summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Garcia-Suarez <rgarciasuarez@gmail.com>2009-05-05 12:09:48 +0200
committerRafael Garcia-Suarez <rgarciasuarez@gmail.com>2009-05-05 12:18:11 +0200
commit9de654f174a7c7ca88031e2ac4a33add560d0c8c (patch)
tree7763181344f0e6240e96c5a444c8a5b57c986dc8
parentf1bef09e9115ebdc1c8818193d6c4cbb8bc050e6 (diff)
parent216e7dec1076aa94d5b8331c187c135e4952955a (diff)
downloadperl-9de654f174a7c7ca88031e2ac4a33add560d0c8c.tar.gz
Merge branch 'blead' into smartmatch
Conflicts: t/op/switch.t
-rw-r--r--.gitignore3
-rwxr-xr-xConfigure26
-rwxr-xr-xCross/Makefile-cross-SH4
-rwxr-xr-xCross/cflags-cross-arm1
-rw-r--r--Cross/config.sh-arm-linux10
-rw-r--r--Cross/config.sh-arm-linux-n7706
-rw-r--r--MANIFEST490
-rw-r--r--Makefile.SH29
-rw-r--r--Makefile.micro5
-rw-r--r--NetWare/Makefile17
-rw-r--r--NetWare/config.wc6
-rw-r--r--Porting/Glossary20
-rw-r--r--Porting/Maintainers.pl47
-rw-r--r--Porting/Maintainers.pm136
-rw-r--r--Porting/config.sh10
-rw-r--r--Porting/corecpan.pl2
-rw-r--r--Porting/corelist.pl121
-rw-r--r--README.cygwin4
-rw-r--r--README.symbian2
-rw-r--r--README.vms2
-rw-r--r--autodoc.pl194
-rwxr-xr-xcflags.SH1
-rwxr-xr-xconfig_h.SH24
-rwxr-xr-xconfigpm8
-rw-r--r--configure.com4
-rw-r--r--cop.h9
-rw-r--r--cv.h7
-rw-r--r--doio.c19
-rw-r--r--doop.c4
-rw-r--r--dump.c2
-rw-r--r--embed.fnc4
-rw-r--r--embed.h2
-rw-r--r--epoc/config.sh6
-rw-r--r--ext/.gitignore13
-rw-r--r--ext/Attribute-Handlers/Changes6
-rw-r--r--ext/Attribute-Handlers/README601
-rw-r--r--ext/Attribute-Handlers/lib/Attribute/Handlers.pm4
-rw-r--r--ext/Attribute-Handlers/t/linerep.t6
-rw-r--r--ext/B/B/Deparse.pm13
-rw-r--r--ext/B/Makefile.PL5
-rw-r--r--ext/B/defsubs_h.PL6
-rw-r--r--ext/B/t/concise-xs.t7
-rw-r--r--ext/B/t/deparse.t74
-rw-r--r--ext/Compress-Raw-Bzip2/Bzip2.xs69
-rw-r--r--ext/Compress-Raw-Bzip2/Changes15
-rw-r--r--ext/Compress-Raw-Bzip2/Makefile.PL9
-rw-r--r--ext/Compress-Raw-Bzip2/README13
-rw-r--r--ext/Compress-Raw-Bzip2/bzip2-src/bzip2.c8
-rw-r--r--ext/Compress-Raw-Bzip2/bzip2-src/bzip2recover.c4
-rw-r--r--ext/Compress-Raw-Bzip2/bzip2-src/bzlib.c41
-rw-r--r--ext/Compress-Raw-Bzip2/bzip2-src/decompress.c6
-rw-r--r--ext/Compress-Raw-Bzip2/lib/Compress/Raw/Bzip2.pm32
-rw-r--r--ext/Compress-Raw-Bzip2/pod/FAQ.pod2
-rw-r--r--ext/Compress-Raw-Bzip2/t/000prereq.t2
-rw-r--r--ext/Compress-Raw-Bzip2/t/01bzip2.t2
-rw-r--r--ext/Compress-Raw-Bzip2/t/09limitoutput.t139
-rw-r--r--ext/Compress-Raw-Zlib/Changes21
-rw-r--r--ext/Compress-Raw-Zlib/Makefile.PL13
-rw-r--r--ext/Compress-Raw-Zlib/README39
-rw-r--r--ext/Compress-Raw-Zlib/Zlib.xs62
-rw-r--r--ext/Compress-Raw-Zlib/lib/Compress/Raw/Zlib.pm232
-rw-r--r--ext/Compress-Raw-Zlib/pod/FAQ.pod2
-rw-r--r--ext/Compress-Raw-Zlib/t/02zlib.t19
-rw-r--r--ext/Compress-Raw-Zlib/t/09limitoutput.t129
-rwxr-xr-xext/Compress-Zlib/Makefile.PL81
-rw-r--r--ext/Compress-Zlib/README120
-rw-r--r--ext/Compress-Zlib/pod/FAQ.pod125
-rw-r--r--ext/Compress-Zlib/t/03zlib-v1.t1188
-rw-r--r--ext/DB_File/Changes4
-rw-r--r--ext/DB_File/DB_File.pm2
-rw-r--r--ext/DB_File/Makefile.PL1
-rw-r--r--ext/Data-Dumper/Dumper.pm11
-rw-r--r--ext/Data-Dumper/Makefile.PL16
-rw-r--r--ext/Data-Dumper/t/bugs.t19
-rw-r--r--ext/Devel-DProf/Makefile.PL1
-rw-r--r--ext/Devel-PPPort/Changes9
-rw-r--r--ext/Devel-PPPort/PPPort_pm.PL2
-rw-r--r--ext/Devel-PPPort/parts/apidoc.fnc4
-rw-r--r--ext/Devel-PPPort/parts/base/50040001
-rw-r--r--ext/Devel-PPPort/parts/base/50040502
-rw-r--r--ext/Devel-PPPort/parts/base/50050001
-rw-r--r--ext/Devel-PPPort/parts/base/50060006
-rw-r--r--ext/Devel-PPPort/parts/base/50060013
-rw-r--r--ext/Devel-PPPort/parts/base/50070021
-rw-r--r--ext/Devel-PPPort/parts/base/50090032
-rw-r--r--ext/Devel-PPPort/parts/base/500900411
-rw-r--r--ext/Devel-PPPort/parts/base/50090052
-rw-r--r--ext/Devel-PPPort/parts/base/50100002
-rw-r--r--ext/Devel-PPPort/parts/base/501100016
-rw-r--r--ext/Devel-PPPort/parts/embed.fnc367
-rw-r--r--ext/Devel-PPPort/parts/inc/misc40
-rw-r--r--ext/Devel-PPPort/parts/todo/50070021
-rw-r--r--ext/Devel-PPPort/parts/todo/50110009
-rw-r--r--ext/Devel-PPPort/soak2
-rw-r--r--ext/Devel-PPPort/t/misc.t6
-rw-r--r--ext/Devel-Peek/Makefile.PL1
-rw-r--r--ext/Digest-SHA/Makefile.PL1
-rw-r--r--ext/DynaLoader/Makefile.PL1
-rw-r--r--ext/DynaLoader/dl_aix.xs15
-rw-r--r--ext/DynaLoader/dl_beos.xs15
-rw-r--r--ext/DynaLoader/dl_dld.xs17
-rw-r--r--ext/DynaLoader/dl_dllload.xs15
-rw-r--r--ext/DynaLoader/dl_dlopen.xs15
-rw-r--r--ext/DynaLoader/dl_dyld.xs15
-rw-r--r--ext/DynaLoader/dl_hpux.xs16
-rw-r--r--ext/DynaLoader/dl_mac.xs15
-rw-r--r--ext/DynaLoader/dl_mpeix.xs15
-rw-r--r--ext/DynaLoader/dl_next.xs16
-rw-r--r--ext/DynaLoader/dl_symbian.xs15
-rw-r--r--ext/DynaLoader/dl_vmesa.xs15
-rw-r--r--ext/DynaLoader/dl_vms.xs32
-rw-r--r--ext/Encode/AUTHORS1
-rw-r--r--ext/Encode/Changes21
-rw-r--r--ext/Encode/Encode.pm8
-rw-r--r--ext/Encode/lib/Encode/Alias.pm4
-rw-r--r--ext/Encode/lib/Encode/MIME/Header.pm6
-rw-r--r--ext/Encode/t/Aliases.t1
-rw-r--r--ext/Errno/Errno_pm.PL6
-rw-r--r--ext/Errno/Makefile.PL4
-rw-r--r--ext/Fcntl/Makefile.PL1
-rw-r--r--ext/File-Glob/Makefile.PL1
-rw-r--r--ext/File-Glob/bsd_glob.c391
-rw-r--r--ext/Filter-Util-Call/Makefile.PL7
-rw-r--r--ext/GDBM_File/Makefile.PL1
-rw-r--r--ext/Hash-Util-FieldHash/Makefile.PL22
-rw-r--r--ext/Hash-Util/Makefile.PL2
-rw-r--r--ext/I18N-Langinfo/Makefile.PL1
-rw-r--r--ext/IO-Compress/Changes (renamed from ext/Compress-Zlib/Changes)368
-rw-r--r--ext/IO-Compress/Makefile.PL (renamed from ext/IO_Compress_Base/Makefile.PL)22
-rw-r--r--ext/IO-Compress/README (renamed from ext/IO_Compress_Zlib/README)58
-rwxr-xr-xext/IO-Compress/examples/compress-zlib/filtdef (renamed from ext/Compress-Zlib/examples/filtdef)0
-rwxr-xr-xext/IO-Compress/examples/compress-zlib/filtinf (renamed from ext/Compress-Zlib/examples/filtinf)0
-rwxr-xr-xext/IO-Compress/examples/compress-zlib/gzcat (renamed from ext/Compress-Zlib/examples/gzcat)0
-rwxr-xr-xext/IO-Compress/examples/compress-zlib/gzgrep (renamed from ext/Compress-Zlib/examples/gzgrep)0
-rwxr-xr-xext/IO-Compress/examples/compress-zlib/gzstream (renamed from ext/Compress-Zlib/examples/gzstream)0
-rwxr-xr-xext/IO-Compress/examples/io/anycat17
-rwxr-xr-xext/IO-Compress/examples/io/bzip2/bzcat29
-rwxr-xr-xext/IO-Compress/examples/io/bzip2/bzgrep25
-rwxr-xr-xext/IO-Compress/examples/io/bzip2/bzstream9
-rw-r--r--ext/IO-Compress/examples/io/gzip/gzappend (renamed from ext/IO_Compress_Zlib/examples/gzappend)0
-rwxr-xr-xext/IO-Compress/examples/io/gzip/gzcat (renamed from ext/IO_Compress_Zlib/examples/gzcat)0
-rwxr-xr-xext/IO-Compress/examples/io/gzip/gzgrep (renamed from ext/IO_Compress_Zlib/examples/gzgrep)0
-rwxr-xr-xext/IO-Compress/examples/io/gzip/gzstream (renamed from ext/IO_Compress_Zlib/examples/gzstream)0
-rw-r--r--ext/IO-Compress/lib/Compress/Zlib.pm (renamed from ext/Compress-Zlib/lib/Compress/Zlib.pm)23
-rw-r--r--ext/IO-Compress/lib/File/GlobMapper.pm (renamed from ext/IO_Compress_Base/lib/File/GlobMapper.pm)0
-rw-r--r--ext/IO-Compress/lib/IO/Compress/Adapter/Bzip2.pm162
-rw-r--r--ext/IO-Compress/lib/IO/Compress/Adapter/Deflate.pm (renamed from ext/IO_Compress_Zlib/lib/IO/Compress/Adapter/Deflate.pm)6
-rw-r--r--ext/IO-Compress/lib/IO/Compress/Adapter/Identity.pm (renamed from ext/IO_Compress_Zlib/lib/IO/Compress/Adapter/Identity.pm)4
-rw-r--r--ext/IO-Compress/lib/IO/Compress/Base.pm (renamed from ext/IO_Compress_Base/lib/IO/Compress/Base.pm)16
-rw-r--r--ext/IO-Compress/lib/IO/Compress/Base/Common.pm (renamed from ext/IO_Compress_Base/lib/IO/Compress/Base/Common.pm)2
-rw-r--r--ext/IO-Compress/lib/IO/Compress/Bzip2.pm758
-rw-r--r--ext/IO-Compress/lib/IO/Compress/Deflate.pm (renamed from ext/IO_Compress_Zlib/lib/IO/Compress/Deflate.pm)16
-rw-r--r--ext/IO-Compress/lib/IO/Compress/Gzip.pm (renamed from ext/IO_Compress_Zlib/lib/IO/Compress/Gzip.pm)18
-rw-r--r--ext/IO-Compress/lib/IO/Compress/Gzip/Constants.pm (renamed from ext/IO_Compress_Zlib/lib/IO/Compress/Gzip/Constants.pm)2
-rw-r--r--ext/IO-Compress/lib/IO/Compress/RawDeflate.pm (renamed from ext/IO_Compress_Zlib/lib/IO/Compress/RawDeflate.pm)18
-rw-r--r--ext/IO-Compress/lib/IO/Compress/Zip.pm (renamed from ext/IO_Compress_Zlib/lib/IO/Compress/Zip.pm)54
-rw-r--r--ext/IO-Compress/lib/IO/Compress/Zip/Constants.pm (renamed from ext/IO_Compress_Zlib/lib/IO/Compress/Zip/Constants.pm)4
-rw-r--r--ext/IO-Compress/lib/IO/Compress/Zlib/Constants.pm (renamed from ext/IO_Compress_Zlib/lib/IO/Compress/Zlib/Constants.pm)2
-rw-r--r--ext/IO-Compress/lib/IO/Compress/Zlib/Extra.pm (renamed from ext/IO_Compress_Zlib/lib/IO/Compress/Zlib/Extra.pm)4
-rw-r--r--ext/IO-Compress/lib/IO/Uncompress/Adapter/Bunzip2.pm111
-rwxr-xr-x[-rw-r--r--]ext/IO-Compress/lib/IO/Uncompress/Adapter/Identity.pm (renamed from ext/IO_Compress_Zlib/lib/IO/Uncompress/Adapter/Identity.pm)6
-rw-r--r--ext/IO-Compress/lib/IO/Uncompress/Adapter/Inflate.pm (renamed from ext/IO_Compress_Zlib/lib/IO/Uncompress/Adapter/Inflate.pm)20
-rw-r--r--ext/IO-Compress/lib/IO/Uncompress/AnyInflate.pm (renamed from ext/IO_Compress_Zlib/lib/IO/Uncompress/AnyInflate.pm)20
-rw-r--r--ext/IO-Compress/lib/IO/Uncompress/AnyUncompress.pm (renamed from ext/IO_Compress_Base/lib/IO/Uncompress/AnyUncompress.pm)55
-rw-r--r--ext/IO-Compress/lib/IO/Uncompress/Base.pm (renamed from ext/IO_Compress_Base/lib/IO/Uncompress/Base.pm)46
-rw-r--r--ext/IO-Compress/lib/IO/Uncompress/Bunzip2.pm858
-rw-r--r--ext/IO-Compress/lib/IO/Uncompress/Gunzip.pm (renamed from ext/IO_Compress_Zlib/lib/IO/Uncompress/Gunzip.pm)16
-rw-r--r--ext/IO-Compress/lib/IO/Uncompress/Inflate.pm (renamed from ext/IO_Compress_Zlib/lib/IO/Uncompress/Inflate.pm)10
-rwxr-xr-x[-rw-r--r--]ext/IO-Compress/lib/IO/Uncompress/RawInflate.pm (renamed from ext/IO_Compress_Zlib/lib/IO/Uncompress/RawInflate.pm)41
-rw-r--r--ext/IO-Compress/lib/IO/Uncompress/Unzip.pm (renamed from ext/IO_Compress_Zlib/lib/IO/Uncompress/Unzip.pm)86
-rw-r--r--ext/IO-Compress/pod/FAQ.pod (renamed from ext/IO_Compress_Zlib/pod/FAQ.pod)20
-rw-r--r--ext/IO-Compress/private/MakeUtil.pm (renamed from ext/Compress-Zlib/private/MakeUtil.pm)0
-rw-r--r--ext/IO-Compress/t/000prereq.t56
-rw-r--r--ext/IO-Compress/t/001bzip2.t206
-rw-r--r--ext/IO-Compress/t/001zlib-generic-deflate.t (renamed from ext/IO_Compress_Zlib/t/001zlib-generic-deflate.t)0
-rw-r--r--ext/IO-Compress/t/001zlib-generic-gzip.t (renamed from ext/IO_Compress_Zlib/t/001zlib-generic-gzip.t)0
-rw-r--r--ext/IO-Compress/t/001zlib-generic-rawdeflate.t (renamed from ext/IO_Compress_Zlib/t/001zlib-generic-rawdeflate.t)0
-rw-r--r--ext/IO-Compress/t/001zlib-generic-zip.t (renamed from ext/IO_Compress_Zlib/t/001zlib-generic-zip.t)0
-rw-r--r--ext/IO-Compress/t/002any-deflate.t (renamed from ext/IO_Compress_Zlib/t/002any-deflate.t)0
-rw-r--r--ext/IO-Compress/t/002any-gzip.t (renamed from ext/IO_Compress_Zlib/t/002any-gzip.t)0
-rw-r--r--ext/IO-Compress/t/002any-rawdeflate.t (renamed from ext/IO_Compress_Zlib/t/002any-rawdeflate.t)0
-rw-r--r--ext/IO-Compress/t/002any-transparent.t (renamed from ext/IO_Compress_Zlib/t/002any-transparent.t)0
-rw-r--r--ext/IO-Compress/t/002any-zip.t (renamed from ext/IO_Compress_Zlib/t/002any-zip.t)0
-rw-r--r--ext/IO-Compress/t/004gziphdr.t (renamed from ext/IO_Compress_Zlib/t/004gziphdr.t)0
-rw-r--r--ext/IO-Compress/t/005defhdr.t (renamed from ext/IO_Compress_Zlib/t/005defhdr.t)0
-rw-r--r--ext/IO-Compress/t/006zip.t (renamed from ext/IO_Compress_Zlib/t/006zip.t)0
-rw-r--r--ext/IO-Compress/t/010examples-bzip2.t145
-rw-r--r--ext/IO-Compress/t/010examples-zlib.t (renamed from ext/IO_Compress_Zlib/t/010examples.t)4
-rw-r--r--ext/IO-Compress/t/01misc.t (renamed from ext/IO_Compress_Base/t/01misc.t)0
-rw-r--r--ext/IO-Compress/t/020isize.t (renamed from ext/IO_Compress_Zlib/t/020isize.t)0
-rw-r--r--ext/IO-Compress/t/050interop-gzip.t (renamed from ext/IO_Compress_Zlib/t/050interop-gzip.t)0
-rw-r--r--ext/IO-Compress/t/100generic-bzip2.t21
-rw-r--r--ext/IO-Compress/t/100generic-deflate.t (renamed from ext/IO_Compress_Zlib/t/100generic-deflate.t)0
-rw-r--r--ext/IO-Compress/t/100generic-gzip.t (renamed from ext/IO_Compress_Zlib/t/100generic-gzip.t)0
-rw-r--r--ext/IO-Compress/t/100generic-rawdeflate.t (renamed from ext/IO_Compress_Zlib/t/100generic-rawdeflate.t)0
-rw-r--r--ext/IO-Compress/t/100generic-zip.t (renamed from ext/IO_Compress_Zlib/t/100generic-zip.t)0
-rw-r--r--ext/IO-Compress/t/101truncate-bzip2.t37
-rw-r--r--ext/IO-Compress/t/101truncate-deflate.t (renamed from ext/IO_Compress_Zlib/t/101truncate-deflate.t)0
-rw-r--r--ext/IO-Compress/t/101truncate-gzip.t (renamed from ext/IO_Compress_Zlib/t/101truncate-gzip.t)0
-rw-r--r--ext/IO-Compress/t/101truncate-rawdeflate.t (renamed from ext/IO_Compress_Zlib/t/101truncate-rawdeflate.t)6
-rw-r--r--ext/IO-Compress/t/101truncate-zip.t (renamed from ext/IO_Compress_Zlib/t/101truncate-zip.t)2
-rw-r--r--ext/IO-Compress/t/102tied-bzip2.t21
-rw-r--r--ext/IO-Compress/t/102tied-deflate.t (renamed from ext/IO_Compress_Zlib/t/102tied-deflate.t)0
-rw-r--r--ext/IO-Compress/t/102tied-gzip.t (renamed from ext/IO_Compress_Zlib/t/102tied-gzip.t)0
-rw-r--r--ext/IO-Compress/t/102tied-rawdeflate.t (renamed from ext/IO_Compress_Zlib/t/102tied-rawdeflate.t)0
-rw-r--r--ext/IO-Compress/t/102tied-zip.t (renamed from ext/IO_Compress_Zlib/t/102tied-zip.t)0
-rw-r--r--ext/IO-Compress/t/103newtied-bzip2.t21
-rw-r--r--ext/IO-Compress/t/103newtied-deflate.t (renamed from ext/IO_Compress_Zlib/t/103newtied-deflate.t)0
-rw-r--r--ext/IO-Compress/t/103newtied-gzip.t (renamed from ext/IO_Compress_Zlib/t/103newtied-gzip.t)0
-rw-r--r--ext/IO-Compress/t/103newtied-rawdeflate.t (renamed from ext/IO_Compress_Zlib/t/103newtied-rawdeflate.t)0
-rw-r--r--ext/IO-Compress/t/103newtied-zip.t (renamed from ext/IO_Compress_Zlib/t/103newtied-zip.t)0
-rw-r--r--ext/IO-Compress/t/104destroy-bzip2.t21
-rw-r--r--ext/IO-Compress/t/104destroy-deflate.t (renamed from ext/IO_Compress_Zlib/t/104destroy-deflate.t)0
-rw-r--r--ext/IO-Compress/t/104destroy-gzip.t (renamed from ext/IO_Compress_Zlib/t/104destroy-gzip.t)0
-rw-r--r--ext/IO-Compress/t/104destroy-rawdeflate.t (renamed from ext/IO_Compress_Zlib/t/104destroy-rawdeflate.t)0
-rw-r--r--ext/IO-Compress/t/104destroy-zip.t (renamed from ext/IO_Compress_Zlib/t/104destroy-zip.t)0
-rw-r--r--ext/IO-Compress/t/105oneshot-bzip2.t22
-rw-r--r--ext/IO-Compress/t/105oneshot-deflate.t (renamed from ext/IO_Compress_Zlib/t/105oneshot-deflate.t)0
-rw-r--r--ext/IO-Compress/t/105oneshot-gzip-only.t (renamed from ext/IO_Compress_Zlib/t/105oneshot-gzip-only.t)0
-rw-r--r--ext/IO-Compress/t/105oneshot-gzip.t (renamed from ext/IO_Compress_Zlib/t/105oneshot-gzip.t)1
-rw-r--r--ext/IO-Compress/t/105oneshot-rawdeflate.t (renamed from ext/IO_Compress_Zlib/t/105oneshot-rawdeflate.t)0
-rw-r--r--ext/IO-Compress/t/105oneshot-zip-bzip2-only.t168
-rw-r--r--ext/IO-Compress/t/105oneshot-zip-only.t (renamed from ext/IO_Compress_Zlib/t/105oneshot-zip-only.t)0
-rw-r--r--ext/IO-Compress/t/105oneshot-zip.t (renamed from ext/IO_Compress_Zlib/t/105oneshot-zip.t)0
-rw-r--r--ext/IO-Compress/t/106prime-bzip2.t21
-rw-r--r--ext/IO-Compress/t/106prime-deflate.t (renamed from ext/IO_Compress_Zlib/t/106prime-deflate.t)0
-rw-r--r--ext/IO-Compress/t/106prime-gzip.t (renamed from ext/IO_Compress_Zlib/t/106prime-gzip.t)0
-rw-r--r--ext/IO-Compress/t/106prime-rawdeflate.t (renamed from ext/IO_Compress_Zlib/t/106prime-rawdeflate.t)0
-rw-r--r--ext/IO-Compress/t/106prime-zip.t (renamed from ext/IO_Compress_Zlib/t/106prime-zip.t)0
-rw-r--r--ext/IO-Compress/t/107multi-bzip2.t21
-rw-r--r--ext/IO-Compress/t/107multi-deflate.t (renamed from ext/IO_Compress_Zlib/t/107multi-deflate.t)0
-rw-r--r--ext/IO-Compress/t/107multi-gzip.t (renamed from ext/IO_Compress_Zlib/t/107multi-gzip.t)0
-rw-r--r--ext/IO-Compress/t/107multi-rawdeflate.t (renamed from ext/IO_Compress_Zlib/t/107multi-rawdeflate.t)0
-rw-r--r--ext/IO-Compress/t/107multi-zip.t (renamed from ext/IO_Compress_Zlib/t/107multi-zip.t)0
-rw-r--r--ext/IO-Compress/t/108anyunc-bzip2.t29
-rw-r--r--ext/IO-Compress/t/108anyunc-deflate.t (renamed from ext/IO_Compress_Zlib/t/108anyunc-deflate.t)0
-rw-r--r--ext/IO-Compress/t/108anyunc-gzip.t (renamed from ext/IO_Compress_Zlib/t/108anyunc-gzip.t)0
-rw-r--r--ext/IO-Compress/t/108anyunc-rawdeflate.t (renamed from ext/IO_Compress_Zlib/t/108anyunc-rawdeflate.t)0
-rw-r--r--ext/IO-Compress/t/108anyunc-transparent.t (renamed from ext/IO_Compress_Zlib/t/108anyunc-transparent.t)0
-rw-r--r--ext/IO-Compress/t/108anyunc-zip.t (renamed from ext/IO_Compress_Zlib/t/108anyunc-zip.t)0
-rw-r--r--ext/IO-Compress/t/109merge-deflate.t (renamed from ext/IO_Compress_Zlib/t/109merge-deflate.t)0
-rw-r--r--ext/IO-Compress/t/109merge-gzip.t (renamed from ext/IO_Compress_Zlib/t/109merge-gzip.t)0
-rw-r--r--ext/IO-Compress/t/109merge-rawdeflate.t (renamed from ext/IO_Compress_Zlib/t/109merge-rawdeflate.t)0
-rw-r--r--ext/IO-Compress/t/109merge-zip.t (renamed from ext/IO_Compress_Zlib/t/109merge-zip.t)0
-rw-r--r--ext/IO-Compress/t/110encode-bzip2.t21
-rw-r--r--ext/IO-Compress/t/110encode-deflate.t (renamed from ext/IO_Compress_Zlib/t/110encode-deflate.t)0
-rw-r--r--ext/IO-Compress/t/110encode-gzip.t (renamed from ext/IO_Compress_Zlib/t/110encode-gzip.t)0
-rw-r--r--ext/IO-Compress/t/110encode-rawdeflate.t (renamed from ext/IO_Compress_Zlib/t/110encode-rawdeflate.t)0
-rw-r--r--ext/IO-Compress/t/110encode-zip.t (renamed from ext/IO_Compress_Zlib/t/110encode-zip.t)0
-rw-r--r--ext/IO-Compress/t/999pod.t16
-rw-r--r--ext/IO-Compress/t/99pod.t16
-rw-r--r--ext/IO-Compress/t/cz-01version.t (renamed from ext/Compress-Zlib/t/01version.t)0
-rw-r--r--ext/IO-Compress/t/cz-05examples.t (renamed from ext/Compress-Zlib/t/05examples.t)4
-rw-r--r--ext/IO-Compress/t/cz-06gzsetp.t (renamed from ext/Compress-Zlib/t/06gzsetp.t)0
-rw-r--r--ext/IO-Compress/t/cz-08encoding.t (renamed from ext/Compress-Zlib/t/08encoding.t)0
-rw-r--r--ext/IO-Compress/t/cz-14gzopen.t (renamed from ext/Compress-Zlib/t/14gzopen.t)453
-rw-r--r--ext/IO-Compress/t/cz-99pod.t16
-rw-r--r--ext/IO-Compress/t/globmapper.t (renamed from ext/IO_Compress_Base/t/globmapper.t)0
-rw-r--r--ext/IO/Makefile.PL2
-rw-r--r--ext/IO_Compress_Base/Changes194
-rw-r--r--ext/IO_Compress_Base/README90
-rw-r--r--ext/IO_Compress_Base/pod/FAQ.pod346
-rw-r--r--ext/IO_Compress_Base/private/MakeUtil.pm381
-rw-r--r--ext/IO_Compress_Zlib/Changes194
-rw-r--r--ext/IO_Compress_Zlib/Makefile.PL67
-rw-r--r--ext/IO_Compress_Zlib/examples/unzip73
-rw-r--r--ext/IO_Compress_Zlib/private/MakeUtil.pm381
-rw-r--r--ext/IPC-SysV/Changes4
-rw-r--r--ext/IPC-SysV/lib/IPC/Msg.pm2
-rw-r--r--ext/IPC-SysV/lib/IPC/Semaphore.pm2
-rw-r--r--ext/IPC-SysV/lib/IPC/SharedMem.pm2
-rw-r--r--ext/IPC-SysV/lib/IPC/SysV.pm2
-rw-r--r--ext/List-Util/Makefile.PL1
-rw-r--r--ext/Math-BigInt-FastCalc/Makefile.PL14
-rw-r--r--ext/Module-Pluggable/Makefile.PL16
-rw-r--r--ext/Module-Pluggable/lib/Module/Pluggable.pm2
-rw-r--r--ext/Module-Pluggable/lib/Module/Pluggable/Object.pm102
-rw-r--r--ext/Module-Pluggable/t/01use.t (renamed from t/Module_Pluggable/01use.t)0
-rw-r--r--ext/Module-Pluggable/t/02alsoworks.t (renamed from t/Module_Pluggable/02alsoworks.t)0
-rw-r--r--ext/Module-Pluggable/t/02works.t (renamed from t/Module_Pluggable/02works.t)0
-rw-r--r--ext/Module-Pluggable/t/02works_taint.t (renamed from t/Module_Pluggable/02works_taint.t)0
-rw-r--r--ext/Module-Pluggable/t/03diffname.t (renamed from t/Module_Pluggable/03diffname.t)0
-rw-r--r--ext/Module-Pluggable/t/04acmedir.t (renamed from t/Module_Pluggable/04acmedir.t)0
-rw-r--r--ext/Module-Pluggable/t/04acmedir_single.t (renamed from t/Module_Pluggable/04acmedir_single.t)0
-rw-r--r--ext/Module-Pluggable/t/04acmepath.t (renamed from t/Module_Pluggable/04acmepath.t)0
-rw-r--r--ext/Module-Pluggable/t/04acmepath_single.t (renamed from t/Module_Pluggable/04acmepath_single.t)0
-rw-r--r--ext/Module-Pluggable/t/05postpath.t (renamed from t/Module_Pluggable/05postpath.t)0
-rw-r--r--ext/Module-Pluggable/t/06multipath.t (renamed from t/Module_Pluggable/06multipath.t)0
-rw-r--r--ext/Module-Pluggable/t/07instantiate.t (renamed from t/Module_Pluggable/07instantiate.t)0
-rw-r--r--ext/Module-Pluggable/t/08nothing.t (renamed from t/Module_Pluggable/08nothing.t)0
-rw-r--r--ext/Module-Pluggable/t/09require.t (renamed from t/Module_Pluggable/09require.t)0
-rw-r--r--ext/Module-Pluggable/t/10innerpack.t (renamed from t/Module_Pluggable/10innerpack.t)0
-rw-r--r--ext/Module-Pluggable/t/10innerpack_inner.t (renamed from t/Module_Pluggable/10innerpack_inner.t)0
-rw-r--r--ext/Module-Pluggable/t/10innerpack_noinner.t (renamed from t/Module_Pluggable/10innerpack_noinner.t)0
-rw-r--r--ext/Module-Pluggable/t/10innerpack_onefile.t27
-rw-r--r--ext/Module-Pluggable/t/10innerpack_override.t (renamed from t/Module_Pluggable/10innerpack_override.t)0
-rw-r--r--ext/Module-Pluggable/t/10innerpack_super.t (renamed from t/Module_Pluggable/10innerpack_super.t)0
-rw-r--r--ext/Module-Pluggable/t/11usetwice.t (renamed from t/Module_Pluggable/11usetwice.t)0
-rw-r--r--ext/Module-Pluggable/t/12only.t (renamed from t/Module_Pluggable/12only.t)0
-rw-r--r--ext/Module-Pluggable/t/12onlyarray.t (renamed from t/Module_Pluggable/12onlyarray.t)0
-rw-r--r--ext/Module-Pluggable/t/12onlyregex.t (renamed from t/Module_Pluggable/12onlyregex.t)0
-rw-r--r--ext/Module-Pluggable/t/12onlyrequire.t21
-rw-r--r--ext/Module-Pluggable/t/13except.t (renamed from t/Module_Pluggable/13except.t)0
-rw-r--r--ext/Module-Pluggable/t/13exceptarray.t (renamed from t/Module_Pluggable/13exceptarray.t)0
-rw-r--r--ext/Module-Pluggable/t/13exceptregex.t (renamed from t/Module_Pluggable/13exceptregex.t)0
-rw-r--r--ext/Module-Pluggable/t/14package.t (renamed from t/Module_Pluggable/14package.t)0
-rw-r--r--ext/Module-Pluggable/t/15topicsafe.t (renamed from t/Module_Pluggable/15topicsafe.t)0
-rw-r--r--ext/Module-Pluggable/t/16different_extension.t (renamed from t/Module_Pluggable/16different_extension.t)0
-rw-r--r--ext/Module-Pluggable/t/17devel_inner_package.t (renamed from t/Module_Pluggable/17devel_inner_package.t)0
-rw-r--r--ext/Module-Pluggable/t/18skipped_package.t (renamed from t/Module_Pluggable/18skipped_package.t)0
-rw-r--r--ext/Module-Pluggable/t/19can_ok_clobber.t (renamed from t/Module_Pluggable/19can_ok_clobber.t)0
-rw-r--r--ext/Module-Pluggable/t/20dodgy_files.t (renamed from t/Module_Pluggable/20dodgy_files.t)0
-rw-r--r--ext/Module-Pluggable/t/21editor_junk.t (renamed from t/Module_Pluggable/21editor_junk.t)0
-rw-r--r--ext/Module-Pluggable/t/acme/Acme/MyTest/Plugin/Foo.pm (renamed from t/Module_Pluggable/acme/Acme/MyTest/Plugin/Foo.pm)0
-rw-r--r--ext/Module-Pluggable/t/lib/Acme/Foo-Bar.pm6
-rw-r--r--ext/Module-Pluggable/t/lib/Acme/MyTest/Plugin/Foo.pm (renamed from t/Module_Pluggable/lib/Acme/MyTest/Plugin/Foo.pm)0
-rw-r--r--ext/Module-Pluggable/t/lib/EditorJunk/Plugin/.gitignore (renamed from t/Module_Pluggable/lib/EditorJunk/Plugin/.gitignore)0
-rw-r--r--ext/Module-Pluggable/t/lib/EditorJunk/Plugin/Bar.pm (renamed from t/Module_Pluggable/lib/EditorJunk/Plugin/Bar.pm)0
-rw-r--r--ext/Module-Pluggable/t/lib/EditorJunk/Plugin/Bar.pm.swo (renamed from t/Module_Pluggable/lib/EditorJunk/Plugin/Bar.pm.swo)0
-rw-r--r--ext/Module-Pluggable/t/lib/EditorJunk/Plugin/Bar.pm.swp (renamed from t/Module_Pluggable/lib/EditorJunk/Plugin/Bar.pm.swp)0
-rw-r--r--ext/Module-Pluggable/t/lib/EditorJunk/Plugin/Bar.pm~ (renamed from t/Module_Pluggable/lib/EditorJunk/Plugin/Bar.pm~)0
-rw-r--r--ext/Module-Pluggable/t/lib/EditorJunk/Plugin/Foo.pm (renamed from t/Module_Pluggable/lib/EditorJunk/Plugin/Foo.pm)0
-rw-r--r--ext/Module-Pluggable/t/lib/ExtTest/Plugin/Bar.plugin (renamed from t/Module_Pluggable/lib/ExtTest/Plugin/Bar.plugin)0
-rw-r--r--ext/Module-Pluggable/t/lib/ExtTest/Plugin/Foo.plugin (renamed from t/Module_Pluggable/lib/ExtTest/Plugin/Foo.plugin)0
-rw-r--r--ext/Module-Pluggable/t/lib/ExtTest/Plugin/Quux/Foo.plugin (renamed from t/Module_Pluggable/lib/ExtTest/Plugin/Quux/Foo.plugin)0
-rw-r--r--ext/Module-Pluggable/t/lib/InnerTest/Plugin/Foo.pm (renamed from t/Module_Pluggable/lib/InnerTest/Plugin/Foo.pm)0
-rw-r--r--ext/Module-Pluggable/t/lib/MyOtherTest/Plugin/Bar.pm (renamed from t/Module_Pluggable/lib/MyOtherTest/Plugin/Bar.pm)0
-rw-r--r--ext/Module-Pluggable/t/lib/MyOtherTest/Plugin/Foo.pm (renamed from t/Module_Pluggable/lib/MyOtherTest/Plugin/Foo.pm)0
-rw-r--r--ext/Module-Pluggable/t/lib/MyOtherTest/Plugin/Quux.pm (renamed from t/Module_Pluggable/lib/MyOtherTest/Plugin/Quux.pm)0
-rw-r--r--ext/Module-Pluggable/t/lib/MyOtherTest/Plugin/Quux/Foo.pm (renamed from t/Module_Pluggable/lib/MyOtherTest/Plugin/Quux/Foo.pm)0
-rw-r--r--ext/Module-Pluggable/t/lib/MyTest/Extend/Plugin/Bar.pm (renamed from t/Module_Pluggable/lib/MyTest/Extend/Plugin/Bar.pm)0
-rw-r--r--ext/Module-Pluggable/t/lib/MyTest/Plugin/Bar.pm (renamed from t/Module_Pluggable/lib/MyTest/Plugin/Bar.pm)0
-rw-r--r--ext/Module-Pluggable/t/lib/MyTest/Plugin/Foo.pm (renamed from t/Module_Pluggable/lib/MyTest/Plugin/Foo.pm)0
-rw-r--r--ext/Module-Pluggable/t/lib/MyTest/Plugin/Quux/Foo.pm (renamed from t/Module_Pluggable/lib/MyTest/Plugin/Quux/Foo.pm)0
-rw-r--r--ext/Module-Pluggable/t/lib/No/Middle.pm (renamed from t/Module_Pluggable/lib/No/Middle.pm)0
-rw-r--r--ext/Module-Pluggable/t/lib/OddTest/Plugin/.gitignore (renamed from t/Module_Pluggable/lib/OddTest/Plugin/.gitignore)0
-rw-r--r--ext/Module-Pluggable/t/lib/OddTest/Plugin/Foo.pm (renamed from t/Module_Pluggable/lib/OddTest/Plugin/Foo.pm)0
-rw-r--r--ext/Module-Pluggable/t/lib/TA/C/A/I.pm (renamed from t/Module_Pluggable/lib/TA/C/A/I.pm)0
-rw-r--r--ext/Module-Pluggable/t/lib/Zot/.Zork.pm0
-rw-r--r--ext/NDBM_File/Makefile.PL1
-rw-r--r--ext/ODBM_File/Makefile.PL1
-rw-r--r--ext/Opcode/Makefile.PL6
-rw-r--r--ext/POSIX/Makefile.PL1
-rw-r--r--ext/POSIX/POSIX.xs24
-rw-r--r--ext/PerlIO-encoding/Makefile.PL7
-rw-r--r--ext/PerlIO-scalar/Makefile.PL7
-rw-r--r--ext/PerlIO-via/Makefile.PL7
-rw-r--r--ext/SDBM_File/Makefile.PL1
-rw-r--r--ext/SDBM_File/sdbm/sdbm.c17
-rw-r--r--ext/Socket/Makefile.PL1
-rw-r--r--ext/Socket/Socket.pm20
-rw-r--r--ext/Socket/Socket.xs51
-rwxr-xr-xext/Socket/t/Socket.t11
-rw-r--r--ext/Storable/Makefile.PL1
-rw-r--r--ext/Sys-Hostname/Makefile.PL8
-rw-r--r--ext/Test-Harness/Changes23
-rw-r--r--ext/Test-Harness/Makefile.PL49
-rw-r--r--ext/Test-Harness/bin/prove26
-rw-r--r--ext/Test-Harness/lib/App/Prove.pm141
-rw-r--r--ext/Test-Harness/lib/App/Prove/State.pm85
-rw-r--r--ext/Test-Harness/lib/App/Prove/State/Result.pm15
-rw-r--r--ext/Test-Harness/lib/App/Prove/State/Result/Test.pm13
-rw-r--r--ext/Test-Harness/lib/TAP/Base.pm16
-rw-r--r--ext/Test-Harness/lib/TAP/Formatter/Base.pm438
-rw-r--r--ext/Test-Harness/lib/TAP/Formatter/Color.pm4
-rw-r--r--ext/Test-Harness/lib/TAP/Formatter/Console.pm404
-rw-r--r--ext/Test-Harness/lib/TAP/Formatter/Console/ParallelSession.pm49
-rw-r--r--ext/Test-Harness/lib/TAP/Formatter/Console/Session.pm166
-rw-r--r--ext/Test-Harness/lib/TAP/Formatter/File.pm58
-rw-r--r--ext/Test-Harness/lib/TAP/Formatter/File/Session.pm109
-rw-r--r--ext/Test-Harness/lib/TAP/Formatter/Session.pm175
-rw-r--r--ext/Test-Harness/lib/TAP/Harness.pm51
-rw-r--r--ext/Test-Harness/lib/TAP/Object.pm25
-rw-r--r--ext/Test-Harness/lib/TAP/Parser.pm60
-rw-r--r--ext/Test-Harness/lib/TAP/Parser/Aggregator.pm14
-rw-r--r--ext/Test-Harness/lib/TAP/Parser/Grammar.pm4
-rw-r--r--ext/Test-Harness/lib/TAP/Parser/Iterator.pm4
-rw-r--r--ext/Test-Harness/lib/TAP/Parser/Iterator/Array.pm4
-rw-r--r--ext/Test-Harness/lib/TAP/Parser/Iterator/Process.pm4
-rw-r--r--ext/Test-Harness/lib/TAP/Parser/Iterator/Stream.pm4
-rw-r--r--ext/Test-Harness/lib/TAP/Parser/IteratorFactory.pm4
-rw-r--r--ext/Test-Harness/lib/TAP/Parser/Multiplexer.pm4
-rw-r--r--ext/Test-Harness/lib/TAP/Parser/Result.pm12
-rw-r--r--ext/Test-Harness/lib/TAP/Parser/Result/Bailout.pm4
-rw-r--r--ext/Test-Harness/lib/TAP/Parser/Result/Comment.pm4
-rw-r--r--ext/Test-Harness/lib/TAP/Parser/Result/Plan.pm4
-rw-r--r--ext/Test-Harness/lib/TAP/Parser/Result/Pragma.pm4
-rw-r--r--ext/Test-Harness/lib/TAP/Parser/Result/Test.pm4
-rw-r--r--ext/Test-Harness/lib/TAP/Parser/Result/Unknown.pm4
-rw-r--r--ext/Test-Harness/lib/TAP/Parser/Result/Version.pm4
-rw-r--r--ext/Test-Harness/lib/TAP/Parser/Result/YAML.pm4
-rw-r--r--ext/Test-Harness/lib/TAP/Parser/ResultFactory.pm4
-rw-r--r--ext/Test-Harness/lib/TAP/Parser/Scheduler.pm18
-rw-r--r--ext/Test-Harness/lib/TAP/Parser/Scheduler/Job.pm4
-rw-r--r--ext/Test-Harness/lib/TAP/Parser/Scheduler/Spinner.pm4
-rw-r--r--ext/Test-Harness/lib/TAP/Parser/Source.pm4
-rw-r--r--ext/Test-Harness/lib/TAP/Parser/Source/Perl.pm49
-rw-r--r--ext/Test-Harness/lib/TAP/Parser/Utils.pm4
-rw-r--r--ext/Test-Harness/lib/TAP/Parser/YAMLish/Reader.pm4
-rw-r--r--ext/Test-Harness/lib/TAP/Parser/YAMLish/Writer.pm4
-rw-r--r--ext/Test-Harness/lib/Test/Harness.pm54
-rw-r--r--ext/Test-Harness/t/aggregator.t6
-rw-r--r--ext/Test-Harness/t/compat/failure.t7
-rw-r--r--ext/Test-Harness/t/compat/inc-propagation.t7
-rw-r--r--ext/Test-Harness/t/file.t402
-rw-r--r--ext/Test-Harness/t/harness-bailout.t58
-rw-r--r--ext/Test-Harness/t/harness.t48
-rw-r--r--ext/Test-Harness/t/iterators.t2
-rw-r--r--ext/Test-Harness/t/lib/App/Prove/Plugin/Dummy.pm2
-rw-r--r--ext/Test-Harness/t/lib/App/Prove/Plugin/Dummy2.pm13
-rwxr-xr-xext/Test-Harness/t/parse.t5
-rw-r--r--ext/Test-Harness/t/perl5lib.t49
-rw-r--r--ext/Test-Harness/t/prove.t51
-rw-r--r--ext/Test-Harness/t/proverun.t2
-rw-r--r--ext/Test-Harness/t/regression.t185
-rw-r--r--ext/Test-Harness/t/taint.t44
-rw-r--r--ext/Text-Soundex/Makefile.PL11
-rw-r--r--ext/Time-Piece/Makefile.PL1
-rw-r--r--ext/Time-Piece/Piece.pm2
-rw-r--r--ext/Time-Piece/Piece.xs98
-rw-r--r--ext/Time-Piece/t/02core.t10
-rw-r--r--ext/Unicode-Normalize/Changes4
-rw-r--r--ext/Unicode-Normalize/Makefile.PL2
-rw-r--r--ext/Unicode-Normalize/Normalize.pm4
-rw-r--r--ext/Unicode-Normalize/Normalize.xs8
-rw-r--r--ext/Unicode-Normalize/README2
-rw-r--r--ext/Unicode-Normalize/mkheader77
-rw-r--r--ext/XS-APItest/Makefile.PL1
-rw-r--r--ext/XS-Typemap/Makefile.PL1
-rw-r--r--ext/XS-Typemap/stdio.c2
-rw-r--r--ext/attributes/attributes.pm (renamed from lib/attributes.pm)89
-rw-r--r--ext/attributes/attributes.xs (renamed from xsutils.c)140
-rw-r--r--ext/attrs/Makefile.PL7
-rw-r--r--ext/attrs/attrs.pm58
-rw-r--r--ext/attrs/attrs.xs65
-rw-r--r--ext/attrs/t/attrs.t141
-rw-r--r--ext/mro/Makefile.PL10
-rw-r--r--ext/mro/mro.xs14
-rw-r--r--ext/re/Makefile.PL1
-rwxr-xr-xext/threads-shared/Makefile.PL6
-rwxr-xr-xext/threads/Makefile.PL6
-rw-r--r--gv.c6
-rw-r--r--gv.h10
-rw-r--r--handy.h30
-rw-r--r--hints/aix.sh5
-rw-r--r--hints/cygwin.sh4
-rw-r--r--hints/qnx.sh9
-rw-r--r--hints/uwin.sh4
-rw-r--r--hints/vmesa.sh2
-rw-r--r--hv.c6
-rwxr-xr-xinstallperl2
-rw-r--r--lib/.gitignore2
-rw-r--r--lib/Archive/Extract.pm22
-rw-r--r--lib/Archive/Tar.pm23
-rw-r--r--lib/Archive/Tar/File.pm9
-rw-r--r--lib/Archive/Tar/t/04_resolved_issues.t39
-rw-r--r--lib/Archive/Tar/t/src/header/signed.tar.packed243
-rw-r--r--lib/Archive/Tar/t/src/linktest/linktest_missing_dir.tar.packed2
-rw-r--r--lib/Archive/Tar/t/src/linktest/linktest_with_dir.tar.packed2
-rw-r--r--lib/Archive/Tar/t/src/long/bar.tar.packed2
-rw-r--r--lib/Archive/Tar/t/src/long/foo.tbz.packed2
-rw-r--r--lib/Archive/Tar/t/src/long/foo.tgz.packed2
-rw-r--r--lib/Archive/Tar/t/src/short/bar.tar.packed2
-rw-r--r--lib/Archive/Tar/t/src/short/foo.tbz.packed2
-rw-r--r--lib/Archive/Tar/t/src/short/foo.tgz.packed2
-rw-r--r--lib/CGI.pm281
-rw-r--r--lib/CGI/Util.pm21
-rw-r--r--lib/CGI/t/util-58.t42
-rw-r--r--lib/CPAN.pm39
-rw-r--r--lib/CPAN/Author.pm31
-rw-r--r--lib/CPAN/Complete.pm12
-rw-r--r--lib/CPAN/DeferedCode.pm16
-rw-r--r--lib/CPAN/Distribution.pm19
-rw-r--r--lib/CPAN/Distroprefs.pm9
-rw-r--r--lib/CPAN/Exception/RecursiveDependency.pm15
-rw-r--r--lib/CPAN/Exception/blocked_urllist.pm40
-rw-r--r--lib/CPAN/FTP.pm48
-rw-r--r--lib/CPAN/FTP/netrc.pm2
-rw-r--r--lib/CPAN/FirstTime.pm106
-rw-r--r--lib/CPAN/HandleConfig.pm1
-rw-r--r--lib/CPAN/Index.pm73
-rw-r--r--lib/CPAN/LWP/UserAgent.pm2
-rw-r--r--lib/CPAN/Module.pm47
-rw-r--r--lib/CPAN/Shell.pm17
-rw-r--r--lib/CPANPLUS.pm2
-rw-r--r--lib/CPANPLUS/Dist/Build.pm100
-rw-r--r--lib/CPANPLUS/Dist/Build/Constants.pm2
-rw-r--r--lib/CPANPLUS/Dist/Build/t/02_CPANPLUS-Dist-Build.t3
-rw-r--r--lib/CPANPLUS/Dist/MM.pm13
-rw-r--r--lib/CPANPLUS/Internals.pm15
-rw-r--r--lib/CPANPLUS/Module.pm148
-rw-r--r--lib/CPANPLUS/Selfupdate.pm2
-rw-r--r--lib/CPANPLUS/Shell/Classic.pm2
-rw-r--r--lib/CPANPLUS/Shell/Default.pm2
-rw-r--r--lib/CPANPLUS/inc.pm522
-rw-r--r--lib/CPANPLUS/t/00_CPANPLUS-Inc.t190
-rw-r--r--lib/CPANPLUS/t/02_CPANPLUS-Internals.t24
-rw-r--r--lib/CPANPLUS/t/20_CPANPLUS-Dist-MM.t4
-rw-r--r--lib/CPANPLUS/t/21_CPANPLUS-Dist-No-Build.t2
-rw-r--r--lib/CPANPLUS/t/40_CPANPLUS-Internals-Report.t9
-rw-r--r--lib/CPANPLUS/t/dummy-CPAN/authors/01mailrc.txt.gz.packed2
-rw-r--r--lib/CPANPLUS/t/dummy-CPAN/authors/id/EUNOXS/Bundle-Foo-Bar-0.01.tar.gz.packed2
-rw-r--r--lib/CPANPLUS/t/dummy-CPAN/authors/id/EUNOXS/Foo-Bar-0.01.tar.gz.packed2
-rw-r--r--lib/CPANPLUS/t/dummy-CPAN/authors/id/EUNOXS/perl5.005_03.tar.gz.packed2
-rw-r--r--lib/CPANPLUS/t/dummy-CPAN/authors/id/EUXS/Foo-Bar-0.01.tar.gz.packed2
-rw-r--r--lib/CPANPLUS/t/dummy-CPAN/authors/id/MBNOXS/Foo-Bar-0.01.tar.gz.packed2
-rw-r--r--lib/CPANPLUS/t/dummy-CPAN/authors/id/MBXS/Foo-Bar-0.01.tar.gz.packed2
-rw-r--r--lib/CPANPLUS/t/dummy-CPAN/modules/02packages.details.txt.gz.packed2
-rw-r--r--lib/CPANPLUS/t/dummy-CPAN/modules/03modlist.data.gz.packed2
-rw-r--r--lib/CPANPLUS/t/inc/conf.pl36
-rw-r--r--lib/Cwd.pm2
-rw-r--r--lib/ExtUtils/Command/MM.pm2
-rw-r--r--lib/ExtUtils/Liblist.pm2
-rw-r--r--lib/ExtUtils/Liblist/Kid.pm2
-rw-r--r--lib/ExtUtils/MM.pm2
-rw-r--r--lib/ExtUtils/MM_AIX.pm2
-rw-r--r--lib/ExtUtils/MM_Any.pm2
-rw-r--r--lib/ExtUtils/MM_BeOS.pm2
-rw-r--r--lib/ExtUtils/MM_Cygwin.pm2
-rw-r--r--lib/ExtUtils/MM_DOS.pm2
-rw-r--r--lib/ExtUtils/MM_Darwin.pm2
-rw-r--r--lib/ExtUtils/MM_Haiku.pm63
-rw-r--r--lib/ExtUtils/MM_MacOS.pm2
-rw-r--r--lib/ExtUtils/MM_NW5.pm2
-rw-r--r--lib/ExtUtils/MM_OS2.pm2
-rw-r--r--lib/ExtUtils/MM_QNX.pm2
-rw-r--r--lib/ExtUtils/MM_UWIN.pm2
-rw-r--r--lib/ExtUtils/MM_Unix.pm2
-rw-r--r--lib/ExtUtils/MM_VMS.pm2
-rw-r--r--lib/ExtUtils/MM_VOS.pm2
-rw-r--r--lib/ExtUtils/MM_Win32.pm2
-rw-r--r--lib/ExtUtils/MM_Win95.pm2
-rw-r--r--lib/ExtUtils/MY.pm2
-rw-r--r--lib/ExtUtils/MakeMaker.pm2
-rw-r--r--lib/ExtUtils/MakeMaker/Config.pm2
-rw-r--r--lib/ExtUtils/MakeMaker/bytes.pm2
-rw-r--r--lib/ExtUtils/MakeMaker/vmsish.pm2
-rw-r--r--lib/ExtUtils/Mkbootstrap.pm2
-rw-r--r--lib/ExtUtils/Mksymlists.pm2
-rw-r--r--lib/ExtUtils/testlib.pm2
-rw-r--r--lib/Fatal.pm16
-rw-r--r--lib/File/Copy.pm6
-rwxr-xr-xlib/File/Copy.t39
-rw-r--r--lib/File/Find.pm4
-rw-r--r--lib/File/stat.pm217
-rw-r--r--lib/File/stat.t22
-rw-r--r--lib/Getopt/Long.pm97
-rw-r--r--lib/Getopt/Long/CHANGES22
-rw-r--r--lib/Getopt/Long/README2
-rw-r--r--lib/IPC/Cmd.pm2
-rw-r--r--lib/IPC/Cmd/t/01_IPC-Cmd.t2
-rw-r--r--lib/IPC/Cmd/t/src/x.tgz.packed2
-rw-r--r--lib/Module/Build.pm3
-rw-r--r--lib/Module/Build/Base.pm2
-rw-r--r--lib/Module/Build/Changes4
-rw-r--r--lib/Module/Build/Compat.pm2
-rw-r--r--lib/Module/Build/Config.pm2
-rw-r--r--lib/Module/Build/Cookbook.pm2
-rw-r--r--lib/Module/Build/Dumper.pm2
-rw-r--r--lib/Module/Build/ModuleInfo.pm2
-rw-r--r--lib/Module/Build/Notes.pm2
-rw-r--r--lib/Module/Build/PPMMaker.pm2
-rw-r--r--lib/Module/Build/Platform/Amiga.pm2
-rw-r--r--lib/Module/Build/Platform/Default.pm2
-rw-r--r--lib/Module/Build/Platform/EBCDIC.pm2
-rw-r--r--lib/Module/Build/Platform/MPEiX.pm2
-rw-r--r--lib/Module/Build/Platform/MacOS.pm2
-rw-r--r--lib/Module/Build/Platform/RiscOS.pm2
-rw-r--r--lib/Module/Build/Platform/Unix.pm2
-rw-r--r--lib/Module/Build/Platform/VMS.pm2
-rw-r--r--lib/Module/Build/Platform/VOS.pm2
-rw-r--r--lib/Module/Build/Platform/Windows.pm2
-rw-r--r--lib/Module/Build/Platform/aix.pm2
-rw-r--r--lib/Module/Build/Platform/cygwin.pm2
-rw-r--r--lib/Module/Build/Platform/darwin.pm2
-rw-r--r--lib/Module/Build/Platform/os2.pm2
-rw-r--r--lib/Module/Build/PodParser.pm2
-rw-r--r--lib/Module/CoreList.pm925
-rw-r--r--lib/NEXT.pm18
-rw-r--r--lib/NEXT/Changes121
-rw-r--r--lib/Net/hostent.t5
-rw-r--r--lib/Parse/CPAN/Meta.pm2
-rw-r--r--lib/Parse/CPAN/Meta/Changes3
-rw-r--r--lib/Term/UI.pm4
-rw-r--r--lib/Text/Tabs.pm2
-rw-r--r--lib/Text/TabsWrap/CHANGELOG9
-rw-r--r--lib/Text/TabsWrap/t/Jacobson.t2
-rw-r--r--lib/Text/TabsWrap/t/Jacobson2.t2
-rw-r--r--lib/Text/TabsWrap/t/dandv.t8
-rwxr-xr-xlib/Text/TabsWrap/t/fill.t5
-rwxr-xr-xlib/Text/TabsWrap/t/tabs.t5
-rwxr-xr-xlib/Text/TabsWrap/t/wrap.t23
-rw-r--r--lib/Text/TabsWrap/t/wrap_separator2.t13
-rw-r--r--lib/Text/Wrap.pm37
-rw-r--r--lib/autodie.pm7
-rw-r--r--lib/autodie/exception.pm24
-rw-r--r--lib/autodie/exception/system.pm4
-rwxr-xr-xlib/h2ph.t37
-rw-r--r--lib/newgetopt.pl2
-rw-r--r--lib/overload.pm25
-rw-r--r--lib/overload/numbers.pm2
-rw-r--r--lib/perl5db.pl1
-rw-r--r--make_ext.pl3
-rw-r--r--mg.c29
-rw-r--r--mint/README2
-rw-r--r--op.c43
-rw-r--r--overload.c2
-rw-r--r--overload.h1
-rw-r--r--overload.pl1
-rw-r--r--pad.c8
-rw-r--r--pad.h2
-rw-r--r--perl.c148
-rw-r--r--perl.h39
-rw-r--r--perly.act728
-rw-r--r--perly.h42
-rw-r--r--perly.tab1319
-rw-r--r--perly.y2
-rw-r--r--plan9/config_sh.sample10
-rw-r--r--plan9/mkfile4
-rw-r--r--pod.lst10
-rw-r--r--pod/.gitignore7
-rw-r--r--pod/buildtoc112
-rw-r--r--pod/perl.pod3
-rw-r--r--pod/perlapi.pod7382
-rw-r--r--pod/perlboot.pod407
-rw-r--r--pod/perldiag.pod37
-rw-r--r--pod/perldoc.pod3
-rw-r--r--pod/perlembed.pod19
-rw-r--r--pod/perlfaq9.pod3
-rw-r--r--pod/perlfunc.pod4
-rw-r--r--pod/perlintern.pod1100
-rw-r--r--pod/perlobj.pod9
-rw-r--r--pod/perlothrtut.pod1067
-rw-r--r--pod/perlpod.pod4
-rw-r--r--pod/perlport.pod4
-rw-r--r--pod/perlrecharclass.pod2
-rw-r--r--pod/perlreftut.pod4
-rw-r--r--pod/perlretut.pod10
-rw-r--r--pod/perlrun.pod4
-rw-r--r--pod/perlsyn.pod23
-rw-r--r--pod/perltoc.pod36909
-rw-r--r--pod/perltodo.pod14
-rw-r--r--pod/perlvar.pod7
-rw-r--r--pod/perlvms.pod (renamed from vms/perlvms.pod)0
-rw-r--r--pod/perlxs.pod6
-rw-r--r--pod/perlxstut.pod4
-rw-r--r--pod/roffitall1
-rw-r--r--pp.h30
-rw-r--r--pp_ctl.c43
-rw-r--r--pp_hot.c12
-rw-r--r--pp_sys.c112
-rw-r--r--proto.h4
-rw-r--r--regen_lib.pl14
-rw-r--r--regen_perly.pl32
-rw-r--r--regexec.c23
-rw-r--r--sv.c53
-rw-r--r--symbian/config.pl2
-rw-r--r--symbian/config.sh4
-rw-r--r--symbian/install.cfg2
-rwxr-xr-xt/TEST9
-rwxr-xr-xt/base/lex.t7
-rw-r--r--t/harness9
-rw-r--r--t/io/perlio_leaks.t11
-rw-r--r--t/lib/autodie/basic_exceptions.t23
-rw-r--r--t/lib/autodie/caller.t34
-rw-r--r--t/lib/autodie/lib/Caller_helper.pm13
-rw-r--r--t/lib/autodie/scope_leak.t41
-rw-r--r--t/lib/autodie/user-context.t59
-rw-r--r--t/lib/common.pl31
-rw-r--r--t/lib/compress/generic.pl19
-rw-r--r--t/lib/compress/merge.pl12
-rw-r--r--t/lib/compress/multi.pl48
-rw-r--r--t/lib/compress/oneshot.pl34
-rw-r--r--t/lib/h2ph.h6
-rw-r--r--t/lib/h2ph.pht24
-rw-r--r--t/lib/warnings/op9
-rw-r--r--t/lib/warnings/toke15
-rw-r--r--t/op/attrs.t35
-rw-r--r--t/op/each_array.t4
-rwxr-xr-xt/op/filetest.t101
-rwxr-xr-xt/op/pat.t221
-rw-r--r--t/op/qr_gc.t6
-rwxr-xr-xt/op/substr.t3
-rw-r--r--t/op/switch.t103
-rw-r--r--t/op/threads.t7
-rw-r--r--[-rwxr-xr-x]t/op/time.t21
-rwxr-xr-xt/op/write.t19
-rw-r--r--t/run/runenv.t11
-rwxr-xr-xtime64.c140
-rw-r--r--time64.h14
-rw-r--r--time64_config.h12
-rw-r--r--toke.c22
-rwxr-xr-xuconfig.sh4
-rw-r--r--universal.c14
-rw-r--r--util.c31
-rw-r--r--util.h6
-rw-r--r--utils/h2ph.PL7
-rw-r--r--utils/h2xs.PL15
-rw-r--r--utils/perlbug.PL6
-rw-r--r--vms/descrip_mms.template58
-rw-r--r--win32/Makefile29
-rw-r--r--win32/Makefile.ce6
-rw-r--r--win32/config.bc6
-rw-r--r--win32/config.ce6
-rw-r--r--win32/config.gc6
-rw-r--r--win32/config.vc6
-rw-r--r--win32/config.vc646
-rw-r--r--win32/dl_win32.xs15
-rw-r--r--win32/makefile.mk29
-rw-r--r--win32/pod.mak8
-rw-r--r--win32/win32.c6
-rw-r--r--win32/win32iop-o.h4
-rw-r--r--win32/wince.c4
-rw-r--r--x2p/find2perl.PL16
714 files changed, 14440 insertions, 56758 deletions
diff --git a/.gitignore b/.gitignore
index aa03fb22f1..ba6fe411ee 100644
--- a/.gitignore
+++ b/.gitignore
@@ -97,6 +97,7 @@ t/test_state
realclean.sh
veryclean.sh
-# metaconfig needs these two symlinks
+# metaconfig needs these three symlinks
.package
U
+MANIFEST.new
diff --git a/Configure b/Configure
index 47ca217cb4..ed36e6992d 100755
--- a/Configure
+++ b/Configure
@@ -25,7 +25,7 @@
# $Id: Head.U 6 2006-08-25 22:21:46Z rmanfredi $
#
-# Generated on Tue Feb 10 17:34:27 CET 2009 [metaconfig 3.5 PL0]
+# Generated on Wed Mar 25 17:28:24 CET 2009 [metaconfig 3.5 PL0]
# (with additional metaconfig patches by perlbug@perl.org)
cat >c1$$ <<EOF
@@ -467,6 +467,7 @@ d_ftime=''
d_gettimeod=''
d_futimes=''
d_Gconvert=''
+d_getaddrinfo=''
d_getcwd=''
d_getespwnam=''
d_getfsstat=''
@@ -498,6 +499,7 @@ d_getlogin_r=''
getlogin_r_proto=''
d_getmnt=''
d_getmntent=''
+d_getnameinfo=''
d_getnbyaddr=''
d_getnbyname=''
d_getnent=''
@@ -554,6 +556,8 @@ d_hasmntopt=''
d_htonl=''
d_ilogbl=''
d_inetaton=''
+d_inetntop=''
+d_inetpton=''
d_int64_t=''
d_isascii=''
d_isfinite=''
@@ -13394,6 +13398,10 @@ eval $ndbm_hdr_protochk
set gdbm_ndbm gdbm-ndbm.h
eval $ndbm_hdr_protochk
+: see if getaddrinfo exists
+set getaddrinfo d_getaddrinfo
+eval $inlibc
+
: see if getcwd exists
set getcwd d_getcwd
eval $inlibc
@@ -13943,6 +13951,10 @@ eval $inlibc
set getmntent d_getmntent
eval $inlibc
+: see if getnameinfo exists
+set getnameinfo d_getnameinfo
+eval $inlibc
+
: see if getnetbyaddr exists
set getnetbyaddr d_getnbyaddr
eval $inlibc
@@ -14886,6 +14898,14 @@ set d_index; eval $setvar
set inet_aton d_inetaton
eval $inlibc
+: see if inet_ntop exists
+set inet_ntop d_inetntop
+eval $inlibc
+
+: see if inet_pton exists
+set inet_pton d_inetpton
+eval $inlibc
+
: Look for isascii
echo " "
$cat >isascii.c <<EOCP
@@ -22299,6 +22319,7 @@ d_ftime='$d_ftime'
d_futimes='$d_futimes'
d_gdbm_ndbm_h_uses_prototypes='$d_gdbm_ndbm_h_uses_prototypes'
d_gdbmndbm_h_uses_prototypes='$d_gdbmndbm_h_uses_prototypes'
+d_getaddrinfo='$d_getaddrinfo'
d_getcwd='$d_getcwd'
d_getespwnam='$d_getespwnam'
d_getfsstat='$d_getfsstat'
@@ -22320,6 +22341,7 @@ d_getlogin='$d_getlogin'
d_getlogin_r='$d_getlogin_r'
d_getmnt='$d_getmnt'
d_getmntent='$d_getmntent'
+d_getnameinfo='$d_getnameinfo'
d_getnbyaddr='$d_getnbyaddr'
d_getnbyname='$d_getnbyname'
d_getnent='$d_getnent'
@@ -22365,6 +22387,8 @@ d_ilogbl='$d_ilogbl'
d_inc_version_list='$d_inc_version_list'
d_index='$d_index'
d_inetaton='$d_inetaton'
+d_inetntop='$d_inetntop'
+d_inetpton='$d_inetpton'
d_int64_t='$d_int64_t'
d_isascii='$d_isascii'
d_isfinite='$d_isfinite'
diff --git a/Cross/Makefile-cross-SH b/Cross/Makefile-cross-SH
index a078988f3c..806bc09494 100755
--- a/Cross/Makefile-cross-SH
+++ b/Cross/Makefile-cross-SH
@@ -358,7 +358,7 @@ h = $(h1) $(h2) $(h3) $(h4) $(h5)
c1 = av.c scope.c op.c doop.c doio.c dump.c gv.c hv.c mg.c reentr.c mro.c perl.c
c2 = perly.c pp.c pp_hot.c pp_ctl.c pp_sys.c regcomp.c regexec.c utf8.c sv.c
-c3 = taint.c toke.c util.c deb.c run.c universal.c xsutils.c pad.c globals.c
+c3 = taint.c toke.c util.c deb.c run.c universal.c pad.c globals.c
c4 = perlio.c perlapi.c numeric.c mathoms.c locale.c pp_pack.c pp_sort.c
c5 = $(madlysrc) $(mallocsrc)
@@ -366,7 +366,7 @@ c = $(c1) $(c2) $(c3) $(c4) $(c5) miniperlmain.c perlmain.c opmini.c
obj1 = $(madlyobj) $(mallocobj) gv$(OBJ_EXT) toke$(OBJ_EXT) perly$(OBJ_EXT) op$(OBJ_EXT) pad$(OBJ_EXT) regcomp$(OBJ_EXT) dump$(OBJ_EXT) util$(OBJ_EXT) mg$(OBJ_EXT) reentr$(OBJ_EXT) mro$(OBJ_EXT)
obj2 = hv$(OBJ_EXT) av$(OBJ_EXT) perl$(OBJ_EXT) run$(OBJ_EXT) pp_hot$(OBJ_EXT) sv$(OBJ_EXT) pp$(OBJ_EXT) scope$(OBJ_EXT) pp_ctl$(OBJ_EXT) pp_sys$(OBJ_EXT)
-obj3 = doop$(OBJ_EXT) doio$(OBJ_EXT) regexec$(OBJ_EXT) utf8$(OBJ_EXT) taint$(OBJ_EXT) deb$(OBJ_EXT) universal$(OBJ_EXT) xsutils$(OBJ_EXT) globals$(OBJ_EXT) perlio$(OBJ_EXT) perlapi$(OBJ_EXT) numeric$(OBJ_EXT) mathoms$(OBJ_EXT) locale$(OBJ_EXT) pp_pack$(OBJ_EXT) pp_sort$(OBJ_EXT)
+obj3 = doop$(OBJ_EXT) doio$(OBJ_EXT) regexec$(OBJ_EXT) utf8$(OBJ_EXT) taint$(OBJ_EXT) deb$(OBJ_EXT) universal$(OBJ_EXT) globals$(OBJ_EXT) perlio$(OBJ_EXT) perlapi$(OBJ_EXT) numeric$(OBJ_EXT) mathoms$(OBJ_EXT) locale$(OBJ_EXT) pp_pack$(OBJ_EXT) pp_sort$(OBJ_EXT)
obj = $(obj1) $(obj2) $(obj3) $(ARCHOBJS)
diff --git a/Cross/cflags-cross-arm b/Cross/cflags-cross-arm
index d33b1136de..acec8cc80f 100755
--- a/Cross/cflags-cross-arm
+++ b/Cross/cflags-cross-arm
@@ -108,7 +108,6 @@ for file do
usersub) ;;
utf8) ;;
util) ;;
- xsutils) ;;
*) ;;
esac
diff --git a/Cross/config.sh-arm-linux b/Cross/config.sh-arm-linux
index 7c9ccce284..d054b59f36 100644
--- a/Cross/config.sh-arm-linux
+++ b/Cross/config.sh-arm-linux
@@ -200,6 +200,7 @@ d__fwalk='undef'
d_gdbm_ndbm_h_uses_prototypes='undef'
d_gdbmndbm_h_uses_prototypes='undef'
d_getcwd='define'
+d_getaddrinfo='undef'
d_getespwnam='undef'
d_getfsstat='undef'
d_getgrent='define'
@@ -220,6 +221,7 @@ d_getlogin='define'
d_getlogin_r='undef'
d_getmntent='define'
d_getmnt='undef'
+d_getnameinfo='undef'
d_getnbyaddr='define'
d_getnbyname='define'
d_getnent='define'
@@ -265,6 +267,8 @@ d_ilogbl='define'
d_inc_version_list='define'
d_index='undef'
d_inetaton='define'
+d_inetntop='undef'
+d_inetpton='undef'
d_int64_t='define'
d_isascii='define'
d_isfinite='undef'
@@ -542,7 +546,7 @@ doublesize='8'
drand01='drand48()'
drand48_r_proto='0'
dtrace=''
-dynamic_ext='B ByteLoader Cwd Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes Unicode/Normalize XS/APItest XS/Typemap attrs re threads threads/shared'
+dynamic_ext='B ByteLoader Cwd Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes Unicode/Normalize XS/APItest XS/Typemap attributes re threads threads/shared'
eagain='EAGAIN'
ebcdic='undef'
echo='echo'
@@ -557,7 +561,7 @@ endservent_r_proto='0'
eunicefix=':'
exe_ext=''
expr='expr'
-extensions='B ByteLoader Cwd Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes Unicode/Normalize XS/APItest XS/Typemap attrs re threads threads/shared Errno'
+extensions='B ByteLoader Cwd Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes Unicode/Normalize XS/APItest XS/Typemap attributes re threads threads/shared Errno'
extras=''
fflushNULL='define'
fflushall='undef'
@@ -747,7 +751,7 @@ issymlink='/usr/bin/test -h'
ivdformat='"ld"'
ivsize='4'
ivtype='long'
-known_extensions='B ByteLoader Cwd DB_File Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call GDBM_File I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 NDBM_File ODBM_File Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes Unicode/Normalize XS/APItest XS/Typemap attrs re threads threads/shared'
+known_extensions='B ByteLoader Cwd DB_File Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call GDBM_File I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 NDBM_File ODBM_File Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes Unicode/Normalize XS/APItest XS/Typemap attributes re threads threads/shared'
ksh=''
ld='cc'
lddlflags='-shared -L/usr/local/lib'
diff --git a/Cross/config.sh-arm-linux-n770 b/Cross/config.sh-arm-linux-n770
index a07fcbbd9a..6c2fd8f59a 100644
--- a/Cross/config.sh-arm-linux-n770
+++ b/Cross/config.sh-arm-linux-n770
@@ -531,7 +531,7 @@ dlsrc='dl_dlopen.xs'
doublesize='8'
drand01='drand48()'
drand48_r_proto='0'
-dynamic_ext='B ByteLoader Cwd Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes Unicode/Normalize XS/APItest XS/Typemap attrs re threads threads/shared'
+dynamic_ext='B ByteLoader Cwd Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes Unicode/Normalize XS/APItest XS/Typemap attributes re threads threads/shared'
eagain='EAGAIN'
ebcdic='undef'
echo='echo'
@@ -546,7 +546,7 @@ endservent_r_proto='0'
eunicefix=':'
exe_ext=''
expr='expr'
-extensions='B ByteLoader Cwd Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes Unicode/Normalize XS/APItest XS/Typemap attrs re threads threads/shared Errno'
+extensions='B ByteLoader Cwd Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes Unicode/Normalize XS/APItest XS/Typemap attributes re threads threads/shared Errno'
extras=''
fflushNULL='define'
fflushall='undef'
@@ -736,7 +736,7 @@ issymlink='/usr/bin/test -h'
ivdformat='"ld"'
ivsize='4'
ivtype='long'
-known_extensions='B ByteLoader Cwd DB_File Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call GDBM_File I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 NDBM_File ODBM_File Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes Unicode/Normalize XS/APItest XS/Typemap attrs re threads threads/shared'
+known_extensions='B ByteLoader Cwd DB_File Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call GDBM_File I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 NDBM_File ODBM_File Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes Unicode/Normalize XS/APItest XS/Typemap attributes re threads threads/shared'
ksh=''
ld='arm-none-linux-gnueabi-gcc'
lddlflags='-shared -L/usr/local/lib'
diff --git a/MANIFEST b/MANIFEST
index abcac8d22f..583150c40c 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -88,10 +88,8 @@ ext/Attribute-Handlers/t/constants.t Test constants and Attribute::Handlers
ext/Attribute-Handlers/t/data_convert.t Test attribute data conversion
ext/Attribute-Handlers/t/linerep.t See if Attribute::Handlers works
ext/Attribute-Handlers/t/multi.t See if Attribute::Handlers works
-ext/attrs/attrs.pm attrs extension Perl module
-ext/attrs/attrs.xs attrs extension external subroutines
-ext/attrs/Makefile.PL attrs extension makefile writer
-ext/attrs/t/attrs.t See if attrs works with C<sub : attrs>
+ext/attributes/attributes.pm For "sub foo : attrlist"
+ext/attributes/attributes.xs For "sub foo : attrlist"
ext/B/B/Concise.pm Compiler Concise backend
ext/B/B/Debug.pm Compiler Debug backend
ext/B/B/Deparse.pm Compiler Deparse backend
@@ -133,35 +131,36 @@ ext/B/t/showlex.t See if B::ShowLex works
ext/B/t/terse.t See if B::Terse works
ext/B/t/xref.t See if B::Xref works
ext/B/typemap Compiler backend interface types
-ext/Compress-Raw-Bzip2/README
-ext/Compress-Raw-Bzip2/Makefile.PL
-ext/Compress-Raw-Bzip2/Bzip2.xs
-ext/Compress-Raw-Bzip2/typemap
-ext/Compress-Raw-Bzip2/fallback/constants.h
-ext/Compress-Raw-Bzip2/fallback/constants.xs
-ext/Compress-Raw-Bzip2/private/MakeUtil.pm
-ext/Compress-Raw-Bzip2/t/000prereq.t
-ext/Compress-Raw-Bzip2/t/01bzip2.t
-ext/Compress-Raw-Bzip2/t/99pod.t
-ext/Compress-Raw-Bzip2/lib/Compress/Raw/Bzip2.pm
ext/Compress-Raw-Bzip2/bzip2-src/blocksort.c
-ext/Compress-Raw-Bzip2/bzip2-src/huffman.c
-ext/Compress-Raw-Bzip2/bzip2-src/crctable.c
-ext/Compress-Raw-Bzip2/bzip2-src/randtable.c
-ext/Compress-Raw-Bzip2/bzip2-src/compress.c
-ext/Compress-Raw-Bzip2/bzip2-src/decompress.c
-ext/Compress-Raw-Bzip2/bzip2-src/bzlib.c
ext/Compress-Raw-Bzip2/bzip2-src/bzip2.c
ext/Compress-Raw-Bzip2/bzip2-src/bzip2recover.c
+ext/Compress-Raw-Bzip2/bzip2-src/bzlib.c
ext/Compress-Raw-Bzip2/bzip2-src/bzlib.h
ext/Compress-Raw-Bzip2/bzip2-src/bzlib_private.h
+ext/Compress-Raw-Bzip2/bzip2-src/compress.c
+ext/Compress-Raw-Bzip2/bzip2-src/crctable.c
+ext/Compress-Raw-Bzip2/bzip2-src/decompress.c
ext/Compress-Raw-Bzip2/bzip2-src/dlltest.c
-ext/Compress-Raw-Bzip2/bzip2-src/unzcrash.c
-ext/Compress-Raw-Bzip2/bzip2-src/spewG.c
-ext/Compress-Raw-Bzip2/bzip2-src/mk251.c
+ext/Compress-Raw-Bzip2/bzip2-src/huffman.c
ext/Compress-Raw-Bzip2/bzip2-src/LICENSE
+ext/Compress-Raw-Bzip2/bzip2-src/mk251.c
+ext/Compress-Raw-Bzip2/bzip2-src/randtable.c
+ext/Compress-Raw-Bzip2/bzip2-src/spewG.c
+ext/Compress-Raw-Bzip2/bzip2-src/unzcrash.c
+ext/Compress-Raw-Bzip2/Bzip2.xs
ext/Compress-Raw-Bzip2/Changes
+ext/Compress-Raw-Bzip2/fallback/constants.h
+ext/Compress-Raw-Bzip2/fallback/constants.xs
+ext/Compress-Raw-Bzip2/lib/Compress/Raw/Bzip2.pm
+ext/Compress-Raw-Bzip2/Makefile.PL
ext/Compress-Raw-Bzip2/pod/FAQ.pod
+ext/Compress-Raw-Bzip2/private/MakeUtil.pm
+ext/Compress-Raw-Bzip2/README
+ext/Compress-Raw-Bzip2/t/000prereq.t
+ext/Compress-Raw-Bzip2/t/01bzip2.t
+ext/Compress-Raw-Bzip2/t/09limitoutput.t
+ext/Compress-Raw-Bzip2/t/99pod.t
+ext/Compress-Raw-Bzip2/typemap
ext/Compress-Raw-Zlib/Changes Compress::Raw::Zlib
ext/Compress-Raw-Zlib/config.in Compress::Raw::Zlib
ext/Compress-Raw-Zlib/examples/filtdef Compress::Raw::Zlib
@@ -176,6 +175,7 @@ ext/Compress-Raw-Zlib/README Compress::Raw::Zlib
ext/Compress-Raw-Zlib/t/01version.t Compress::Raw::Zlib
ext/Compress-Raw-Zlib/t/02zlib.t Compress::Raw::Zlib
ext/Compress-Raw-Zlib/t/07bufsize.t Compress::Raw::Zlib
+ext/Compress-Raw-Zlib/t/09limitoutput.t Compress::Raw::Zlib
ext/Compress-Raw-Zlib/t/18lvalue.t Compress::Raw::Zlib
ext/Compress-Raw-Zlib/typemap Compress::Raw::Zlib
ext/Compress-Raw-Zlib/zlib-src/adler32.c Compress::Raw::Zlib
@@ -200,23 +200,6 @@ ext/Compress-Raw-Zlib/zlib-src/zlib.h Compress::Raw::Zlib
ext/Compress-Raw-Zlib/zlib-src/zutil.c Compress::Raw::Zlib
ext/Compress-Raw-Zlib/zlib-src/zutil.h Compress::Raw::Zlib
ext/Compress-Raw-Zlib/Zlib.xs Compress::Raw::Zlib
-ext/Compress-Zlib/Changes Compress::Zlib
-ext/Compress-Zlib/examples/filtdef Compress::Zlib
-ext/Compress-Zlib/examples/filtinf Compress::Zlib
-ext/Compress-Zlib/examples/gzcat Compress::Zlib
-ext/Compress-Zlib/examples/gzgrep Compress::Zlib
-ext/Compress-Zlib/examples/gzstream Compress::Zlib
-ext/Compress-Zlib/lib/Compress/Zlib.pm Compress::Zlib
-ext/Compress-Zlib/Makefile.PL Compress::Zlib
-ext/Compress-Zlib/pod/FAQ.pod Compress::Zlib
-ext/Compress-Zlib/private/MakeUtil.pm Compress::Zlib
-ext/Compress-Zlib/README Compress::Zlib
-ext/Compress-Zlib/t/01version.t Compress::Zlib
-ext/Compress-Zlib/t/03zlib-v1.t Compress::Zlib
-ext/Compress-Zlib/t/05examples.t Compress::Zlib
-ext/Compress-Zlib/t/06gzsetp.t Compress::Zlib
-ext/Compress-Zlib/t/08encoding.t Compress::Zlib
-ext/Compress-Zlib/t/14gzopen.t Compress::Zlib
ext/Cwd/Changes Cwd extension Changelog
ext/Cwd/Cwd.xs Cwd extension external subroutines
ext/Cwd/Makefile.PL Cwd extension makefile maker
@@ -226,7 +209,6 @@ ext/Cwd/t/win32.t See if Cwd works on Win32
ext/Data-Dumper/Changes Data pretty printer, changelog
ext/Data-Dumper/Dumper.pm Data pretty printer, module
ext/Data-Dumper/Dumper.xs Data pretty printer, externals
-ext/Data-Dumper/Makefile.PL Data pretty printer, makefile writer
ext/Data-Dumper/t/bless.t See if Data::Dumper works
ext/Data-Dumper/t/bugs.t See if Data::Dumper works
ext/Data-Dumper/t/dumper.t See if Data::Dumper works
@@ -722,7 +704,6 @@ ext/File-Glob/TODO File::Glob extension todo list
ext/File-Glob/t/taint.t See if File::Glob works
ext/Filter-Util-Call/Call.pm Filter::Util::Call extension module
ext/Filter-Util-Call/Call.xs Filter::Util::Call extension external subroutines
-ext/Filter-Util-Call/Makefile.PL Filter::Util::Call extension makefile writer
ext/Filter-Util-Call/t/call.t See if Filter::Util::Call works
ext/GDBM_File/GDBM_File.pm GDBM extension Perl module
ext/GDBM_File/GDBM_File.xs GDBM extension external subroutines
@@ -734,7 +715,6 @@ ext/Hash-Util/Changes Change history of Hash::Util
ext/Hash-Util-FieldHash/Changes Changes for Hash::Util::FieldHash
ext/Hash-Util-FieldHash/FieldHash.xs XS portion
ext/Hash-Util-FieldHash/lib/Hash/Util/FieldHash.pm Perl portion and documentation
-ext/Hash-Util-FieldHash/Makefile.PL Makefile for Hash::Util::FieldHash
ext/Hash-Util-FieldHash/t/01_load.t Test script
ext/Hash-Util-FieldHash/t/02_function.t Test script
ext/Hash-Util-FieldHash/t/03_class.t Test script
@@ -754,107 +734,137 @@ ext/I18N-Langinfo/Langinfo.xs I18N::Langinfo
ext/I18N-Langinfo/Makefile.PL I18N::Langinfo
ext/I18N-Langinfo/t/Langinfo.t See whether I18N::Langinfo works
ext/IO/ChangeLog IO perl module change log
-ext/IO_Compress_Base/Changes IO::Compress::Base
-ext/IO_Compress_Base/lib/File/GlobMapper.pm IO::Compress::Base
-ext/IO_Compress_Base/lib/IO/Compress/Base/Common.pm IO::Compress::Base
-ext/IO_Compress_Base/lib/IO/Compress/Base.pm IO::Compress::Base
-ext/IO_Compress_Base/lib/IO/Uncompress/AnyUncompress.pm IO::Compress::Base
-ext/IO_Compress_Base/lib/IO/Uncompress/Base.pm IO::Compress::Base
-ext/IO_Compress_Base/Makefile.PL IO::Compress::Base
-ext/IO_Compress_Base/pod/FAQ.pod IO::Compress::Base
-ext/IO_Compress_Base/private/MakeUtil.pm IO::Compress::Base
-ext/IO_Compress_Base/README IO::Compress::Base
-ext/IO_Compress_Base/t/01misc.t IO::Compress::Base
-ext/IO_Compress_Base/t/globmapper.t IO::Compress::Base
-ext/IO_Compress_Zlib/Changes IO::Compress::Zlib
-ext/IO_Compress_Zlib/examples/gzappend IO::Compress::Zlib
-ext/IO_Compress_Zlib/examples/gzcat IO::Compress::Zlib
-ext/IO_Compress_Zlib/examples/gzgrep IO::Compress::Zlib
-ext/IO_Compress_Zlib/examples/gzstream IO::Compress::Zlib
-ext/IO_Compress_Zlib/examples/unzip IO::Compress::Zlib
-ext/IO_Compress_Zlib/lib/IO/Compress/Adapter/Deflate.pm IO::Compress::Zlib
-ext/IO_Compress_Zlib/lib/IO/Compress/Adapter/Identity.pm IO::Compress::Zlib
-ext/IO_Compress_Zlib/lib/IO/Compress/Deflate.pm IO::Compress::Zlib
-ext/IO_Compress_Zlib/lib/IO/Compress/Gzip/Constants.pm IO::Compress::Zlib
-ext/IO_Compress_Zlib/lib/IO/Compress/Gzip.pm IO::Compress::Zlib
-ext/IO_Compress_Zlib/lib/IO/Compress/RawDeflate.pm IO::Compress::Zlib
-ext/IO_Compress_Zlib/lib/IO/Compress/Zip/Constants.pm IO::Compress::Zlib
-ext/IO_Compress_Zlib/lib/IO/Compress/Zip.pm IO::Compress::Zlib
-ext/IO_Compress_Zlib/lib/IO/Compress/Zlib/Constants.pm IO::Compress::Zlib
-ext/IO_Compress_Zlib/lib/IO/Compress/Zlib/Extra.pm IO::Compress::Zlib
-ext/IO_Compress_Zlib/lib/IO/Uncompress/Adapter/Identity.pm IO::Compress::Zlib
-ext/IO_Compress_Zlib/lib/IO/Uncompress/Adapter/Inflate.pm IO::Compress::Zlib
-ext/IO_Compress_Zlib/lib/IO/Uncompress/AnyInflate.pm IO::Compress::Zlib
-ext/IO_Compress_Zlib/lib/IO/Uncompress/Gunzip.pm IO::Compress::Zlib
-ext/IO_Compress_Zlib/lib/IO/Uncompress/Inflate.pm IO::Compress::Zlib
-ext/IO_Compress_Zlib/lib/IO/Uncompress/RawInflate.pm IO::Compress::Zlib
-ext/IO_Compress_Zlib/lib/IO/Uncompress/Unzip.pm IO::Compress::Zlib
-ext/IO_Compress_Zlib/Makefile.PL IO::Compress::Zlib
-ext/IO_Compress_Zlib/pod/FAQ.pod IO::Compress::Zlib
-ext/IO_Compress_Zlib/private/MakeUtil.pm IO::Compress::Zlib
-ext/IO_Compress_Zlib/README IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/001zlib-generic-deflate.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/001zlib-generic-gzip.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/001zlib-generic-rawdeflate.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/001zlib-generic-zip.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/002any-deflate.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/002any-gzip.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/002any-rawdeflate.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/002any-transparent.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/002any-zip.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/004gziphdr.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/005defhdr.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/006zip.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/010examples.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/020isize.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/050interop-gzip.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/100generic-deflate.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/100generic-gzip.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/100generic-rawdeflate.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/100generic-zip.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/101truncate-deflate.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/101truncate-gzip.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/101truncate-rawdeflate.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/101truncate-zip.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/102tied-deflate.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/102tied-gzip.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/102tied-rawdeflate.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/102tied-zip.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/103newtied-deflate.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/103newtied-gzip.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/103newtied-rawdeflate.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/103newtied-zip.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/104destroy-deflate.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/104destroy-gzip.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/104destroy-rawdeflate.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/104destroy-zip.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/105oneshot-deflate.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/105oneshot-gzip-only.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/105oneshot-gzip.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/105oneshot-rawdeflate.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/105oneshot-zip-only.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/105oneshot-zip.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/106prime-deflate.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/106prime-gzip.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/106prime-rawdeflate.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/106prime-zip.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/107multi-deflate.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/107multi-gzip.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/107multi-rawdeflate.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/107multi-zip.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/108anyunc-deflate.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/108anyunc-gzip.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/108anyunc-rawdeflate.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/108anyunc-transparent.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/108anyunc-zip.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/109merge-deflate.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/109merge-gzip.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/109merge-rawdeflate.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/109merge-zip.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/110encode-deflate.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/110encode-gzip.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/110encode-rawdeflate.t IO::Compress::Zlib
-ext/IO_Compress_Zlib/t/110encode-zip.t IO::Compress::Zlib
+ext/IO-Compress/Changes IO::Compress
+ext/IO-Compress/examples/compress-zlib/filtdef IO::Compress
+ext/IO-Compress/examples/compress-zlib/filtinf IO::Compress
+ext/IO-Compress/examples/compress-zlib/gzcat IO::Compress
+ext/IO-Compress/examples/compress-zlib/gzgrep IO::Compress
+ext/IO-Compress/examples/compress-zlib/gzstream IO::Compress
+ext/IO-Compress/examples/io/anycat IO::Compress
+ext/IO-Compress/examples/io/bzip2/bzcat IO::Compress
+ext/IO-Compress/examples/io/bzip2/bzgrep IO::Compress
+ext/IO-Compress/examples/io/bzip2/bzstream IO::Compress
+ext/IO-Compress/examples/io/gzip/gzappend IO::Compress
+ext/IO-Compress/examples/io/gzip/gzcat IO::Compress
+ext/IO-Compress/examples/io/gzip/gzgrep IO::Compress
+ext/IO-Compress/examples/io/gzip/gzstream IO::Compress
+ext/IO-Compress/lib/Compress/Zlib.pm IO::Compress
+ext/IO-Compress/lib/File/GlobMapper.pm IO::Compress
+ext/IO-Compress/lib/IO/Compress/Adapter/Bzip2.pm IO::Compress
+ext/IO-Compress/lib/IO/Compress/Adapter/Deflate.pm IO::Compress
+ext/IO-Compress/lib/IO/Compress/Adapter/Identity.pm IO::Compress
+ext/IO-Compress/lib/IO/Compress/Base/Common.pm IO::Compress
+ext/IO-Compress/lib/IO/Compress/Base.pm IO::Compress
+ext/IO-Compress/lib/IO/Compress/Bzip2.pm IO::Compress
+ext/IO-Compress/lib/IO/Compress/Deflate.pm IO::Compress
+ext/IO-Compress/lib/IO/Compress/Gzip/Constants.pm IO::Compress
+ext/IO-Compress/lib/IO/Compress/Gzip.pm IO::Compress
+ext/IO-Compress/lib/IO/Compress/RawDeflate.pm IO::Compress
+ext/IO-Compress/lib/IO/Compress/Zip/Constants.pm IO::Compress
+ext/IO-Compress/lib/IO/Compress/Zip.pm IO::Compress
+ext/IO-Compress/lib/IO/Compress/Zlib/Constants.pm IO::Compress
+ext/IO-Compress/lib/IO/Compress/Zlib/Extra.pm IO::Compress
+ext/IO-Compress/lib/IO/Uncompress/Adapter/Bunzip2.pm IO::Compress
+ext/IO-Compress/lib/IO/Uncompress/Adapter/Identity.pm IO::Compress
+ext/IO-Compress/lib/IO/Uncompress/Adapter/Inflate.pm IO::Compress
+ext/IO-Compress/lib/IO/Uncompress/AnyInflate.pm IO::Compress
+ext/IO-Compress/lib/IO/Uncompress/AnyUncompress.pm IO::Compress
+ext/IO-Compress/lib/IO/Uncompress/Base.pm IO::Compress
+ext/IO-Compress/lib/IO/Uncompress/Bunzip2.pm IO::Compress
+ext/IO-Compress/lib/IO/Uncompress/Gunzip.pm IO::Compress
+ext/IO-Compress/lib/IO/Uncompress/Inflate.pm IO::Compress
+ext/IO-Compress/lib/IO/Uncompress/RawInflate.pm IO::Compress
+ext/IO-Compress/lib/IO/Uncompress/Unzip.pm IO::Compress
+ext/IO-Compress/Makefile.PL IO::Compress
+ext/IO-Compress/pod/FAQ.pod IO::Compress
+ext/IO-Compress/private/MakeUtil.pm IO::Compress
+ext/IO-Compress/README IO::Compress
+ext/IO-Compress/t/000prereq.t IO::Compress
+ext/IO-Compress/t/001bzip2.t IO::Compress
+ext/IO-Compress/t/001zlib-generic-deflate.t IO::Compress
+ext/IO-Compress/t/001zlib-generic-gzip.t IO::Compress
+ext/IO-Compress/t/001zlib-generic-rawdeflate.t IO::Compress
+ext/IO-Compress/t/001zlib-generic-zip.t IO::Compress
+ext/IO-Compress/t/002any-deflate.t IO::Compress
+ext/IO-Compress/t/002any-gzip.t IO::Compress
+ext/IO-Compress/t/002any-rawdeflate.t IO::Compress
+ext/IO-Compress/t/002any-transparent.t IO::Compress
+ext/IO-Compress/t/002any-zip.t IO::Compress
+ext/IO-Compress/t/004gziphdr.t IO::Compress
+ext/IO-Compress/t/005defhdr.t IO::Compress
+ext/IO-Compress/t/006zip.t IO::Compress
+ext/IO-Compress/t/010examples-bzip2.t IO::Compress
+ext/IO-Compress/t/010examples-zlib.t IO::Compress
+ext/IO-Compress/t/01misc.t IO::Compress
+ext/IO-Compress/t/020isize.t IO::Compress
+ext/IO-Compress/t/050interop-gzip.t IO::Compress
+ext/IO-Compress/t/100generic-bzip2.t IO::Compress
+ext/IO-Compress/t/100generic-deflate.t IO::Compress
+ext/IO-Compress/t/100generic-gzip.t IO::Compress
+ext/IO-Compress/t/100generic-rawdeflate.t IO::Compress
+ext/IO-Compress/t/100generic-zip.t IO::Compress
+ext/IO-Compress/t/101truncate-bzip2.t IO::Compress
+ext/IO-Compress/t/101truncate-deflate.t IO::Compress
+ext/IO-Compress/t/101truncate-gzip.t IO::Compress
+ext/IO-Compress/t/101truncate-rawdeflate.t IO::Compress
+ext/IO-Compress/t/101truncate-zip.t IO::Compress
+ext/IO-Compress/t/102tied-bzip2.t IO::Compress
+ext/IO-Compress/t/102tied-deflate.t IO::Compress
+ext/IO-Compress/t/102tied-gzip.t IO::Compress
+ext/IO-Compress/t/102tied-rawdeflate.t IO::Compress
+ext/IO-Compress/t/102tied-zip.t IO::Compress
+ext/IO-Compress/t/103newtied-bzip2.t IO::Compress
+ext/IO-Compress/t/103newtied-deflate.t IO::Compress
+ext/IO-Compress/t/103newtied-gzip.t IO::Compress
+ext/IO-Compress/t/103newtied-rawdeflate.t IO::Compress
+ext/IO-Compress/t/103newtied-zip.t IO::Compress
+ext/IO-Compress/t/104destroy-bzip2.t IO::Compress
+ext/IO-Compress/t/104destroy-deflate.t IO::Compress
+ext/IO-Compress/t/104destroy-gzip.t IO::Compress
+ext/IO-Compress/t/104destroy-rawdeflate.t IO::Compress
+ext/IO-Compress/t/104destroy-zip.t IO::Compress
+ext/IO-Compress/t/105oneshot-bzip2.t IO::Compress
+ext/IO-Compress/t/105oneshot-deflate.t IO::Compress
+ext/IO-Compress/t/105oneshot-gzip-only.t IO::Compress
+ext/IO-Compress/t/105oneshot-gzip.t IO::Compress
+ext/IO-Compress/t/105oneshot-rawdeflate.t IO::Compress
+ext/IO-Compress/t/105oneshot-zip-bzip2-only.t IO::Compress
+ext/IO-Compress/t/105oneshot-zip-only.t IO::Compress
+ext/IO-Compress/t/105oneshot-zip.t IO::Compress
+ext/IO-Compress/t/106prime-bzip2.t IO::Compress
+ext/IO-Compress/t/106prime-deflate.t IO::Compress
+ext/IO-Compress/t/106prime-gzip.t IO::Compress
+ext/IO-Compress/t/106prime-rawdeflate.t IO::Compress
+ext/IO-Compress/t/106prime-zip.t IO::Compress
+ext/IO-Compress/t/107multi-bzip2.t IO::Compress
+ext/IO-Compress/t/107multi-deflate.t IO::Compress
+ext/IO-Compress/t/107multi-gzip.t IO::Compress
+ext/IO-Compress/t/107multi-rawdeflate.t IO::Compress
+ext/IO-Compress/t/107multi-zip.t IO::Compress
+ext/IO-Compress/t/108anyunc-bzip2.t IO::Compress
+ext/IO-Compress/t/108anyunc-deflate.t IO::Compress
+ext/IO-Compress/t/108anyunc-gzip.t IO::Compress
+ext/IO-Compress/t/108anyunc-rawdeflate.t IO::Compress
+ext/IO-Compress/t/108anyunc-transparent.t IO::Compress
+ext/IO-Compress/t/108anyunc-zip.t IO::Compress
+ext/IO-Compress/t/109merge-deflate.t IO::Compress
+ext/IO-Compress/t/109merge-gzip.t IO::Compress
+ext/IO-Compress/t/109merge-rawdeflate.t IO::Compress
+ext/IO-Compress/t/109merge-zip.t IO::Compress
+ext/IO-Compress/t/110encode-bzip2.t IO::Compress
+ext/IO-Compress/t/110encode-deflate.t IO::Compress
+ext/IO-Compress/t/110encode-gzip.t IO::Compress
+ext/IO-Compress/t/110encode-rawdeflate.t IO::Compress
+ext/IO-Compress/t/110encode-zip.t IO::Compress
+ext/IO-Compress/t/999pod.t IO::Compress
+ext/IO-Compress/t/99pod.t IO::Compress
+ext/IO-Compress/t/cz-01version.t IO::Compress
+ext/IO-Compress/t/cz-05examples.t IO::Compress
+ext/IO-Compress/t/cz-06gzsetp.t IO::Compress
+ext/IO-Compress/t/cz-08encoding.t IO::Compress
+ext/IO-Compress/t/cz-14gzopen.t IO::Compress
+ext/IO-Compress/t/cz-99pod.t IO::Compress
+ext/IO-Compress/t/globmapper.t IO::Compress
ext/IO/hints/sco.pl Hint for IO for named architecture
ext/IO/IO.pm Top-level interface to IO::* classes
ext/IO/IO.xs IO extension external subroutines
@@ -947,13 +957,13 @@ ext/List-Util/t/reduce.t List::Util
ext/List-Util/t/refaddr.t Scalar::Util
ext/List-Util/t/reftype.t Scalar::Util
ext/List-Util/t/shuffle.t List::Util
+ext/List-Util/t/stack-corruption.t List::Util
ext/List-Util/t/sum.t List::Util
ext/List-Util/t/tainted.t Scalar::Util
ext/List-Util/t/weak.t Scalar::Util
ext/List-Util/Util.xs Util extension
ext/Math-BigInt-FastCalc/FastCalc.pm Math::BigInt::FastCalc extension
ext/Math-BigInt-FastCalc/FastCalc.xs Math::BigInt::FastCalc extension
-ext/Math-BigInt-FastCalc/Makefile.PL Math::BigInt::FastCalc extension
ext/Math-BigInt-FastCalc/t/bigintfc.t Math::BigInt::FastCalc extension
ext/Math-BigInt-FastCalc/t/bootstrap.t Math::BigInt::FastCalc extension
ext/Math-BigInt-FastCalc/t/leak.t test for memory leaks in Math::BigInt::FastCalc
@@ -972,8 +982,67 @@ ext/Module-Pluggable/lib/Devel/InnerPackage.pm Find inner packages
ext/Module-Pluggable/lib/Module/Pluggable/Object.pm Module::Pluggable
ext/Module-Pluggable/lib/Module/Pluggable.pm Module::Pluggable
ext/Module-Pluggable/Makefile.PL Module::Pluggable
+ext/Module-Pluggable/t/01use.t Module::Pluggable tests
+ext/Module-Pluggable/t/02alsoworks.t Module::Pluggable tests
+ext/Module-Pluggable/t/02works.t Module::Pluggable tests
+ext/Module-Pluggable/t/02works_taint.t Module::Pluggable tests
+ext/Module-Pluggable/t/03diffname.t Module::Pluggable tests
+ext/Module-Pluggable/t/04acmedir_single.t Module::Pluggable tests
+ext/Module-Pluggable/t/04acmedir.t Module::Pluggable tests
+ext/Module-Pluggable/t/04acmepath_single.t Module::Pluggable tests
+ext/Module-Pluggable/t/04acmepath.t Module::Pluggable tests
+ext/Module-Pluggable/t/05postpath.t Module::Pluggable tests
+ext/Module-Pluggable/t/06multipath.t Module::Pluggable tests
+ext/Module-Pluggable/t/07instantiate.t Module::Pluggable tests
+ext/Module-Pluggable/t/08nothing.t Module::Pluggable tests
+ext/Module-Pluggable/t/09require.t Module::Pluggable tests
+ext/Module-Pluggable/t/10innerpack_inner.t Module::Pluggable tests
+ext/Module-Pluggable/t/10innerpack_noinner.t Module::Pluggable tests
+ext/Module-Pluggable/t/10innerpack_onefile.t Module::Pluggable tests
+ext/Module-Pluggable/t/10innerpack_override.t Module::Pluggable tests
+ext/Module-Pluggable/t/10innerpack_super.t Module::Pluggable tests
+ext/Module-Pluggable/t/10innerpack.t Module::Pluggable tests
+ext/Module-Pluggable/t/11usetwice.t Module::Pluggable tests
+ext/Module-Pluggable/t/12onlyarray.t Module::Pluggable tests
+ext/Module-Pluggable/t/12onlyregex.t Module::Pluggable tests
+ext/Module-Pluggable/t/12onlyrequire.t Module::Pluggable tests
+ext/Module-Pluggable/t/12only.t Module::Pluggable tests
+ext/Module-Pluggable/t/13exceptarray.t Module::Pluggable tests
+ext/Module-Pluggable/t/13exceptregex.t Module::Pluggable tests
+ext/Module-Pluggable/t/13except.t Module::Pluggable tests
+ext/Module-Pluggable/t/14package.t Module::Pluggable tests
+ext/Module-Pluggable/t/15topicsafe.t Module::Pluggable tests
+ext/Module-Pluggable/t/16different_extension.t Module::Pluggable tests
+ext/Module-Pluggable/t/17devel_inner_package.t Module::Pluggable tests
+ext/Module-Pluggable/t/18skipped_package.t Module::Pluggable tests
+ext/Module-Pluggable/t/19can_ok_clobber.t Module::Pluggable tests
+ext/Module-Pluggable/t/20dodgy_files.t Module::Pluggable tests
+ext/Module-Pluggable/t/21editor_junk.t Module::Pluggable tests
+ext/Module-Pluggable/t/acme/Acme/MyTest/Plugin/Foo.pm Module::Pluggable tests
+ext/Module-Pluggable/t/lib/Acme/Foo-Bar.pm Module::Pluggable tests
+ext/Module-Pluggable/t/lib/Acme/MyTest/Plugin/Foo.pm Module::Pluggable tests
+ext/Module-Pluggable/t/lib/EditorJunk/Plugin/Bar.pm Module::Pluggable tests
+ext/Module-Pluggable/t/lib/EditorJunk/Plugin/Bar.pm~ Module::Pluggable tests
+ext/Module-Pluggable/t/lib/EditorJunk/Plugin/Bar.pm.swo Module::Pluggable tests
+ext/Module-Pluggable/t/lib/EditorJunk/Plugin/Bar.pm.swp Module::Pluggable tests
+ext/Module-Pluggable/t/lib/EditorJunk/Plugin/Foo.pm Module::Pluggable tests
+ext/Module-Pluggable/t/lib/ExtTest/Plugin/Bar.plugin Module::Pluggable tests
+ext/Module-Pluggable/t/lib/ExtTest/Plugin/Foo.plugin Module::Pluggable tests
+ext/Module-Pluggable/t/lib/ExtTest/Plugin/Quux/Foo.plugin Module::Pluggable tests
+ext/Module-Pluggable/t/lib/InnerTest/Plugin/Foo.pm Module::Pluggable tests
+ext/Module-Pluggable/t/lib/MyOtherTest/Plugin/Bar.pm Module::Pluggable tests
+ext/Module-Pluggable/t/lib/MyOtherTest/Plugin/Foo.pm Module::Pluggable tests
+ext/Module-Pluggable/t/lib/MyOtherTest/Plugin/Quux/Foo.pm Module::Pluggable tests
+ext/Module-Pluggable/t/lib/MyOtherTest/Plugin/Quux.pm Module::Pluggable tests
+ext/Module-Pluggable/t/lib/MyTest/Extend/Plugin/Bar.pm Module::Pluggable tests
+ext/Module-Pluggable/t/lib/MyTest/Plugin/Bar.pm Module::Pluggable tests
+ext/Module-Pluggable/t/lib/MyTest/Plugin/Foo.pm Module::Pluggable tests
+ext/Module-Pluggable/t/lib/MyTest/Plugin/Quux/Foo.pm Module::Pluggable tests
+ext/Module-Pluggable/t/lib/No/Middle.pm Module::Pluggable tests
+ext/Module-Pluggable/t/lib/OddTest/Plugin/Foo.pm Module::Pluggable tests
+ext/Module-Pluggable/t/lib/TA/C/A/I.pm Module::Pluggable tests
+ext/Module-Pluggable/t/lib/Zot/.Zork.pm Module::Pluggable tests
ext/mro/Changes mro extension
-ext/mro/Makefile.PL mro extension
ext/mro/mro.pm mro extension
ext/mro/mro.xs mro extension
ext/NDBM_File/hints/cygwin.pl Hint for NDBM_File for named architecture
@@ -1005,7 +1074,6 @@ ext/ODBM_File/ODBM_File.pm ODBM extension Perl module
ext/ODBM_File/ODBM_File.xs ODBM extension external subroutines
ext/ODBM_File/t/odbm.t See if ODBM_File works
ext/ODBM_File/typemap ODBM extension interface types
-ext/Opcode/Makefile.PL Opcode extension makefile writer
ext/Opcode/Opcode.pm Opcode extension Perl module
ext/Opcode/Opcode.xs Opcode extension external subroutines
ext/Opcode/ops.pm "Pragma" form of Opcode extension Perl module
@@ -1013,18 +1081,15 @@ ext/Opcode/t/Opcode.t See if Opcode works
ext/Opcode/t/ops.t See if Opcode works
ext/PerlIO-encoding/encoding.pm PerlIO::encoding
ext/PerlIO-encoding/encoding.xs PerlIO::encoding
-ext/PerlIO-encoding/Makefile.PL PerlIO::encoding makefile writer
ext/PerlIO-encoding/MANIFEST PerlIO::encoding list of files
ext/PerlIO-encoding/t/encoding.t See if PerlIO encoding conversion works
ext/PerlIO-encoding/t/fallback.t See if PerlIO fallbacks work
ext/PerlIO-encoding/t/nolooping.t Tests for PerlIO::encoding
-ext/PerlIO-scalar/Makefile.PL PerlIO layer for scalars
ext/PerlIO-scalar/scalar.pm PerlIO layer for scalars
ext/PerlIO-scalar/scalar.xs PerlIO layer for scalars
ext/PerlIO-scalar/t/scalar.t See if PerlIO::scalar works
ext/PerlIO-scalar/t/scalar_ungetc.t Tests for PerlIO layer for scalars
ext/PerlIO-via/hints/aix.pl Hint for PerlIO::via for named architecture
-ext/PerlIO-via/Makefile.PL PerlIO layer for layers in perl
ext/PerlIO-via/t/via.t See if PerlIO::via works
ext/PerlIO-via/via.pm PerlIO layer for layers in perl
ext/PerlIO-via/via.xs PerlIO layer for layers in perl
@@ -1160,7 +1225,6 @@ ext/Storable/t/utf8.t See if Storable works
ext/Storable/t/weak.t Can Storable store weakrefs
ext/Sys-Hostname/Hostname.pm Sys::Hostname extension Perl module
ext/Sys-Hostname/Hostname.xs Sys::Hostname extension external subroutines
-ext/Sys-Hostname/Makefile.PL Sys::Hostname extension makefile writer
ext/Sys-Hostname/t/Hostname.t See if Sys::Hostname works
ext/Sys-Syslog/Changes Changlog for Sys::Syslog
ext/Sys-Syslog/fallback/const-c.inc Sys::Syslog constants fallback file
@@ -1186,10 +1250,14 @@ ext/Test-Harness/lib/App/Prove/State.pm Gubbins for the prove utility
ext/Test-Harness/lib/App/Prove/State/Result.pm Gubbins for the prove utility
ext/Test-Harness/lib/App/Prove/State/Result/Test.pm Gubbins for the prove utility
ext/Test-Harness/lib/TAP/Base.pm A parser for Test Anything Protocol
+ext/Test-Harness/lib/TAP/Formatter/Base.pm A parser for Test Anything Protocol
ext/Test-Harness/lib/TAP/Formatter/Color.pm A parser for Test Anything Protocol
ext/Test-Harness/lib/TAP/Formatter/Console/ParallelSession.pm A parser for Test Anything Protocol
ext/Test-Harness/lib/TAP/Formatter/Console.pm A parser for Test Anything Protocol
ext/Test-Harness/lib/TAP/Formatter/Console/Session.pm A parser for Test Anything Protocol
+ext/Test-Harness/lib/TAP/Formatter/File.pm A parser for Test Anything Protocol
+ext/Test-Harness/lib/TAP/Formatter/File/Session.pm A parser for Test Anything Protocol
+ext/Test-Harness/lib/TAP/Formatter/Session.pm A parser for Test Anything Protocol
ext/Test-Harness/lib/TAP/Harness.pm A parser for Test Anything Protocol
ext/Test-Harness/lib/TAP/Object.pm A parser for Test Anything Protocol
ext/Test-Harness/lib/TAP/Parser/Aggregator.pm A parser for Test Anything Protocol
@@ -1220,7 +1288,6 @@ ext/Test-Harness/lib/TAP/Parser/Utils.pm A parser for Test Anything Protocol
ext/Test-Harness/lib/TAP/Parser/YAMLish/Reader.pm A parser for Test Anything Protocol
ext/Test-Harness/lib/TAP/Parser/YAMLish/Writer.pm A parser for Test Anything Protocol
ext/Test-Harness/lib/Test/Harness.pm A test harness
-ext/Test-Harness/Makefile.PL Makefile.PL for Test::Harness
ext/Test-Harness/t/000-load.t Test::Harness test
ext/Test-Harness/t/aggregator.t Test::Harness test
ext/Test-Harness/t/bailout.t Test::Harness test
@@ -1239,11 +1306,14 @@ ext/Test-Harness/t/data/catme.1 Test data for Test::Harness
ext/Test-Harness/t/data/proverc Test data for Test::Harness
ext/Test-Harness/t/data/sample.yml Test data for Test::Harness
ext/Test-Harness/t/errors.t Test::Harness test
+ext/Test-Harness/t/file.t Test::Harness test
ext/Test-Harness/t/glob-to-regexp.t Test::Harness test
ext/Test-Harness/t/grammar.t Test::Harness test
+ext/Test-Harness/t/harness-bailout.t Test::Harness test
ext/Test-Harness/t/harness-subclass.t Test::Harness test
ext/Test-Harness/t/harness.t Test::Harness test
ext/Test-Harness/t/iterators.t Test::Harness test
+ext/Test-Harness/t/lib/App/Prove/Plugin/Dummy2.pm Module for testing Test::Harness
ext/Test-Harness/t/lib/App/Prove/Plugin/Dummy.pm Module for testing Test::Harness
ext/Test-Harness/t/lib/Dev/Null.pm Module for testing Test::Harness
ext/Test-Harness/t/lib/EmptyParser.pm Module for testing Test::Harness
@@ -1266,6 +1336,7 @@ ext/Test-Harness/t/object.t Test::Harness test
ext/Test-Harness/t/parser-config.t Test::Harness test
ext/Test-Harness/t/parser-subclass.t Test::Harness test
ext/Test-Harness/t/parse.t Test::Harness test
+ext/Test-Harness/t/perl5lib.t Test::Harness test
ext/Test-Harness/t/premature-bailout.t Test::Harness test
ext/Test-Harness/t/process.t Test::Harness test
ext/Test-Harness/t/proveenv.t Test::Harness test
@@ -1350,7 +1421,6 @@ ext/Test-Harness/t/yamlish-output.t Test::Harness test
ext/Test-Harness/t/yamlish.t Test::Harness test
ext/Test-Harness/t/yamlish-writer.t Test::Harness test
ext/Text-Soundex/Changes Changelog for Text::Soundex
-ext/Text-Soundex/Makefile.PL Text::Soundex extension makefile writer
ext/Text-Soundex/README README for Text::Soundex
ext/Text-Soundex/Soundex.pm Text::Soundex extension Perl module
ext/Text-Soundex/Soundex.xs Text::Soundex extension external subroutines
@@ -1684,6 +1754,7 @@ lib/Archive/Tar/t/04_resolved_issues.t Archive::Tar tests
lib/Archive/Tar/t/05_iter.t Archive::Tar tests
lib/Archive/Tar/t/90_symlink.t Archive::Tar tests
lib/Archive/Tar/t/99_pod.t Archive::Tar tests
+lib/Archive/Tar/t/src/header/signed.tar.packed Archive::Tar tests
lib/Archive/Tar/t/src/linktest/linktest_missing_dir.tar.packed Archive::Tar tests
lib/Archive/Tar/t/src/linktest/linktest_with_dir.tar.packed Archive::Tar tests
lib/Archive/Tar/t/src/long/b Archive::Tar tests
@@ -1695,7 +1766,6 @@ lib/Archive/Tar/t/src/short/bar.tar.packed Archive::Tar tests
lib/Archive/Tar/t/src/short/foo.tbz.packed Archive::Tar tests
lib/Archive/Tar/t/src/short/foo.tgz.packed Archive::Tar tests
lib/assert.pl assertion and panic with stack trace
-lib/attributes.pm For "sub foo : attrlist"
lib/autodie/exception.pm Exception class for autodie
lib/autodie/exception/system.pm Exception class for autodying system()
lib/autodie.pm Functions suceed or die with lexical scope
@@ -1830,11 +1900,11 @@ lib/CPAN/Bundle.pm helper package for CPAN.pm
lib/CPAN/CacheMgr.pm helper package for CPAN.pm
lib/CPAN/Complete.pm helper package for CPAN.pm
lib/CPAN/Debug.pm helper package for CPAN.pm
-lib/CPAN/DeferedCode.pm helper package for CPAN.pm
lib/CPAN/DeferredCode.pm helper package for CPAN.pm
lib/CPAN/Distribution.pm helper package for CPAN.pm
lib/CPAN/Distroprefs.pm helper package for CPAN.pm
lib/CPAN/Distrostatus.pm helper package for CPAN.pm
+lib/CPAN/Exception/blocked_urllist.pm helper package for CPAN.pm
lib/CPAN/Exception/RecursiveDependency.pm helper package for CPAN.pm
lib/CPAN/Exception/yaml_not_installed.pm helper package for CPAN.pm
lib/CPAN/FirstTime.pm Utility for creating CPAN config files
@@ -1876,7 +1946,6 @@ lib/CPANPLUS/Dist/Sample.pm CPANPLUS
lib/CPANPLUS/Error.pm CPANPLUS
lib/CPANPLUS/FAQ.pod CPANPLUS
lib/CPANPLUS/Hacking.pod CPANPLUS
-lib/CPANPLUS/inc.pm CPANPLUS
lib/CPANPLUS/Internals/Constants.pm CPANPLUS
lib/CPANPLUS/Internals/Constants/Report.pm CPANPLUS
lib/CPANPLUS/Internals/Extract.pm CPANPLUS
@@ -1905,7 +1974,6 @@ lib/CPANPLUS/Shell/Default/Plugins/Remote.pm CPANPLUS
lib/CPANPLUS/Shell/Default/Plugins/Source.pm CPANPLUS
lib/CPANPLUS/Shell/Default.pm CPANPLUS
lib/CPANPLUS/Shell.pm CPANPLUS
-lib/CPANPLUS/t/00_CPANPLUS-Inc.t CPANPLUS tests
lib/CPANPLUS/t/00_CPANPLUS-Internals-Utils.t CPANPLUS tests
lib/CPANPLUS/t/01_CPANPLUS-Configure.t CPANPLUS tests
lib/CPANPLUS/t/02_CPANPLUS-Internals.t CPANPLUS tests
@@ -2055,7 +2123,6 @@ lib/ExtUtils/MM_BeOS.pm MakeMaker methods for BeOS
lib/ExtUtils/MM_Cygwin.pm MakeMaker methods for Cygwin
lib/ExtUtils/MM_Darwin.pm MakeMaker methods for Darwin
lib/ExtUtils/MM_DOS.pm MakeMaker methods for DOS
-lib/ExtUtils/MM_Haiku.pm MakeMaker methods for Haiku
lib/ExtUtils/MM_MacOS.pm MakeMaker methods for MacOS
lib/ExtUtils/MM_NW5.pm MakeMaker methods for NetWare
lib/ExtUtils/MM_OS2.pm MakeMaker methods for OS/2
@@ -2122,7 +2189,7 @@ lib/ExtUtils/t/oneliner.t See if MM can generate perl one-liners
lib/ExtUtils/t/Packlist.t See if Packlist works
lib/ExtUtils/t/parse_version.t See if parse_version works
lib/ExtUtils/t/PL_FILES.t Test PL_FILES in MakeMaker
-lib/ExtUtils/t/pm.t See if Makemaker can handle PM
+lib/ExtUtils/t/pm.t See if MakeMaker can handle PM
lib/ExtUtils/t/postamble.t See if postamble works
lib/ExtUtils/t/prefixify.t See if MakeMaker can apply a PREFIX
lib/ExtUtils/t/prereq_print.t See if PREREQ_PRINT works
@@ -2613,8 +2680,21 @@ lib/Package/Constants.pm Package::Constants
lib/Package/Constants/t/01_list.t Package::Constants tests
lib/Params/Check.pm Params::Check
lib/Params/Check/t/01_Params-Check.t Params::Check tests
-lib/Parse/CPAN/Meta.pm Parse::CPAN::Meta
+lib/parent.pm Establish an ISA relationship with base classes at compile time
+lib/parent/t/compile-time-file.t tests for parent.pm
+lib/parent/t/compile-time.t tests for parent.pm
+lib/parent/t/lib/Dummy2.plugin test files for parent.pm
+lib/parent/t/lib/Dummy/Outside.pm test files for parent.pm
+lib/parent/t/lib/Dummy.pm test files for parent.pm
+lib/parent/t/lib/FileThatOnlyExistsAsPMC.pmc test files for parent.pm
+lib/parent/t/lib/ReturnsFalse.pm test files for parent.pm
+lib/parent/t/parent-classfromclassfile.t tests for parent.pm
+lib/parent/t/parent-classfromfile.t tests for parent.pm
+lib/parent/t/parent-pmc.t tests for parent.pm
+lib/parent/t/parent-returns-false.t tests for parent.pm
+lib/parent/t/parent.t tests for parent.pm
lib/Parse/CPAN/Meta/Changes Parse::CPAN::Meta
+lib/Parse/CPAN/Meta.pm Parse::CPAN::Meta
lib/Parse/CPAN/Meta/t/01_compile.t Parse::CPAN::Meta
lib/Parse/CPAN/Meta/t/02_basic.t Parse::CPAN::Meta
lib/Parse/CPAN/Meta/t/03_regression.t Parse::CPAN::Meta
@@ -2627,24 +2707,12 @@ lib/Parse/CPAN/Meta/t/15_multibyte.t Parse::CPAN::Meta
lib/Parse/CPAN/Meta/t/16_nullrefs.t Parse::CPAN::Meta
lib/Parse/CPAN/Meta/t/17_toolbar.t Parse::CPAN::Meta
lib/Parse/CPAN/Meta/t/data/HTML-WebDAO.yml Parse::CPAN::Meta
-lib/Parse/CPAN/Meta/t/data/Template-Provider-Unicode-Japanese.yml Parse::CPAN::Meta
lib/Parse/CPAN/Meta/t/data/multibyte.yml Parse::CPAN::Meta
lib/Parse/CPAN/Meta/t/data/sample.yml Parse::CPAN::Meta
+lib/Parse/CPAN/Meta/t/data/Template-Provider-Unicode-Japanese.yml Parse::CPAN::Meta
lib/Parse/CPAN/Meta/t/data/toolbar.yml Parse::CPAN::Meta
+lib/Parse/CPAN/Meta/t/data/utf_16_le_bom.yml Parse::CPAN::Meta
lib/Parse/CPAN/Meta/t/data/vanilla.yml Parse::CPAN::Meta
-lib/parent.pm Establish an ISA relationship with base classes at compile time
-lib/parent/t/compile-time-file.t tests for parent.pm
-lib/parent/t/compile-time.t tests for parent.pm
-lib/parent/t/lib/Dummy2.plugin test files for parent.pm
-lib/parent/t/lib/Dummy/Outside.pm test files for parent.pm
-lib/parent/t/lib/Dummy.pm test files for parent.pm
-lib/parent/t/lib/FileThatOnlyExistsAsPMC.pmc test files for parent.pm
-lib/parent/t/lib/ReturnsFalse.pm test files for parent.pm
-lib/parent/t/parent-classfromclassfile.t tests for parent.pm
-lib/parent/t/parent-classfromfile.t tests for parent.pm
-lib/parent/t/parent-pmc.t tests for parent.pm
-lib/parent/t/parent-returns-false.t tests for parent.pm
-lib/parent/t/parent.t tests for parent.pm
lib/perl5db.pl Perl debugging routines
lib/perl5db.t Tests for the Perl debugger
lib/perl5db/t/eval-line-bug Tests for the Perl debugger
@@ -3069,6 +3137,7 @@ lib/Text/TabsWrap/CHANGELOG ChangeLog for Tabs+Wrap
lib/Text/TabsWrap/t/37000.t See if Text::Tabs is working
lib/Text/TabsWrap/t/39548.t See if Text::Tabs is working
lib/Text/TabsWrap/t/belg4mit.t See if Text::Tabs is working
+lib/Text/TabsWrap/t/dandv.t See if Text::Tabs is working
lib/Text/TabsWrap/t/fill.t See if Text::Wrap::fill works
lib/Text/TabsWrap/t/Jacobson2.t See if Text::Tabs is working
lib/Text/TabsWrap/t/Jacobson.t See if Text::Tabs is working
@@ -3076,6 +3145,7 @@ lib/Text/TabsWrap/t/Jochen.t See if Text::Tabs is working
lib/Text/TabsWrap/t/sep2.t See if Text::Tabs is working
lib/Text/TabsWrap/t/sep.t See if Text::Tabs is working
lib/Text/TabsWrap/t/tabs.t See if Text::Tabs works
+lib/Text/TabsWrap/t/wrap_separator2.t See if Text::Wrap::wrap works
lib/Text/TabsWrap/t/wrap.t See if Text::Wrap::wrap works
lib/Text/Wrap.pm Paragraph formatter
lib/Thread.pm Thread extensions frontend
@@ -3468,7 +3538,6 @@ pod/perl593delta.pod Perl changes in version 5.9.3
pod/perl594delta.pod Perl changes in version 5.9.4
pod/perl595delta.pod Perl changes in version 5.9.5
pod/perlapio.pod Perl internal IO abstraction interface
-pod/perlapi.pod Perl API listing (autogenerated)
pod/perlartistic.pod Perl Artistic License
pod/perlbook.pod Perl book information
pod/perlboot.pod Perl OO tutorial for beginners
@@ -3507,7 +3576,6 @@ pod/perlgpl.pod GNU General Public License
pod/perlguts.pod Perl internal functions for those doing extensions
pod/perlhack.pod Perl hackers guide
pod/perlhist.pod Perl history records
-pod/perlintern.pod Perl internal functions (autogenerated)
pod/perlintro.pod Perl introduction for beginners
pod/perliol.pod C API for Perl's implementation of IO in Layers
pod/perlipc.pod Perl interprocess communication
@@ -3524,7 +3592,6 @@ pod/perlnumber.pod Perl number semantics
pod/perlobj.pod Perl objects
pod/perlopentut.pod Perl open() tutorial
pod/perlop.pod Perl operators and precedence
-pod/perlothrtut.pod Old Perl threads tutorial
pod/perlpacktut.pod Perl pack() and unpack() tutorial
pod/perlperf.pod Perl Performance and Optimization Techniques
pod/perl.pod Perl overview (this section)
@@ -3550,7 +3617,6 @@ pod/perlsub.pod Perl subroutines
pod/perlsyn.pod Perl syntax
pod/perlthrtut.pod Perl threads tutorial
pod/perltie.pod Perl objects hidden behind simple variables
-pod/perltoc.pod Perl documentation table of contents
pod/perltodo.pod Perl things to do
pod/perltooc.pod Perl OO tutorial, part 2
pod/perltoot.pod Perl OO tutorial, part 1
@@ -3561,6 +3627,7 @@ pod/perluniintro.pod Perl Unicode introduction
pod/perlunitut.pod Perl Unicode tutorial
pod/perlutil.pod utilities packaged with the Perl distribution
pod/perlvar.pod Perl predefined variables
+pod/perlvms.pod Perl notes for VMS
pod/perlxs.pod Perl XS application programming interface
pod/perlxstut.pod Perl XS tutorial
pod/pod2html.PL Precursor for translator to turn pod into HTML
@@ -3670,7 +3737,7 @@ README.tru64 Perl notes for Tru64
README.tw Perl for Traditional Chinese (in Big5)
README.uts Perl notes for UTS
README.vmesa Perl notes for VM/ESA
-README.vms Perl notes for VMS
+README.vms Notes about installing the VMS port
README.vos Perl notes for Stratus VOS
README.win32 Perl notes for Windows
reentr.c Reentrant interfaces
@@ -3814,6 +3881,7 @@ t/lib/autodie/autodie_test_module.pm autodie - test helper
t/lib/autodie/backcompat.t autodie - More Fatal backcompat
t/lib/autodie/basic_exceptions.t autodie - Basic exception tests
t/lib/autodie/binmode.t autodie - Binmode testing
+t/lib/autodie/caller.t autodie - Caller diagnostics
t/lib/autodie/context_lexical.t autodie - Context clobbering lexically
t/lib/autodie/context.t autodie - Context clobbering tests
t/lib/autodie/crickey.t autodie - Like an Australian
@@ -3831,6 +3899,7 @@ t/lib/autodie/lib/autodie/test/au/exception.pm autodie - Australian helper
t/lib/autodie/lib/autodie/test/au.pm autodie - Austrlaian helper
t/lib/autodie/lib/autodie/test/badname.pm autodie - Bad exception class
t/lib/autodie/lib/autodie/test/missing.pm autodie - Missing exception class
+t/lib/autodie/lib/Caller_helper.pm autodie - Caller helper
t/lib/autodie/lib/lethal.pm autodie - with a better name
t/lib/autodie/lib/pujHa/ghach/Dotlh.pm autodie - With Klingon honour
t/lib/autodie/lib/pujHa/ghach.pm autodie - Like a Klingon
@@ -3842,6 +3911,7 @@ t/lib/autodie/scope_leak.t autodie - file scope leak tests
t/lib/autodie/sysopen.t autodie - sysopen tests
t/lib/autodie/truncate.t autodie - File truncation tests
t/lib/autodie/unlink.t autodie - Unlink system tests.
+t/lib/autodie/user-context.t autodie - Context changes for usersubs
t/lib/autodie/usersub.t autodie - user subroutine tests
t/lib/autodie/version.t autodie - versioning tests
t/lib/autodie/version_tag.t
@@ -3866,9 +3936,9 @@ t/lib/compress/zlib-generic.pl Compress::Zlib
t/lib/contains_bad_pod.xr Pod-Parser test file
t/lib/contains_pod.xr Pod-Parser test file
t/lib/cygwin.t Builtin cygwin function tests
-t/lib/deprecate.t Test deprecate.pm
t/lib/deprecate/Deprecated.pm Deprecated module to test deprecate.pm
t/lib/deprecate/Optionally.pm Optionally deprecated module to test deprecate.pm
+t/lib/deprecate.t Test deprecate.pm
t/lib/Devel/switchd.pm Module for t/run/switchd.t
t/lib/Dev/Null.pm Test::More test module
t/lib/dprof/test1_t Perl code profiler tests
@@ -3977,62 +4047,6 @@ t/lib/warnings/toke Tests for toke.c for warnings.t
t/lib/warnings/universal Tests for universal.c for warnings.t
t/lib/warnings/utf8 Tests for utf8.c for warnings.t
t/lib/warnings/util Tests for util.c for warnings.t
-t/Module_Pluggable/01use.t Module::Pluggable tests
-t/Module_Pluggable/02alsoworks.t Module::Pluggable tests
-t/Module_Pluggable/02works.t Module::Pluggable tests
-t/Module_Pluggable/02works_taint.t Module::Pluggable tests
-t/Module_Pluggable/03diffname.t Module::Pluggable tests
-t/Module_Pluggable/04acmedir_single.t Module::Pluggable tests
-t/Module_Pluggable/04acmedir.t Module::Pluggable tests
-t/Module_Pluggable/04acmepath_single.t Module::Pluggable tests
-t/Module_Pluggable/04acmepath.t Module::Pluggable tests
-t/Module_Pluggable/05postpath.t Module::Pluggable tests
-t/Module_Pluggable/06multipath.t Module::Pluggable tests
-t/Module_Pluggable/07instantiate.t Module::Pluggable tests
-t/Module_Pluggable/08nothing.t Module::Pluggable tests
-t/Module_Pluggable/09require.t Module::Pluggable tests
-t/Module_Pluggable/10innerpack_inner.t Module::Pluggable tests
-t/Module_Pluggable/10innerpack_noinner.t Module::Pluggable tests
-t/Module_Pluggable/10innerpack_override.t Module::Pluggable tests
-t/Module_Pluggable/10innerpack_super.t Module::Pluggable tests
-t/Module_Pluggable/10innerpack.t Module::Pluggable tests
-t/Module_Pluggable/11usetwice.t Module::Pluggable tests
-t/Module_Pluggable/12onlyarray.t Module::Pluggable tests
-t/Module_Pluggable/12onlyregex.t Module::Pluggable tests
-t/Module_Pluggable/12only.t Module::Pluggable tests
-t/Module_Pluggable/13exceptarray.t Module::Pluggable tests
-t/Module_Pluggable/13exceptregex.t Module::Pluggable tests
-t/Module_Pluggable/13except.t Module::Pluggable tests
-t/Module_Pluggable/14package.t Module::Pluggable tests
-t/Module_Pluggable/15topicsafe.t Module::Pluggable tests
-t/Module_Pluggable/16different_extension.t Module::Pluggable tests
-t/Module_Pluggable/17devel_inner_package.t Module::Pluggable tests
-t/Module_Pluggable/18skipped_package.t Module::Pluggable tests
-t/Module_Pluggable/19can_ok_clobber.t Module::Pluggable tests
-t/Module_Pluggable/20dodgy_files.t Module::Pluggable tests
-t/Module_Pluggable/21editor_junk.t Module::Pluggable tests
-t/Module_Pluggable/acme/Acme/MyTest/Plugin/Foo.pm Module::Pluggable tests
-t/Module_Pluggable/lib/Acme/MyTest/Plugin/Foo.pm Module::Pluggable tests
-t/Module_Pluggable/lib/EditorJunk/Plugin/Bar.pm Module::Pluggable tests
-t/Module_Pluggable/lib/EditorJunk/Plugin/Bar.pm~ Module::Pluggable tests
-t/Module_Pluggable/lib/EditorJunk/Plugin/Bar.pm.swo Module::Pluggable tests
-t/Module_Pluggable/lib/EditorJunk/Plugin/Bar.pm.swp Module::Pluggable tests
-t/Module_Pluggable/lib/EditorJunk/Plugin/Foo.pm Module::Pluggable tests
-t/Module_Pluggable/lib/ExtTest/Plugin/Bar.plugin Module::Pluggable tests
-t/Module_Pluggable/lib/ExtTest/Plugin/Foo.plugin Module::Pluggable tests
-t/Module_Pluggable/lib/ExtTest/Plugin/Quux/Foo.plugin Module::Pluggable tests
-t/Module_Pluggable/lib/InnerTest/Plugin/Foo.pm Module::Pluggable tests
-t/Module_Pluggable/lib/MyOtherTest/Plugin/Bar.pm Module::Pluggable tests
-t/Module_Pluggable/lib/MyOtherTest/Plugin/Foo.pm Module::Pluggable tests
-t/Module_Pluggable/lib/MyOtherTest/Plugin/Quux/Foo.pm Module::Pluggable tests
-t/Module_Pluggable/lib/MyOtherTest/Plugin/Quux.pm Module::Pluggable tests
-t/Module_Pluggable/lib/MyTest/Extend/Plugin/Bar.pm Module::Pluggable tests
-t/Module_Pluggable/lib/MyTest/Plugin/Bar.pm Module::Pluggable tests
-t/Module_Pluggable/lib/MyTest/Plugin/Foo.pm Module::Pluggable tests
-t/Module_Pluggable/lib/MyTest/Plugin/Quux/Foo.pm Module::Pluggable tests
-t/Module_Pluggable/lib/No/Middle.pm Module::Pluggable tests
-t/Module_Pluggable/lib/OddTest/Plugin/Foo.pm Module::Pluggable tests
-t/Module_Pluggable/lib/TA/C/A/I.pm Module::Pluggable tests
t/mro/basic_01_c3.t mro tests
t/mro/basic_01_dfs.t mro tests
t/mro/basic_02_c3.t mro tests
@@ -4399,7 +4413,6 @@ vms/make_command.com record MM[SK] command used to build Perl
vms/mms2make.pl convert descrip.mms to make syntax
vms/munchconfig.c performs shell $var substitution for VMS
vms/myconfig.com record local configuration info for bug report
-vms/perlvms.pod VMS-specific additions to Perl documentation
vms/sockadapt.c glue for SockshShr socket support
vms/sockadapt.h glue for SockshShr socket support
vms/test.com DCL driver for regression tests
@@ -4500,4 +4513,3 @@ x2p/util.c Utility routines
x2p/util.h Public declarations for the above
x2p/walk.c Parse tree walker
XSUB.h Include file for extension subroutines
-xsutils.c Additional bundled package methods not in UNIVERSAL::
diff --git a/Makefile.SH b/Makefile.SH
index 0b8003900e..1156bfc2f5 100644
--- a/Makefile.SH
+++ b/Makefile.SH
@@ -439,7 +439,7 @@ h = $(h1) $(h2) $(h3) $(h4) $(h5)
c1 = av.c scope.c op.c doop.c doio.c dump.c gv.c hv.c mg.c reentr.c mro.c perl.c
c2 = perly.c pp.c pp_hot.c pp_ctl.c pp_sys.c regcomp.c regexec.c utf8.c sv.c
-c3 = taint.c toke.c util.c deb.c run.c universal.c xsutils.c pad.c globals.c
+c3 = taint.c toke.c util.c deb.c run.c universal.c pad.c globals.c
c4 = perlio.c perlapi.c numeric.c mathoms.c locale.c pp_pack.c pp_sort.c
c5 = $(madlysrc) $(mallocsrc)
@@ -448,12 +448,15 @@ c = $(c1) $(c2) $(c3) $(c4) $(c5) miniperlmain.c perlmain.c opmini.c perlmini.c
obj0 = op$(OBJ_EXT) perl$(OBJ_EXT)
obj1 = $(madlyobj) $(mallocobj) gv$(OBJ_EXT) toke$(OBJ_EXT) perly$(OBJ_EXT) pad$(OBJ_EXT) regcomp$(OBJ_EXT) dump$(OBJ_EXT) util$(OBJ_EXT) mg$(OBJ_EXT) reentr$(OBJ_EXT) mro$(OBJ_EXT)
obj2 = hv$(OBJ_EXT) av$(OBJ_EXT) run$(OBJ_EXT) pp_hot$(OBJ_EXT) sv$(OBJ_EXT) pp$(OBJ_EXT) scope$(OBJ_EXT) pp_ctl$(OBJ_EXT) pp_sys$(OBJ_EXT)
-obj3 = doop$(OBJ_EXT) doio$(OBJ_EXT) regexec$(OBJ_EXT) utf8$(OBJ_EXT) taint$(OBJ_EXT) deb$(OBJ_EXT) universal$(OBJ_EXT) xsutils$(OBJ_EXT) globals$(OBJ_EXT) perlio$(OBJ_EXT) perlapi$(OBJ_EXT) numeric$(OBJ_EXT) mathoms$(OBJ_EXT) locale$(OBJ_EXT) pp_pack$(OBJ_EXT) pp_sort$(OBJ_EXT)
+obj3 = doop$(OBJ_EXT) doio$(OBJ_EXT) regexec$(OBJ_EXT) utf8$(OBJ_EXT) taint$(OBJ_EXT) deb$(OBJ_EXT) universal$(OBJ_EXT) globals$(OBJ_EXT) perlio$(OBJ_EXT) perlapi$(OBJ_EXT) numeric$(OBJ_EXT) mathoms$(OBJ_EXT) locale$(OBJ_EXT) pp_pack$(OBJ_EXT) pp_sort$(OBJ_EXT)
mini_obj = $(obj1) $(obj2) $(obj3) $(ARCHOBJS)
ndt_obj = $(obj0) $(obj1) $(obj2) $(obj3) $(ARCHOBJS)
obj = $(ndt_obj) $(DTRACE_O)
+perltoc_pod_prereqs = extra.pods pod/perlapi.pod pod/perldelta.pod pod/perlintern.pod
+generated_pods = pod/perltoc.pod $(perltoc_pod_prereqs)
+
lintflags = \
-b \
-n \
@@ -521,7 +524,7 @@ splintfiles = $(c1)
.c.s:
$(CCCMDSRC) -S $*.c
-all: $(FIRSTMAKEFILE) miniperl$(EXE_EXT) miniperl extra.pods $(private) $(unidatafiles) $(public) $(dynamic_ext) $(nonxs_ext) extras.make
+all: $(FIRSTMAKEFILE) miniperl$(EXE_EXT) miniperl $(generated_pods) $(private) $(unidatafiles) $(public) $(dynamic_ext) $(nonxs_ext) extras.make
@echo " ";
@echo " Everything is up to date. Type '$(MAKE) test' to run test suite."
@@ -969,18 +972,26 @@ uni.data: miniperl$(EXE_EXT) $(CONFIGPM) lib/unicore/mktables
cd lib/unicore && $(LDLIBPTH) $(RUN) ../../miniperl$(EXE_EXT) -I../../lib mktables -w
touch uni.data
+# perl$(EXE_EXT) and ext because buildtoc uses Text::Wrap uses re
+# But also this ensures that all extensions are built before we try to scan
+# them, which picks up Devel::PPPort's documentation.
+pod/perltoc.pod: $(perltoc_pod_prereqs) perl$(EXE_EXT) $(ext) pod/buildtoc
+ $(RUN) ./perl$(EXE_EXT) -Ilib pod/buildtoc --build-toc -q
+
+pod/perlapi.pod pod/perlintern.pod: miniperl$(EXE_EXT) autodoc.pl embed.fnc
+ $(RUN) ./miniperl$(EXE_EXT) -Ilib autodoc.pl
+
+pod/perldelta.pod: pod/perl5110delta.pod
+ $(LNS) perl5110delta.pod pod/perldelta.pod
+
extra.pods: miniperl$(EXE_EXT)
-@test ! -f extra.pods || rm -f `cat extra.pods`
-@rm -f extra.pods
-@for x in `grep -l '^=[a-z]' README.* | grep -v README.vms` ; do \
nx=`echo $$x | sed -e "s/README\.//"`; \
- cd pod ; $(LNS) ../$$x "perl"$$nx".pod" ; cd .. ; \
+ $(LNS) ../$$x "pod/perl"$$nx".pod" ; \
echo "pod/perl"$$nx".pod" >> extra.pods ; \
done
- -@rm -f pod/perlvms.pod
- -@test -f vms/perlvms.pod && cd pod && $(LNS) ../vms/perlvms.pod perlvms.pod && cd .. && echo "pod/perlvms.pod" >> extra.pods
- -@rm -f pod/perldelta.pod
- -@test -f pod/perl5110delta.pod && cd pod && $(LNS) perl5110delta.pod perldelta.pod && cd .. && echo "pod/perldelta.pod" >> extra.pods # See buildtoc
extras.make: perl$(EXE_EXT)
-@test ! -s extras.lst || PATH="`pwd`:${PATH}" PERL5LIB="`pwd`/lib" $(LDLIBPTH) $(RUN) ./perl -Ilib -MCPAN -e '@ARGV&&make(@ARGV)' `cat extras.lst`
@@ -1174,7 +1185,7 @@ _mopup:
-rmdir .depending
-@test -f extra.pods && rm -f `cat extra.pods`
-@test -f vms/README_vms.pod && rm -f vms/README_vms.pod
- -rm -f perl.exp ext.libs extra.pods uni.data opmini.o perlmini.o
+ -rm -f perl.exp ext.libs $(generated_pods) uni.data opmini.o perlmini.o
-rm -f perl.export perl.dll perl.libexp perl.map perl.def
-rm -f perl.loadmap miniperl.loadmap perl.prelmap miniperl.prelmap
-rm -f perl.third lib*.so.perl.third perl.3log t/perl.third t/perl.3log
diff --git a/Makefile.micro b/Makefile.micro
index 39b8c3dc39..86113322d7 100644
--- a/Makefile.micro
+++ b/Makefile.micro
@@ -21,7 +21,7 @@ O = uav$(_O) udeb$(_O) udoio$(_O) udoop$(_O) udump$(_O) \
uregcomp$(_O) uregexec$(_O) urun$(_O) \
uscope$(_O) usv$(_O) utaint$(_O) utoke$(_O) \
unumeric$(_O) ulocale$(_O) umathoms$(_O) \
- uuniversal$(_O) uutf8$(_O) uutil$(_O) uperlapi$(_O) uxsutils$(_O)
+ uuniversal$(_O) uutf8$(_O) uutil$(_O) uperlapi$(_O)
microperl: $(O)
$(LD) -o $@ $(O) $(LDFLAGS) $(LIBS)
@@ -170,9 +170,6 @@ uutil$(_O): $(HE) util.c
uperlapi$(_O): $(HE) perlapi.c perlapi.h
$(CC) $(CCFLAGS) -o $@ $(CFLAGS) perlapi.c
-uxsutils$(_O): $(HE) xsutils.c
- $(CC) $(CCFLAGS) -o $@ $(CFLAGS) xsutils.c
-
uudmap.h: generate_uudmap$(_X)
$(RUN) ./generate_uudmap$(_X) >uudmap.h
diff --git a/NetWare/Makefile b/NetWare/Makefile
index 13c56fbf8b..f22161698f 100644
--- a/NetWare/Makefile
+++ b/NetWare/Makefile
@@ -312,7 +312,7 @@ IO_NLM = $(AUTODIR)\IO\IO.NLM
OPCODE_NLM = $(AUTODIR)\Opcode\Opcode.NLM
SDBM_FILE_NLM = $(AUTODIR)\SDBM_File\SDBM_File.NLM
POSIX_NLM = $(AUTODIR)\POSIX\POSIX.NLM
-ATTRS_NLM = $(AUTODIR)\attrs\attrs.NLM
+ATTRIBUTES_NLM = $(AUTODIR)\attributes\attributes.NLM
B_NLM = $(AUTODIR)\B\B.NLM
DUMPER_NLM = $(AUTODIR)\Data\Dumper\Dumper.NLM
PEEK_NLM = $(AUTODIR)\Devel\Peek\Peek.NLM
@@ -336,7 +336,7 @@ EXTENSION_NLM = \
$(SOCKET_NLM) \
$(OPCODE_NLM) \
$(B_NLM) \
- $(ATTRS_NLM) \
+ $(ATTRIBUTES_NLM) \
$(SDBM_FILE_NLM) \
$(POSIX_NLM) \
$(DUMPER_NLM) \
@@ -724,8 +724,7 @@ MICROCORE_SRC = \
..\toke.c \
..\universal.c \
..\utf8.c \
- ..\util.c \
- ..\xsutils.c
+ ..\util.c
#EXTRACORE_SRC = $(EXTRACORE_SRC) perllib.c
@@ -788,7 +787,7 @@ CORE_H = $(CORE_NOCFG_H) .\config.h
DLL_OBJ = $(DLL_SRC:.c=.obj)
X2P_OBJ = $(X2P_SRC:.c=.obj)
-DYNAMIC_EXT = Socket IO Fcntl Opcode SDBM_File POSIX attrs B re \
+DYNAMIC_EXT = Socket IO Fcntl Opcode SDBM_File POSIX attributes B re \
Data/Dumper Devel/Peek ByteLoader Devel/DProf File/Glob \
Storable/Storable List/Util MIME/Base64/Base64 XS/APItest/APItest \
XS/Typemap/Typemap Unicode/Normalize/Normalize Sys/Hostname
@@ -803,7 +802,7 @@ OPCODE = $(EXTDIR)\Opcode\Opcode
SDBM_FILE = $(EXTDIR)\SDBM_File\SDBM_File
IO = $(EXTDIR)\IO\IO
POSIX = $(EXTDIR)\POSIX\POSIX
-ATTRS = $(EXTDIR)\attrs\attrs
+ATTRIBUTES = $(EXTDIR)\attributes\attributes
B = $(EXTDIR)\B\B
RE = $(EXTDIR)\re\re
DUMPER = $(EXTDIR)\Data\Dumper\Dumper
@@ -830,7 +829,7 @@ EXTENSION_C = \
$(SDBM_FILE).c \
$(IO).c \
$(POSIX).c \
- $(ATTRS).c \
+ $(ATTRIBUTES).c \
$(RE).c \
$(DUMPER).c \
$(PEEK).c \
@@ -1226,7 +1225,7 @@ $(POSIX_NLM):
$(MAKE)
cd ..\..\netware
-$(ATTRS_NLM):
+$(ATTRIBUTES_NLM):
cd $(EXTDIR)\$(*B)
..\..\miniperl -I..\..\lib Makefile.PL PERL_CORE=1 INSTALLDIRS=perl
$(MAKE)
@@ -1397,7 +1396,7 @@ distclean: clean nwclean
-del /f /q $(EXTDIR)\DynaLoader\dl_win32.xs
-del /f /q $(EXTDIR)\DynaLoader\DynaLoader.pm
-del /f /q $(EXTDIR)\DynaLoader\XSLoader.pm
- -del /f /q $(LIBDIR)\.exists $(LIBDIR)\attrs.pm $(LIBDIR)\DynaLoader.pm
+ -del /f /q $(LIBDIR)\.exists $(LIBDIR)\attributes.pm $(LIBDIR)\DynaLoader.pm
-del /f /q $(LIBDIR)\XSLoader.pm
-del /f /q $(LIBDIR)\Fcntl.pm $(LIBDIR)\IO.pm $(LIBDIR)\Opcode.pm
-del /f /q $(LIBDIR)\ops.pm $(LIBDIR)\Safe.pm
diff --git a/NetWare/config.wc b/NetWare/config.wc
index 2dc9f76235..533a59fcd9 100644
--- a/NetWare/config.wc
+++ b/NetWare/config.wc
@@ -201,6 +201,7 @@ d_ftime='define'
d_futimes='undef'
d_gdbm_ndbm_h_uses_prototypes='undef'
d_gdbmndbm_h_uses_prototypes='undef'
+d_getaddrinfo='undef'
d_getcwd='define'
d_getespwnam='undef'
d_getfsstat='undef'
@@ -222,6 +223,7 @@ d_getlogin='define'
d_getlogin_r='undef'
d_getmntent='undef'
d_getmnt='undef'
+d_getnameinfo='undef'
d_getnbyaddr='undef'
d_getnbyname='undef'
d_getnent='undef'
@@ -268,6 +270,8 @@ d_ilogbl='undef'
d_inc_version_list='undef'
d_index='undef'
d_inetaton='undef'
+d_inetntop='undef'
+d_inetpton='undef'
d_int64_t='undef'
d_isascii='define'
d_isfinite='undef'
@@ -534,7 +538,7 @@ doublesize='8'
drand01='(rand()/(double)((unsigned)1<<RANDBITS))'
drand48_r_proto='0'
dtrace=''
-dynamic_ext='Socket IO Fcntl Opcode SDBM_File attrs'
+dynamic_ext='Socket IO Fcntl Opcode SDBM_File attributes'
eagain='EAGAIN'
ebcdic='undef'
echo='echo'
diff --git a/Porting/Glossary b/Porting/Glossary
index 53a44c41c9..5e1c51adcf 100644
--- a/Porting/Glossary
+++ b/Porting/Glossary
@@ -899,6 +899,11 @@ d_gdbmndbm_h_uses_prototypes (i_ndbm.U):
undefined. Consult the different d_*ndbm_h_uses_prototypes variables
to get the same information for alternative ndbm.h include files.
+d_getaddrinfo (d_getaddrinfo.U):
+ This variable conditionally defines the HAS_GETADDRINFO symbol,
+ which indicates to the C program that the getaddrinfo() function
+ is available.
+
d_getcwd (d_getcwd.U):
This variable conditionally defines the HAS_GETCWD symbol, which
indicates to the C program that the getcwd() routine is available
@@ -1001,6 +1006,11 @@ d_getmntent (d_getmntent.U):
indicates to the C program that the getmntent() routine is available
to iterate through mounted files to get their mount info.
+d_getnameinfo (d_getnameinfo.U):
+ This variable conditionally defines the HAS_GETNAMEINFO symbol,
+ which indicates to the C program that the getnameinfo() function
+ is available.
+
d_getnbyaddr (d_getnbyad.U):
This variable conditionally defines the HAS_GETNETBYADDR symbol, which
indicates to the C program that the getnetbyaddr() routine is available
@@ -1218,6 +1228,16 @@ d_inetaton (d_inetaton.U):
indicates to the C program that the inet_aton() function is available
to parse IP address "dotted-quad" strings.
+d_inetntop (d_inetntop.U):
+ This variable conditionally defines the HAS_INETNTOP symbol,
+ which indicates to the C program that the inet_ntop() function
+ is available.
+
+d_inetpton (d_inetpton.U):
+ This variable conditionally defines the HAS_INETPTON symbol,
+ which indicates to the C program that the inet_pton() function
+ is available.
+
d_int64_t (d_int64_t.U):
This symbol will be defined if the C compiler supports int64_t.
diff --git a/Porting/Maintainers.pl b/Porting/Maintainers.pl
index 568ed1f537..74b90dc4c7 100644
--- a/Porting/Maintainers.pl
+++ b/Porting/Maintainers.pl
@@ -18,6 +18,7 @@ package Maintainers;
'arandal' => 'Allison Randal <allison@perl.org>',
'audreyt' => 'Audrey Tang <cpan@audreyt.org>',
'avar' => 'Ævar Arnfjörð Bjarmason <avar@cpan.org>',
+ 'bingos' => 'Chris Williams <chris@bingosnet.co.uk>',
'chorny' => "Alexandr Ciornii <alexchorny\100gmail.com>",
'corion' => 'Max Maischein <corion@corion.net>',
'craig' => 'Craig Berry <craigberry@mac.com>',
@@ -62,6 +63,7 @@ package Maintainers;
'pjf' => 'Paul Fenwick <pjf@cpan.org>',
'pmqs' => 'Paul Marquess <pmqs@cpan.org>',
'pvhp' => 'Peter Prymmer <pvhp@best.com>',
+ 'rafl' => 'Florian Ragwitz <flora@cpan.org>',
'rclamp' => 'Richard Clamp <rclamp@cpan.org>',
'rgarcia' => 'Rafael Garcia-Suarez <rgarcia@cpan.org>',
'rkobes' => 'Randy Kobes <rkobes@cpan.org>',
@@ -270,7 +272,7 @@ package Maintainers;
'CPANPLUS::Dist::Build' =>
{
- 'MAINTAINER' => 'kwilliams',
+ 'MAINTAINER' => 'bingos',
'FILES' => q[lib/CPANPLUS/Dist/Build.pm lib/CPANPLUS/Dist/Build],
'CPAN' => 1,
'UPSTREAM' => 'cpan',
@@ -281,15 +283,15 @@ package Maintainers;
'MAINTAINER' => 'kwilliams',
'FILES' => q[ext/Cwd lib/Cwd.pm],
'CPAN' => 1,
- 'UPSTREAM' => undef,
+ 'UPSTREAM' => 'cpan',
},
'Data::Dumper' =>
{
- 'MAINTAINER' => 'ilyam', # Not gsar.
+ 'MAINTAINER' => 'p5p', # Not gsar. Not ilyam
'FILES' => q[ext/Data-Dumper],
'CPAN' => 1,
- 'UPSTREAM' => undef,
+ 'UPSTREAM' => 'blead',
},
'DB::File' =>
@@ -305,7 +307,7 @@ package Maintainers;
'MAINTAINER' => 'mhx',
'FILES' => q[ext/Devel-PPPort],
'CPAN' => 1,
- 'UPSTREAM' => undef,
+ 'UPSTREAM' => 'cpan',
},
'Digest' =>
@@ -456,7 +458,7 @@ package Maintainers;
'MAINTAINER' => 'kwilliams',
'FILES' => q[lib/File/Spec.pm lib/File/Spec],
'CPAN' => 1,
- 'UPSTREAM' => undef,
+ 'UPSTREAM' => "cpan",
},
'File::Temp' =>
@@ -489,15 +491,17 @@ package Maintainers;
'MAINTAINER' => 'jv',
'FILES' => q[lib/Getopt/Long.pm lib/Getopt/Long],
'CPAN' => 1,
- 'UPSTREAM' => undef,
+ 'UPSTREAM' => 'cpan',
},
+ # Sean has donated it to us.
+ # Nothing has changed since his last CPAN release.
'I18N::LangTags' =>
{
- 'MAINTAINER' => 'sburke',
+ 'MAINTAINER' => 'p5p',
'FILES' => q[lib/I18N/LangTags.pm lib/I18N/LangTags],
'CPAN' => 1,
- 'UPSTREAM' => undef,
+ 'UPSTREAM' => 'blead',
},
'if' =>
@@ -511,7 +515,7 @@ package Maintainers;
'IO' =>
{
'MAINTAINER' => 'gbarr',
- 'FILES' => q[ext/IO],
+ 'FILES' => q[ext/IO/],
'CPAN' => 1,
'UPSTREAM' => undef,
},
@@ -548,6 +552,14 @@ package Maintainers;
'UPSTREAM' => 'cpan',
},
+ 'IPC::SysV' =>
+ {
+ 'MAINTAINER' => 'mhx',
+ 'FILES' => q[ext/IPC-SysV],
+ 'CPAN' => 1,
+ 'UPSTREAM' => 'cpan',
+ },
+
'lib' =>
{
'MAINTAINER' => 'smueller',
@@ -727,7 +739,7 @@ package Maintainers;
'Module::Pluggable' =>
{
'MAINTAINER' => 'simonw',
- 'FILES' => q[ext/Module-Pluggable t/Module_Pluggable],
+ 'FILES' => q[ext/Module-Pluggable],
'CPAN' => 1,
'UPSTREAM' => undef,
},
@@ -737,15 +749,15 @@ package Maintainers;
'MAINTAINER' => 'smpeters',
'FILES' => q[lib/Net/Ping.pm lib/Net/Ping],
'CPAN' => 1,
- 'UPSTREAM' => undef,
+ 'UPSTREAM' => 'blead',
},
'NEXT' =>
{
- 'MAINTAINER' => 'dconway',
+ 'MAINTAINER' => 'rafl',
'FILES' => q[lib/NEXT.pm lib/NEXT],
'CPAN' => 1,
- 'UPSTREAM' => undef,
+ 'UPSTREAM' => 'cpan',
},
'Object::Accessor' =>
@@ -1069,8 +1081,7 @@ package Maintainers;
'threads' =>
{
'MAINTAINER' => 'jdhedden',
- 'FILES' => q[ext/threads/hints ext/threads/t
- ext/threads/threads.{pm,xs}],
+ 'FILES' => q[ext/threads],
'CPAN' => 1,
'UPSTREAM' => 'blead',
},
@@ -1129,7 +1140,7 @@ package Maintainers;
'FILES' => q[lib/Unicode/Collate.pm
lib/Unicode/Collate],
'CPAN' => 1,
- 'UPSTREAM' => undef,
+ 'UPSTREAM' => 'first-come',
},
'Unicode::Normalize' =>
@@ -1137,7 +1148,7 @@ package Maintainers;
'MAINTAINER' => 'sadahiro',
'FILES' => q[ext/Unicode-Normalize],
'CPAN' => 1,
- 'UPSTREAM' => undef,
+ 'UPSTREAM' => 'first-come',
},
'version' =>
diff --git a/Porting/Maintainers.pm b/Porting/Maintainers.pm
index 0b03e0579e..666e4516db 100644
--- a/Porting/Maintainers.pm
+++ b/Porting/Maintainers.pm
@@ -18,7 +18,7 @@ use vars qw(@ISA @EXPORT_OK $VERSION);
@ISA = qw(Exporter);
@EXPORT_OK = qw(%Modules %Maintainers
get_module_files get_module_pat
- show_results process_options);
+ show_results process_options files_to_modules);
$VERSION = 0.02;
require Exporter;
@@ -135,6 +135,71 @@ sub process_options {
return ($Maintainer, $Module, $Files, @Files);
}
+sub files_to_modules {
+ my @Files = @_;
+ my %ModuleByFile;
+
+ for (@Files) { s:^\./:: }
+
+ @ModuleByFile{@Files} = ();
+
+ # First try fast match.
+
+ my %ModuleByPat;
+ for my $module (keys %Modules) {
+ for my $pat (get_module_pat($module)) {
+ $ModuleByPat{$pat} = $module;
+ }
+ }
+ # Expand any globs.
+ my %ExpModuleByPat;
+ for my $pat (keys %ModuleByPat) {
+ if (-e $pat) {
+ $ExpModuleByPat{$pat} = $ModuleByPat{$pat};
+ } else {
+ for my $exp (glob($pat)) {
+ $ExpModuleByPat{$exp} = $ModuleByPat{$pat};
+ }
+ }
+ }
+ %ModuleByPat = %ExpModuleByPat;
+ for my $file (@Files) {
+ $ModuleByFile{$file} = $ModuleByPat{$file}
+ if exists $ModuleByPat{$file};
+ }
+
+ # If still unresolved files...
+ if (my @ToDo = grep { !defined $ModuleByFile{$_} } keys %ModuleByFile) {
+
+ # Cannot match what isn't there.
+ @ToDo = grep { -e $_ } @ToDo;
+
+ if (@ToDo) {
+ # Try prefix matching.
+
+ # Remove trailing slashes.
+ for (@ToDo) { s|/$|| }
+
+ my %ToDo;
+ @ToDo{@ToDo} = ();
+
+ for my $pat (keys %ModuleByPat) {
+ last unless keys %ToDo;
+ if (-d $pat) {
+ my @Done;
+ for my $file (keys %ToDo) {
+ if ($file =~ m|^$pat|i) {
+ $ModuleByFile{$file} = $ModuleByPat{$pat};
+ push @Done, $file;
+ }
+ }
+ delete @ToDo{@Done};
+ }
+ }
+ }
+ }
+ \%ModuleByFile;
+}
sub show_results {
my ($Maintainer, $Module, $Files, @Files) = @_;
@@ -179,72 +244,11 @@ sub show_results {
duplicated_maintainers();
}
} elsif (@Files) {
- my %ModuleByFile;
-
- for (@Files) { s:^\./:: }
-
- @ModuleByFile{@Files} = ();
-
- # First try fast match.
-
- my %ModuleByPat;
- for my $module (keys %Modules) {
- for my $pat (get_module_pat($module)) {
- $ModuleByPat{$pat} = $module;
- }
- }
- # Expand any globs.
- my %ExpModuleByPat;
- for my $pat (keys %ModuleByPat) {
- if (-e $pat) {
- $ExpModuleByPat{$pat} = $ModuleByPat{$pat};
- } else {
- for my $exp (glob($pat)) {
- $ExpModuleByPat{$exp} = $ModuleByPat{$pat};
- }
- }
- }
- %ModuleByPat = %ExpModuleByPat;
- for my $file (@Files) {
- $ModuleByFile{$file} = $ModuleByPat{$file}
- if exists $ModuleByPat{$file};
- }
-
- # If still unresolved files...
- if (my @ToDo = grep { !defined $ModuleByFile{$_} } keys %ModuleByFile) {
-
- # Cannot match what isn't there.
- @ToDo = grep { -e $_ } @ToDo;
-
- if (@ToDo) {
- # Try prefix matching.
-
- # Remove trailing slashes.
- for (@ToDo) { s|/$|| }
-
- my %ToDo;
- @ToDo{@ToDo} = ();
-
- for my $pat (keys %ModuleByPat) {
- last unless keys %ToDo;
- if (-d $pat) {
- my @Done;
- for my $file (keys %ToDo) {
- if ($file =~ m|^$pat|i) {
- $ModuleByFile{$file} = $ModuleByPat{$pat};
- push @Done, $file;
- }
- }
- delete @ToDo{@Done};
- }
- }
- }
- }
-
+ my $ModuleByFile = files_to_modules(@Files);
for my $file (@Files) {
- if (defined $ModuleByFile{$file}) {
- my $module = $ModuleByFile{$file};
- my $maintainer = $Modules{$ModuleByFile{$file}}{MAINTAINER};
+ if (defined $ModuleByFile->{$file}) {
+ my $module = $ModuleByFile->{$file};
+ my $maintainer = $Modules{$ModuleByFile->{$file}}{MAINTAINER};
my $upstream = $Modules{$module}{UPSTREAM}||'unknown';
printf "%-15s [%-7s] $module $maintainer $Maintainers{$maintainer}\n", $file, $upstream;
} else {
diff --git a/Porting/config.sh b/Porting/config.sh
index 06f70bd358..1356481074 100644
--- a/Porting/config.sh
+++ b/Porting/config.sh
@@ -225,6 +225,7 @@ d_ftime='undef'
d_futimes='define'
d_gdbm_ndbm_h_uses_prototypes='undef'
d_gdbmndbm_h_uses_prototypes='undef'
+d_getaddrinfo='define'
d_getcwd='define'
d_getespwnam='undef'
d_getfsstat='undef'
@@ -246,6 +247,7 @@ d_getlogin='define'
d_getlogin_r='undef'
d_getmnt='undef'
d_getmntent='define'
+d_getnameinfo='define'
d_getnbyaddr='define'
d_getnbyname='define'
d_getnent='define'
@@ -291,6 +293,8 @@ d_ilogbl='define'
d_inc_version_list='undef'
d_index='undef'
d_inetaton='define'
+d_inetntop='define'
+d_inetpton='define'
d_int64_t='define'
d_isascii='define'
d_isfinite='undef'
@@ -556,7 +560,7 @@ doublesize='8'
drand01='drand48()'
drand48_r_proto='0'
dtrace=''
-dynamic_ext='attrs B Compress/Raw/Zlib Cwd Data/Dumper DB_File Devel/DProf Devel/Peek Devel/PPPort Digest/MD5 Digest/SHA Encode Fcntl File/Glob Filter/Util/Call GDBM_File Hash/Util I18N/Langinfo IO IPC/SysV List/Util Math/BigInt/FastCalc MIME/Base64 NDBM_File ODBM_File Opcode PerlIO/encoding PerlIO/scalar PerlIO/via POSIX re SDBM_File Socket Storable Sys/Hostname Sys/Syslog Text/Soundex threads Time/HiRes Time/Piece Unicode/Normalize XS/APItest XS/Typemap threads/shared Hash/Util/FieldHash'
+dynamic_ext='attributes B Compress/Raw/Zlib Cwd Data/Dumper DB_File Devel/DProf Devel/Peek Devel/PPPort Digest/MD5 Digest/SHA Encode Fcntl File/Glob Filter/Util/Call GDBM_File Hash/Util I18N/Langinfo IO IPC/SysV List/Util Math/BigInt/FastCalc MIME/Base64 NDBM_File ODBM_File Opcode PerlIO/encoding PerlIO/scalar PerlIO/via POSIX re SDBM_File Socket Storable Sys/Hostname Sys/Syslog Text/Soundex threads Time/HiRes Time/Piece Unicode/Normalize XS/APItest XS/Typemap threads/shared Hash/Util/FieldHash'
eagain='EAGAIN'
ebcdic='undef'
echo='echo'
@@ -571,7 +575,7 @@ endservent_r_proto='0'
eunicefix=':'
exe_ext=''
expr='expr'
-extensions='attrs B Compress/Raw/Zlib Cwd Data/Dumper DB_File Devel/DProf Devel/Peek Devel/PPPort Digest/MD5 Digest/SHA Encode Fcntl File/Glob Filter/Util/Call GDBM_File Hash/Util I18N/Langinfo IO IPC/SysV List/Util Math/BigInt/FastCalc MIME/Base64 NDBM_File ODBM_File Opcode PerlIO/encoding PerlIO/scalar PerlIO/via POSIX re SDBM_File Socket Storable Sys/Hostname Sys/Syslog Text/Soundex threads Time/HiRes Time/Piece Unicode/Normalize XS/APItest XS/Typemap threads/shared Hash/Util/FieldHash Compress/Zlib Errno IO_Compress_Base IO_Compress_Zlib Module/Pluggable Test/Harness'
+extensions='attributes B Compress/Raw/Zlib Cwd Data/Dumper DB_File Devel/DProf Devel/Peek Devel/PPPort Digest/MD5 Digest/SHA Encode Fcntl File/Glob Filter/Util/Call GDBM_File Hash/Util I18N/Langinfo IO IPC/SysV List/Util Math/BigInt/FastCalc MIME/Base64 NDBM_File ODBM_File Opcode PerlIO/encoding PerlIO/scalar PerlIO/via POSIX re SDBM_File Socket Storable Sys/Hostname Sys/Syslog Text/Soundex threads Time/HiRes Time/Piece Unicode/Normalize XS/APItest XS/Typemap threads/shared Hash/Util/FieldHash Compress/Zlib Errno IO_Compress_Base IO_Compress_Zlib Module/Pluggable Test/Harness'
extern_C='extern'
extras=''
fflushNULL='define'
@@ -763,7 +767,7 @@ issymlink='test -h'
ivdformat='"Ld"'
ivsize='8'
ivtype='long long'
-known_extensions='attrs B Compress/Raw/Zlib Cwd Data/Dumper DB_File Devel/DProf Devel/Peek Devel/PPPort Digest/MD5 Digest/SHA Encode Fcntl File/Glob Filter/Util/Call GDBM_File Hash/Util I18N/Langinfo IO IPC/SysV List/Util Math/BigInt/FastCalc MIME/Base64 NDBM_File ODBM_File Opcode PerlIO/encoding PerlIO/scalar PerlIO/via POSIX re SDBM_File Socket Storable Sys/Hostname Sys/Syslog Text/Soundex threads Time/HiRes Time/Piece Unicode/Normalize Win32 Win32API/File Win32CORE XS/APItest XS/Typemap threads/shared Hash/Util/FieldHash'
+known_extensions='attributes B Compress/Raw/Zlib Cwd Data/Dumper DB_File Devel/DProf Devel/Peek Devel/PPPort Digest/MD5 Digest/SHA Encode Fcntl File/Glob Filter/Util/Call GDBM_File Hash/Util I18N/Langinfo IO IPC/SysV List/Util Math/BigInt/FastCalc MIME/Base64 NDBM_File ODBM_File Opcode PerlIO/encoding PerlIO/scalar PerlIO/via POSIX re SDBM_File Socket Storable Sys/Hostname Sys/Syslog Text/Soundex threads Time/HiRes Time/Piece Unicode/Normalize Win32 Win32API/File Win32CORE XS/APItest XS/Typemap threads/shared Hash/Util/FieldHash'
ksh=''
ld='cc'
lddlflags='-shared -O2 -L/usr/local/lib -fstack-protector'
diff --git a/Porting/corecpan.pl b/Porting/corecpan.pl
index df2a70acc4..eb77fe18b6 100644
--- a/Porting/corecpan.pl
+++ b/Porting/corecpan.pl
@@ -148,7 +148,7 @@ else {
for my $dist (sort keys %results) {
print "Module $dist...\n";
for my $file (sort keys %{$results{$dist}}) {
- my ($vcpan, $vcore) = @{$results{$dist}{$file}}{@labels};
+ my ($vcore, $vcpan) = @{$results{$dist}{$file}}{@labels};
if (our $opt_v or $vcore ne $vcpan) {
print " $file: core=$vcore, cpan=$vcpan\n";
}
diff --git a/Porting/corelist.pl b/Porting/corelist.pl
index 5c25d0a963..b301c832e0 100644
--- a/Porting/corelist.pl
+++ b/Porting/corelist.pl
@@ -6,8 +6,34 @@ use strict;
use warnings;
use File::Find;
use ExtUtils::MM_Unix;
+use lib "Porting";
+use Maintainers qw(%Modules files_to_modules);
+use File::Spec;
my %lines;
+my %module_to_file;
+my %modlist;
+my $cpan = shift;
+
+if ($cpan) {
+ my $modlistfile
+ = File::Spec->catfile($cpan, 'modules', '02packages.details.txt');
+ open my $fh, '<', $modlistfile or die "Couldn't open $modlistfile: $!";
+
+ {
+ local $/ = "\n\n";
+ die "Incompatible modlist format"
+ unless <$fh> =~ /^Columns: +package name, version, path/m;
+ }
+
+ # Converting the file to a hash is about 5 times faster than a regexp flat
+ # lookup.
+ while (<$fh>) {
+ next unless /^([A-Za-z_:0-9]+) +[-0-9.undefHASHVERSIONvsetwhenloadingbogus]+ +(\S+)/;
+ $modlist{$1} = $2;
+ }
+}
+
find(sub {
/(\.pm|_pm\.PL)$/ or return;
/PPPort\.pm$/ and return;
@@ -19,30 +45,101 @@ find(sub {
# some heuristics to figure out the module name from the file name
$module =~ s{^(lib|(win32/|vms/|symbian/)?ext)/}{}
and $1 ne 'lib'
- and ( $module =~ s{^(.*)/lib/\1\b}{$1},
- $module =~ s{(\w+)/\1\b}{$1},
+ and ( $module =~ s{\b(\w+)/\1\b}{$1},
$module =~ s{^B/O}{O},
- $module =~ s{^IO_Compress_Base/lib/}{},
- $module =~ s{^IO_Compress_Zlib/(?:lib/)?}{},
- $module =~ s{^Devel/PPPort}{Devel},
+ $module =~ s{^Devel-PPPort}{Devel},
$module =~ s{^Encode/encoding}{encoding},
- $module =~ s{^IPC/SysV/}{IPC/},
- $module =~ s{^List/Util/lib/Scalar}{Scalar},
- $module =~ s{^MIME/Base64/QuotedPrint}{MIME/QuotedPrint},
+ $module =~ s{^IPC-SysV/}{IPC/},
+ $module =~ s{^MIME-Base64/QuotedPrint}{MIME/QuotedPrint},
$module =~ s{^(?:DynaLoader|Errno|Opcode)/}{},
);
$module =~ s{/}{::}g;
+ $module =~ s{-}{::}g;
+ $module =~ s{^.*::lib::}{};
$module =~ s/(\.pm|_pm\.PL)$//;
- $lines{sprintf "\t%-24s=> $version,\n", "'$module'"}++;
+ $lines{$module} = $version;
+ $module_to_file{$module} = $File::Find::name;
}, 'lib', 'ext', 'vms/ext', 'symbian/ext');
--e 'configpm' and $lines{sprintf "\t%-24s=> undef,\n", "'Config'"}++;
+-e 'configpm' and $lines{Config} = 'undef';
if (open my $ucdv, "<", "lib/unicore/version") {
chomp (my $ucd = <$ucdv>);
- $lines{sprintf "\t%-24s=> '$ucd',\n", "'Unicode'"}++;
+ $lines{Unicode} = "'$ucd'";
close $ucdv;
}
+
+sub display_hash {
+ my ($hash) = @_;
+}
+
print " $] => {\n";
-print sort keys %lines;
+printf "\t%-24s=> $lines{$_},\n", "'$_'" foreach sort keys %lines;
print " },\n";
+
+exit unless %modlist;
+
+# We have to go through this two stage lookup, given how Maintainers.pl keys its
+# data by "Module", which is really a dist.
+my $file_to_M = files_to_modules(values %module_to_file);
+
+my %module_to_upstream;
+my %module_to_dist;
+my %dist_to_meta_YAML;
+while (my ($module, $file) = each %module_to_file) {
+ my $M = $file_to_M->{$file};
+ next unless $M;
+ next if $Modules{$M}{MAINTAINER} eq 'p5p';
+ $module_to_upstream{$module} = $Modules{$M}{UPSTREAM};
+ next if defined $module_to_upstream{$module} &&
+ $module_to_upstream{$module} =~ /^(?:blead|first-come)$/;
+ my $dist = $modlist{$module};
+ unless ($dist) {
+ warn "Can't find a distribution for $module";
+ next;
+ }
+ $module_to_dist{$module} = $dist;
+
+ next if exists $dist_to_meta_YAML{$dist};
+
+ $dist_to_meta_YAML{$dist} = undef;
+
+ # Like it or lump it, this has to be Unix format.
+ my $meta_YAML_path = "$cpan/authors/id/$dist";
+ $meta_YAML_path =~ s/(?:tar\.gz|zip)$/meta/ or die "$meta_YAML_path";
+ unless (-e $meta_YAML_path) {
+ warn "$meta_YAML_path does not exist for $module";
+ # I tried code to open the tarballs with Archive::Tar to find and
+ # extract META.yml, but only Text-Tabs+Wrap-2006.1117.tar.gz had one,
+ # so it's not worth including.
+ next;
+ }
+ require Parse::CPAN::Meta;
+ $dist_to_meta_YAML{$dist} = Parse::CPAN::Meta::LoadFile($meta_YAML_path);
+}
+
+print "\n%upstream = (\n";
+foreach my $module (sort keys %module_to_upstream) {
+ my $upstream = defined $module_to_upstream{$module}
+ ? "'$module_to_upstream{$module}'" : 'undef';
+ printf " %-24s=> $upstream,\n", "'$module'";
+}
+print ");\n";
+
+print "\n%bug_tracker = (\n";
+foreach my $module (sort keys %module_to_upstream) {
+ my $upstream = defined $module_to_upstream{$module};
+ next if defined $upstream
+ and $upstream eq 'blead' || $upstream eq 'first-come';
+
+ my $bug_tracker;
+
+ my $dist = $module_to_dist{$module};
+ $bug_tracker = $dist_to_meta_YAML{$dist}->{resources}{bugtracker}
+ if $dist;
+
+ $bug_tracker = defined $bug_tracker ? "'$bug_tracker'" : 'undef';
+ next if $bug_tracker eq "'http://rt.perl.org/perlbug/'";
+ printf " %-24s=> $bug_tracker,\n", "'$module'";
+}
+print ");\n";
diff --git a/README.cygwin b/README.cygwin
index 231d94721d..14640c6784 100644
--- a/README.cygwin
+++ b/README.cygwin
@@ -564,11 +564,11 @@ be kept as clean as possible.
pod/perl561delta.pod pod/perl570delta.pod pod/perl572delta.pod
pod/perl573delta.pod pod/perl58delta.pod pod/perl581delta.pod
pod/perl590delta.pod pod/perlhist.pod pod/perlmodlib.pod
- pod/perltoc.pod pod.lst Porting/Glossary Porting/repository.pod
+ pod/perltoc.pod pod.lst Porting/Glossary pod/perlrepository.pod
Porting/checkAUTHORS.pl
ext/Compress-Raw-Zlib/Changes ext/Compress-Raw-Zlib/README
ext/Compress-Zlib/Changes ext/Cwd/Changes ext/DB_File/Changes
- ext/Encode/Changes ext/Sys/Syslog/Changes ext/Time-HiRes/Changes
+ ext/Encode/Changes ext/Sys-Syslog/Changes ext/Time-HiRes/Changes
ext/Win32API-File/Changes lib/CGI/Changes lib/ExtUtils/CBuilder/Changes
lib/ExtUtils/Changes lib/ExtUtils/NOTES lib/ExtUtils/PATCHING
lib/ExtUtils/README lib/Module/Build/Changes lib/Net/Ping/Changes
diff --git a/README.symbian b/README.symbian
index 6bd36f5a75..341c0269fb 100644
--- a/README.symbian
+++ b/README.symbian
@@ -360,7 +360,7 @@ The Symbian port is licensed under the same terms as Perl itself.
DynaLoader Exporter File::Spec integer lib strict Symbol
vars warnings XSLoader
- The following extensions are available:
- attrs Compress::Zlib Cwd Data::Dumper Devel::Peek Digest::MD5 DynaLoader
+ attributes Compress::Zlib Cwd Data::Dumper Devel::Peek Digest::MD5 DynaLoader
Fcntl File::Glob Filter::Util::Call IO List::Util MIME::Base64
PerlIO::scalar PerlIO::via SDBM_File Socket Storable Time::HiRes
- The following extensions are missing for various technical reasons:
diff --git a/README.vms b/README.vms
index de1ce59d4e..0328cd972d 100644
--- a/README.vms
+++ b/README.vms
@@ -768,7 +768,7 @@ Vmsperl pages on the web include:
=head1 SEE ALSO
Perl information for users and programmers about the port of perl to VMS is
-available from the [.VMS]PERLVMS.POD file that gets installed as L<perlvms>.
+available from the [.POD]PERLVMS.POD file that gets installed as L<perlvms>.
For administrators the perlvms document also includes a detailed discussion
of extending vmsperl with CPAN modules after Perl has been installed.
diff --git a/autodoc.pl b/autodoc.pl
index 25fabf0ca4..325d778f98 100644
--- a/autodoc.pl
+++ b/autodoc.pl
@@ -1,13 +1,5 @@
#!/usr/bin/perl -w
-require 5.003; # keep this compatible, an old perl is all we may have before
- # we build the new one
-
-BEGIN {
- push @INC, 'lib';
- require 'regen_lib.pl';
-}
-
use strict;
#
@@ -17,52 +9,6 @@ use strict;
# implicit interpreter context argument.
#
-open IN, "embed.fnc" or die $!;
-
-# walk table providing an array of components in each line to
-# subroutine, printing the result
-sub walk_table (&@) {
- my $function = shift;
- my $filename = shift || '-';
- my $leader = shift;
- my $trailer = shift;
- my $F;
- local *F;
- if (ref $filename) { # filehandle
- $F = $filename;
- }
- else {
- safer_unlink $filename;
- $F = safer_open($filename);
- binmode F;
- $F = \*F;
- }
- print $F $leader if $leader;
- seek IN, 0, 0; # so we may restart
- while (<IN>) {
- chomp;
- next if /^:/;
- while (s|\\\s*$||) {
- $_ .= <IN>;
- chomp;
- }
- s/\s+$//;
- my @args;
- if (/^\s*(#|$)/) {
- @args = $_;
- }
- else {
- @args = split /\s*\|\s*/, $_;
- }
- s/\b(NN|NULLOK)\b\s+//g for @args;
- print $F $function->(@args);
- }
- print $F $trailer if $trailer;
- unless (ref $filename) {
- close $F or die "Error closing $filename: $!";
- }
-}
-
my %apidocs;
my %gutsdocs;
my %docfuncs;
@@ -145,9 +91,12 @@ removed without notice.\n\n" if $flags =~ /x/;
print $fh "=for hackers\nFound in file $file\n\n";
}
-sub readonly_header (*) {
- my $fh = shift;
- print $fh <<"_EOH_";
+sub output {
+ my ($podname, $header, $dochash, $footer) = @_;
+ my $filename = "pod/$podname.pod";
+ open my $fh, '>', $filename or die "Can't open $filename: $!";
+
+ print $fh <<"_EOH_", $header;
-*- buffer-read-only: t -*-
!!!!!!! DO NOT EDIT THIS FILE !!!!!!!
@@ -155,15 +104,32 @@ This file is built by $0 extracting documentation from the C source
files.
_EOH_
-}
-sub readonly_footer (*) {
- my $fh = shift;
- print $fh <<'_EOF_';
+ my $key;
+ # case insensitive sort, with fallback for determinacy
+ for $key (sort { uc($a) cmp uc($b) || $a cmp $b } keys %$dochash) {
+ my $section = $dochash->{$key};
+ print $fh "\n=head1 $key\n\n=over 8\n\n";
+ # Again, fallback for determinacy
+ for my $key (sort { uc($a) cmp uc($b) || $a cmp $b } keys %$section) {
+ docout($fh, $key, $section->{$key});
+ }
+ print $fh "\n=back\n";
+ }
+
+ print $fh $footer, <<'_EOF_';
=cut
ex: set ro:
_EOF_
+
+ close $fh or die "Can't close $filename: $!";
+}
+
+if (@ARGV) {
+ my $workdir = shift;
+ chdir $workdir
+ or die "Couldn't chdir to '$workdir': $!";
}
my $file;
@@ -182,34 +148,47 @@ for $file (($MANIFEST =~ /^(\S+\.c)\t/gm), ($MANIFEST =~ /^(\S+\.h)\t/gm)) {
close F or die "Error closing $file: $!\n";
}
-safer_unlink "pod/perlapi.pod";
-my $doc = safer_open("pod/perlapi.pod");
-
-walk_table { # load documented functions into appropriate hash
- if (@_ > 1) {
- my($flags, $retval, $func, @args) = @_;
- return "" unless $flags =~ /d/;
- $func =~ s/\t//g; $flags =~ s/p//; # clean up fields from embed.pl
- $retval =~ s/\t//;
- my $docref = delete $docfuncs{$func};
- $seenfuncs{$func} = 1;
- if ($docref and @$docref) {
- if ($flags =~ /A/) {
- $docref->[0].="x" if $flags =~ /M/;
- $apidocs{$docref->[4]}{$func} =
- [$docref->[0] . 'A', $docref->[1], $retval, $docref->[3],
- @args];
- } else {
- $gutsdocs{$docref->[4]}{$func} =
- [$docref->[0], $docref->[1], $retval, $docref->[3], @args];
- }
- }
- else {
- warn "no docs for $func\n" unless $seenfuncs{$func};
+open IN, "embed.fnc" or die $!;
+
+# walk table providing an array of components in each line to
+# subroutine, printing the result
+
+while (<IN>) {
+ chomp;
+ next if /^:/;
+ while (s|\\\s*$||) {
+ $_ .= <IN>;
+ chomp;
+ }
+ s/\s+$//;
+ next if /^\s*(#|$)/;
+
+ my ($flags, $retval, $func, @args) = split /\s*\|\s*/, $_;
+
+ next unless $flags =~ /d/;
+ next unless $func;
+
+ s/\b(NN|NULLOK)\b\s+//g for @args;
+ $func =~ s/\t//g; # clean up fields from embed.pl
+ $retval =~ s/\t//;
+
+ my $docref = delete $docfuncs{$func};
+ $seenfuncs{$func} = 1;
+ if ($docref and @$docref) {
+ if ($flags =~ /A/) {
+ $docref->[0].="x" if $flags =~ /M/;
+ $apidocs{$docref->[4]}{$func} =
+ [$docref->[0] . 'A', $docref->[1], $retval, $docref->[3],
+ @args];
+ } else {
+ $gutsdocs{$docref->[4]}{$func} =
+ [$docref->[0], $docref->[1], $retval, $docref->[3], @args];
}
}
- return "";
-} $doc;
+ else {
+ warn "no docs for $func\n" unless $seenfuncs{$func};
+ }
+}
for (sort keys %docfuncs) {
# Have you used a full for apidoc or just a func name?
@@ -217,9 +196,7 @@ for (sort keys %docfuncs) {
warn "Unable to place $_!\n";
}
-readonly_header($doc);
-
-print $doc <<'_EOB_';
+output('perlapi', <<'_EOB_', \%apidocs, <<'_EOE_');
=head1 NAME
perlapi - autogenerated documentation for the perl public API
@@ -265,20 +242,6 @@ The listing below is alphabetical, case insensitive.
_EOB_
-my $key;
-# case insensitive sort, with fallback for determinacy
-for $key (sort { uc($a) cmp uc($b) || $a cmp $b } keys %apidocs) {
- my $section = $apidocs{$key};
- print $doc "\n=head1 $key\n\n=over 8\n\n";
- # Again, fallback for determinacy
- for my $key (sort { uc($a) cmp uc($b) || $a cmp $b } keys %$section) {
- docout($doc, $key, $section->{$key});
- }
- print $doc "\n=back\n";
-}
-
-print $doc <<'_EOE_';
-
=head1 AUTHORS
Until May 1997, this document was maintained by Jeff Okamoto
@@ -299,14 +262,7 @@ perlguts(1), perlxs(1), perlxstut(1), perlintern(1)
_EOE_
-readonly_footer($doc);
-
-safer_close($doc);
-
-safer_unlink "pod/perlintern.pod";
-my $guts = safer_open("pod/perlintern.pod");
-readonly_header($guts);
-print $guts <<'END';
+output('perlintern', <<'END', \%gutsdocs, <<'END');
=head1 NAME
perlintern - autogenerated documentation of purely B<internal>
@@ -322,17 +278,6 @@ B<they are not for use in extensions>!
END
-for $key (sort { uc($a) cmp uc($b); } keys %gutsdocs) {
- my $section = $gutsdocs{$key};
- print $guts "\n=head1 $key\n\n=over 8\n\n";
- for my $key (sort { uc($a) cmp uc($b); } keys %$section) {
- docout($guts, $key, $section->{$key});
- }
- print $guts "\n=back\n";
-}
-
-print $guts <<'END';
-
=head1 AUTHORS
The autodocumentation system was originally added to the Perl core by
@@ -344,6 +289,3 @@ document their functions.
perlguts(1), perlapi(1)
END
-readonly_footer($guts);
-
-safer_close($guts);
diff --git a/cflags.SH b/cflags.SH
index ef1c8b5b37..a5d71b928c 100755
--- a/cflags.SH
+++ b/cflags.SH
@@ -319,7 +319,6 @@ for file do
usersub) ;;
utf8) ;;
util) ;;
- xsutils) ;;
*) ;;
esac
diff --git a/config_h.SH b/config_h.SH
index 11808fc5a3..ccb7f10ea0 100755
--- a/config_h.SH
+++ b/config_h.SH
@@ -3574,6 +3574,12 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
*/
#$d_futimes HAS_FUTIMES /**/
+/* HAS_GETADDRINFO:
+ * This symbol, if defined, indicates that the getaddrinfo() function
+ * is available for use.
+ */
+#$d_getaddrinfo HAS_GETADDRINFO /**/
+
/* HAS_GETCWD:
* This symbol, if defined, indicates that the getcwd routine is
* available to get the current working directory.
@@ -3610,6 +3616,12 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
*/
#$d_getmntent HAS_GETMNTENT /**/
+/* HAS_GETNAMEINFO:
+ * This symbol, if defined, indicates that the getnameinfo() function
+ * is available for use.
+ */
+#$d_getnameinfo HAS_GETNAMEINFO /**/
+
/* HAS_GETPRPWNAM:
* This symbol, if defined, indicates that the getprpwnam system call is
* available to retrieve protected (shadow) password entries by name.
@@ -3634,6 +3646,18 @@ sed <<!GROK!THIS! >$CONFIG_H -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un
*/
#$d_ilogbl HAS_ILOGBL /**/
+/* HAS_INETNTOP:
+ * This symbol, if defined, indicates that the inet_ntop() function
+ * is available to parse IPv4 and IPv6 strings.
+ */
+#$d_inetntop HAS_INETNTOP /**/
+
+/* HAS_INETPTON:
+ * This symbol, if defined, indicates that the inet_pton() function
+ * is available to parse IPv4 and IPv6 strings.
+ */
+#$d_inetpton HAS_INETPTON /**/
+
/* HAS_INT64_T:
* This symbol will defined if the C compiler supports int64_t.
* Usually the <inttypes.h> needs to be included, but sometimes
diff --git a/configpm b/configpm
index 1825b0df9c..7651a9ca7b 100755
--- a/configpm
+++ b/configpm
@@ -124,6 +124,10 @@ $config_txt .= sprintf <<'ENDOFBEG', ($myver) x 3;
# This file was created by configpm when Perl was built. Any changes
# made to this file will be lost the next time perl is built.
+# for a description of the variables, please have a look at the
+# Glossary file, as written in the Porting folder, or use the url:
+# http://perl5.git.perl.org/perl.git/blob/HEAD:/Porting/Glossary
+
package Config;
use strict;
# use warnings; Pulls in Carp
@@ -772,6 +776,10 @@ Values stored in config.sh as 'undef' are returned as undefined
values. The perl C<exists> function can be used to check if a
named variable exists.
+For a description of the variables, please have a look at the
+Glossary file, as written in the Porting folder, or use the url:
+http://perl5.git.perl.org/perl.git/blob/HEAD:/Porting/Glossary
+
=over 4
=item myconfig()
diff --git a/configure.com b/configure.com
index 52aae858d5..4815fdf2ed 100644
--- a/configure.com
+++ b/configure.com
@@ -5949,6 +5949,7 @@ $ WC "d_ftello='" + d_ftello + "'"
$ WC "d_futimes='undef'"
$ WC "d_gdbmndbm_h_uses_prototypes='undef'"
$ WC "d_gdbm_ndbm_h_uses_prototypes='undef'"
+$ WC "d_getaddrinfo='undef'"
$ WC "d_getcwd='define'"
$ WC "d_getespwnam='undef'"
$ WC "d_getfsstat='undef'"
@@ -5963,6 +5964,7 @@ $ WC "d_getitimer='" + d_getitimer + "'"
$ WC "d_getlogin='define'"
$ WC "d_getmnt='undef'"
$ WC "d_getmntent='undef'"
+$ WC "d_getnameinfo='undef'"
$ WC "d_getnbyaddr='" + d_getnbyaddr + "'"
$ WC "d_getnbyname='" + d_getnbyname + "'"
$ WC "d_getnent='" + d_getnent + "'"
@@ -5994,6 +5996,8 @@ $ WC "d_ilogbl='undef'"
$ WC "d_inc_version_list='undef'"
$ WC "d_index='" + d_index + "'"
$ WC "d_inetaton='undef'"
+$ WC "d_inetntop='undef'"
+$ WC "d_inetpton='undef'"
$ WC "d_int64_t='" + d_int64_t + "'"
$ WC "d_isascii='define'"
$ WC "d_isfinite='undef'"
diff --git a/cop.h b/cop.h
index 39a6b01484..fc19494e25 100644
--- a/cop.h
+++ b/cop.h
@@ -232,11 +232,7 @@ struct cop {
#define CopLINE_set(c,l) (CopLINE(c) = (l))
/* OutCopFILE() is CopFILE for output (caller, die, warn, etc.) */
-#ifdef MACOS_TRADITIONAL
-# define OutCopFILE(c) MacPerl_MPWFileName(CopFILE(c))
-#else
-# define OutCopFILE(c) CopFILE(c)
-#endif
+#define OutCopFILE(c) CopFILE(c)
/* If $[ is non-zero, it's stored in cop_hints under the key "$[", and
HINT_ARYBASE is set to indicate this.
@@ -883,6 +879,7 @@ See L<perlcall/Lightweight Callbacks>.
multicall_oldcatch = CATCH_GET; \
SAVETMPS; SAVEVPTR(PL_op); \
CATCH_SET(TRUE); \
+ PUSHSTACKi(PERLSI_SORT); \
PUSHBLOCK(cx, CXt_SUB|CXp_MULTICALL, PL_stack_sp); \
PUSHSUB(cx); \
if (++CvDEPTH(cv) >= 2) { \
@@ -906,8 +903,10 @@ See L<perlcall/Lightweight Callbacks>.
LEAVESUB(multicall_cv); \
CvDEPTH(multicall_cv)--; \
POPBLOCK(cx,PL_curpm); \
+ POPSTACK; \
CATCH_SET(multicall_oldcatch); \
LEAVE; \
+ SPAGAIN; \
} STMT_END
/*
diff --git a/cv.h b/cv.h
index bd504fd3b1..2c21ec68e1 100644
--- a/cv.h
+++ b/cv.h
@@ -69,7 +69,6 @@ Returns the stash of the CV.
#define CvOUTSIDE_SEQ(sv) ((XPVCV*)MUTABLE_PTR(SvANY(sv)))->xcv_outside_seq
#define CVf_METHOD 0x0001 /* CV is explicitly marked as a method */
-#define CVf_LOCKED 0x0002 /* CV locks itself or first arg on entry */
#define CVf_LVALUE 0x0004 /* CV return value can be used as lvalue */
#define CVf_WEAKOUTSIDE 0x0010 /* CvOUTSIDE isn't ref counted */
@@ -84,7 +83,7 @@ Returns the stash of the CV.
#define CVf_ISXSUB 0x0800 /* CV is an XSUB, not pure perl. */
/* This symbol for optimised communication between toke.c and op.c: */
-#define CVf_BUILTIN_ATTRS (CVf_METHOD|CVf_LOCKED|CVf_LVALUE)
+#define CVf_BUILTIN_ATTRS (CVf_METHOD|CVf_LVALUE)
#define CvCLONE(cv) (CvFLAGS(cv) & CVf_CLONE)
#define CvCLONE_on(cv) (CvFLAGS(cv) |= CVf_CLONE)
@@ -110,10 +109,6 @@ Returns the stash of the CV.
#define CvMETHOD_on(cv) (CvFLAGS(cv) |= CVf_METHOD)
#define CvMETHOD_off(cv) (CvFLAGS(cv) &= ~CVf_METHOD)
-#define CvLOCKED(cv) (CvFLAGS(cv) & CVf_LOCKED)
-#define CvLOCKED_on(cv) (CvFLAGS(cv) |= CVf_LOCKED)
-#define CvLOCKED_off(cv) (CvFLAGS(cv) &= ~CVf_LOCKED)
-
#define CvLVALUE(cv) (CvFLAGS(cv) & CVf_LVALUE)
#define CvLVALUE_on(cv) (CvFLAGS(cv) |= CVf_LVALUE)
#define CvLVALUE_off(cv) (CvFLAGS(cv) &= ~CVf_LVALUE)
diff --git a/doio.c b/doio.c
index 6135efa46d..0e46582e89 100644
--- a/doio.c
+++ b/doio.c
@@ -1395,7 +1395,7 @@ Perl_do_aexec5(pTHX_ SV *really, register SV **mark, register SV **sp,
{
dVAR;
PERL_ARGS_ASSERT_DO_AEXEC5;
-#if defined(MACOS_TRADITIONAL) || defined(__SYMBIAN32__) || defined(__LIBCATAMOUNT__)
+#if defined(__SYMBIAN32__) || defined(__LIBCATAMOUNT__)
Perl_croak(aTHX_ "exec? I'm not *that* kind of operating system");
#else
if (sp > mark) {
@@ -1943,10 +1943,6 @@ Perl_cando(pTHX_ Mode_t mode, bool effective, register const Stat_t *statbufp)
static bool
S_ingroup(pTHX_ Gid_t testgid, bool effective)
{
-#ifdef MACOS_TRADITIONAL
- /* This is simply not correct for AppleShare, but fix it yerself. */
- return TRUE;
-#else
dVAR;
if (testgid == (effective ? PL_egid : PL_gid))
return TRUE;
@@ -1971,7 +1967,6 @@ S_ingroup(pTHX_ Gid_t testgid, bool effective)
#else
return FALSE;
#endif
-#endif
}
#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
@@ -1981,7 +1976,7 @@ Perl_do_ipcget(pTHX_ I32 optype, SV **mark, SV **sp)
{
dVAR;
const key_t key = (key_t)SvNVx(*++mark);
- const I32 n = (optype == OP_MSGGET) ? 0 : SvIVx(*++mark);
+ SV *nsv = optype == OP_MSGGET ? NULL : *++mark;
const I32 flags = SvIVx(*++mark);
PERL_ARGS_ASSERT_DO_IPCGET;
@@ -1996,11 +1991,11 @@ Perl_do_ipcget(pTHX_ I32 optype, SV **mark, SV **sp)
#endif
#ifdef HAS_SEM
case OP_SEMGET:
- return semget(key, n, flags);
+ return semget(key, (int) SvIV(nsv), flags);
#endif
#ifdef HAS_SHM
case OP_SHMGET:
- return shmget(key, n, flags);
+ return shmget(key, (size_t) SvUV(nsv), flags);
#endif
#if !defined(HAS_MSG) || !defined(HAS_SEM) || !defined(HAS_SHM)
default:
@@ -2352,11 +2347,6 @@ Perl_vms_start_glob
fp = Perl_vms_start_glob(aTHX_ tmpglob, io);
#else /* !VMS */
-#ifdef MACOS_TRADITIONAL
- sv_setpv(tmpcmd, "glob ");
- sv_catsv(tmpcmd, tmpglob);
- sv_catpv(tmpcmd, " |");
-#else
#ifdef DOSISH
#ifdef OS2
sv_setpv(tmpcmd, "for a in ");
@@ -2388,7 +2378,6 @@ Perl_vms_start_glob
#endif
#endif /* !CSH */
#endif /* !DOSISH */
-#endif /* MACOS_TRADITIONAL */
(void)do_open(PL_last_in_gv, (char*)SvPVX_const(tmpcmd), SvCUR(tmpcmd),
FALSE, O_RDONLY, 0, NULL);
fp = IoIFP(io);
diff --git a/doop.c b/doop.c
index 34357732c0..5cce7edeb9 100644
--- a/doop.c
+++ b/doop.c
@@ -203,10 +203,6 @@ S_do_trans_complex(pTHX_ SV * const sv)
if (complement && !del)
rlen = tbl[0x100];
-#ifdef MACOS_TRADITIONAL
-#define comp CoMP /* "comp" is a keyword in some compilers ... */
-#endif
-
if (PL_op->op_private & OPpTRANS_SQUASH) {
UV pch = 0xfeedface;
while (s < send) {
diff --git a/dump.c b/dump.c
index 724baf8bd3..4d6e6d4fc0 100644
--- a/dump.c
+++ b/dump.c
@@ -1477,7 +1477,6 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
if (SvCOMPILED(sv)) sv_catpv(d, "COMPILED,");
if (CvLVALUE(sv)) sv_catpv(d, "LVALUE,");
if (CvMETHOD(sv)) sv_catpv(d, "METHOD,");
- if (CvLOCKED(sv)) sv_catpv(d, "LOCKED,");
if (CvWEAKOUTSIDE(sv)) sv_catpv(d, "WEAKOUTSIDE,");
break;
case SVt_PVHV:
@@ -1492,7 +1491,6 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
if (isGV_with_GP(sv)) {
if (GvINTRO(sv)) sv_catpv(d, "INTRO,");
if (GvMULTI(sv)) sv_catpv(d, "MULTI,");
- if (GvUNIQUE(sv)) sv_catpv(d, "UNIQUE,");
if (GvASSUMECV(sv)) sv_catpv(d, "ASSUMECV,");
if (GvIN_PAD(sv)) sv_catpv(d, "IN_PAD,");
}
diff --git a/embed.fnc b/embed.fnc
index cae666c62c..7dae7636d1 100644
--- a/embed.fnc
+++ b/embed.fnc
@@ -1278,8 +1278,6 @@ Apr |void |newMYSUB |I32 floor|NULLOK OP *o|NULLOK OP *proto|NULLOK OP *attrs|NU
#endif
: Used in perly.y
p |OP * |my_attrs |NN OP *o|NULLOK OP *attrs
-: Only used in perl.c
-p |void |boot_core_xsutils
#if defined(USE_ITHREADS)
ApR |PERL_CONTEXT*|cx_dup |NULLOK PERL_CONTEXT* cx|I32 ix|I32 max|NN CLONE_PARAMS* param
ApR |PERL_SI*|si_dup |NULLOK PERL_SI* si|NN CLONE_PARAMS* param
@@ -1866,7 +1864,7 @@ Apn |int |my_socketpair |int family|int type|int protocol|int fd[2]
Ap |int |my_dirfd |NULLOK DIR* dir
#ifdef PERL_OLD_COPY_ON_WRITE
: Used in pp_hot.c and regexec.c
-pMXE |SV* |sv_setsv_cow |NN SV* dstr|NN SV* sstr
+pMXE |SV* |sv_setsv_cow |NULLOK SV* dstr|NN SV* sstr
#endif
Aop |const char *|PerlIO_context_layers|NULLOK const char *mode
diff --git a/embed.h b/embed.h
index 8e100f222f..09af299b1a 100644
--- a/embed.h
+++ b/embed.h
@@ -1113,7 +1113,6 @@
#endif
#ifdef PERL_CORE
#define my_attrs Perl_my_attrs
-#define boot_core_xsutils Perl_boot_core_xsutils
#endif
#if defined(USE_ITHREADS)
#define cx_dup Perl_cx_dup
@@ -3444,7 +3443,6 @@
#endif
#ifdef PERL_CORE
#define my_attrs(a,b) Perl_my_attrs(aTHX_ a,b)
-#define boot_core_xsutils() Perl_boot_core_xsutils(aTHX)
#endif
#if defined(USE_ITHREADS)
#define cx_dup(a,b,c,d) Perl_cx_dup(aTHX_ a,b,c,d)
diff --git a/epoc/config.sh b/epoc/config.sh
index 49f59147dc..5d41313332 100644
--- a/epoc/config.sh
+++ b/epoc/config.sh
@@ -202,6 +202,7 @@ d_ftime='undef'
d_futimes='undef'
d_gdbm_ndbm_h_uses_prototypes='undef'
d_gdbmndbm_h_uses_prototypes='undef'
+d_getaddrinfo='undef'
d_getespwnam='undef'
d_getfsstat='undef'
d_getgrent_r='undef'
@@ -221,6 +222,7 @@ d_getitimer='undef'
d_getlogin_r='undef'
d_getlogin='undef'
d_getmntent='undef'
+d_getnameinfo='undef'
d_getnbyaddr='undef'
d_getnbyname='undef'
d_getnent='undef'
@@ -265,6 +267,8 @@ d_htonl='define'
d_ilogbl='undef'
d_index='undef'
d_inetaton='define'
+d_inetntop='undef'
+d_inetpton='undef'
d_int64_t='undef'
d_iovec_s='undef'
d_isascii='define'
@@ -525,7 +529,7 @@ endservent_r_proto='0'
eunicefix=':'
exe_ext=''
expr='expr'
-extensions='Data/Dumper Digest/MD5 Errno Fcntl File/Glob Filter/Util/Call IO List/Util MIME/Base64 Opcode PerlIO/scalar Socket Storable Sys/Hostname Unicode/Storable attrs re'
+extensions='Data/Dumper Digest/MD5 Errno Fcntl File/Glob Filter/Util/Call IO List/Util MIME/Base64 Opcode PerlIO/scalar Socket Storable Sys/Hostname Unicode/Storable attributes re'
fflushNULL='undef'
fflushall='define'
find=''
diff --git a/ext/.gitignore b/ext/.gitignore
index 820dc7bf16..5cd0e48950 100644
--- a/ext/.gitignore
+++ b/ext/.gitignore
@@ -12,3 +12,16 @@ ppport.h
!/XS-APItest/exception.c
!/XS-APItest/notcore.c
!/XS-Typemap/stdio.c
+/attributes/Makefile.PL
+/Data-Dumper/Makefile.PL
+/Filter-Util-Call/Makefile.PL
+/Hash-Util-FieldHash/Makefile.PL
+/Math-BigInt-FastCalc/Makefile.PL
+/mro/Makefile.PL
+/Opcode/Makefile.PL
+/PerlIO-encoding/Makefile.PL
+/PerlIO-scalar/Makefile.PL
+/PerlIO-via/Makefile.PL
+/Sys-Hostname/Makefile.PL
+/Test-Harness/Makefile.PL
+/Text-Soundex/Makefile.PL
diff --git a/ext/Attribute-Handlers/Changes b/ext/Attribute-Handlers/Changes
index 06e47ff62c..394ef5253e 100644
--- a/ext/Attribute-Handlers/Changes
+++ b/ext/Attribute-Handlers/Changes
@@ -115,4 +115,10 @@ Revision history for Perl extension Attribute::Handlers
0.81 Sun Nov 9 22:47:00 CET 2008
- Fix to make tests work on 5.6.X (Eric Rybski, RT #40781)
+
+0.82 Wed Mar 11 17:17:00 CET 2009
+ - Bring test code in line with core perl.
+0.83 Fri Mar 13 15:14:00 CET 2009
+ - Re-add a TODO marker in the tests that would fail on 5.6.2.
+
diff --git a/ext/Attribute-Handlers/README b/ext/Attribute-Handlers/README
index 78d4e1242a..a1d9ce333e 100644
--- a/ext/Attribute-Handlers/README
+++ b/ext/Attribute-Handlers/README
@@ -1,62 +1,605 @@
==============================================================================
- Release of version 0.80 of Attribute::Handlers
+ Attribute::Handlers
==============================================================================
NAME
Attribute::Handlers - Simpler definition of attribute handlers
+VERSION
+ This document describes version 0.79 of Attribute::Handlers, released
+ November 25, 2007.
+
+SYNOPSIS
+ package MyClass;
+ require v5.6.0;
+ use Attribute::Handlers;
+ no warnings 'redefine';
+
+
+ sub Good : ATTR(SCALAR) {
+ my ($package, $symbol, $referent, $attr, $data) = @_;
+
+ # Invoked for any scalar variable with a :Good attribute,
+ # provided the variable was declared in MyClass (or
+ # a derived class) or typed to MyClass.
+
+ # Do whatever to $referent here (executed in CHECK phase).
+ ...
+ }
+
+ sub Bad : ATTR(SCALAR) {
+ # Invoked for any scalar variable with a :Bad attribute,
+ # provided the variable was declared in MyClass (or
+ # a derived class) or typed to MyClass.
+ ...
+ }
+
+ sub Good : ATTR(ARRAY) {
+ # Invoked for any array variable with a :Good attribute,
+ # provided the variable was declared in MyClass (or
+ # a derived class) or typed to MyClass.
+ ...
+ }
+
+ sub Good : ATTR(HASH) {
+ # Invoked for any hash variable with a :Good attribute,
+ # provided the variable was declared in MyClass (or
+ # a derived class) or typed to MyClass.
+ ...
+ }
+
+ sub Ugly : ATTR(CODE) {
+ # Invoked for any subroutine declared in MyClass (or a
+ # derived class) with an :Ugly attribute.
+ ...
+ }
+
+ sub Omni : ATTR {
+ # Invoked for any scalar, array, hash, or subroutine
+ # with an :Omni attribute, provided the variable or
+ # subroutine was declared in MyClass (or a derived class)
+ # or the variable was typed to MyClass.
+ # Use ref($_[2]) to determine what kind of referent it was.
+ ...
+ }
+
+
+ use Attribute::Handlers autotie => { Cycle => Tie::Cycle };
+
+ my $next : Cycle(['A'..'Z']);
+
DESCRIPTION
This module, when inherited by a package, allows that package's class to
define attribute handler subroutines for specific attributes. Variables
and subroutines subsequently defined in that package, or in packages
derived from that package may be given attributes with the same names as
- the attribute handler subroutines, which will then be called at the end
- of the compilation phase (i.e. in a `CHECK' block).
+ the attribute handler subroutines, which will then be called in one of
+ the compilation phases (i.e. in a "BEGIN", "CHECK", "INIT", or "END"
+ block). ("UNITCHECK" blocks don't correspond to a global compilation
+ phase, so they can't be specified here.)
-EXAMPLE
+ To create a handler, define it as a subroutine with the same name as the
+ desired attribute, and declare the subroutine itself with the attribute
+ ":ATTR". For example:
- package UNIVERSAL;
- use Attribute::Handlers;
+ package LoudDecl;
+ use Attribute::Handlers;
- my %name;
- sub name { return $name{$_[2]}||*{$_[1]}{NAME} }
+ sub Loud :ATTR {
+ my ($package, $symbol, $referent, $attr, $data, $phase, $filename, $linenum) = @_;
+ print STDERR
+ ref($referent), " ",
+ *{$symbol}{NAME}, " ",
+ "($referent) ", "was just declared ",
+ "and ascribed the ${attr} attribute ",
+ "with data ($data)\n",
+ "in phase $phase\n",
+ "in file $filename at line $linenum\n";
+ }
- sub Name :ATTR { $name{$_[2]} = $_[4] }
+ This creates a handler for the attribute ":Loud" in the class LoudDecl.
+ Thereafter, any subroutine declared with a ":Loud" attribute in the
+ class LoudDecl:
- sub Purpose :ATTR { print STDERR "Purpose of ", &name, " is $_[4]\n" }
+ package LoudDecl;
- sub Unit :ATTR { print STDERR &name, " measured in $_[4]\n" }
+ sub foo: Loud {...}
+ causes the above handler to be invoked, and passed:
- package main;
+ [0] the name of the package into which it was declared;
- my $capacity : Name(capacity)
- : Purpose(to store max storage capacity for files)
- : Unit(Gb);
+ [1] a reference to the symbol table entry (typeglob) containing the
+ subroutine;
- package Other;
+ [2] a reference to the subroutine;
- sub foo : Purpose(to foo all data before barring it) { }
+ [3] the name of the attribute;
+ [4] any data associated with that attribute;
-AUTHOR
- Damian Conway (damian@conway.org)
+ [5] the name of the phase in which the handler is being invoked;
-COPYRIGHT
- Copyright (c) 2001-2008, Damian Conway. All Rights Reserved.
- This module is free software. It may be used, redistributed
- and/or modified under the same terms as Perl itself.
+ [6] the filename in which the handler is being invoked;
+ [7] the line number in this file.
-CHANGES
+ Likewise, declaring any variables with the ":Loud" attribute within the
+ package:
-See the included "Changes" file for a change log.
+ package LoudDecl;
-==============================================================================
+ my $foo :Loud;
+ my @foo :Loud;
+ my %foo :Loud;
-AVAILABILITY
+ will cause the handler to be called with a similar argument list
+ (except, of course, that $_[2] will be a reference to the variable).
-Attribute::Handlers has been uploaded to the CPAN
+ The package name argument will typically be the name of the class into
+ which the subroutine was declared, but it may also be the name of a
+ derived class (since handlers are inherited).
+
+ If a lexical variable is given an attribute, there is no symbol table to
+ which it belongs, so the symbol table argument ($_[1]) is set to the
+ string 'LEXICAL' in that case. Likewise, ascribing an attribute to an
+ anonymous subroutine results in a symbol table argument of 'ANON'.
+
+ The data argument passes in the value (if any) associated with the
+ attribute. For example, if &foo had been declared:
+
+ sub foo :Loud("turn it up to 11, man!") {...}
+
+ then a reference to an array containing the string "turn it up to 11,
+ man!" would be passed as the last argument.
+
+ Attribute::Handlers makes strenuous efforts to convert the data argument
+ ($_[4]) to a useable form before passing it to the handler (but see
+ "Non-interpretive attribute handlers"). If those efforts succeed, the
+ interpreted data is passed in an array reference; if they fail, the raw
+ data is passed as a string. For example, all of these:
+
+ sub foo :Loud(till=>ears=>are=>bleeding) {...}
+ sub foo :Loud(qw/till ears are bleeding/) {...}
+ sub foo :Loud(qw/my, ears, are, bleeding/) {...}
+ sub foo :Loud(till,ears,are,bleeding) {...}
+
+ causes it to pass "['till','ears','are','bleeding']" as the handler's
+ data argument. While:
+
+ sub foo :Loud(['till','ears','are','bleeding']) {...}
+
+ causes it to pass "[ ['till','ears','are','bleeding'] ]"; the array
+ reference specified in the data being passed inside the standard array
+ reference indicating successful interpretation.
+
+ However, if the data can't be parsed as valid Perl, then it is passed as
+ an uninterpreted string. For example:
+
+ sub foo :Loud(my,ears,are,bleeding) {...}
+ sub foo :Loud(qw/my ears are bleeding) {...}
+
+ cause the strings 'my,ears,are,bleeding' and 'qw/my ears are bleeding'
+ respectively to be passed as the data argument.
+
+ If no value is associated with the attribute, "undef" is passed.
+
+ Typed lexicals
+ Regardless of the package in which it is declared, if a lexical variable
+ is ascribed an attribute, the handler that is invoked is the one
+ belonging to the package to which it is typed. For example, the
+ following declarations:
+
+ package OtherClass;
+
+ my LoudDecl $loudobj : Loud;
+ my LoudDecl @loudobjs : Loud;
+ my LoudDecl %loudobjex : Loud;
+
+ causes the LoudDecl::Loud handler to be invoked (even if OtherClass also
+ defines a handler for ":Loud" attributes).
+
+ Type-specific attribute handlers
+ If an attribute handler is declared and the ":ATTR" specifier is given
+ the name of a built-in type ("SCALAR", "ARRAY", "HASH", or "CODE"), the
+ handler is only applied to declarations of that type. For example, the
+ following definition:
+
+ package LoudDecl;
+
+ sub RealLoud :ATTR(SCALAR) { print "Yeeeeow!" }
+
+ creates an attribute handler that applies only to scalars:
+
+ package Painful;
+ use base LoudDecl;
+
+ my $metal : RealLoud; # invokes &LoudDecl::RealLoud
+ my @metal : RealLoud; # error: unknown attribute
+ my %metal : RealLoud; # error: unknown attribute
+ sub metal : RealLoud {...} # error: unknown attribute
+
+ You can, of course, declare separate handlers for these types as well
+ (but you'll need to specify "no warnings 'redefine'" to do it quietly):
+
+ package LoudDecl;
+ use Attribute::Handlers;
+ no warnings 'redefine';
+
+ sub RealLoud :ATTR(SCALAR) { print "Yeeeeow!" }
+ sub RealLoud :ATTR(ARRAY) { print "Urrrrrrrrrr!" }
+ sub RealLoud :ATTR(HASH) { print "Arrrrrgggghhhhhh!" }
+ sub RealLoud :ATTR(CODE) { croak "Real loud sub torpedoed" }
+
+ You can also explicitly indicate that a single handler is meant to be
+ used for all types of referents like so:
+
+ package LoudDecl;
+ use Attribute::Handlers;
+
+ sub SeriousLoud :ATTR(ANY) { warn "Hearing loss imminent" }
+
+ (I.e. "ATTR(ANY)" is a synonym for ":ATTR").
+
+ Non-interpretive attribute handlers
+ Occasionally the strenuous efforts Attribute::Handlers makes to convert
+ the data argument ($_[4]) to a useable form before passing it to the
+ handler get in the way.
+
+ You can turn off that eagerness-to-help by declaring an attribute
+ handler with the keyword "RAWDATA". For example:
+
+ sub Raw : ATTR(RAWDATA) {...}
+ sub Nekkid : ATTR(SCALAR,RAWDATA) {...}
+ sub Au::Naturale : ATTR(RAWDATA,ANY) {...}
+
+ Then the handler makes absolutely no attempt to interpret the data it
+ receives and simply passes it as a string:
+
+ my $power : Raw(1..100); # handlers receives "1..100"
+
+ Phase-specific attribute handlers
+ By default, attribute handlers are called at the end of the compilation
+ phase (in a "CHECK" block). This seems to be optimal in most cases
+ because most things that can be defined are defined by that point but
+ nothing has been executed.
+
+ However, it is possible to set up attribute handlers that are called at
+ other points in the program's compilation or execution, by explicitly
+ stating the phase (or phases) in which you wish the attribute handler to
+ be called. For example:
+
+ sub Early :ATTR(SCALAR,BEGIN) {...}
+ sub Normal :ATTR(SCALAR,CHECK) {...}
+ sub Late :ATTR(SCALAR,INIT) {...}
+ sub Final :ATTR(SCALAR,END) {...}
+ sub Bookends :ATTR(SCALAR,BEGIN,END) {...}
+
+ As the last example indicates, a handler may be set up to be (re)called
+ in two or more phases. The phase name is passed as the handler's final
+ argument.
+
+ Note that attribute handlers that are scheduled for the "BEGIN" phase
+ are handled as soon as the attribute is detected (i.e. before any
+ subsequently defined "BEGIN" blocks are executed).
+
+ Attributes as "tie" interfaces
+ Attributes make an excellent and intuitive interface through which to
+ tie variables. For example:
+
+ use Attribute::Handlers;
+ use Tie::Cycle;
+
+ sub UNIVERSAL::Cycle : ATTR(SCALAR) {
+ my ($package, $symbol, $referent, $attr, $data, $phase) = @_;
+ $data = [ $data ] unless ref $data eq 'ARRAY';
+ tie $$referent, 'Tie::Cycle', $data;
+ }
+
+ # and thereafter...
+
+ package main;
+
+ my $next : Cycle('A'..'Z'); # $next is now a tied variable
+
+ while (<>) {
+ print $next;
+ }
+
+ Note that, because the "Cycle" attribute receives its arguments in the
+ $data variable, if the attribute is given a list of arguments, $data
+ will consist of a single array reference; otherwise, it will consist of
+ the single argument directly. Since Tie::Cycle requires its cycling
+ values to be passed as an array reference, this means that we need to
+ wrap non-array-reference arguments in an array constructor:
+
+ $data = [ $data ] unless ref $data eq 'ARRAY';
+
+ Typically, however, things are the other way around: the tieable class
+ expects its arguments as a flattened list, so the attribute looks like:
+
+ sub UNIVERSAL::Cycle : ATTR(SCALAR) {
+ my ($package, $symbol, $referent, $attr, $data, $phase) = @_;
+ my @data = ref $data eq 'ARRAY' ? @$data : $data;
+ tie $$referent, 'Tie::Whatever', @data;
+ }
+
+ This software pattern is so widely applicable that Attribute::Handlers
+ provides a way to automate it: specifying 'autotie' in the "use
+ Attribute::Handlers" statement. So, the cycling example, could also be
+ written:
+
+ use Attribute::Handlers autotie => { Cycle => 'Tie::Cycle' };
+
+ # and thereafter...
+
+ package main;
+
+ my $next : Cycle(['A'..'Z']); # $next is now a tied variable
+
+ while (<>) {
+ print $next;
+
+ Note that we now have to pass the cycling values as an array reference,
+ since the "autotie" mechanism passes "tie" a list of arguments as a list
+ (as in the Tie::Whatever example), *not* as an array reference (as in
+ the original Tie::Cycle example at the start of this section).
+
+ The argument after 'autotie' is a reference to a hash in which each key
+ is the name of an attribute to be created, and each value is the class
+ to which variables ascribed that attribute should be tied.
+
+ Note that there is no longer any need to import the Tie::Cycle module --
+ Attribute::Handlers takes care of that automagically. You can even pass
+ arguments to the module's "import" subroutine, by appending them to the
+ class name. For example:
+
+ use Attribute::Handlers
+ autotie => { Dir => 'Tie::Dir qw(DIR_UNLINK)' };
+
+ If the attribute name is unqualified, the attribute is installed in the
+ current package. Otherwise it is installed in the qualifier's package:
+
+ package Here;
+
+ use Attribute::Handlers autotie => {
+ Other::Good => Tie::SecureHash, # tie attr installed in Other::
+ Bad => Tie::Taxes, # tie attr installed in Here::
+ UNIVERSAL::Ugly => Software::Patent # tie attr installed everywhere
+ };
+
+ Autoties are most commonly used in the module to which they actually
+ tie, and need to export their attributes to any module that calls them.
+ To facilitate this, Attribute::Handlers recognizes a special
+ "pseudo-class" -- "__CALLER__", which may be specified as the qualifier
+ of an attribute:
+
+ package Tie::Me::Kangaroo:Down::Sport;
+
+ use Attribute::Handlers autotie => { '__CALLER__::Roo' => __PACKAGE__ };
+
+ This causes Attribute::Handlers to define the "Roo" attribute in the
+ package that imports the Tie::Me::Kangaroo:Down::Sport module.
+
+ Note that it is important to quote the __CALLER__::Roo identifier
+ because a bug in perl 5.8 will refuse to parse it and cause an unknown
+ error.
+
+ Passing the tied object to "tie"
+ Occasionally it is important to pass a reference to the object being
+ tied to the TIESCALAR, TIEHASH, etc. that ties it.
+
+ The "autotie" mechanism supports this too. The following code:
+
+ use Attribute::Handlers autotieref => { Selfish => Tie::Selfish };
+ my $var : Selfish(@args);
+
+ has the same effect as:
+
+ tie my $var, 'Tie::Selfish', @args;
+
+ But when "autotieref" is used instead of "autotie":
+
+ use Attribute::Handlers autotieref => { Selfish => Tie::Selfish };
+ my $var : Selfish(@args);
+
+ the effect is to pass the "tie" call an extra reference to the variable
+ being tied:
+
+ tie my $var, 'Tie::Selfish', \$var, @args;
+
+EXAMPLES
+ If the class shown in SYNOPSIS were placed in the MyClass.pm module,
+ then the following code:
+
+ package main;
+ use MyClass;
+
+ my MyClass $slr :Good :Bad(1**1-1) :Omni(-vorous);
+
+ package SomeOtherClass;
+ use base MyClass;
+
+ sub tent { 'acle' }
+
+ sub fn :Ugly(sister) :Omni('po',tent()) {...}
+ my @arr :Good :Omni(s/cie/nt/);
+ my %hsh :Good(q/bye/) :Omni(q/bus/);
+
+ would cause the following handlers to be invoked:
+
+ # my MyClass $slr :Good :Bad(1**1-1) :Omni(-vorous);
+
+ MyClass::Good:ATTR(SCALAR)( 'MyClass', # class
+ 'LEXICAL', # no typeglob
+ \$slr, # referent
+ 'Good', # attr name
+ undef # no attr data
+ 'CHECK', # compiler phase
+ );
+
+ MyClass::Bad:ATTR(SCALAR)( 'MyClass', # class
+ 'LEXICAL', # no typeglob
+ \$slr, # referent
+ 'Bad', # attr name
+ 0 # eval'd attr data
+ 'CHECK', # compiler phase
+ );
+
+ MyClass::Omni:ATTR(SCALAR)( 'MyClass', # class
+ 'LEXICAL', # no typeglob
+ \$slr, # referent
+ 'Omni', # attr name
+ '-vorous' # eval'd attr data
+ 'CHECK', # compiler phase
+ );
+
+
+ # sub fn :Ugly(sister) :Omni('po',tent()) {...}
+
+ MyClass::UGLY:ATTR(CODE)( 'SomeOtherClass', # class
+ \*SomeOtherClass::fn, # typeglob
+ \&SomeOtherClass::fn, # referent
+ 'Ugly', # attr name
+ 'sister' # eval'd attr data
+ 'CHECK', # compiler phase
+ );
+
+ MyClass::Omni:ATTR(CODE)( 'SomeOtherClass', # class
+ \*SomeOtherClass::fn, # typeglob
+ \&SomeOtherClass::fn, # referent
+ 'Omni', # attr name
+ ['po','acle'] # eval'd attr data
+ 'CHECK', # compiler phase
+ );
+
+
+ # my @arr :Good :Omni(s/cie/nt/);
+
+ MyClass::Good:ATTR(ARRAY)( 'SomeOtherClass', # class
+ 'LEXICAL', # no typeglob
+ \@arr, # referent
+ 'Good', # attr name
+ undef # no attr data
+ 'CHECK', # compiler phase
+ );
+
+ MyClass::Omni:ATTR(ARRAY)( 'SomeOtherClass', # class
+ 'LEXICAL', # no typeglob
+ \@arr, # referent
+ 'Omni', # attr name
+ "" # eval'd attr data
+ 'CHECK', # compiler phase
+ );
+
+
+ # my %hsh :Good(q/bye) :Omni(q/bus/);
+
+ MyClass::Good:ATTR(HASH)( 'SomeOtherClass', # class
+ 'LEXICAL', # no typeglob
+ \%hsh, # referent
+ 'Good', # attr name
+ 'q/bye' # raw attr data
+ 'CHECK', # compiler phase
+ );
+
+ MyClass::Omni:ATTR(HASH)( 'SomeOtherClass', # class
+ 'LEXICAL', # no typeglob
+ \%hsh, # referent
+ 'Omni', # attr name
+ 'bus' # eval'd attr data
+ 'CHECK', # compiler phase
+ );
+
+ Installing handlers into UNIVERSAL, makes them...err..universal. For
+ example:
+
+ package Descriptions;
+ use Attribute::Handlers;
+
+ my %name;
+ sub name { return $name{$_[2]}||*{$_[1]}{NAME} }
+
+ sub UNIVERSAL::Name :ATTR {
+ $name{$_[2]} = $_[4];
+ }
+
+ sub UNIVERSAL::Purpose :ATTR {
+ print STDERR "Purpose of ", &name, " is $_[4]\n";
+ }
+
+ sub UNIVERSAL::Unit :ATTR {
+ print STDERR &name, " measured in $_[4]\n";
+ }
+
+ Let's you write:
+
+ use Descriptions;
+
+ my $capacity : Name(capacity)
+ : Purpose(to store max storage capacity for files)
+ : Unit(Gb);
+
+
+ package Other;
+
+ sub foo : Purpose(to foo all data before barring it) { }
+
+ # etc.
+
+DIAGNOSTICS
+ "Bad attribute type: ATTR(%s)"
+ An attribute handler was specified with an ":ATTR(*ref_type*)", but
+ the type of referent it was defined to handle wasn't one of the five
+ permitted: "SCALAR", "ARRAY", "HASH", "CODE", or "ANY".
+
+ "Attribute handler %s doesn't handle %s attributes"
+ A handler for attributes of the specified name *was* defined, but
+ not for the specified type of declaration. Typically encountered whe
+ trying to apply a "VAR" attribute handler to a subroutine, or a
+ "SCALAR" attribute handler to some other type of variable.
+
+ "Declaration of %s attribute in package %s may clash with future
+ reserved word"
+ A handler for an attributes with an all-lowercase name was declared.
+ An attribute with an all-lowercase name might have a meaning to Perl
+ itself some day, even though most don't yet. Use a mixed-case
+ attribute name, instead.
+
+ "Can't have two ATTR specifiers on one subroutine"
+ You just can't, okay? Instead, put all the specifications together
+ with commas between them in a single "ATTR(*specification*)".
+
+ "Can't autotie a %s"
+ You can only declare autoties for types "SCALAR", "ARRAY", and
+ "HASH". They're the only things (apart from typeglobs -- which are
+ not declarable) that Perl can tie.
+
+ "Internal error: %s symbol went missing"
+ Something is rotten in the state of the program. An attributed
+ subroutine ceased to exist between the point it was declared and the
+ point at which its attribute handler(s) would have been called.
+
+ "Won't be able to apply END handler"
+ You have defined an END handler for an attribute that is being
+ applied to a lexical variable. Since the variable may not be
+ available during END this won't happen.
+
+AUTHOR
+ Damian Conway (damian@conway.org). The maintainer of this module is now
+ Rafael Garcia-Suarez (rgarciasuarez@gmail.com).
+
+ Maintainer of the CPAN release is Steffen Mueller (smueller@cpan.org).
+ Contact him with technical difficulties with respect to the packaging of
+ the CPAN module.
+
+BUGS
+ There are undoubtedly serious bugs lurking somewhere in code this funky
+ :-) Bug reports and other feedback are most welcome.
+
+COPYRIGHT AND LICENSE
+ Copyright (c) 2001-2009, Damian Conway. All Rights Reserved.
+ This module is free software. It may be used, redistributed
+ and/or modified under the same terms as Perl itself.
-==============================================================================
diff --git a/ext/Attribute-Handlers/lib/Attribute/Handlers.pm b/ext/Attribute-Handlers/lib/Attribute/Handlers.pm
index 4f6c01972f..aba1138022 100644
--- a/ext/Attribute-Handlers/lib/Attribute/Handlers.pm
+++ b/ext/Attribute-Handlers/lib/Attribute/Handlers.pm
@@ -4,7 +4,7 @@ use Carp;
use warnings;
use strict;
use vars qw($VERSION $AUTOLOAD);
-$VERSION = '0.81';
+$VERSION = '0.83';
# $DB::single=1;
my %symcache;
@@ -878,6 +878,6 @@ Bug reports and other feedback are most welcome.
=head1 COPYRIGHT AND LICENSE
- Copyright (c) 2001-2008, Damian Conway. All Rights Reserved.
+ Copyright (c) 2001-2009, Damian Conway. All Rights Reserved.
This module is free software. It may be used, redistributed
and/or modified under the same terms as Perl itself.
diff --git a/ext/Attribute-Handlers/t/linerep.t b/ext/Attribute-Handlers/t/linerep.t
index 726a724f34..e417de5aaa 100644
--- a/ext/Attribute-Handlers/t/linerep.t
+++ b/ext/Attribute-Handlers/t/linerep.t
@@ -42,8 +42,8 @@ sub SArgs : ATTR(SCALAR) {
is( $data->[0], 'grumpf', 'data' );
is( $phase, 'CHECK', 'phase' );
TODO: {
- local $TODO = "Doesn't work correctly" if $] < 5.011;
- is( $filename, __FILE__, 'filename' );
- is( $linenum, 42, 'linenum' );
+ local $TODO = "Doesn't work correctly" if $] < 5.008;
+ is( $filename, __FILE__, 'filename' );
+ is( $linenum, 42, 'linenum' );
}
}
diff --git a/ext/B/B/Deparse.pm b/ext/B/B/Deparse.pm
index 1ee448089e..9ba24420b8 100644
--- a/ext/B/B/Deparse.pm
+++ b/ext/B/B/Deparse.pm
@@ -17,15 +17,22 @@ use B qw(class main_root main_start main_cv svref_2object opnumber perlstring
OPpCONST_ARYBASE OPpEXISTS_SUB OPpSORT_NUMERIC OPpSORT_INTEGER
OPpSORT_REVERSE OPpSORT_INPLACE OPpSORT_DESCEND OPpITER_REVERSED
SVf_IOK SVf_NOK SVf_ROK SVf_POK SVpad_OUR SVf_FAKE SVs_RMG SVs_SMG
- CVf_METHOD CVf_LOCKED CVf_LVALUE
+ CVf_METHOD CVf_LVALUE
PMf_KEEP PMf_GLOBAL PMf_CONTINUE PMf_EVAL PMf_ONCE
PMf_MULTILINE PMf_SINGLELINE PMf_FOLD PMf_EXTENDED),
- ($] < 5.009 ? 'PMf_SKIPWHITE' : 'RXf_SKIPWHITE');
-$VERSION = 0.88;
+ ($] < 5.009 ? 'PMf_SKIPWHITE' : 'RXf_SKIPWHITE'),
+ ($] < 5.011 ? 'CVf_LOCKED' : ());
+$VERSION = 0.89;
use strict;
use vars qw/$AUTOLOAD/;
use warnings ();
+BEGIN {
+ # Easiest way to keep this code portable between 5.12.x and 5.10.x looks to
+ # be to fake up a dummy CVf_LOCKED that will never actually be true.
+ *CVf_LOCKED = sub () {0} unless defined &CVf_LOCKED;
+}
+
# Changes between 0.50 and 0.51:
# - fixed nulled leave with live enter in sort { }
# - fixed reference constants (\"str")
diff --git a/ext/B/Makefile.PL b/ext/B/Makefile.PL
index 4a1e425ac1..123c62402e 100644
--- a/ext/B/Makefile.PL
+++ b/ext/B/Makefile.PL
@@ -19,7 +19,6 @@ WriteMakefile(
NAME => "B",
VERSION_FROM => "B.pm",
PL_FILES => { 'defsubs_h.PL' => 'defsubs.h' },
- MAN3PODS => {},
clean => {
FILES => "perl$e *$o B.c defsubs.h *~"
}
@@ -31,10 +30,6 @@ sub post_constants {
"\nLIBS = $Config::Config{libs}\n"
}
-sub headerfilefile {
- push @makefileopts, MAN3PODS => {};
-}
-
sub headerpath {
if ($core) {
return File::Spec->catdir(File::Spec->updir,
diff --git a/ext/B/defsubs_h.PL b/ext/B/defsubs_h.PL
index f92a26e1d1..684ca26fb0 100644
--- a/ext/B/defsubs_h.PL
+++ b/ext/B/defsubs_h.PL
@@ -20,7 +20,6 @@ foreach my $const (qw(
CVf_CLONE
CVf_CLONED
CVf_CONST
- CVf_LOCKED
CVf_LVALUE
CVf_METHOD
CVf_NODEBUG
@@ -68,6 +67,11 @@ if ($] >= 5.009) {
doconst(AVf_REAL);
}
+if ($] < 5.011) {
+ # Constant not present after 5.10.x
+ doconst(CVf_LOCKED);
+}
+
foreach my $tuple (['op.h'],['cop.h'],['regexp.h','RXf_'])
{
my $file = $tuple->[0];
diff --git a/ext/B/t/concise-xs.t b/ext/B/t/concise-xs.t
index cc31958f62..b849af50ca 100644
--- a/ext/B/t/concise-xs.t
+++ b/ext/B/t/concise-xs.t
@@ -159,7 +159,7 @@ my $testpkgs = {
XS => [qw( svref_2object perlstring opnumber main_start
main_root main_cv )],
- constant => [qw/ ASSIGN CVf_LOCKED CVf_LVALUE
+ constant => [qw/ ASSIGN CVf_LVALUE
CVf_METHOD LIST_CONTEXT OP_CONST OP_LIST OP_RV2SV
OP_STRINGIFY OPf_KIDS OPf_MOD OPf_REF OPf_SPECIAL
OPf_STACKED OPf_WANT OPf_WANT_LIST OPf_WANT_SCALAR
@@ -173,7 +173,9 @@ my $testpkgs = {
PMf_MULTILINE PMf_ONCE PMf_SINGLELINE
POSTFIX SVf_FAKE SVf_IOK SVf_NOK SVf_POK SVf_ROK
SVpad_OUR SVs_RMG SVs_SMG SWAP_CHILDREN OPpPAD_STATE
- /, $] > 5.009 ? ('RXf_SKIPWHITE') : ('PMf_SKIPWHITE')],
+ /, $] > 5.009 ? ('RXf_SKIPWHITE') : ('PMf_SKIPWHITE'),
+ 'CVf_LOCKED', # This ends up as a constant, pre or post 5.10
+ ],
},
POSIX => { dflt => 'constant', # all but 252/589
@@ -222,6 +224,7 @@ my $testpkgs = {
XS => [qw/ unpack_sockaddr_un unpack_sockaddr_in
sockatmark sockaddr_family pack_sockaddr_un
pack_sockaddr_in inet_ntoa inet_aton
+ inet_ntop inet_pton
/],
},
};
diff --git a/ext/B/t/deparse.t b/ext/B/t/deparse.t
index 2f0f436677..27e9f9e9ac 100644
--- a/ext/B/t/deparse.t
+++ b/ext/B/t/deparse.t
@@ -27,7 +27,7 @@ BEGIN {
require feature;
feature->import(':5.10');
}
-use Test::More tests => 74;
+use Test::More tests => 77;
use Config ();
use B::Deparse;
@@ -50,24 +50,27 @@ while (<DATA>) {
chomp;
# This code is pinched from the t/lib/common.pl for TODO.
# It's not clear how to avoid duplication
- my ($skip, $skip_reason);
- s/^#\s*SKIP\s*(.*)\n//m and $skip_reason = $1;
- # If the SKIP reason starts ? then it's taken as a code snippet to evaluate
- # This provides the flexibility to have conditional SKIPs
- if ($skip_reason && $skip_reason =~ s/^\?//) {
- my $temp = eval $skip_reason;
- if ($@) {
- die "# In SKIP code reason:\n# $skip_reason\n$@";
+ # Now tweaked a bit to do skip or todo
+ my %reason;
+ foreach my $what (qw(skip todo)) {
+ s/^#\s*\U$what\E\s*(.*)\n//m and $reason{$what} = $1;
+ # If the SKIP reason starts ? then it's taken as a code snippet to
+ # evaluate. This provides the flexibility to have conditional SKIPs
+ if ($reason{$what} && $reason{$what} =~ s/^\?//) {
+ my $temp = eval $reason{$what};
+ if ($@) {
+ die "# In \U$what\E code reason:\n# $reason{$what}\n$@";
+ }
+ $reason{$what} = $temp;
}
- $skip_reason = $temp;
}
- s/#\s*(.*)$//mg;
+ s/^\s*#\s*(.*)$//mg;
my ($num, $testname) = $1 =~ m/(\d+)\s*(.*)/;
- if ($skip_reason) {
+ if ($reason{skip}) {
# Like this to avoid needing a label SKIP:
- Test::More->builder->skip($skip_reason);
+ Test::More->builder->skip($reason{skip});
next;
}
@@ -91,6 +94,8 @@ while (<DATA>) {
$regex =~ s/(\S+)/\Q$1/g;
$regex =~ s/\s+/\\s+/g;
$regex = '^\{\s*' . $regex . '\s*\}$';
+
+ local $::TODO = $reason{todo};
like($deparsed, qr/$regex/, $testname);
}
}
@@ -215,12 +220,8 @@ $test /= 2 if ++$test;
}
####
# 8
-{
- my $test = sub : locked method {
- my $x;
- }
- ;
-}
+# Was sub : locked method { ... }
+# This number could be re-used.
####
# 9
{
@@ -431,15 +432,15 @@ else { x(); }
my($y, $t);
/x${y}z$t/;
####
-# SKIP ?$B::Deparse::VERSION <= 0.88 && "TODO new undocumented cpan-bug #33708"
+# TODO new undocumented cpan-bug #33708
# 55 (cpan-bug #33708)
%{$_ || {}}
####
-# SKIP ?$B::Deparse::VERSION <= 0.88 && "TODO hash constants not yet fixed"
+# TODO hash constants not yet fixed
# 56 (cpan-bug #33708)
use constant H => { "#" => 1 }; H->{"#"}
####
-# SKIP ?$B::Deparse::VERSION <= 0.88 && "TODO optimized away 0 not yet fixed"
+# TODO optimized away 0 not yet fixed
# 57 (cpan-bug #33708)
foreach my $i (@_) { 0 }
####
@@ -549,8 +550,10 @@ do {
'???';
!1;
####
-# SKIP ? $Config::Config{useithreads} && "TODO doesn't work with threads"
+# TODO ? $Config::Config{useithreads} && "doesn't work with threads"
# 61 tests that shouldn't be constant folded
+# It might be fundamentally impossible to make this work on ithreads, in which
+# case the TODO should become a SKIP
x() if $a;
if ($a == 1) { x() } elsif ($b == 2) { z() }
if (do { foo(); GLIPP }) { x() }
@@ -573,11 +576,34 @@ warn O_CREAT;
# 65 tests for deparsing imported constants that got deleted from the original namespace
warn O_APPEND;
####
-# SKIP ? $Config::Config{useithreads} && "TODO doesn't work with threads"
+# TODO ? $Config::Config{useithreads} && "doesn't work with threads"
# 66 tests for deparsing constants which got turned into full typeglobs
+# It might be fundamentally impossible to make this work on ithreads, in which
+# case the TODO should become a SKIP
warn O_EXCL;
eval '@Fcntl::O_EXCL = qw/affe tiger/;';
warn O_EXCL;
####
# 67 tests for deparsing of blessed constant with overloaded numification
warn OVERLOADED_NUMIFICATION;
+####
+# TODO Only strict 'refs' currently supported
+# 68 strict
+no strict;
+$x;
+####
+# TODO Subsets of warnings could be encoded textually, rather than as bitflips.
+no warnings 'deprecated';
+my $x;
+####
+# TODO Better test for CPAN #33708 - the deparsed code has different behaviour
+use strict;
+no warnings;
+
+foreach (0..3) {
+ my $x = 2;
+ {
+ my $x if 0;
+ print ++$x, "\n";
+ }
+}
diff --git a/ext/Compress-Raw-Bzip2/Bzip2.xs b/ext/Compress-Raw-Bzip2/Bzip2.xs
index 1e6eeb911d..36b2dbe32d 100644
--- a/ext/Compress-Raw-Bzip2/Bzip2.xs
+++ b/ext/Compress-Raw-Bzip2/Bzip2.xs
@@ -50,6 +50,7 @@ typedef struct di_stream {
int flags ;
#define FLAG_APPEND_OUTPUT 1
#define FLAG_CONSUME_INPUT 8
+#define FLAG_LIMIT_OUTPUT 16
bz_stream stream;
uInt bufsize;
int last_error ;
@@ -182,7 +183,7 @@ DispStream(s, message)
printf("DispStream 0x%p", s) ;
if (message)
- printf("- %s \n", message) ;
+ printf(" - %s \n", message) ;
printf("\n") ;
if (!s) {
@@ -191,6 +192,7 @@ DispStream(s, message)
else {
printf(" stream 0x%p\n", &(s->stream));
printf(" opaque 0x%p\n", s->stream.opaque);
+ printf(" state 0x%p\n", s->stream.state );
printf(" next_in 0x%p", s->stream.next_in);
if (s->stream.next_in){
printf(" =>");
@@ -208,9 +210,14 @@ DispStream(s, message)
printf(" avail_in %lu\n", (unsigned long)s->stream.avail_in);
printf(" avail_out %lu\n", (unsigned long)s->stream.avail_out);
printf(" bufsize %lu\n", (unsigned long)s->bufsize);
+ printf(" total_in_lo32 %u\n", s->stream.total_in_lo32);
+ printf(" total_in_hi32 %u\n", s->stream.total_in_hi32);
+ printf(" total_out_lo32 %u\n", s->stream.total_out_lo32);
+ printf(" total_out_hi32 %u\n", s->stream.total_out_hi32);
printf(" flags 0x%x\n", s->flags);
printf(" APPEND %s\n", EnDis(FLAG_APPEND_OUTPUT));
printf(" CONSUME %s\n", EnDis(FLAG_CONSUME_INPUT));
+ printf(" LIMIT %s\n", EnDis(FLAG_LIMIT_OUTPUT));
printf("\n");
@@ -267,6 +274,8 @@ char * string;
case SVt_PVHV:
case SVt_PVCV:
croak("%s: buffer parameter is not a SCALAR reference", string);
+ default:
+ break;
}
if (SvROK(sv))
croak("%s: buffer parameter is a reference to a reference", string) ;
@@ -304,6 +313,8 @@ char * string ;
case SVt_PVHV:
case SVt_PVCV:
croak("%s: buffer parameter is not a SCALAR reference", string);
+ default:
+ break;
}
if (SvROK(sv))
croak("%s: buffer parameter is a reference to a reference", string) ;
@@ -334,6 +345,9 @@ PROTOTYPES: DISABLE
INCLUDE: constants.xs
BOOT:
+#ifndef NO_WRITEABLE_DATA
+ trace = TRACE_DEFAULT ;
+#endif
/* Check this version of bzip2 is == 1 */
if (BZ2_bzlibVersion()[0] != '1')
croak(COMPRESS_CLASS " needs bzip2 version 1.x, you have %s\n", BZ2_bzlibVersion()) ;
@@ -346,8 +360,8 @@ const char *
bzlibversion()
void
-new(class, appendOut=1, blockSize100k=1, workfactor=0, verbosity=0)
- const char * class
+new(className, appendOut=1, blockSize100k=1, workfactor=0, verbosity=0)
+ const char * className
int appendOut
int blockSize100k
int workfactor
@@ -383,7 +397,7 @@ new(class, appendOut=1, blockSize100k=1, workfactor=0, verbosity=0)
err = BZ_MEM_ERROR ;
{
- SV* obj = sv_setref_pv(sv_newmortal(), class, (void*)s);
+ SV* obj = sv_setref_pv(sv_newmortal(), className, (void*)s);
XPUSHs(obj);
}
if(0)
@@ -401,12 +415,13 @@ new(class, appendOut=1, blockSize100k=1, workfactor=0, verbosity=0)
MODULE = Compress::Raw::Bunzip2 PACKAGE = Compress::Raw::Bunzip2
void
-new(class, appendOut=1 , consume=1, small=0, verbosity=0)
- const char* class
+new(className, appendOut=1 , consume=1, small=0, verbosity=0, limitOutput=0)
+ const char* className
int appendOut
int consume
int small
int verbosity
+ int limitOutput
PPCODE:
{
int err = BZ_OK ;
@@ -429,6 +444,8 @@ new(class, appendOut=1 , consume=1, small=0, verbosity=0)
flags |= FLAG_APPEND_OUTPUT;
if (consume)
flags |= FLAG_CONSUME_INPUT;
+ if (limitOutput)
+ flags |= (FLAG_LIMIT_OUTPUT|FLAG_CONSUME_INPUT);
PostInitStream(s, flags) ;
}
}
@@ -436,7 +453,7 @@ new(class, appendOut=1 , consume=1, small=0, verbosity=0)
err = BZ_MEM_ERROR ;
{
- SV* obj = sv_setref_pv(sv_newmortal(), class, (void*)s);
+ SV* obj = sv_setref_pv(sv_newmortal(), className, (void*)s);
XPUSHs(obj);
}
if (0)
@@ -716,7 +733,7 @@ bzinflate (s, buf, output)
CODE:
bufinc = s->bufsize;
/* If the buffer is a reference, dereference it */
- buf = deRef(buf, "inflate") ;
+ buf = deRef(buf, "bzinflate") ;
if (s->flags & FLAG_CONSUME_INPUT && SvREADONLY(buf))
croak(UNCOMPRESS_CLASS "::bzinflate input parameter cannot be read-only when ConsumeInput is specified");
@@ -730,7 +747,7 @@ bzinflate (s, buf, output)
s->stream.avail_in = SvCUR(buf);
/* and retrieve the output buffer */
- output = deRef_l(output, "inflate") ;
+ output = deRef_l(output, "bzinflate") ;
#ifdef UTF8_AVAILABLE
if (DO_UTF8(output))
out_utf8 = TRUE ;
@@ -740,22 +757,38 @@ bzinflate (s, buf, output)
if((s->flags & FLAG_APPEND_OUTPUT) != FLAG_APPEND_OUTPUT) {
SvCUR_set(output, 0);
}
+
+ /* Assume no output buffer - the code below will update if there is any available */
+ s->stream.avail_out = 0;
+
if (SvLEN(output)) {
prefix_length = cur_length = SvCUR(output) ;
- s->stream.next_out = (char*) SvPVbyte_nolen(output) + cur_length;
- increment = SvLEN(output) - cur_length - 1;
- s->stream.avail_out = increment;
- }
- else {
- s->stream.avail_out = 0;
+
+ if (s->flags & FLAG_LIMIT_OUTPUT && SvLEN(output) - cur_length - 1 < bufinc)
+ {
+ Sv_Grow(output, bufinc + cur_length + 1) ;
+ }
+
+ /* Only setup the stream output pointers if there is spare
+ capacity in the outout SV
+ */
+ if (SvLEN(output) > cur_length + 1)
+ {
+ s->stream.next_out = (char*) SvPVbyte_nolen(output) + cur_length;
+ increment = SvLEN(output) - cur_length - 1;
+ s->stream.avail_out = increment;
+ }
}
+
s->bytesInflated = 0;
+ RETVAL = BZ_OK;
+
while (1) {
if (s->stream.avail_out == 0) {
/* out of space in the output buffer so make it bigger */
- Sv_Grow(output, SvLEN(output) + bufinc) ;
+ Sv_Grow(output, SvLEN(output) + bufinc + 1) ;
cur_length += increment ;
s->stream.next_out = (char*) SvPVbyte_nolen(output) + cur_length ;
increment = bufinc ;
@@ -763,9 +796,11 @@ bzinflate (s, buf, output)
bufinc *= 2 ;
}
+ /*DispStream(s, "pre"); */
RETVAL = BZ2_bzDecompress (&(s->stream));
- if (RETVAL != BZ_OK)
+ /*DispStream(s, "apres");*/
+ if (RETVAL != BZ_OK || s->flags & FLAG_LIMIT_OUTPUT)
break ;
if (s->stream.avail_out == 0)
diff --git a/ext/Compress-Raw-Bzip2/Changes b/ext/Compress-Raw-Bzip2/Changes
index f25e57a017..f8c7a64bc8 100644
--- a/ext/Compress-Raw-Bzip2/Changes
+++ b/ext/Compress-Raw-Bzip2/Changes
@@ -1,10 +1,23 @@
CHANGES
-------
- 2.016 26 February 2009
+ 2.019 4 May 2009
+
+ * tidied up Bzip2.xs
+
+ 2.018 3 May 2009
+
+ * added linitOutput option
+
+ * Changes to bzip2 source to get the module to build using a C++
+ compiler
+
+ 2.017 28 March 2009
* Minor changes to allow building in perl core.
+ * Removed MAN3PODS from Makefile.PL
+
2.015 3 September 2008
* Documented bzlibversion
diff --git a/ext/Compress-Raw-Bzip2/Makefile.PL b/ext/Compress-Raw-Bzip2/Makefile.PL
index 192c28f8f9..ba65694c57 100644
--- a/ext/Compress-Raw-Bzip2/Makefile.PL
+++ b/ext/Compress-Raw-Bzip2/Makefile.PL
@@ -35,13 +35,6 @@ WriteMakefile(
},
(
- $ENV{SKIP_FOR_CORE}
- ? (MAN3PODS => {})
- : ()
- ),
-
-
- (
$BUILD_BZIP2
? bzip2_files($BZIP2_LIB)
: (LIBS => [ "-L$BZIP2_LIB -lbz2 " ])
@@ -54,6 +47,8 @@ WriteMakefile(
: ()
),
+ INSTALLDIRS => ($] > 5.010 ? 'perl' : 'site'),
+
((ExtUtils::MakeMaker->VERSION() gt '6.30') ?
('LICENSE' => 'perl') : ()),
diff --git a/ext/Compress-Raw-Bzip2/README b/ext/Compress-Raw-Bzip2/README
index 158b897002..7f6bcb72e3 100644
--- a/ext/Compress-Raw-Bzip2/README
+++ b/ext/Compress-Raw-Bzip2/README
@@ -1,11 +1,11 @@
Compress-Raw-Bzip2
- Version 2.015
+ Version 2.019
- 2nd September 2008
+ 4th May 2009
- Copyright (c) 2005-2008 Paul Marquess. All rights reserved.
+ Copyright (c) 2005-2009 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.
@@ -16,6 +16,11 @@
Full source for the bzip2 library is available at
http://www.bzip.org/
+ Note that the files bzip2.c, bzip2recover.c, bzlib.c & decompress.c
+ have been modified to allow them to build with a C++ compiler.
+ The file bzip2-src/bzip2-cpp.patch contains the patch
+ that was used to modify the original source.
+
DESCRIPTION
-----------
@@ -159,7 +164,7 @@ To help me help you, I need all of the following information:
If you haven't installed Compress-Raw-Bzip2 then search Compress::Raw::Bzip2.pm
for a line like this:
- $VERSION = "2.015" ;
+ $VERSION = "2.019" ;
c. The version of bzip2 you have used.
If you have successfully installed Compress-Raw-Bzip2, this one-liner
diff --git a/ext/Compress-Raw-Bzip2/bzip2-src/bzip2.c b/ext/Compress-Raw-Bzip2/bzip2-src/bzip2.c
index 390410735b..011edfabb9 100644
--- a/ext/Compress-Raw-Bzip2/bzip2-src/bzip2.c
+++ b/ext/Compress-Raw-Bzip2/bzip2-src/bzip2.c
@@ -800,6 +800,11 @@ void ioError ( void )
}
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
/*---------------------------------------------*/
static
void mySignalCatcher ( IntNative n )
@@ -866,6 +871,9 @@ void mySIGSEGVorSIGBUScatcher ( IntNative n )
{ cadvise(); cleanUpAndFail( 2 ); }
}
+#ifdef __cplusplus
+}
+#endif
/*---------------------------------------------*/
static
diff --git a/ext/Compress-Raw-Bzip2/bzip2-src/bzip2recover.c b/ext/Compress-Raw-Bzip2/bzip2-src/bzip2recover.c
index 5f6d621809..bdbcd8bfe2 100644
--- a/ext/Compress-Raw-Bzip2/bzip2-src/bzip2recover.c
+++ b/ext/Compress-Raw-Bzip2/bzip2-src/bzip2recover.c
@@ -153,7 +153,7 @@ typedef
/*---------------------------------------------*/
static BitStream* bsOpenReadStream ( FILE* stream )
{
- BitStream *bs = malloc ( sizeof(BitStream) );
+ BitStream *bs = (BitStream*) malloc ( sizeof(BitStream) );
if (bs == NULL) mallocFail ( sizeof(BitStream) );
bs->handle = stream;
bs->buffer = 0;
@@ -166,7 +166,7 @@ static BitStream* bsOpenReadStream ( FILE* stream )
/*---------------------------------------------*/
static BitStream* bsOpenWriteStream ( FILE* stream )
{
- BitStream *bs = malloc ( sizeof(BitStream) );
+ BitStream *bs = (BitStream*) malloc ( sizeof(BitStream) );
if (bs == NULL) mallocFail ( sizeof(BitStream) );
bs->handle = stream;
bs->buffer = 0;
diff --git a/ext/Compress-Raw-Bzip2/bzip2-src/bzlib.c b/ext/Compress-Raw-Bzip2/bzip2-src/bzlib.c
index ef86c91e69..c2d6f716b8 100644
--- a/ext/Compress-Raw-Bzip2/bzip2-src/bzlib.c
+++ b/ext/Compress-Raw-Bzip2/bzip2-src/bzlib.c
@@ -98,6 +98,11 @@ int bz_config_ok ( void )
/*---------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
static
void* default_bzalloc ( void* opaque, Int32 items, Int32 size )
{
@@ -111,6 +116,9 @@ void default_bzfree ( void* opaque, void* addr )
if (addr != NULL) free ( addr );
}
+#ifdef __cplusplus
+}
+#endif
/*---------------------------------------------------*/
static
@@ -165,7 +173,7 @@ int BZ_API(BZ2_bzCompressInit)
if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc;
if (strm->bzfree == NULL) strm->bzfree = default_bzfree;
- s = BZALLOC( sizeof(EState) );
+ s = (EState*) BZALLOC( sizeof(EState) );
if (s == NULL) return BZ_MEM_ERROR;
s->strm = strm;
@@ -174,9 +182,9 @@ int BZ_API(BZ2_bzCompressInit)
s->ftab = NULL;
n = 100000 * blockSize100k;
- s->arr1 = BZALLOC( n * sizeof(UInt32) );
- s->arr2 = BZALLOC( (n+BZ_N_OVERSHOOT) * sizeof(UInt32) );
- s->ftab = BZALLOC( 65537 * sizeof(UInt32) );
+ s->arr1 = (UInt32*) BZALLOC( n * sizeof(UInt32) );
+ s->arr2 = (UInt32*) BZALLOC( (n+BZ_N_OVERSHOOT) * sizeof(UInt32) );
+ s->ftab = (UInt32*) BZALLOC( 65537 * sizeof(UInt32) );
if (s->arr1 == NULL || s->arr2 == NULL || s->ftab == NULL) {
if (s->arr1 != NULL) BZFREE(s->arr1);
@@ -362,7 +370,7 @@ Bool handle_compress ( bz_stream* strm )
{
Bool progress_in = False;
Bool progress_out = False;
- EState* s = strm->state;
+ EState* s = (EState*) strm->state;
while (True) {
@@ -409,7 +417,7 @@ int BZ_API(BZ2_bzCompress) ( bz_stream *strm, int action )
Bool progress;
EState* s;
if (strm == NULL) return BZ_PARAM_ERROR;
- s = strm->state;
+ s = (EState*) strm->state;
if (s == NULL) return BZ_PARAM_ERROR;
if (s->strm != strm) return BZ_PARAM_ERROR;
@@ -469,7 +477,7 @@ int BZ_API(BZ2_bzCompressEnd) ( bz_stream *strm )
{
EState* s;
if (strm == NULL) return BZ_PARAM_ERROR;
- s = strm->state;
+ s = (EState*) strm->state;
if (s == NULL) return BZ_PARAM_ERROR;
if (s->strm != strm) return BZ_PARAM_ERROR;
@@ -505,7 +513,7 @@ int BZ_API(BZ2_bzDecompressInit)
if (strm->bzalloc == NULL) strm->bzalloc = default_bzalloc;
if (strm->bzfree == NULL) strm->bzfree = default_bzfree;
- s = BZALLOC( sizeof(DState) );
+ s = (DState*) BZALLOC( sizeof(DState) );
if (s == NULL) return BZ_MEM_ERROR;
s->strm = strm;
strm->state = s;
@@ -684,7 +692,10 @@ Bool unRLE_obuf_to_output_FAST ( DState* s )
/*---------------------------------------------------*/
-__inline__ Int32 BZ2_indexIntoF ( Int32 indx, Int32 *cftab )
+#ifndef __cplusplus
+__inline__
+#endif
+Int32 BZ2_indexIntoF ( Int32 indx, Int32 *cftab )
{
Int32 nb, na, mid;
nb = 0;
@@ -810,7 +821,7 @@ int BZ_API(BZ2_bzDecompress) ( bz_stream *strm )
Bool corrupt;
DState* s;
if (strm == NULL) return BZ_PARAM_ERROR;
- s = strm->state;
+ s = (DState*) strm->state;
if (s == NULL) return BZ_PARAM_ERROR;
if (s->strm != strm) return BZ_PARAM_ERROR;
@@ -863,7 +874,7 @@ int BZ_API(BZ2_bzDecompressEnd) ( bz_stream *strm )
{
DState* s;
if (strm == NULL) return BZ_PARAM_ERROR;
- s = strm->state;
+ s = (DState*) strm->state;
if (s == NULL) return BZ_PARAM_ERROR;
if (s->strm != strm) return BZ_PARAM_ERROR;
@@ -934,7 +945,7 @@ BZFILE* BZ_API(BZ2_bzWriteOpen)
if (ferror(f))
{ BZ_SETERR(BZ_IO_ERROR); return NULL; };
- bzf = malloc ( sizeof(bzFile) );
+ bzf = (bzFile*) malloc ( sizeof(bzFile) );
if (bzf == NULL)
{ BZ_SETERR(BZ_MEM_ERROR); return NULL; };
@@ -982,7 +993,7 @@ void BZ_API(BZ2_bzWrite)
{ BZ_SETERR(BZ_OK); return; };
bzf->strm.avail_in = len;
- bzf->strm.next_in = buf;
+ bzf->strm.next_in = (char*)buf;
while (True) {
bzf->strm.avail_out = BZ_MAX_UNUSED;
@@ -1107,7 +1118,7 @@ BZFILE* BZ_API(BZ2_bzReadOpen)
if (ferror(f))
{ BZ_SETERR(BZ_IO_ERROR); return NULL; };
- bzf = malloc ( sizeof(bzFile) );
+ bzf = (bzFile*) malloc ( sizeof(bzFile) );
if (bzf == NULL)
{ BZ_SETERR(BZ_MEM_ERROR); return NULL; };
@@ -1179,7 +1190,7 @@ int BZ_API(BZ2_bzRead)
{ BZ_SETERR(BZ_OK); return 0; };
bzf->strm.avail_out = len;
- bzf->strm.next_out = buf;
+ bzf->strm.next_out = (char*) buf;
while (True) {
diff --git a/ext/Compress-Raw-Bzip2/bzip2-src/decompress.c b/ext/Compress-Raw-Bzip2/bzip2-src/decompress.c
index bba5e0fa36..97cfb70059 100644
--- a/ext/Compress-Raw-Bzip2/bzip2-src/decompress.c
+++ b/ext/Compress-Raw-Bzip2/bzip2-src/decompress.c
@@ -209,13 +209,13 @@ Int32 BZ2_decompress ( DState* s )
s->blockSize100k -= BZ_HDR_0;
if (s->smallDecompress) {
- s->ll16 = BZALLOC( s->blockSize100k * 100000 * sizeof(UInt16) );
- s->ll4 = BZALLOC(
+ s->ll16 = (UInt16*) BZALLOC( s->blockSize100k * 100000 * sizeof(UInt16) );
+ s->ll4 = (UChar*) BZALLOC(
((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar)
);
if (s->ll16 == NULL || s->ll4 == NULL) RETURN(BZ_MEM_ERROR);
} else {
- s->tt = BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) );
+ s->tt = (UInt32*) BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) );
if (s->tt == NULL) RETURN(BZ_MEM_ERROR);
}
diff --git a/ext/Compress-Raw-Bzip2/lib/Compress/Raw/Bzip2.pm b/ext/Compress-Raw-Bzip2/lib/Compress/Raw/Bzip2.pm
index ebc60a05fb..0c5d8bc9ba 100644
--- a/ext/Compress-Raw-Bzip2/lib/Compress/Raw/Bzip2.pm
+++ b/ext/Compress-Raw-Bzip2/lib/Compress/Raw/Bzip2.pm
@@ -12,7 +12,7 @@ use Carp ;
use bytes ;
our ($VERSION, $XS_VERSION, @ISA, @EXPORT, $AUTOLOAD);
-$VERSION = '2.015';
+$VERSION = '2.019';
$XS_VERSION = $VERSION;
$VERSION = eval $VERSION;
@@ -220,7 +220,7 @@ Returns C<BZ_STREAM_END> on success and a C<bzip2> error code on failure.
=head1 Uncompression
-=head2 ($z, $status) = new Compress::Raw::Bunzip2 $appendOutput, $consumeInput, $small;
+=head2 ($z, $status) = new Compress::Raw::Bunzip2 $appendOutput, $consumeInput, $small, $limitOutput;
If successful, it will return the initialised uncompression object, C<$z>
and a C<$status> of C<BZ_OK> in a list context. In scalar context it
@@ -253,6 +253,26 @@ To quote the bzip2 documentation
Defaults to 0.
+=item B<$limitOutput>
+
+The C<LimitOutput> option changes the behavior of the C<< $i->bzinflate >>
+method so that the amount of memory used by the output buffer can be
+limited.
+
+When C<LimitOutput> is used the size of the output buffer used will either
+be the 16k or the amount of memory already allocated to C<$output>,
+whichever is larger. Predicting the output size available is tricky, so
+don't rely on getting an exact output buffer size.
+
+When C<LimitOutout> is not specified C<< $i->bzinflate >> will use as much
+memory as it takes to write all the uncompressed data it creates by
+uncompressing the input buffer.
+
+If C<LimitOutput> is enabled, the C<ConsumeInput> option will also be
+enabled.
+
+This option defaults to false.
+
=back
=head2 $status = $z->bzinflate($input, $output);
@@ -275,6 +295,12 @@ If C<appendOutput> is enabled in the constructor for the bunzip2 object,
the uncompressed data will be appended to C<$output>. If not enabled,
C<$output> will be truncated before the uncompressed data is written to it.
+=head1 Misc
+
+=head2 my $version = Compress::Raw::Bzip2::bzlibversion();
+
+Returns the version of the underlying bzip2 library.
+
=head1 Constants
The following bzip2 constants are exported by this module
@@ -322,7 +348,7 @@ See the Changes file.
=head1 COPYRIGHT AND LICENSE
-Copyright (c) 2005-2008 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2009 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.
diff --git a/ext/Compress-Raw-Bzip2/pod/FAQ.pod b/ext/Compress-Raw-Bzip2/pod/FAQ.pod
index f429807958..41921a5d44 100644
--- a/ext/Compress-Raw-Bzip2/pod/FAQ.pod
+++ b/ext/Compress-Raw-Bzip2/pod/FAQ.pod
@@ -112,7 +112,7 @@ See the Changes file.
=head1 COPYRIGHT AND LICENSE
-Copyright (c) 2005-2008 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2009 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.
diff --git a/ext/Compress-Raw-Bzip2/t/000prereq.t b/ext/Compress-Raw-Bzip2/t/000prereq.t
index 99d249be55..fd131fc7e6 100644
--- a/ext/Compress-Raw-Bzip2/t/000prereq.t
+++ b/ext/Compress-Raw-Bzip2/t/000prereq.t
@@ -19,7 +19,7 @@ BEGIN
if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 };
- my $VERSION = '2.015';
+ my $VERSION = '2.019';
my @NAMES = qw(
);
diff --git a/ext/Compress-Raw-Bzip2/t/01bzip2.t b/ext/Compress-Raw-Bzip2/t/01bzip2.t
index 407d16aa8c..008c0b3492 100644
--- a/ext/Compress-Raw-Bzip2/t/01bzip2.t
+++ b/ext/Compress-Raw-Bzip2/t/01bzip2.t
@@ -80,7 +80,7 @@ my $len = length $hello ;
title "Error Cases" ;
eval { new Compress::Raw::Bzip2(1,2,3,4,5,6) };
- like $@, mkErr "Usage: Compress::Raw::Bzip2::new(class, appendOut=1, blockSize100k=1, workfactor=0, verbosity=0)";
+ like $@, mkErr "Usage: Compress::Raw::Bzip2::new(className, appendOut=1, blockSize100k=1, workfactor=0, verbosity=0)";
}
diff --git a/ext/Compress-Raw-Bzip2/t/09limitoutput.t b/ext/Compress-Raw-Bzip2/t/09limitoutput.t
new file mode 100644
index 0000000000..78e121aa90
--- /dev/null
+++ b/ext/Compress-Raw-Bzip2/t/09limitoutput.t
@@ -0,0 +1,139 @@
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir 't' if -d 't';
+ @INC = ("../lib", "lib/compress");
+ }
+}
+
+use lib qw(t t/compress);
+use strict;
+use warnings;
+use bytes;
+
+use Test::More ;
+use CompTestUtils;
+
+BEGIN
+{
+ # use Test::NoWarnings, if available
+ my $extra = 0 ;
+ $extra = 1
+ if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 };
+
+ plan tests => 88 + $extra ;
+
+ use_ok('Compress::Raw::Bzip2') ;
+}
+
+
+
+my $hello = "I am a HAL 9000 computer" x 2001;
+my $tmp = $hello ;
+
+my ($err, $x, $X, $status);
+
+ok( ($x, $err) = new Compress::Raw::Bzip2 (1));
+ok $x ;
+cmp_ok $err, '==', BZ_OK, " status is BZ_OK" ;
+
+my $out ;
+$status = $x->bzdeflate($tmp, $out) ;
+cmp_ok $status, '==', BZ_RUN_OK, " status is BZ_RUN_OK" ;
+
+cmp_ok $x->bzclose($out), '==', BZ_STREAM_END, " bzflush returned BZ_STREAM_END" ;
+
+{
+ my $t = $out;
+ my $b = new Compress::Raw::Bunzip2(0,0);
+
+ my $GOT;
+ my $status = $b->bzinflate($t, $GOT) ;
+ cmp_ok $status, "==", BZ_STREAM_END;
+ ok $GOT eq $hello;
+
+}
+
+sub getOut { my $x = ''; return \$x }
+
+for my $bufsize (1, 2, 3, 13, 4096, 1024*10)
+{
+ print "#\n#Bufsize $bufsize\n#\n";
+ $tmp = $out;
+
+ my $k;
+ ok(($k, $err) = new Compress::Raw::Bunzip2( 1,1,0,0,1
+ #AppendOutput => 1,
+ #LimitOutput => 1,
+ #Bufsize => $bufsize
+ ));
+ ok $k ;
+ cmp_ok $err, '==', BZ_OK, " status is BZ_OK" ;
+
+ is $k->total_in_lo32(), 0, " total_in_lo32 == 0" ;
+ is $k->total_out_lo32(), 0, " total_out_lo32 == 0" ;
+ my $GOT = getOut();
+ my $prev;
+ my $deltaOK = 1;
+ my $looped = 0;
+ while (length $tmp)
+ {
+ ++ $looped;
+ my $prev = length $GOT;
+ $status = $k->bzinflate($tmp, $GOT) ;
+ last if $status != BZ_OK;
+ $deltaOK = 0 if length($GOT) - $prev > $bufsize;
+ }
+
+ ok $deltaOK, " Output Delta never > $bufsize";
+ cmp_ok $looped, '>=', 1, " looped $looped";
+ is length($tmp), 0, " length of input buffer is zero";
+
+ cmp_ok $status, "==", BZ_STREAM_END, " status is BZ_STREAM_END" ;
+ ok $$GOT eq $hello, " got expected output" ;
+ is $k->total_in_lo32(), length $out, " length total_in_lo32 ok" ;
+ is $k->total_out_lo32(), length $hello, " length total_out_lo32 ok " . $k->total_out_lo32() ;
+}
+
+sub getit
+{
+ my $obj = shift ;
+ my $input = shift;
+
+ my $data ;
+ 1 while $obj->bzinflate($input, $data) != BZ_STREAM_END ;
+ return \$data ;
+}
+
+{
+ title "regression test";
+
+ my ($err, $x, $X, $status);
+
+ ok( ($x, $err) = new Compress::Raw::Bzip2 (1));
+ ok $x ;
+ cmp_ok $err, '==', BZ_OK, " status is BZ_OK" ;
+
+ my $line1 = ("abcdefghijklmnopq" x 1000) . "\n" ;
+ my $line2 = "second line\n" ;
+ my $text = $line1 . $line2 ;
+ my $tmp = $text;
+
+ my $out ;
+ $status = $x->bzdeflate($tmp, $out) ;
+ cmp_ok $status, '==', BZ_RUN_OK, " status is BZ_RUN_OK" ;
+
+ cmp_ok $x->bzclose($out), '==', BZ_STREAM_END, " bzclose returned BZ_STREAM_END" ;
+
+ my $k;
+ ok(($k, $err) = new Compress::Raw::Bunzip2( 1,1,0,0,1
+ #AppendOutput => 1,
+ #LimitOutput => 1
+ ));
+
+
+ my $c = getit($k, $out);
+ is $$c, $text;
+
+
+}
+
diff --git a/ext/Compress-Raw-Zlib/Changes b/ext/Compress-Raw-Zlib/Changes
index e818e4f2f7..3308181705 100644
--- a/ext/Compress-Raw-Zlib/Changes
+++ b/ext/Compress-Raw-Zlib/Changes
@@ -1,6 +1,27 @@
CHANGES
-------
+ 2.019 4 May 2009
+
+ * No Changes
+
+ 2.018 3 May 2009
+
+ * No Changes
+
+ 2.017 28 March 2009
+
+ * Added 'LimitOutput' option
+
+ * Removed MAN3PODS from Makefile.PL
+
+ * Fixed coring issue when LimitOutput was used.
+
+ * Documented Compress::Raw::Zlib::zlib_version()
+
+ * Documented Compress::Raw::Zlib::deflateReset()
+ [RT #40566]
+
2.015 3 September 2008
* Makefile.PL
diff --git a/ext/Compress-Raw-Zlib/Makefile.PL b/ext/Compress-Raw-Zlib/Makefile.PL
index 72a7b89a5a..d141df42a0 100644
--- a/ext/Compress-Raw-Zlib/Makefile.PL
+++ b/ext/Compress-Raw-Zlib/Makefile.PL
@@ -77,24 +77,11 @@ WriteMakefile(
},
(
- $ENV{SKIP_FOR_CORE}
- ? (MAN3PODS => {})
- : ()
- ),
-
- (
$BUILD_ZLIB
? zlib_files($ZLIB_LIB)
: (LIBS => [ "-L$ZLIB_LIB -lz " ])
),
- (
- $] >= 5.005
- ? (ABSTRACT_FROM => 'lib/Compress/Raw/Zlib.pm',
- AUTHOR => 'Paul Marquess <pmqs@cpan.org>')
- : ()
- ),
-
INSTALLDIRS => ($] >= 5.009 ? 'perl' : 'site'),
((ExtUtils::MakeMaker->VERSION() gt '6.30') ?
diff --git a/ext/Compress-Raw-Zlib/README b/ext/Compress-Raw-Zlib/README
index 0a5f5182cc..3248f94308 100644
--- a/ext/Compress-Raw-Zlib/README
+++ b/ext/Compress-Raw-Zlib/README
@@ -1,11 +1,11 @@
Compress-Raw-Zlib
- Version 2.015
+ Version 2.019
- 2nd September 2008
+ 4th May 2009
- Copyright (c) 2005-2008 Paul Marquess. All rights reserved.
+ Copyright (c) 2005-2009 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.
@@ -177,6 +177,35 @@ this module.
TROUBLESHOOTING
---------------
+Undefined Symbol gzsetparams
+----------------------------
+
+If you get the error shown below when you run the Compress-Raw-Zlib test
+harness it probably means you are running a copy of zlib that is
+version 1.0.5 or older.
+
+t/01version.........Can't load 'blib/arch/auto/Compress/Zlib/Zlib.so' for
+ module Compress::Raw::Zlib: blib/arch/auto/Compress/Raw/Zlib/Zlib.so:
+ undefined symbol: gzsetparams at ...
+
+There are two ways to fix this problem:
+
+ 1. Upgrade to the latest version of zlib.
+
+ 2. Edit config.in and set the OLD_ZLIB variable to True.
+
+Test Harness 01version fails
+----------------------------
+If the 01version test harness fails, and the problem isn't covered by the
+scenario above, it probably means that you have two versions of
+zlib installed on your system.
+
+Run the command below to see if this is indeed the case
+
+ make test TEST_VERBOSE=1 TEST_FILES=t/01version.t
+
+Try removing the one you don't want to use and rebuild.
+
Solaris build fails with "language optional software package not installed"
---------------------------------------------------------------------------
@@ -277,7 +306,7 @@ it ships with a pre-compiled version of Compress-Raw-Zlib. To check if a
newer version of Compress-Raw-Zlib is available run this from the command
prompt
- C:\> ppm verify -upgrade Compress-Zlib
+ C:\> ppm verify -upgrade Compress-Raw-Zlib
If you are not running Activestate Perl and you don't have access
to a C compiler, you will not be able to build and install this module.
@@ -326,7 +355,7 @@ To help me help you, I need all of the following information:
If you haven't installed Compress-Raw-Zlib then search Compress::Raw::Zlib.pm
for a line like this:
- $VERSION = "2.015" ;
+ $VERSION = "2.019" ;
c. The version of zlib you have used.
If you have successfully installed Compress-Raw-Zlib, this one-liner
diff --git a/ext/Compress-Raw-Zlib/Zlib.xs b/ext/Compress-Raw-Zlib/Zlib.xs
index 821e1d1c7b..251f9984cb 100644
--- a/ext/Compress-Raw-Zlib/Zlib.xs
+++ b/ext/Compress-Raw-Zlib/Zlib.xs
@@ -3,7 +3,7 @@
* Created : 22nd January 1996
* Version : 2.000
*
- * Copyright (c) 1995-2007 Paul Marquess. All rights reserved.
+ * Copyright (c) 1995-2009 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.
*
@@ -541,6 +541,8 @@ char * string;
case SVt_PVHV:
case SVt_PVCV:
croak("%s: buffer parameter is not a SCALAR reference", string);
+ default:
+ break;
}
if (SvROK(sv))
croak("%s: buffer parameter is a reference to a reference", string) ;
@@ -578,6 +580,8 @@ char * string ;
case SVt_PVHV:
case SVt_PVCV:
croak("%s: buffer parameter is not a SCALAR reference", string);
+ default:
+ break;
}
if (SvROK(sv))
croak("%s: buffer parameter is a reference to a reference", string) ;
@@ -1272,7 +1276,7 @@ inflate (s, buf, output, eof=FALSE)
bool eof
uInt cur_length = 0;
uInt prefix_length = 0;
- uInt increment = 0;
+ int increment = 0;
STRLEN stmp = NO_INIT
uLong bufinc = NO_INIT
PREINIT:
@@ -1306,23 +1310,39 @@ inflate (s, buf, output, eof=FALSE)
if((s->flags & FLAG_APPEND) != FLAG_APPEND) {
SvCUR_set(output, 0);
}
+
+ /* Assume no output buffer - the code below will update if there is any available */
+ s->stream.avail_out = 0;
+
+
if (SvLEN(output)) {
prefix_length = cur_length = SvCUR(output) ;
- s->stream.next_out = (Bytef*) SvPVbyte_nolen(output) + cur_length;
- increment = SvLEN(output) - cur_length - 1;
- s->stream.avail_out = increment;
- }
- else {
- s->stream.avail_out = 0;
+
+ if (s->flags & FLAG_LIMIT_OUTPUT && SvLEN(output) - cur_length - 1 < bufinc)
+ {
+ Sv_Grow(output, bufinc + cur_length + 1) ;
+ }
+
+ /* Only setup the stream output pointers if there is spare
+ capacity in the outout SV
+ */
+ if (SvLEN(output) > cur_length + 1)
+ {
+ s->stream.next_out = (Bytef*) SvPVbyte_nolen(output) + cur_length;
+ increment = SvLEN(output) - cur_length - 1;
+ s->stream.avail_out = increment;
+ }
}
+
+
s->bytesInflated = 0;
RETVAL = Z_OK;
while (RETVAL == Z_OK) {
- if (s->stream.avail_out == 0 ) {
+ if (s->stream.avail_out == 0) {
/* out of space in the output buffer so make it bigger */
- Sv_Grow(output, SvLEN(output) + bufinc) ;
+ Sv_Grow(output, SvLEN(output) + bufinc +1) ;
cur_length += increment ;
s->stream.next_out = (Bytef*) SvPVbyte_nolen(output) + cur_length ;
increment = bufinc ;
@@ -1330,7 +1350,13 @@ inflate (s, buf, output, eof=FALSE)
bufinc *= 2 ;
}
+ /* printf("INFLATE Availl In %d, Out %d\n", s->stream.avail_in,
+ s->stream.avail_out);
+DispStream(s, "BEFORE");
+Perl_sv_dump(output); */
RETVAL = inflate(&(s->stream), Z_SYNC_FLUSH);
+ /* printf("INFLATE returned %d %s, avail in %d, out %d\n", RETVAL,
+ GetErrorString(RETVAL), s->stream.avail_in, s->stream.avail_out); */
if (RETVAL == Z_NEED_DICT && s->dictionary) {
@@ -1338,11 +1364,16 @@ inflate (s, buf, output, eof=FALSE)
RETVAL = inflateSetDictionary(&(s->stream),
(const Bytef*)SvPVbyte_nolen(s->dictionary),
SvCUR(s->dictionary));
+ if (RETVAL == Z_OK)
+ continue;
}
- if (s->flags & FLAG_LIMIT_OUTPUT ||
- RETVAL == Z_STREAM_ERROR || RETVAL == Z_MEM_ERROR ||
- RETVAL == Z_DATA_ERROR || RETVAL == Z_STREAM_END )
+ if (s->flags & FLAG_LIMIT_OUTPUT &&
+ (RETVAL == Z_OK || RETVAL == Z_BUF_ERROR ))
+ break;
+
+ if (RETVAL == Z_STREAM_ERROR || RETVAL == Z_MEM_ERROR ||
+ RETVAL == Z_DATA_ERROR || RETVAL == Z_STREAM_END )
break ;
if (RETVAL == Z_BUF_ERROR) {
@@ -1376,8 +1407,8 @@ inflate (s, buf, output, eof=FALSE)
#endif
s->last_error = RETVAL ;
- if (RETVAL == Z_OK || RETVAL == Z_STREAM_END || RETVAL == Z_DATA_ERROR) {
- unsigned in ;
+ if (RETVAL == Z_OK || RETVAL == Z_STREAM_END || RETVAL == Z_BUF_ERROR || RETVAL == Z_DATA_ERROR) {
+ unsigned in ;
s->bytesInflated = cur_length + increment - s->stream.avail_out - prefix_length;
s->uncompressedBytes += s->bytesInflated ;
@@ -1411,6 +1442,7 @@ inflate (s, buf, output, eof=FALSE)
*SvEND(buf) = '\0';
SvSETMAGIC(buf);
}
+
}
OUTPUT:
RETVAL
diff --git a/ext/Compress-Raw-Zlib/lib/Compress/Raw/Zlib.pm b/ext/Compress-Raw-Zlib/lib/Compress/Raw/Zlib.pm
index 6d096e016d..f55ad46e4c 100644
--- a/ext/Compress-Raw-Zlib/lib/Compress/Raw/Zlib.pm
+++ b/ext/Compress-Raw-Zlib/lib/Compress/Raw/Zlib.pm
@@ -13,7 +13,7 @@ use warnings ;
use bytes ;
our ($VERSION, $XS_VERSION, @ISA, @EXPORT, $AUTOLOAD);
-$VERSION = '2.015';
+$VERSION = '2.019';
$XS_VERSION = $VERSION;
$VERSION = eval $VERSION;
@@ -547,6 +547,7 @@ Compress::Raw::Zlib - Low-Level Interface to zlib compression library
($d, $status) = new Compress::Raw::Zlib::Deflate( [OPT] ) ;
$status = $d->deflate($input, $output) ;
$status = $d->flush($output [, $flush_type]) ;
+ $d->deflateReset() ;
$d->deflateParams(OPTS) ;
$d->deflateTune(OPTS) ;
$d->dict_adler() ;
@@ -576,8 +577,7 @@ Compress::Raw::Zlib - Low-Level Interface to zlib compression library
$crc = adler32_combine($crc1, $crc2, $len2)l
$crc = crc32_combine($adler1, $adler2, $len2)
- ZLIB_VERSION
- ZLIB_VERNUM
+ my $version = Compress::Raw::Zlib::zlib_version();
=head1 DESCRIPTION
@@ -763,6 +763,16 @@ the C<$d> object, the compressed data will be appended to C<$output>. If
it is false, C<$output> will be truncated before any compressed data is
written to it.
+=head2 B<$status = $d-E<gt>deflateReset() >
+
+This method will reset the deflation object C<$d>. It can be used when you
+are compressing multiple data streams and want to use the same object to
+compress each of them. It should only be used once the previous data stream
+has been flushed successfully, i.e. a call to C<< $d->flush(Z_FINISH) >> has
+returned C<Z_OK>.
+
+Returns C<Z_OK> if successful.
+
=head2 B<$status = $d-E<gt>deflateParams([OPT])>
Change settings for the deflate object C<$d>.
@@ -965,7 +975,7 @@ This option defaults to false.
=item B<-ConsumeInput>
If set to true, this option will remove compressed data from the input
-buffer of the the C< $i-E<gt>inflate > method as the inflate progresses.
+buffer of the C<< $i->inflate >> method as the inflate progresses.
This option can be useful when you are processing compressed data that is
embedded in another file/buffer. In this case the data that immediately
@@ -973,6 +983,29 @@ follows the compressed stream will be left in the input buffer.
This option defaults to true.
+=item B<-LimitOutput>
+
+The C<LimitOutput> option changes the behavior of the C<< $i->inflate >>
+method so that the amount of memory used by the output buffer can be
+limited.
+
+When C<LimitOutput> is used the size of the output buffer used will either
+be the value of the C<Bufsize> option or the amount of memory already
+allocated to C<$output>, whichever is larger. Predicting the output size
+available is tricky, so don't rely on getting an exact output buffer size.
+
+When C<LimitOutout> is not specified C<< $i->inflate >> will use as much
+memory as it takes to write all the uncompressed data it creates by
+uncompressing the input buffer.
+
+If C<LimitOutput> is enabled, the C<ConsumeInput> option will also be
+enabled.
+
+This option defaults to false.
+
+See L</The LimitOutput option> for a discussion on why C<LimitOutput> is
+needed and how to use it.
+
=back
Here is an example of using an optional parameter to override the default
@@ -1101,7 +1134,7 @@ Returns the total number of uncompressed bytes output from inflate.
Returns the buffer size used to carry out the decompression.
-=head2 Example
+=head2 Examples
Here is an example of using C<inflate>.
@@ -1120,10 +1153,9 @@ Here is an example of using C<inflate>.
my ($output, $status) ;
while (read(STDIN, $input, 4096))
{
- $status = $x->inflate(\$input, $output) ;
+ $status = $x->inflate($input, $output) ;
- print $output
- if $status == Z_OK or $status == Z_STREAM_END ;
+ print $output ;
last if $status != Z_OK ;
}
@@ -1131,6 +1163,46 @@ Here is an example of using C<inflate>.
die "inflation failed\n"
unless $status == Z_STREAM_END ;
+The next example show how to use the C<LimitOutput> option. Notice the use
+of two nested loops in this case. The outer loop reads the data from the
+input source - STDIN and the inner loop repeatedly calls C<inflate> until
+C<$input> is exhausted, we get an error, or the end of the stream is
+reached. One point worth remembering is by using the C<LimitOutput> option
+you also get C<ConsumeInput> set as well - this makes the code below much
+simpler.
+
+ use strict ;
+ use warnings ;
+
+ use Compress::Raw::Zlib;
+
+ my $x = new Compress::Raw::Zlib::Inflate(LimitOutput => 1)
+ or die "Cannot create a inflation stream\n" ;
+
+ my $input = '' ;
+ binmode STDIN;
+ binmode STDOUT;
+
+ my ($output, $status) ;
+
+ OUTER:
+ while (read(STDIN, $input, 4096))
+ {
+ do
+ {
+ $status = $x->inflate($input, $output) ;
+
+ print $output ;
+
+ last OUTER
+ unless $status == Z_OK || $status == Z_BUF_ERROR ;
+ }
+ while ($status == Z_OK && length $input);
+ }
+
+ die "inflation failed\n"
+ unless $status == Z_STREAM_END ;
+
=head1 CHECKSUM FUNCTIONS
Two functions are provided by I<zlib> to calculate checksums. For the
@@ -1153,6 +1225,148 @@ CRC-related functions are available.
These functions allow checksums to be merged.
+=head1 Misc
+
+=head2 my $version = Compress::Raw::Zlib::zlib_version();
+
+Returns the version of the zlib library.
+
+=head1 The LimitOutput option.
+
+By default C<< $i->inflate($input, $output) >> will uncompress I<all> data
+in C<$input> and write I<all> of the uncompressed data it has generated to
+C<$output>. This makes the interface to C<inflate> much simpler - if the
+method has uncompressed C<$input> successfully I<all> compressed data in
+C<$input> will have been dealt with. So if you are reading from an input
+source and uncompressing as you go the code will look something like this
+
+ use strict ;
+ use warnings ;
+
+ use Compress::Raw::Zlib;
+
+ my $x = new Compress::Raw::Zlib::Inflate()
+ or die "Cannot create a inflation stream\n" ;
+
+ my $input = '' ;
+
+ my ($output, $status) ;
+ while (read(STDIN, $input, 4096))
+ {
+ $status = $x->inflate($input, $output) ;
+
+ print $output ;
+
+ last if $status != Z_OK ;
+ }
+
+ die "inflation failed\n"
+ unless $status == Z_STREAM_END ;
+
+The points to note are
+
+=over 5
+
+=item *
+
+The main processing loop in the code handles reading of compressed data
+from STDIN.
+
+=item *
+
+The status code returned from C<inflate> will only trigger termination of
+the main processing loop if it isn't C<Z_OK>. When C<LimitOutput> has not
+been used the C<Z_OK> status means means that the end of the compressed
+data stream has been reached or there has been an error in uncompression.
+
+=item *
+
+After the call to C<inflate> I<all> of the uncompressed data in C<$input>
+will have been processed. This means the subsequent call to C<read> can
+overwrite it's contents without any problem.
+
+=back
+
+For most use-cases the behavior described above is acceptable (this module
+and it's predecessor, C<Compress::Zlib>, have used it for over 10 years
+without an issue), but in a few very specific use-cases the amount of
+memory required for C<$output> can prohibitively large. For example, if the
+compressed data stream contains the same pattern repeated thousands of
+times, a relatively small compressed data stream can uncompress into
+hundreds of megabytes. Remember C<inflate> will keep allocating memory
+until I<all> the uncompressed data has been written to the output buffer -
+the size of C<$output> is unbounded.
+
+The C<LimitOutput> option is designed to help with this use-case.
+
+The main difference in your code when using C<LimitOutput> is having to
+deal with cases where the C<$input> parameter still contains some
+uncompressed data that C<inflate> hasn't processed yet. The status code
+returned from C<inflate> will be C<Z_OK> if uncompression took place and
+C<Z_BUF_ERROR> if the output buffer is full.
+
+Below is typical code that shows how to use C<LimitOutput>.
+
+ use strict ;
+ use warnings ;
+
+ use Compress::Raw::Zlib;
+
+ my $x = new Compress::Raw::Zlib::Inflate(LimitOutput => 1)
+ or die "Cannot create a inflation stream\n" ;
+
+ my $input = '' ;
+ binmode STDIN;
+ binmode STDOUT;
+
+ my ($output, $status) ;
+
+ OUTER:
+ while (read(STDIN, $input, 4096))
+ {
+ do
+ {
+ $status = $x->inflate($input, $output) ;
+
+ print $output ;
+
+ last OUTER
+ unless $status == Z_OK || $status == Z_BUF_ERROR ;
+ }
+ while ($status == Z_OK && length $input);
+ }
+
+ die "inflation failed\n"
+ unless $status == Z_STREAM_END ;
+
+Points to note this time:
+
+=over 5
+
+=item *
+
+There are now two nested loops in the code: the outer loop for reading the
+compressed data from STDIN, as before; and the inner loop to carry out the
+uncompression.
+
+=item *
+
+There are two exit points from the inner uncompression loop.
+
+Firstly when C<inflate> has returned a status other than C<Z_OK> or
+C<Z_BUF_ERROR>. This means that either the end of the compressed data
+stream has been reached (C<Z_STREAM_END>) or there is an error in the
+compressed data. In either of these cases there is no point in continuing
+with reading the compressed data, so both loops are terminated.
+
+The second exit point tests if there is any data left in the input buffer,
+C<$input> - remember that the C<ConsumeInput> option is automatically
+enabled when C<LimitOutput> is used. When the input buffer has been
+exhausted, the outer loop can run again and overwrite a now empty
+C<$input>.
+
+=back
+
=head1 ACCESSING ZIP FILES
Although it is possible (with some effort on your part) to use this
@@ -1199,7 +1413,7 @@ See the Changes file.
=head1 COPYRIGHT AND LICENSE
-Copyright (c) 2005-2008 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2009 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.
diff --git a/ext/Compress-Raw-Zlib/pod/FAQ.pod b/ext/Compress-Raw-Zlib/pod/FAQ.pod
index 0a78bbbdf4..56d08f5cfe 100644
--- a/ext/Compress-Raw-Zlib/pod/FAQ.pod
+++ b/ext/Compress-Raw-Zlib/pod/FAQ.pod
@@ -135,7 +135,7 @@ See the Changes file.
=head1 COPYRIGHT AND LICENSE
-Copyright (c) 2005-2008 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2009 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.
diff --git a/ext/Compress-Raw-Zlib/t/02zlib.t b/ext/Compress-Raw-Zlib/t/02zlib.t
index 889566afd4..7d379249b5 100644
--- a/ext/Compress-Raw-Zlib/t/02zlib.t
+++ b/ext/Compress-Raw-Zlib/t/02zlib.t
@@ -24,13 +24,13 @@ BEGIN
my $count = 0 ;
if ($] < 5.005) {
- $count = 229 ;
+ $count = 230 ;
}
elsif ($] >= 5.006) {
- $count = 283 ;
+ $count = 284 ;
}
else {
- $count = 241 ;
+ $count = 242 ;
}
plan tests => $count + $extra;
@@ -443,10 +443,13 @@ for my $consume ( 0 .. 1)
# create a flush point
cmp_ok $x->flush($Answer, Z_FULL_FLUSH), '==', Z_OK ;
+
+ my $len1 = length $Answer;
cmp_ok $x->deflate($goodbye, $Answer), '==', Z_OK;
cmp_ok $x->flush($Answer), '==', Z_OK ;
+ my $len2 = length($Answer) - $len1 ;
my ($first, @Answer) = split('', $Answer) ;
@@ -475,7 +478,6 @@ for my $consume ( 0 .. 1)
$GOT .= $Z if defined $Z ;
# print "x $status\n";
last if $status == Z_STREAM_END or $status != Z_OK ;
-
}
cmp_ok $status, '==', Z_DATA_ERROR ;
@@ -488,7 +490,7 @@ for my $consume ( 0 .. 1)
my $initial = $1 ;
- ok(($k, $err) = new Compress::Raw::Zlib::Inflate(-ConsumeInput => 0)) ;
+ ok(($k, $err) = new Compress::Raw::Zlib::Inflate(ConsumeInput => 0)) ;
ok $k ;
cmp_ok $err, '==', Z_OK ;
@@ -499,8 +501,11 @@ for my $consume ( 0 .. 1)
cmp_ok $status, '==', Z_OK
or diag "status '$status'\nlength rest is " . length($rest) . "\n" ;
- cmp_ok $k->inflate($rest, $GOT), '==', Z_DATA_ERROR;
- is $Z . $GOT, $goodbye ;
+ is length($rest), $len2, "expected compressed output";
+
+ $GOT = '';
+ cmp_ok $k->inflate($rest, $GOT), '==', Z_DATA_ERROR, "inflate returns Z_DATA_ERROR";
+ is $GOT, $goodbye ;
}
{
diff --git a/ext/Compress-Raw-Zlib/t/09limitoutput.t b/ext/Compress-Raw-Zlib/t/09limitoutput.t
new file mode 100644
index 0000000000..a98b18f0c7
--- /dev/null
+++ b/ext/Compress-Raw-Zlib/t/09limitoutput.t
@@ -0,0 +1,129 @@
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir 't' if -d 't';
+ @INC = ("../lib", "lib/compress");
+ }
+}
+
+use lib qw(t t/compress);
+use strict;
+use warnings;
+use bytes;
+
+use Test::More ;
+use CompTestUtils;
+
+BEGIN
+{
+ # use Test::NoWarnings, if available
+ my $extra = 0 ;
+ $extra = 1
+ if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 };
+
+ plan tests => 98 + $extra ;
+
+ use_ok('Compress::Raw::Zlib', 2) ;
+}
+
+
+
+my $hello = "I am a HAL 9000 computer" x 2001;
+my $tmp = $hello ;
+
+my ($err, $x, $X, $status);
+
+ok( ($x, $err) = new Compress::Raw::Zlib::Deflate (-AppendOutput => 1));
+ok $x ;
+cmp_ok $err, '==', Z_OK, " status is Z_OK" ;
+
+my $out ;
+$status = $x->deflate($tmp, $out) ;
+cmp_ok $status, '==', Z_OK, " status is Z_OK" ;
+
+cmp_ok $x->flush($out), '==', Z_OK, " flush returned Z_OK" ;
+
+
+sub getOut { my $x = ''; return \$x }
+
+for my $bufsize (1, 2, 3, 13, 4096, 1024*10)
+{
+ print "#\n#Bufsize $bufsize\n#\n";
+ $tmp = $out;
+
+ my $k;
+ ok(($k, $err) = new Compress::Raw::Zlib::Inflate( AppendOutput => 1,
+ LimitOutput => 1,
+ Bufsize => $bufsize
+ ));
+ ok $k ;
+ cmp_ok $err, '==', Z_OK, " status is Z_OK" ;
+
+ ok ! defined $k->msg(), " no msg" ;
+ is $k->total_in(), 0, " total_in == 0" ;
+ is $k->total_out(), 0, " total_out == 0" ;
+ my $GOT = getOut();
+ my $prev;
+ my $deltaOK = 1;
+ my $looped = 0;
+ while (length $tmp)
+ {
+ ++ $looped;
+ my $prev = length $GOT;
+ $status = $k->inflate($tmp, $GOT) ;
+ last if $status == Z_STREAM_END || $status == Z_DATA_ERROR || $status == Z_STREAM_ERROR ;
+ $deltaOK = 0 if length($GOT) - $prev > $bufsize;
+ }
+
+ ok $deltaOK, " Output Delta never > $bufsize";
+ cmp_ok $looped, '>=', 1, " looped $looped";
+ is length($tmp), 0, " length of input buffer is zero";
+
+ cmp_ok $status, '==', Z_STREAM_END, " status is Z_STREAM_END" ;
+ is $$GOT, $hello, " got expected output" ;
+ ok ! defined $k->msg(), " no msg" ;
+ is $k->total_in(), length $out, " length total_in ok" ;
+ is $k->total_out(), length $hello, " length total_out ok " . $k->total_out() ;
+}
+
+sub getit
+{
+ my $obj = shift ;
+ my $input = shift;
+
+ my $data ;
+ 1 while $obj->inflate($input, $data) != Z_STREAM_END ;
+ return \$data ;
+}
+
+{
+ title "regression test";
+
+ my ($err, $x, $X, $status);
+
+ ok( ($x, $err) = new Compress::Raw::Zlib::Deflate (-AppendOutput => 1));
+ ok $x ;
+ cmp_ok $err, '==', Z_OK, " status is Z_OK" ;
+
+ my $line1 = ("abcdefghijklmnopq" x 1000) . "\n" ;
+ my $line2 = "second line\n" ;
+ my $text = $line1 . $line2 ;
+ my $tmp = $text;
+
+ my $out ;
+ $status = $x->deflate($tmp, $out) ;
+ cmp_ok $status, '==', Z_OK, " status is Z_OK" ;
+
+ cmp_ok $x->flush($out), '==', Z_OK, " flush returned Z_OK" ;
+
+ my $k;
+ ok(($k, $err) = new Compress::Raw::Zlib::Inflate( AppendOutput => 1,
+ LimitOutput => 1
+ ));
+
+
+ my $c = getit($k, $out);
+ is $$c, $text;
+
+
+}
+
diff --git a/ext/Compress-Zlib/Makefile.PL b/ext/Compress-Zlib/Makefile.PL
deleted file mode 100755
index 1f6ba8060a..0000000000
--- a/ext/Compress-Zlib/Makefile.PL
+++ /dev/null
@@ -1,81 +0,0 @@
-#! perl -w
-
-use strict ;
-require 5.004 ;
-
-$::VERSION = '2.015' ;
-
-use private::MakeUtil;
-use ExtUtils::MakeMaker 5.16 ;
-
-
-UpDowngrade(getPerlFiles('MANIFEST'))
- unless $ENV{PERL_CORE};
-
-WriteMakefile(
- NAME => 'Compress::Zlib',
- VERSION_FROM => 'lib/Compress/Zlib.pm',
- 'dist' => { COMPRESS => 'gzip',
- TARFLAGS => '-chvf',
- SUFFIX => 'gz',
- DIST_DEFAULT => 'MyTrebleCheck tardist',
- },
-
- (
- $ENV{SKIP_FOR_CORE}
- ? (MAN3PODS => {})
- : (PREREQ_PM => { 'Compress::Raw::Zlib' => $::VERSION,
- 'IO::Compress::Base' => $::VERSION,
- 'IO::Compress::Base::Common' => $::VERSION,
- 'IO::Uncompress::Base' => $::VERSION,
- 'IO::Compress::Gzip' => $::VERSION,
- 'IO::Compress::Gzip::Constants' => $::VERSION,
- 'IO::Uncompress::Gunzip' => $::VERSION,
- 'Scalar::Util' => 0,
- }
- )
- ),
-
- (
- $] >= 5.005
- ? (ABSTRACT_FROM => 'lib/Compress/Zlib.pm',
- AUTHOR => 'Paul Marquess <pmqs@cpan.org>')
- : ()
- ),
-
- INSTALLDIRS => ($] >= 5.009 ? 'perl' : 'site'),
-
- (
- $] >= 5.009 && ! $ENV{PERL_CORE}
- ? (INST_LIB => 'blib/arch')
- : ()
- ),
-
- ((ExtUtils::MakeMaker->VERSION() gt '6.30') ?
- ('LICENSE' => 'perl') : ()),
-
-) ;
-
-# Check for Compress::Zlib version 1.
-eval "require Compress::Zlib; " ;
-if ( ! $ENV{PERL_CORE} && ! $@ && $Compress::Zlib::VERSION < 2)
-{
- my $ver = $Compress::Zlib::VERSION ;
- print <<EOM
-
-I see you already have Compress::Zlib version $ver installed.
-Version 1 MUST be removed for version 2 to operate correctly.
-
-The easiest way to do that is to install Compress::Zlib like this
-
- make install UNINST=1
-
-If you run the CPAN shell run this before installing Compress::Zlib
-
- o conf make_install_arg UNINST=1
-
-EOM
-}
-
-# end of file Makefile.PL
-
diff --git a/ext/Compress-Zlib/README b/ext/Compress-Zlib/README
deleted file mode 100644
index 89d1f07c77..0000000000
--- a/ext/Compress-Zlib/README
+++ /dev/null
@@ -1,120 +0,0 @@
-
- Compress-Zlib
-
- Version 2.015
-
- 2nd September 2008
-
- Copyright (c) 1995-2008 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.
-
-DESCRIPTION
------------
-
-This module provides a Perl interface to the zlib compression library.
-
-PREREQUISITES
--------------
-
-Before you can build Compress-Zlib you need to have the following
-installed on your system:
-
- * Perl 5.004 or better.
- * Compress::Raw::Zlib
- * IO::Compress::Gzip
-
-BUILDING THE MODULE
--------------------
-
-Assuming you have met all the prerequisites, the module can now be built
-using this sequence of commands:
-
- perl Makefile.PL
- make
- make test
-
-INSTALLATION
-------------
-
-To install Compress-Zlib, run the command below:
-
- make install
-
-TROUBLESHOOTING
----------------
-
-Undefined Symbol gzsetparams
-----------------------------
-
-If you get the error shown below when you run the Compress-Zlib test
-harness it probably means you are running a copy of zlib that is
-version 1.0.5 or older.
-
-t/01version.........Can't load 'blib/arch/auto/Compress/Zlib/Zlib.so' for
- module Compress::Raw::Zlib: blib/arch/auto/Compress/Raw/Zlib/Zlib.so:
- undefined symbol: gzsetparams at ...
-
-There are two ways to fix this problem:
-
- 1. Upgrade to the latest version of zlib.
-
- 2. Edit config.in and set the OLD_ZLIB variable to True.
-
-Test Harness 01version fails
-----------------------------
-If the 01version test harness fails, and the problem isn't covered by the
-scenario above, it probably means that you have two versions of
-zlib installed on your system.
-
-Run the command below to see if this is indeed the case
-
- make test TEST_VERBOSE=1 TEST_FILES=t/01version.t
-
-Try removing the one you don't want to use and rebuild.
-
-FEEDBACK
---------
-
-How to report a problem with Compress-Zlib.
-
-To help me help you, I need all of the following information:
-
- 1. The Versions of everything relevant.
- This includes:
-
- a. The *complete* output from running this
-
- perl -V
-
- Do not edit the output in any way.
- Note, I want you to run "perl -V" and NOT "perl -v".
-
- If your perl does not understand the "-V" option it is too
- old. This module needs Perl version 5.004 or better.
-
- b. The version of Compress-Zlib you have.
- If you have successfully installed Compress-Zlib, this one-liner
- will tell you:
-
- perl -MCompress::Zlib -e 'print qq[ver $Compress::Zlib::VERSION\n]'
-
- If you are running windows use this
-
- perl -MCompress::Zlib -e "print qq[ver $Compress::Zlib::VERSION\n]"
-
- If you haven't installed Compress-Zlib then search Compress::Zlib.pm
- for a line like this:
-
- $VERSION = "2.015" ;
-
- 2. If you are having problems building Compress-Zlib, send me a
- complete log of what happened. Start by unpacking the Compress-Zlib
- module into a fresh directory and keep a log of all the steps
-
- [edit config.in, if necessary]
- perl Makefile.PL
- make
- make test TEST_VERBOSE=1
-
-Paul Marquess <pmqs@cpan.org>
diff --git a/ext/Compress-Zlib/pod/FAQ.pod b/ext/Compress-Zlib/pod/FAQ.pod
deleted file mode 100644
index d590412f92..0000000000
--- a/ext/Compress-Zlib/pod/FAQ.pod
+++ /dev/null
@@ -1,125 +0,0 @@
-
-=head1 NAME
-
-Compress::Zlib::FAQ -- Frequently Asked Questions about Compress::Zlib
-
-=head1 DESCRIPTION
-
-Common questions answered.
-
-=head2 Compatibility with Unix compress/uncompress.
-
-Although C<Compress::Zlib> has a pair of functions called C<compress> and
-C<uncompress>, they are I<not> related to the Unix programs of the same
-name. The C<Compress::Zlib> module is not compatible with Unix
-C<compress>.
-
-If you have the C<uncompress> program available, you can use this to read
-compressed files
-
- open F, "uncompress -c $filename |";
- while (<F>)
- {
- ...
-
-Alternatively, if you have the C<gunzip> program available, you can use
-this to read compressed files
-
- open F, "gunzip -c $filename |";
- while (<F>)
- {
- ...
-
-and this to write compress files, if you have the C<compress> program
-available
-
- open F, "| compress -c $filename ";
- print F "data";
- ...
- close F ;
-
-=head2 Accessing .tar.Z files
-
-The C<Archive::Tar> module can optionally use C<Compress::Zlib> (via the
-C<IO::Zlib> module) to access tar files that have been compressed with
-C<gzip>. Unfortunately tar files compressed with the Unix C<compress>
-utility cannot be read by C<Compress::Zlib> and so cannot be directly
-accessed by C<Archive::Tar>.
-
-If the C<uncompress> or C<gunzip> programs are available, you can use one
-of these workarounds to read C<.tar.Z> files from C<Archive::Tar>
-
-Firstly with C<uncompress>
-
- use strict;
- use warnings;
- use Archive::Tar;
-
- open F, "uncompress -c $filename |";
- my $tar = Archive::Tar->new(*F);
- ...
-
-and this with C<gunzip>
-
- use strict;
- use warnings;
- use Archive::Tar;
-
- open F, "gunzip -c $filename |";
- my $tar = Archive::Tar->new(*F);
- ...
-
-Similarly, if the C<compress> program is available, you can use this to
-write a C<.tar.Z> file
-
- use strict;
- use warnings;
- use Archive::Tar;
- use IO::File;
-
- my $fh = new IO::File "| compress -c >$filename";
- my $tar = Archive::Tar->new();
- ...
- $tar->write($fh);
- $fh->close ;
-
-=head2 Accessing Zip Files
-
-This module does not support reading/writing zip files.
-
-Support for reading/writing zip files is included with the
-C<IO::Compress::Zip> and C<IO::Uncompress::Unzip> modules.
-
-The primary focus of the C<IO::Compress::Zip> and C<IO::Uncompress::Unzip>
-modules is to provide an C<IO::File> compatible streaming read/write
-interface to zip files/buffers. They are not fully flegged archivers. If
-you are looking for an archiver check out the C<Archive::Zip> module. You
-can find it on CPAN at
-
- http://www.cpan.org/modules/by-module/Archive/Archive-Zip-*.tar.gz
-
-=head1 SEE ALSO
-
-L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
-
-L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
-
-L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
-L<Archive::Tar|Archive::Tar>,
-L<IO::Zlib|IO::Zlib>
-
-=head1 AUTHOR
-
-This module was written by Paul Marquess, F<pmqs@cpan.org>.
-
-=head1 MODIFICATION HISTORY
-
-See the Changes file.
-
-=head1 COPYRIGHT AND LICENSE
-
-Copyright (c) 2005-2008 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.
-
diff --git a/ext/Compress-Zlib/t/03zlib-v1.t b/ext/Compress-Zlib/t/03zlib-v1.t
deleted file mode 100644
index 7358f4a5f0..0000000000
--- a/ext/Compress-Zlib/t/03zlib-v1.t
+++ /dev/null
@@ -1,1188 +0,0 @@
-BEGIN {
- if ($ENV{PERL_CORE}) {
- chdir 't' if -d 't';
- @INC = ("../lib", "lib/compress");
- }
-}
-
-use lib qw(t t/compress);
-use strict;
-use warnings;
-use bytes;
-
-use Test::More ;
-use CompTestUtils;
-use Symbol;
-
-BEGIN
-{
- # use Test::NoWarnings, if available
- my $extra = 0 ;
- $extra = 1
- if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 };
-
- my $count = 0 ;
- if ($] < 5.005) {
- $count = 390 ;
- }
- else {
- $count = 401 ;
- }
-
-
- plan tests => $count + $extra ;
-
- use_ok('Compress::Zlib', 2) ;
- use_ok('IO::Compress::Gzip::Constants') ;
-
- use_ok('IO::Compress::Gzip', qw($GzipError)) ;
-}
-
-
-my $hello = <<EOM ;
-hello world
-this is a test
-EOM
-
-my $len = length $hello ;
-
-# Check zlib_version and ZLIB_VERSION are the same.
-is Compress::Zlib::zlib_version, ZLIB_VERSION,
- "ZLIB_VERSION matches Compress::Zlib::zlib_version" ;
-
-# generate a long random string
-my $contents = '' ;
-foreach (1 .. 5000)
- { $contents .= chr int rand 256 }
-
-my $x ;
-my $fil;
-
-# compress/uncompress tests
-# =========================
-
-eval { compress([1]); };
-ok $@ =~ m#not a scalar reference#
- or print "# $@\n" ;;
-
-eval { uncompress([1]); };
-ok $@ =~ m#not a scalar reference#
- or print "# $@\n" ;;
-
-$hello = "hello mum" ;
-my $keep_hello = $hello ;
-
-my $compr = compress($hello) ;
-ok $compr ne "" ;
-
-my $keep_compr = $compr ;
-
-my $uncompr = uncompress ($compr) ;
-
-ok $hello eq $uncompr ;
-
-ok $hello eq $keep_hello ;
-ok $compr eq $keep_compr ;
-
-# compress a number
-$hello = 7890 ;
-$keep_hello = $hello ;
-
-$compr = compress($hello) ;
-ok $compr ne "" ;
-
-$keep_compr = $compr ;
-
-$uncompr = uncompress ($compr) ;
-
-ok $hello eq $uncompr ;
-
-ok $hello eq $keep_hello ;
-ok $compr eq $keep_compr ;
-
-# bigger compress
-
-$compr = compress ($contents) ;
-ok $compr ne "" ;
-
-$uncompr = uncompress ($compr) ;
-
-ok $contents eq $uncompr ;
-
-# buffer reference
-
-$compr = compress(\$hello) ;
-ok $compr ne "" ;
-
-
-$uncompr = uncompress (\$compr) ;
-ok $hello eq $uncompr ;
-
-# bad level
-$compr = compress($hello, 1000) ;
-ok ! defined $compr;
-
-# change level
-$compr = compress($hello, Z_BEST_COMPRESSION) ;
-ok defined $compr;
-$uncompr = uncompress (\$compr) ;
-ok $hello eq $uncompr ;
-
-# corrupt data
-$compr = compress(\$hello) ;
-ok $compr ne "" ;
-
-substr($compr,0, 1) = "\xFF";
-ok !defined uncompress (\$compr) ;
-
-# deflate/inflate - small buffer
-# ==============================
-
-$hello = "I am a HAL 9000 computer" ;
-my @hello = split('', $hello) ;
-my ($err, $X, $status);
-
-ok (($x, $err) = deflateInit( {-Bufsize => 1} ) ) ;
-ok $x ;
-ok $err == Z_OK ;
-
-my $Answer = '';
-foreach (@hello)
-{
- ($X, $status) = $x->deflate($_) ;
- last unless $status == Z_OK ;
-
- $Answer .= $X ;
-}
-
-ok $status == Z_OK ;
-
-ok ((($X, $status) = $x->flush())[1] == Z_OK ) ;
-$Answer .= $X ;
-
-
-my @Answer = split('', $Answer) ;
-
-my $k;
-ok (($k, $err) = inflateInit( {-Bufsize => 1}) ) ;
-ok $k ;
-ok $err == Z_OK ;
-
-my $GOT = '';
-my $Z;
-foreach (@Answer)
-{
- ($Z, $status) = $k->inflate($_) ;
- $GOT .= $Z ;
- last if $status == Z_STREAM_END or $status != Z_OK ;
-
-}
-
-ok $status == Z_STREAM_END ;
-ok $GOT eq $hello ;
-
-
-title 'deflate/inflate - small buffer with a number';
-# ==============================
-
-$hello = 6529 ;
-
-ok (($x, $err) = deflateInit( {-Bufsize => 1} ) ) ;
-ok $x ;
-ok $err == Z_OK ;
-
-ok !defined $x->msg() ;
-ok $x->total_in() == 0 ;
-ok $x->total_out() == 0 ;
-$Answer = '';
-{
- ($X, $status) = $x->deflate($hello) ;
-
- $Answer .= $X ;
-}
-
-ok $status == Z_OK ;
-
-ok ((($X, $status) = $x->flush())[1] == Z_OK ) ;
-$Answer .= $X ;
-
-ok !defined $x->msg() ;
-ok $x->total_in() == length $hello ;
-ok $x->total_out() == length $Answer ;
-
-
-@Answer = split('', $Answer) ;
-
-ok (($k, $err) = inflateInit( {-Bufsize => 1}) ) ;
-ok $k ;
-ok $err == Z_OK ;
-
-ok !defined $k->msg() ;
-ok $k->total_in() == 0 ;
-ok $k->total_out() == 0 ;
-
-$GOT = '';
-foreach (@Answer)
-{
- ($Z, $status) = $k->inflate($_) ;
- $GOT .= $Z ;
- last if $status == Z_STREAM_END or $status != Z_OK ;
-
-}
-
-ok $status == Z_STREAM_END ;
-ok $GOT eq $hello ;
-
-ok !defined $k->msg() ;
-is $k->total_in(), length $Answer ;
-ok $k->total_out() == length $hello ;
-
-
-
-title 'deflate/inflate - larger buffer';
-# ==============================
-
-
-ok $x = deflateInit() ;
-
-ok ((($X, $status) = $x->deflate($contents))[1] == Z_OK) ;
-
-my $Y = $X ;
-
-
-ok ((($X, $status) = $x->flush() )[1] == Z_OK ) ;
-$Y .= $X ;
-
-
-
-ok $k = inflateInit() ;
-
-($Z, $status) = $k->inflate($Y) ;
-
-ok $status == Z_STREAM_END ;
-ok $contents eq $Z ;
-
-title 'deflate/inflate - preset dictionary';
-# ===================================
-
-my $dictionary = "hello" ;
-ok $x = deflateInit({-Level => Z_BEST_COMPRESSION,
- -Dictionary => $dictionary}) ;
-
-my $dictID = $x->dict_adler() ;
-
-($X, $status) = $x->deflate($hello) ;
-ok $status == Z_OK ;
-($Y, $status) = $x->flush() ;
-ok $status == Z_OK ;
-$X .= $Y ;
-$x = 0 ;
-
-ok $k = inflateInit(-Dictionary => $dictionary) ;
-
-($Z, $status) = $k->inflate($X);
-ok $status == Z_STREAM_END ;
-ok $k->dict_adler() == $dictID;
-ok $hello eq $Z ;
-
-#$Z='';
-#while (1) {
-# ($Z, $status) = $k->inflate($X) ;
-# last if $status == Z_STREAM_END or $status != Z_OK ;
-#print "status=[$status] hello=[$hello] Z=[$Z]\n";
-#}
-#ok $status == Z_STREAM_END ;
-#ok $hello eq $Z
-# or print "status=[$status] hello=[$hello] Z=[$Z]\n";
-
-
-
-
-
-
-title 'inflate - check remaining buffer after Z_STREAM_END';
-# ===================================================
-
-{
- ok $x = deflateInit(-Level => Z_BEST_COMPRESSION ) ;
-
- ($X, $status) = $x->deflate($hello) ;
- ok $status == Z_OK ;
- ($Y, $status) = $x->flush() ;
- ok $status == Z_OK ;
- $X .= $Y ;
- $x = 0 ;
-
- ok $k = inflateInit() ;
-
- my $first = substr($X, 0, 2) ;
- my $last = substr($X, 2) ;
- ($Z, $status) = $k->inflate($first);
- ok $status == Z_OK ;
- ok $first eq "" ;
-
- $last .= "appendage" ;
- my $T;
- ($T, $status) = $k->inflate($last);
- ok $status == Z_STREAM_END ;
- ok $hello eq $Z . $T ;
- ok $last eq "appendage" ;
-
-}
-
-title 'memGzip & memGunzip';
-{
- my $name = "test.gz" ;
- my $buffer = <<EOM;
-some sample
-text
-
-EOM
-
- my $len = length $buffer ;
- my ($x, $uncomp) ;
-
-
- # create an in-memory gzip file
- my $dest = Compress::Zlib::memGzip($buffer) ;
- ok length $dest ;
-
- # write it to disk
- ok open(FH, ">$name") ;
- binmode(FH);
- print FH $dest ;
- close FH ;
-
- # uncompress with gzopen
- ok my $fil = gzopen($name, "rb") ;
-
- is $fil->gzread($uncomp, 0), 0 ;
- ok (($x = $fil->gzread($uncomp)) == $len) ;
-
- ok ! $fil->gzclose ;
-
- ok $uncomp eq $buffer ;
-
- 1 while unlink $name ;
-
- # now check that memGunzip can deal with it.
- my $ungzip = Compress::Zlib::memGunzip($dest) ;
- ok defined $ungzip ;
- ok $buffer eq $ungzip ;
-
- # now do the same but use a reference
-
- $dest = Compress::Zlib::memGzip(\$buffer) ;
- ok length $dest ;
-
- # write it to disk
- ok open(FH, ">$name") ;
- binmode(FH);
- print FH $dest ;
- close FH ;
-
- # uncompress with gzopen
- ok $fil = gzopen($name, "rb") ;
-
- ok (($x = $fil->gzread($uncomp)) == $len) ;
-
- ok ! $fil->gzclose ;
-
- ok $uncomp eq $buffer ;
-
- # now check that memGunzip can deal with it.
- my $keep = $dest;
- $ungzip = Compress::Zlib::memGunzip(\$dest) ;
- ok defined $ungzip ;
- ok $buffer eq $ungzip ;
-
- # check memGunzip can cope with missing gzip trailer
- my $minimal = substr($keep, 0, -1) ;
- $ungzip = Compress::Zlib::memGunzip(\$minimal) ;
- ok defined $ungzip ;
- ok $buffer eq $ungzip ;
-
- $minimal = substr($keep, 0, -2) ;
- $ungzip = Compress::Zlib::memGunzip(\$minimal) ;
- ok defined $ungzip ;
- ok $buffer eq $ungzip ;
-
- $minimal = substr($keep, 0, -3) ;
- $ungzip = Compress::Zlib::memGunzip(\$minimal) ;
- ok defined $ungzip ;
- ok $buffer eq $ungzip ;
-
- $minimal = substr($keep, 0, -4) ;
- $ungzip = Compress::Zlib::memGunzip(\$minimal) ;
- ok defined $ungzip ;
- ok $buffer eq $ungzip ;
-
- $minimal = substr($keep, 0, -5) ;
- $ungzip = Compress::Zlib::memGunzip(\$minimal) ;
- ok defined $ungzip ;
- ok $buffer eq $ungzip ;
-
- $minimal = substr($keep, 0, -6) ;
- $ungzip = Compress::Zlib::memGunzip(\$minimal) ;
- ok defined $ungzip ;
- ok $buffer eq $ungzip ;
-
- $minimal = substr($keep, 0, -7) ;
- $ungzip = Compress::Zlib::memGunzip(\$minimal) ;
- ok defined $ungzip ;
- ok $buffer eq $ungzip ;
-
- $minimal = substr($keep, 0, -8) ;
- $ungzip = Compress::Zlib::memGunzip(\$minimal) ;
- ok defined $ungzip ;
- ok $buffer eq $ungzip ;
-
- $minimal = substr($keep, 0, -9) ;
- $ungzip = Compress::Zlib::memGunzip(\$minimal) ;
- ok ! defined $ungzip ;
-
-
- 1 while unlink $name ;
-
- # check corrupt header -- too short
- $dest = "x" ;
- my $result = Compress::Zlib::memGunzip($dest) ;
- ok !defined $result ;
-
- # check corrupt header -- full of junk
- $dest = "x" x 200 ;
- $result = Compress::Zlib::memGunzip($dest) ;
- ok !defined $result ;
-
- # corrupt header - 1st byte wrong
- my $bad = $keep ;
- substr($bad, 0, 1) = "\xFF" ;
- $ungzip = Compress::Zlib::memGunzip(\$bad) ;
- ok ! defined $ungzip ;
-
- # corrupt header - 2st byte wrong
- $bad = $keep ;
- substr($bad, 1, 1) = "\xFF" ;
- $ungzip = Compress::Zlib::memGunzip(\$bad) ;
- ok ! defined $ungzip ;
-
- # corrupt header - method not deflated
- $bad = $keep ;
- substr($bad, 2, 1) = "\xFF" ;
- $ungzip = Compress::Zlib::memGunzip(\$bad) ;
- ok ! defined $ungzip ;
-
- # corrupt header - reserverd bits used
- $bad = $keep ;
- substr($bad, 3, 1) = "\xFF" ;
- $ungzip = Compress::Zlib::memGunzip(\$bad) ;
- ok ! defined $ungzip ;
-
- # corrupt trailer - length wrong
- $bad = $keep ;
- substr($bad, -8, 4) = "\xFF" x 4 ;
- $ungzip = Compress::Zlib::memGunzip(\$bad) ;
- ok ! defined $ungzip ;
-
- # corrupt trailer - CRC wrong
- $bad = $keep ;
- substr($bad, -4, 4) = "\xFF" x 4 ;
- $ungzip = Compress::Zlib::memGunzip(\$bad) ;
- ok ! defined $ungzip ;
-}
-
-{
- title "Check all bytes can be handled";
-
- my $lex = new LexFile my $name ;
- my $data = join '', map { chr } 0x00 .. 0xFF;
- $data .= "\r\nabd\r\n";
-
- my $fil;
- ok $fil = gzopen($name, "wb") ;
- is $fil->gzwrite($data), length $data ;
- ok ! $fil->gzclose();
-
- my $input;
- ok $fil = gzopen($name, "rb") ;
- is $fil->gzread($input), length $data ;
- ok ! $fil->gzclose();
- ok $input eq $data;
-
- title "Check all bytes can be handled - transparent mode";
- writeFile($name, $data);
- ok $fil = gzopen($name, "rb") ;
- is $fil->gzread($input), length $data ;
- ok ! $fil->gzclose();
- ok $input eq $data;
-
-}
-
-title 'memGunzip with a gzopen created file';
-{
- my $name = "test.gz" ;
- my $buffer = <<EOM;
-some sample
-text
-
-EOM
-
- ok $fil = gzopen($name, "wb") ;
-
- ok $fil->gzwrite($buffer) == length $buffer ;
-
- ok ! $fil->gzclose ;
-
- my $compr = readFile($name);
- ok length $compr ;
- my $unc = Compress::Zlib::memGunzip($compr) ;
- ok defined $unc ;
- ok $buffer eq $unc ;
- 1 while unlink $name ;
-}
-
-{
-
- # Check - MAX_WBITS
- # =================
-
- $hello = "Test test test test test";
- @hello = split('', $hello) ;
-
- ok (($x, $err) = deflateInit( -Bufsize => 1, -WindowBits => -MAX_WBITS() ) ) ;
- ok $x ;
- ok $err == Z_OK ;
-
- $Answer = '';
- foreach (@hello)
- {
- ($X, $status) = $x->deflate($_) ;
- last unless $status == Z_OK ;
-
- $Answer .= $X ;
- }
-
- ok $status == Z_OK ;
-
- ok ((($X, $status) = $x->flush())[1] == Z_OK ) ;
- $Answer .= $X ;
-
-
- @Answer = split('', $Answer) ;
- # Undocumented corner -- extra byte needed to get inflate to return
- # Z_STREAM_END when done.
- push @Answer, " " ;
-
- ok (($k, $err) = inflateInit(-Bufsize => 1, -WindowBits => -MAX_WBITS()) ) ;
- ok $k ;
- ok $err == Z_OK ;
-
- $GOT = '';
- foreach (@Answer)
- {
- ($Z, $status) = $k->inflate($_) ;
- $GOT .= $Z ;
- last if $status == Z_STREAM_END or $status != Z_OK ;
-
- }
-
- ok $status == Z_STREAM_END ;
- ok $GOT eq $hello ;
-
-}
-
-{
- # inflateSync
-
- # create a deflate stream with flush points
-
- my $hello = "I am a HAL 9000 computer" x 2001 ;
- my $goodbye = "Will I dream?" x 2010;
- my ($err, $answer, $X, $status, $Answer);
-
- ok (($x, $err) = deflateInit() ) ;
- ok $x ;
- ok $err == Z_OK ;
-
- ($Answer, $status) = $x->deflate($hello) ;
- ok $status == Z_OK ;
-
- # create a flush point
- ok ((($X, $status) = $x->flush(Z_FULL_FLUSH))[1] == Z_OK ) ;
- $Answer .= $X ;
-
- ($X, $status) = $x->deflate($goodbye) ;
- ok $status == Z_OK ;
- $Answer .= $X ;
-
- ok ((($X, $status) = $x->flush())[1] == Z_OK ) ;
- $Answer .= $X ;
-
- my ($first, @Answer) = split('', $Answer) ;
-
- my $k;
- ok (($k, $err) = inflateInit()) ;
- ok $k ;
- ok $err == Z_OK ;
-
- ($Z, $status) = $k->inflate($first) ;
- ok $status == Z_OK ;
-
- # skip to the first flush point.
- while (@Answer)
- {
- my $byte = shift @Answer;
- $status = $k->inflateSync($byte) ;
- last unless $status == Z_DATA_ERROR;
-
- }
-
- ok $status == Z_OK;
-
- my $GOT = '';
- my $Z = '';
- foreach (@Answer)
- {
- my $Z = '';
- ($Z, $status) = $k->inflate($_) ;
- $GOT .= $Z if defined $Z ;
- # print "x $status\n";
- last if $status == Z_STREAM_END or $status != Z_OK ;
-
- }
-
- # zlib 1.0.9 returns Z_STREAM_END here, all others return Z_DATA_ERROR
- ok $status == Z_DATA_ERROR || $status == Z_STREAM_END ;
- ok $GOT eq $goodbye ;
-
-
- # Check inflateSync leaves good data in buffer
- $Answer =~ /^(.)(.*)$/ ;
- my ($initial, $rest) = ($1, $2);
-
-
- ok (($k, $err) = inflateInit()) ;
- ok $k ;
- ok $err == Z_OK ;
-
- ($Z, $status) = $k->inflate($initial) ;
- ok $status == Z_OK ;
-
- $status = $k->inflateSync($rest) ;
- ok $status == Z_OK;
-
- ($GOT, $status) = $k->inflate($rest) ;
-
- ok $status == Z_DATA_ERROR ;
- ok $Z . $GOT eq $goodbye ;
-}
-
-{
- # deflateParams
-
- my $hello = "I am a HAL 9000 computer" x 2001 ;
- my $goodbye = "Will I dream?" x 2010;
- my ($input, $err, $answer, $X, $status, $Answer);
-
- ok (($x, $err) = deflateInit(-Level => Z_BEST_COMPRESSION,
- -Strategy => Z_DEFAULT_STRATEGY) ) ;
- ok $x ;
- ok $err == Z_OK ;
-
- ok $x->get_Level() == Z_BEST_COMPRESSION;
- ok $x->get_Strategy() == Z_DEFAULT_STRATEGY;
-
- ($Answer, $status) = $x->deflate($hello) ;
- ok $status == Z_OK ;
- $input .= $hello;
-
- # error cases
- eval { $x->deflateParams() };
- #like $@, mkErr("^Compress::Raw::Zlib::deflateParams needs Level and/or Strategy");
- like $@, "/^Compress::Raw::Zlib::deflateParams needs Level and/or Strategy/";
-
- eval { $x->deflateParams(-Joe => 3) };
- like $@, "/^Compress::Raw::Zlib::deflateStream::deflateParams: unknown key value/";
- #like $@, mkErr("^Compress::Raw::Zlib::deflateStream::deflateParams: unknown key value(s) Joe");
- #ok $@ =~ /^Compress::Zlib::deflateStream::deflateParams: unknown key value\(s\) Joe at/
- # or print "# $@\n" ;
-
- ok $x->get_Level() == Z_BEST_COMPRESSION;
- ok $x->get_Strategy() == Z_DEFAULT_STRATEGY;
-
- # change both Level & Strategy
- $status = $x->deflateParams(-Level => Z_BEST_SPEED, -Strategy => Z_HUFFMAN_ONLY) ;
- ok $status == Z_OK ;
-
- ok $x->get_Level() == Z_BEST_SPEED;
- ok $x->get_Strategy() == Z_HUFFMAN_ONLY;
-
- ($X, $status) = $x->deflate($goodbye) ;
- ok $status == Z_OK ;
- $Answer .= $X ;
- $input .= $goodbye;
-
- # change only Level
- $status = $x->deflateParams(-Level => Z_NO_COMPRESSION) ;
- ok $status == Z_OK ;
-
- ok $x->get_Level() == Z_NO_COMPRESSION;
- ok $x->get_Strategy() == Z_HUFFMAN_ONLY;
-
- ($X, $status) = $x->deflate($goodbye) ;
- ok $status == Z_OK ;
- $Answer .= $X ;
- $input .= $goodbye;
-
- # change only Strategy
- $status = $x->deflateParams(-Strategy => Z_FILTERED) ;
- ok $status == Z_OK ;
-
- ok $x->get_Level() == Z_NO_COMPRESSION;
- ok $x->get_Strategy() == Z_FILTERED;
-
- ($X, $status) = $x->deflate($goodbye) ;
- ok $status == Z_OK ;
- $Answer .= $X ;
- $input .= $goodbye;
-
- ok ((($X, $status) = $x->flush())[1] == Z_OK ) ;
- $Answer .= $X ;
-
- my ($first, @Answer) = split('', $Answer) ;
-
- my $k;
- ok (($k, $err) = inflateInit()) ;
- ok $k ;
- ok $err == Z_OK ;
-
- ($Z, $status) = $k->inflate($Answer) ;
-
- ok $status == Z_STREAM_END
- or print "# status $status\n";
- ok $Z eq $input ;
-}
-
-{
- # error cases
-
- eval { deflateInit(-Level) };
- like $@, '/^Compress::Zlib::deflateInit: Expected even number of parameters, got 1/';
-
- eval { inflateInit(-Level) };
- like $@, '/^Compress::Zlib::inflateInit: Expected even number of parameters, got 1/';
-
- eval { deflateInit(-Joe => 1) };
- ok $@ =~ /^Compress::Zlib::deflateInit: unknown key value\(s\) Joe at/;
-
- eval { inflateInit(-Joe => 1) };
- ok $@ =~ /^Compress::Zlib::inflateInit: unknown key value\(s\) Joe at/;
-
- eval { deflateInit(-Bufsize => 0) };
- ok $@ =~ /^.*?: Bufsize must be >= 1, you specified 0 at/;
-
- eval { inflateInit(-Bufsize => 0) };
- ok $@ =~ /^.*?: Bufsize must be >= 1, you specified 0 at/;
-
- eval { deflateInit(-Bufsize => -1) };
- #ok $@ =~ /^.*?: Bufsize must be >= 1, you specified -1 at/;
- ok $@ =~ /^Compress::Zlib::deflateInit: Parameter 'Bufsize' must be an unsigned int, got '-1'/;
-
- eval { inflateInit(-Bufsize => -1) };
- ok $@ =~ /^Compress::Zlib::inflateInit: Parameter 'Bufsize' must be an unsigned int, got '-1'/;
-
- eval { deflateInit(-Bufsize => "xxx") };
- ok $@ =~ /^Compress::Zlib::deflateInit: Parameter 'Bufsize' must be an unsigned int, got 'xxx'/;
-
- eval { inflateInit(-Bufsize => "xxx") };
- ok $@ =~ /^Compress::Zlib::inflateInit: Parameter 'Bufsize' must be an unsigned int, got 'xxx'/;
-
- eval { gzopen([], 0) ; } ;
- ok $@ =~ /^gzopen: file parameter is not a filehandle or filename at/
- or print "# $@\n" ;
-
-# my $x = Symbol::gensym() ;
-# eval { gzopen($x, 0) ; } ;
-# ok $@ =~ /^gzopen: file parameter is not a filehandle or filename at/
-# or print "# $@\n" ;
-
-}
-
-if ($] >= 5.005)
-{
- # test inflate with a substr
-
- ok my $x = deflateInit() ;
-
- ok ((my ($X, $status) = $x->deflate($contents))[1] == Z_OK) ;
-
- my $Y = $X ;
-
-
-
- ok ((($X, $status) = $x->flush() )[1] == Z_OK ) ;
- $Y .= $X ;
-
- my $append = "Appended" ;
- $Y .= $append ;
-
- ok $k = inflateInit() ;
-
- #($Z, $status) = $k->inflate(substr($Y, 0, -1)) ;
- ($Z, $status) = $k->inflate(substr($Y, 0)) ;
-
- ok $status == Z_STREAM_END ;
- ok $contents eq $Z ;
- is $Y, $append;
-
-}
-
-if ($] >= 5.005)
-{
- # deflate/inflate in scalar context
-
- ok my $x = deflateInit() ;
-
- my $X = $x->deflate($contents);
-
- my $Y = $X ;
-
-
-
- $X = $x->flush();
- $Y .= $X ;
-
- my $append = "Appended" ;
- $Y .= $append ;
-
- ok $k = inflateInit() ;
-
- $Z = $k->inflate(substr($Y, 0, -1)) ;
- #$Z = $k->inflate(substr($Y, 0)) ;
-
- ok $contents eq $Z ;
- is $Y, $append;
-
-}
-
-{
- title 'CRC32' ;
-
- # CRC32 of this data should have the high bit set
- # value in ascii is ZgRNtjgSUW
- my $data = "\x5a\x67\x52\x4e\x74\x6a\x67\x53\x55\x57";
- my $expected_crc = 0xCF707A2B ; # 3480255019
-
- my $crc = crc32($data) ;
- is $crc, $expected_crc;
-}
-
-{
- title 'Adler32' ;
-
- # adler of this data should have the high bit set
- # value in ascii is lpscOVsAJiUfNComkOfWYBcPhHZ[bT
- my $data = "\x6c\x70\x73\x63\x4f\x56\x73\x41\x4a\x69\x55\x66" .
- "\x4e\x43\x6f\x6d\x6b\x4f\x66\x57\x59\x42\x63\x50" .
- "\x68\x48\x5a\x5b\x62\x54";
- my $expected_crc = 0xAAD60AC7 ; # 2866154183
- my $crc = adler32($data) ;
- is $crc, $expected_crc;
-}
-
-{
- # memGunzip - input > 4K
-
- my $contents = '' ;
- foreach (1 .. 20000)
- { $contents .= chr int rand 256 }
-
- ok my $compressed = Compress::Zlib::memGzip(\$contents) ;
-
- ok length $compressed > 4096 ;
- ok my $out = Compress::Zlib::memGunzip(\$compressed) ;
-
- ok $contents eq $out ;
- is length $out, length $contents ;
-
-
-}
-
-
-{
- # memGunzip Header Corruption Tests
-
- my $string = <<EOM;
-some text
-EOM
-
- my $good ;
- ok my $x = new IO::Compress::Gzip \$good, Append => 1, -HeaderCRC => 1 ;
- ok $x->write($string) ;
- ok $x->close ;
-
- {
- title "Header Corruption - Fingerprint wrong 1st byte" ;
- my $buffer = $good ;
- substr($buffer, 0, 1) = 'x' ;
-
- ok ! Compress::Zlib::memGunzip(\$buffer) ;
- }
-
- {
- title "Header Corruption - Fingerprint wrong 2nd byte" ;
- my $buffer = $good ;
- substr($buffer, 1, 1) = "\xFF" ;
-
- ok ! Compress::Zlib::memGunzip(\$buffer) ;
- }
-
- {
- title "Header Corruption - CM not 8";
- my $buffer = $good ;
- substr($buffer, 2, 1) = 'x' ;
-
- ok ! Compress::Zlib::memGunzip(\$buffer) ;
- }
-
- {
- title "Header Corruption - Use of Reserved Flags";
- my $buffer = $good ;
- substr($buffer, 3, 1) = "\xff";
-
- ok ! Compress::Zlib::memGunzip(\$buffer) ;
- }
-
-}
-
-for my $index ( GZIP_MIN_HEADER_SIZE + 1 .. GZIP_MIN_HEADER_SIZE + GZIP_FEXTRA_HEADER_SIZE + 1)
-{
- title "Header Corruption - Truncated in Extra";
- my $string = <<EOM;
-some text
-EOM
-
- my $truncated ;
- ok my $x = new IO::Compress::Gzip \$truncated, Append => 1, -HeaderCRC => 1, Strict => 0,
- -ExtraField => "hello" x 10 ;
- ok $x->write($string) ;
- ok $x->close ;
-
- substr($truncated, $index) = '' ;
-
- ok ! Compress::Zlib::memGunzip(\$truncated) ;
-
-
-}
-
-my $Name = "fred" ;
-for my $index ( GZIP_MIN_HEADER_SIZE .. GZIP_MIN_HEADER_SIZE + length($Name) -1)
-{
- title "Header Corruption - Truncated in Name";
- my $string = <<EOM;
-some text
-EOM
-
- my $truncated ;
- ok my $x = new IO::Compress::Gzip \$truncated, Append => 1, -Name => $Name;
- ok $x->write($string) ;
- ok $x->close ;
-
- substr($truncated, $index) = '' ;
-
- ok ! Compress::Zlib::memGunzip(\$truncated) ;
-}
-
-my $Comment = "comment" ;
-for my $index ( GZIP_MIN_HEADER_SIZE .. GZIP_MIN_HEADER_SIZE + length($Comment) -1)
-{
- title "Header Corruption - Truncated in Comment";
- my $string = <<EOM;
-some text
-EOM
-
- my $truncated ;
- ok my $x = new IO::Compress::Gzip \$truncated, -Comment => $Comment;
- ok $x->write($string) ;
- ok $x->close ;
-
- substr($truncated, $index) = '' ;
- ok ! Compress::Zlib::memGunzip(\$truncated) ;
-}
-
-for my $index ( GZIP_MIN_HEADER_SIZE .. GZIP_MIN_HEADER_SIZE + GZIP_FHCRC_SIZE -1)
-{
- title "Header Corruption - Truncated in CRC";
- my $string = <<EOM;
-some text
-EOM
-
- my $truncated ;
- ok my $x = new IO::Compress::Gzip \$truncated, -HeaderCRC => 1;
- ok $x->write($string) ;
- ok $x->close ;
-
- substr($truncated, $index) = '' ;
-
- ok ! Compress::Zlib::memGunzip(\$truncated) ;
-}
-
-{
- title "memGunzip can cope with a gzip header with all possible fields";
- my $string = <<EOM;
-some text
-EOM
-
- my $buffer ;
- ok my $x = new IO::Compress::Gzip \$buffer,
- -Append => 1,
- -Strict => 0,
- -HeaderCRC => 1,
- -Name => "Fred",
- -ExtraField => "Extra",
- -Comment => 'Comment';
- ok $x->write($string) ;
- ok $x->close ;
-
- ok defined $buffer ;
-
- ok my $got = Compress::Zlib::memGunzip($buffer)
- or diag "gzerrno is $gzerrno" ;
- is $got, $string ;
-}
-
-
-{
- # Trailer Corruption tests
-
- my $string = <<EOM;
-some text
-EOM
-
- my $good ;
- ok my $x = new IO::Compress::Gzip \$good, Append => 1 ;
- ok $x->write($string) ;
- ok $x->close ;
-
- foreach my $trim (-8 .. -1)
- {
- my $got = $trim + 8 ;
- title "Trailer Corruption - Trailer truncated to $got bytes" ;
- my $buffer = $good ;
-
- substr($buffer, $trim) = '';
-
- ok my $u = Compress::Zlib::memGunzip(\$buffer) ;
- ok $u eq $string;
-
- }
-
- {
- title "Trailer Corruption - Length Wrong, CRC Correct" ;
- my $buffer = $good ;
- substr($buffer, -4, 4) = pack('V', 1234);
-
- ok ! Compress::Zlib::memGunzip(\$buffer) ;
- }
-
- {
- title "Trailer Corruption - Length Wrong, CRC Wrong" ;
- my $buffer = $good ;
- substr($buffer, -4, 4) = pack('V', 1234);
- substr($buffer, -8, 4) = pack('V', 1234);
-
- ok ! Compress::Zlib::memGunzip(\$buffer) ;
-
- }
-}
-
-
-sub slurp
-{
- my $name = shift ;
-
- my $input;
- my $fil = gzopen($name, "rb") ;
- ok $fil , "opened $name";
- cmp_ok $fil->gzread($input, 50000), ">", 0, "read more than zero bytes";
- ok ! $fil->gzclose(), "closed ok";
-
- return $input;
-}
-
-sub trickle
-{
- my $name = shift ;
-
- my $got;
- my $input;
- $fil = gzopen($name, "rb") ;
- ok $fil, "opened ok";
- while ($fil->gzread($input, 50000) > 0)
- {
- $got .= $input;
- $input = '';
- }
- ok ! $fil->gzclose(), "closed ok";
-
- return $got;
-
- return $input;
-}
-
-{
-
- title "Append & MultiStream Tests";
- # rt.24041
-
- my $lex = new LexFile my $name ;
- my $data1 = "the is the first";
- my $data2 = "and this is the second";
- my $trailing = "some trailing data";
-
- my $fil;
-
- title "One file";
- $fil = gzopen($name, "wb") ;
- ok $fil, "opened first file";
- is $fil->gzwrite($data1), length $data1, "write data1" ;
- ok ! $fil->gzclose(), "Closed";
-
- is slurp($name), $data1, "got expected data from slurp";
- is trickle($name), $data1, "got expected data from trickle";
-
- title "Two files";
- $fil = gzopen($name, "ab") ;
- ok $fil, "opened second file";
- is $fil->gzwrite($data2), length $data2, "write data2" ;
- ok ! $fil->gzclose(), "Closed";
-
- is slurp($name), $data1 . $data2, "got expected data from slurp";
- is trickle($name), $data1 . $data2, "got expected data from trickle";
-
- title "Trailing Data";
- open F, ">>$name";
- print F $trailing;
- close F;
-
- is slurp($name), $data1 . $data2 . $trailing, "got expected data from slurp" ;
- is trickle($name), $data1 . $data2 . $trailing, "got expected data from trickle" ;
-}
-
-{
- title "gzclose & gzflush return codes";
- # rt.29215
-
- my $lex = new LexFile my $name ;
- my $data1 = "the is some text";
- my $status;
-
- $fil = gzopen($name, "wb") ;
- ok $fil, "opened first file";
- is $fil->gzwrite($data1), length $data1, "write data1" ;
- $status = $fil->gzflush(0xfff);
- ok $status, "flush not ok" ;
- is $status, Z_STREAM_ERROR;
- ok ! $fil->gzflush(), "flush ok" ;
- ok ! $fil->gzclose(), "Closed";
-}
diff --git a/ext/DB_File/Changes b/ext/DB_File/Changes
index ec6b819f3d..781a8b728f 100644
--- a/ext/DB_File/Changes
+++ b/ext/DB_File/Changes
@@ -1,5 +1,9 @@
+1.820 28 March 2009
+
+ * remove MAN3PODS from Makefile.PL to match core.
+
1.819 18 February 2009
* t/db-recno.t fails if run in a path that contains spaces
diff --git a/ext/DB_File/DB_File.pm b/ext/DB_File/DB_File.pm
index 536f1a4218..86d0b19888 100644
--- a/ext/DB_File/DB_File.pm
+++ b/ext/DB_File/DB_File.pm
@@ -165,7 +165,7 @@ our ($db_version, $use_XSLoader, $splice_end_array, $Error);
use Carp;
-$VERSION = "1.819" ;
+$VERSION = "1.820" ;
$VERSION = eval $VERSION; # needed for dev releases
{
diff --git a/ext/DB_File/Makefile.PL b/ext/DB_File/Makefile.PL
index 540eca4500..a586a0445c 100644
--- a/ext/DB_File/Makefile.PL
+++ b/ext/DB_File/Makefile.PL
@@ -44,7 +44,6 @@ my $WALL = '' ;
WriteMakefile(
NAME => 'DB_File',
LIBS => ["-L${LIB_DIR} $LIBS"],
- #MAN3PODS => {}, # Pods will be built by installman.
INC => "-I$INC_DIR",
VERSION_FROM => 'DB_File.pm',
XS_VERSION => eval MM->parse_version('DB_File.pm'),
diff --git a/ext/Data-Dumper/Dumper.pm b/ext/Data-Dumper/Dumper.pm
index b716ff2de3..19b3c025f5 100644
--- a/ext/Data-Dumper/Dumper.pm
+++ b/ext/Data-Dumper/Dumper.pm
@@ -9,7 +9,7 @@
package Data::Dumper;
-$VERSION = '2.121_18';
+$VERSION = '2.121_19';
#$| = 1;
@@ -231,11 +231,6 @@ sub Dumpperl {
$name = "\$" . $s->{varname} . $i;
}
- # Ensure hash iterator is reset
- if (ref($val) eq 'HASH') {
- keys(%$val);
- }
-
my $valstr;
{
local($s->{apad}) = $s->{apad};
@@ -429,6 +424,10 @@ sub _dump {
$keys = [ sort keys %$val ];
}
}
+
+ # Ensure hash iterator is reset
+ keys(%$val);
+
while (($k, $v) = ! $sortkeys ? (each %$val) :
@$keys ? ($key = shift(@$keys), $val->{$key}) :
() )
diff --git a/ext/Data-Dumper/Makefile.PL b/ext/Data-Dumper/Makefile.PL
deleted file mode 100644
index 1548c75dda..0000000000
--- a/ext/Data-Dumper/Makefile.PL
+++ /dev/null
@@ -1,16 +0,0 @@
-use ExtUtils::MakeMaker;
-WriteMakefile(
- NAME => "Data::Dumper",
- VERSION_FROM => 'Dumper.pm',
- 'dist' => {
- COMPRESS => 'gzip -9f',
- SUFFIX => 'gz',
- DIST_DEFAULT => 'all tardist',
- },
- MAN3PODS => {},
- (
- (grep { $_ eq 'PERL_CORE=1' } @ARGV)
- ? ()
- : ('DEFINE' => '-DUSE_PPPORT_H')
- ),
-);
diff --git a/ext/Data-Dumper/t/bugs.t b/ext/Data-Dumper/t/bugs.t
index ad58d6a6f8..453b252bab 100644
--- a/ext/Data-Dumper/t/bugs.t
+++ b/ext/Data-Dumper/t/bugs.t
@@ -16,7 +16,7 @@ BEGIN {
}
use strict;
-use Test::More tests => 4;
+use Test::More tests => 5;
use Data::Dumper;
{
@@ -57,7 +57,22 @@ ok(1, "[perl #38612]"); # Still no core dump? We are fine.
my $txt = $d->Dump();
my $VAR1;
eval $txt;
- is_deeply($VAR1, \%h, '[perl #40668] Reset hash iterator');
+ is_deeply($VAR1, \%h, '[perl #40668] Reset hash iterator');
+}
+
+# [perl #64744] Data::Dumper each() bad interaction
+{
+ local $Data::Dumper::Useqq = 1;
+ my $a = {foo => 1, bar => 1};
+ each %$a;
+ $a = {x => $a};
+
+ my $d = Data::Dumper->new([$a]);
+ $d->Useqq(1);
+ my $txt = $d->Dump();
+ my $VAR1;
+ eval $txt;
+ is_deeply($VAR1, $a, '[perl #64744] Reset hash iterator');
}
# [perl #56766] Segfaults on bad syntax - fixed with version 2.121_17
diff --git a/ext/Devel-DProf/Makefile.PL b/ext/Devel-DProf/Makefile.PL
index 5d975eabef..5bb00128d0 100644
--- a/ext/Devel-DProf/Makefile.PL
+++ b/ext/Devel-DProf/Makefile.PL
@@ -15,5 +15,4 @@ WriteMakefile(
SUFFIX => 'gz',
DIST_DEFAULT => 'all tardist',
},
- MAN3PODS => {},
);
diff --git a/ext/Devel-PPPort/Changes b/ext/Devel-PPPort/Changes
index 86d85d1120..c98306d8d3 100644
--- a/ext/Devel-PPPort/Changes
+++ b/ext/Devel-PPPort/Changes
@@ -1,3 +1,12 @@
+3.17 - 2009-03-15
+
+ * rework PTR macros, fixing PTR2ul for 5.6.1
+ (fixes CPAN #39802, thanks to CHOCOLATE for
+ reporting and providing a patch)
+ * added support for the following API
+ PTR2nat
+ (second part of fix for CPAN #39802)
+
3.16 - 2009-01-23
* fix DEFSV_set() for threaded 5.005 perls
diff --git a/ext/Devel-PPPort/PPPort_pm.PL b/ext/Devel-PPPort/PPPort_pm.PL
index fb818eaa91..6fca8cf26d 100644
--- a/ext/Devel-PPPort/PPPort_pm.PL
+++ b/ext/Devel-PPPort/PPPort_pm.PL
@@ -535,7 +535,7 @@ package Devel::PPPort;
use strict;
use vars qw($VERSION $data);
-$VERSION = do { my @r = '$Snapshot: /Devel-PPPort/3.16 $' =~ /(\d+\.\d+(?:_\d+)?)/; @r ? $r[0] : '9.99' };
+$VERSION = do { my @r = '$Snapshot: /Devel-PPPort/3.17 $' =~ /(\d+\.\d+(?:_\d+)?)/; @r ? $r[0] : '9.99' };
sub _init_data
{
diff --git a/ext/Devel-PPPort/parts/apidoc.fnc b/ext/Devel-PPPort/parts/apidoc.fnc
index 63b97468b8..616a9b4e7e 100644
--- a/ext/Devel-PPPort/parts/apidoc.fnc
+++ b/ext/Devel-PPPort/parts/apidoc.fnc
@@ -1,6 +1,6 @@
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:
-: !!!!! Do NOT edit this file directly! -- Edit PPPort_pm.PL instead. !!!!!
+: !!!! Do NOT edit this file directly! -- Edit devel/mkapidoc.sh instead. !!!!
:
: This file was automatically generated from the API documentation scattered
: all over the Perl source code. To learn more about how all this works,
@@ -300,9 +300,9 @@ m|HV *|PAD_COMPNAME_TYPE|PADOFFSET po
mn|bool|PL_dowarn
mn|GV *|PL_DBsub
mn|GV*|PL_last_in_gv
+mn|GV*|PL_ofsgv
mn|SV *|PL_DBsingle
mn|SV *|PL_DBtrace
-mn|SV*|PL_ofs_sv
mn|SV*|PL_rs
ms||djSP
m|STRLEN|PAD_COMPNAME_GEN|PADOFFSET po
diff --git a/ext/Devel-PPPort/parts/base/5004000 b/ext/Devel-PPPort/parts/base/5004000
index a196371bfe..5350285413 100644
--- a/ext/Devel-PPPort/parts/base/5004000
+++ b/ext/Devel-PPPort/parts/base/5004000
@@ -84,5 +84,6 @@ PERL_USHORT_MAX # added by devel/scanprov
PERL_USHORT_MIN # added by devel/scanprov
SvUVXx # added by devel/scanprov
boolSV # added by devel/scanprov
+isPRINT # added by devel/scanprov
memEQ # added by devel/scanprov
memNE # added by devel/scanprov
diff --git a/ext/Devel-PPPort/parts/base/5004050 b/ext/Devel-PPPort/parts/base/5004050
index 992642b633..f0e0456422 100644
--- a/ext/Devel-PPPort/parts/base/5004050
+++ b/ext/Devel-PPPort/parts/base/5004050
@@ -8,7 +8,7 @@ do_binmode # E
newCONSTSUB # E
newSVpvn # E
save_aelem # E
-save_helem # E
+save_helem # U
sv_catpv_mg # E
sv_catpvn_mg # U
sv_catsv_mg # U
diff --git a/ext/Devel-PPPort/parts/base/5005000 b/ext/Devel-PPPort/parts/base/5005000
index 3c96370a4c..1f2bf06332 100644
--- a/ext/Devel-PPPort/parts/base/5005000
+++ b/ext/Devel-PPPort/parts/base/5005000
@@ -24,6 +24,7 @@ sv_peek # U
sv_pvn # E
sv_true # E
sv_uv # E
+CPERLscope # added by devel/scanprov
END_EXTERN_C # added by devel/scanprov
EXTERN_C # added by devel/scanprov
NOOP # added by devel/scanprov
diff --git a/ext/Devel-PPPort/parts/base/5006000 b/ext/Devel-PPPort/parts/base/5006000
index b2a93bf246..47d788e240 100644
--- a/ext/Devel-PPPort/parts/base/5006000
+++ b/ext/Devel-PPPort/parts/base/5006000
@@ -284,5 +284,11 @@ dTHX # added by devel/scanprov
dTHXa # added by devel/scanprov
dTHXoa # added by devel/scanprov
dXSTARG # added by devel/scanprov
+isALNUMC # added by devel/scanprov
+isASCII # added by devel/scanprov
+isCNTRL # added by devel/scanprov
+isGRAPH # added by devel/scanprov
+isPUNCT # added by devel/scanprov
+isXDIGIT # added by devel/scanprov
pTHX # added by devel/scanprov
pTHX_ # added by devel/scanprov
diff --git a/ext/Devel-PPPort/parts/base/5006001 b/ext/Devel-PPPort/parts/base/5006001
index a6369d517e..ed53af5cc3 100644
--- a/ext/Devel-PPPort/parts/base/5006001
+++ b/ext/Devel-PPPort/parts/base/5006001
@@ -9,6 +9,9 @@ save_generic_pvref # U
utf16_to_utf8 # E (Perl_utf16_to_utf8)
utf16_to_utf8_reversed # E (Perl_utf16_to_utf8_reversed)
utf8_to_bytes # U
+G_METHOD # added by devel/scanprov
NVef # added by devel/scanprov
NVff # added by devel/scanprov
NVgf # added by devel/scanprov
+isBLANK # added by devel/scanprov
+isPSXSPC # added by devel/scanprov
diff --git a/ext/Devel-PPPort/parts/base/5007002 b/ext/Devel-PPPort/parts/base/5007002
index 9d31a24f09..148eef9252 100644
--- a/ext/Devel-PPPort/parts/base/5007002
+++ b/ext/Devel-PPPort/parts/base/5007002
@@ -24,6 +24,7 @@ sv_pvn_force_flags # U
sv_setsv_flags # U
sv_setsv_nomg # U
sv_utf8_upgrade_flags # U
+sv_utf8_upgrade_nomg # U
swash_fetch # E (Perl_swash_fetch)
GROK_NUMERIC_RADIX # added by devel/scanprov
IN_LOCALE # added by devel/scanprov
diff --git a/ext/Devel-PPPort/parts/base/5009003 b/ext/Devel-PPPort/parts/base/5009003
index bbf2a61bf6..61ddf3757e 100644
--- a/ext/Devel-PPPort/parts/base/5009003
+++ b/ext/Devel-PPPort/parts/base/5009003
@@ -39,6 +39,7 @@ vverify # U
PERLIO_FUNCS_CAST # added by devel/scanprov
PERLIO_FUNCS_DECL # added by devel/scanprov
PERL_UNUSED_ARG # added by devel/scanprov
+PTR2nat # added by devel/scanprov
STR_WITH_LEN # added by devel/scanprov
SV_CONST_RETURN # added by devel/scanprov
SV_MUTABLE_RETURN # added by devel/scanprov
@@ -58,5 +59,6 @@ SvPV_mutable # added by devel/scanprov
SvPV_nolen_const # added by devel/scanprov
SvPV_nomg_const # added by devel/scanprov
SvPV_nomg_const_nolen # added by devel/scanprov
+SvPV_renew # added by devel/scanprov
SvSHARED_HASH # added by devel/scanprov
dVAR # added by devel/scanprov
diff --git a/ext/Devel-PPPort/parts/base/5009004 b/ext/Devel-PPPort/parts/base/5009004
index 65dbc853f5..eadb7e2f8f 100644
--- a/ext/Devel-PPPort/parts/base/5009004
+++ b/ext/Devel-PPPort/parts/base/5009004
@@ -23,6 +23,17 @@ regclass_swash # E (Perl_regclass_swash)
sv_does # U
sv_setpvs # U
sv_usepvn_flags # U
+PERL_PV_ESCAPE_ALL # added by devel/scanprov
+PERL_PV_ESCAPE_FIRSTCHAR # added by devel/scanprov
+PERL_PV_ESCAPE_NOBACKSLASH # added by devel/scanprov
+PERL_PV_ESCAPE_NOCLEAR # added by devel/scanprov
+PERL_PV_ESCAPE_QUOTE # added by devel/scanprov
+PERL_PV_ESCAPE_UNI # added by devel/scanprov
+PERL_PV_ESCAPE_UNI_DETECT # added by devel/scanprov
+PERL_PV_PRETTY_DUMP # added by devel/scanprov
+PERL_PV_PRETTY_LTGT # added by devel/scanprov
+PERL_PV_PRETTY_QUOTE # added by devel/scanprov
+PERL_PV_PRETTY_REGPROP # added by devel/scanprov
PERL_UNUSED_CONTEXT # added by devel/scanprov
PERL_USE_GCC_BRACE_GROUPS # added by devel/scanprov
SV_HAS_TRAILING_NUL # added by devel/scanprov
diff --git a/ext/Devel-PPPort/parts/base/5009005 b/ext/Devel-PPPort/parts/base/5009005
index eb5da81ff4..738c630aca 100644
--- a/ext/Devel-PPPort/parts/base/5009005
+++ b/ext/Devel-PPPort/parts/base/5009005
@@ -29,4 +29,6 @@ regfree_internal # U
savesharedpvn # U
scan_vstring # E (Perl_scan_vstring)
upg_version # E (Perl_upg_version)
+PERL_PV_ESCAPE_RE # added by devel/scanprov
+PL_parser # added by devel/scanprov
SV_COW_SHARED_HASH_KEYS # added by devel/scanprov
diff --git a/ext/Devel-PPPort/parts/base/5010000 b/ext/Devel-PPPort/parts/base/5010000
index 737f374ef0..be08fd80fa 100644
--- a/ext/Devel-PPPort/parts/base/5010000
+++ b/ext/Devel-PPPort/parts/base/5010000
@@ -5,3 +5,5 @@ sv_destroyable # U
sys_init # U
sys_init3 # U
sys_term # U
+PERL_PV_PRETTY_ELLIPSES # added by devel/scanprov
+PERL_PV_PRETTY_NOCLEAR # added by devel/scanprov
diff --git a/ext/Devel-PPPort/parts/base/5011000 b/ext/Devel-PPPort/parts/base/5011000
index c9ba122660..ba064c586e 100644
--- a/ext/Devel-PPPort/parts/base/5011000
+++ b/ext/Devel-PPPort/parts/base/5011000
@@ -11,21 +11,37 @@ gv_fetchmethod_flags # U
hv_assert # U
mPUSHs # U
mXPUSHs # U
+mro_get_from_name # U
+mro_get_private_data # U
+mro_register # U
+mro_set_mro # U
+mro_set_private_data # U
newSVpvn_flags # U
newSVpvn_utf8 # U
newSVpvs_flags # U
pad_sv # U
pregfree2 # U
ref # U (Perl_ref)
+save_adelete # U
+save_helem_flags # U
save_padsv_and_mortalize # U
+save_pushptr # U
stashpv_hvname_match # U
sv_insert_flags # U
sv_magic_portable # U
+sv_utf8_upgrade_flags_grow # U
+DEFSV_set # added by devel/scanprov
PERL_BCDVERSION # added by devel/scanprov
PERL_MAGIC_glob # added by devel/scanprov
PERL_MAGIC_mutex # added by devel/scanprov
+PL_bufend # added by devel/scanprov
+PL_bufptr # added by devel/scanprov
PL_copline # added by devel/scanprov
PL_expect # added by devel/scanprov
+PL_lex_state # added by devel/scanprov
+PL_lex_stuff # added by devel/scanprov
+PL_linestr # added by devel/scanprov
+PL_tokenbuf # added by devel/scanprov
WARN_ASSERTIONS # added by devel/scanprov
aTHXR # added by devel/scanprov
aTHXR_ # added by devel/scanprov
diff --git a/ext/Devel-PPPort/parts/embed.fnc b/ext/Devel-PPPort/parts/embed.fnc
index f08dfef1a5..cae666c62c 100644
--- a/ext/Devel-PPPort/parts/embed.fnc
+++ b/ext/Devel-PPPort/parts/embed.fnc
@@ -101,22 +101,25 @@ START_EXTERN_C
Ap |SV* |amagic_call |NN SV* left|NN SV* right|int method|int dir
Ap |bool |Gv_AMupdate |NN HV* stash
ApR |CV* |gv_handler |NULLOK HV* stash|I32 id
+: Used in perly.y
p |OP* |append_elem |I32 optype|NULLOK OP* first|NULLOK OP* last
+: Used in perly.y
p |OP* |append_list |I32 optype|NULLOK LISTOP* first|NULLOK LISTOP* last
+: FIXME - this is only called by pp_chown. They should be merged.
p |I32 |apply |I32 type|NN SV** mark|NN SV** sp
ApM |void |apply_attrs_string|NN const char *stashpv|NN CV *cv|NN const char *attrstr|STRLEN len
Apd |void |av_clear |NN AV *av
Apd |SV* |av_delete |NN AV *av|I32 key|I32 flags
ApdR |bool |av_exists |NN AV *av|I32 key
Apd |void |av_extend |NN AV *av|I32 key
-pR |AV* |av_fake |I32 size|NN SV **strp
ApdR |SV** |av_fetch |NN AV *av|I32 key|I32 lval
Apd |void |av_fill |NN AV *av|I32 fill
-ApdR |I32 |av_len |NN const AV *av
+ApdR |I32 |av_len |NN AV *av
ApdR |AV* |av_make |I32 size|NN SV **strp
Apd |SV* |av_pop |NN AV *av
ApdoxM |void |av_create_and_push|NN AV **const avp|NN SV *const val
Apd |void |av_push |NN AV *av|NN SV *val
+: Used in scope.c, and by Data::Alias
EXp |void |av_reify |NN AV *av
ApdR |SV* |av_shift |NN AV *av
Apd |SV** |av_store |NN AV *av|I32 key|NULLOK SV *val
@@ -128,13 +131,19 @@ Apo |IV* |av_iter_p |NN AV *av
#if defined(PERL_IN_AV_C) || defined(PERL_DECL_PROT)
s |MAGIC* |get_aux_mg |NN AV *av
#endif
+: Used in perly.y
pR |OP* |bind_match |I32 type|NN OP *left|NN OP *right
+: Used in perly.y
pR |OP* |block_end |I32 floor|NULLOK OP* seq
ApR |I32 |block_gimme
+: Used in perly.y
pR |int |block_start |int full
+: Used in perl.c
p |void |boot_core_UNIVERSAL
+: Used in perl.c
p |void |boot_core_PerlIO
Ap |void |call_list |I32 oldscope|NN AV *paramList
+: Used in serveral source files
pR |bool |cando |Mode_t mode|bool effective|NN const Stat_t* statbufp
ApR |U32 |cast_ulong |NV f
ApR |I32 |cast_i32 |NV f
@@ -143,7 +152,9 @@ ApR |UV |cast_uv |NV f
#if !defined(HAS_TRUNCATE) && !defined(HAS_CHSIZE) && defined(F_FREESP)
ApR |I32 |my_chsize |int fd|Off_t length
#endif
+: Used in perly.y
pR |OP* |convert |I32 optype|I32 flags|NULLOK OP* o
+: Used in op.c and perl.c
pM |PERL_CONTEXT* |create_eval_scope|U32 flags
: croak()'s first parm can be NULL. Otherwise, mod_perl breaks.
Afprd |void |croak |NULLOK const char* pat|...
@@ -168,13 +179,14 @@ Afnp |void |sv_setpvf_mg_nocontext|NN SV *const sv|NN const char *const pat|...
Afnp |int |fprintf_nocontext|NN PerlIO *stream|NN const char *format|...
Afnp |int |printf_nocontext|NN const char *format|...
#endif
-bp |void |cv_ckproto |NN const CV* cv|NULLOK const GV* gv\
- |NULLOK const char* p
+: Used in sv.c
p |void |cv_ckproto_len |NN const CV* cv|NULLOK const GV* gv\
|NULLOK const char* p|const STRLEN len
+: Used in pp.c and pp_sys.c
pd |CV* |cv_clone |NN CV* proto
ApdR |SV* |gv_const_sv |NN GV* gv
-ApdR |SV* |cv_const_sv |NULLOK CV* cv
+ApdR |SV* |cv_const_sv |NULLOK const CV *const cv
+: Used in pad.c
pR |SV* |op_const_sv |NULLOK const OP* o|NULLOK CV* cv
Apd |void |cv_undef |NN CV* cv
Ap |void |cx_dump |NN PERL_CONTEXT* cx
@@ -183,9 +195,12 @@ Ap |void |filter_del |NN filter_t funcp
ApR |I32 |filter_read |int idx|NN SV *buf_sv|int maxlen
ApPR |char** |get_op_descs
ApPR |char** |get_op_names
+: FIXME discussion on p5p
pPR |const char* |get_no_modify
+: FIXME discussion on p5p
pPR |U32* |get_opargs
ApPR |PPADDR_t*|get_ppaddr
+: Used by CXINC, which appears to be in widespread use
EXpR |I32 |cxinc
Afp |void |deb |NN const char* pat|...
Ap |void |vdeb |NN const char* pat|NULLOK va_list* args
@@ -195,18 +210,28 @@ Ap |I32 |debstack
Ap |I32 |debstackptrs
Ap |char* |delimcpy |NN char* to|NN const char* toend|NN const char* from \
|NN const char* fromend|int delim|NN I32* retlen
+: Used in op.c, perl.c
pM |void |delete_eval_scope
+: Used in various files
p |void |deprecate |NN const char *const s
+: Used in various files
p |void |deprecate_old |NN const char *const s
Afp |OP* |die |NULLOK const char* pat|...
-p |OP* |vdie |NULLOK const char* pat|NULLOK va_list* args
+#if defined(PERL_IN_UTIL_C) || defined(PERL_DECL_PROT)
+s |OP* |vdie |NULLOK const char* pat|NULLOK va_list* args
+#endif
+: Used in util.c
p |OP* |die_where |NULLOK const char* message|STRLEN msglen
Ap |void |dounwind |I32 cxix
+: FIXME
pmb |bool |do_aexec |NULLOK SV* really|NN SV** mark|NN SV** sp
+: Used in pp_sys.c
p |bool |do_aexec5 |NULLOK SV* really|NN SV** mark|NN SV** sp|int fd|int do_report
Ap |int |do_binmode |NN PerlIO *fp|int iotype|int mode
+: Used in pp.c
p |void |do_chop |NN SV *astr|NN SV *sv
Ap |bool |do_close |NULLOK GV* gv|bool not_implicit
+: Defined in doio.c, used only in pp_sys.c
p |bool |do_eof |NN GV* gv
#ifdef PERL_DEFAULT_DO_EXEC3_IMPLEMENTATION
@@ -224,18 +249,25 @@ Ap |int |do_spawn_nowait|NN char* cmd
p |bool |do_exec3 |NN const char *incmd|int fd|int do_report
#endif
p |void |do_execfree
-#ifdef PERL_IN_DOIO_C
+#if defined(PERL_IN_DOIO_C) || defined(PERL_DECL_PROT)
s |void |exec_failed |NN const char *cmd|int fd|int do_report
#endif
#if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
+: Defined in doio.c, used only in pp_sys.c
p |I32 |do_ipcctl |I32 optype|NN SV** mark|NN SV** sp
+: Defined in doio.c, used only in pp_sys.c
p |I32 |do_ipcget |I32 optype|NN SV** mark|NN SV** sp
+: Defined in doio.c, used only in pp_sys.c
p |I32 |do_msgrcv |NN SV** mark|NN SV** sp
+: Defined in doio.c, used only in pp_sys.c
p |I32 |do_msgsnd |NN SV** mark|NN SV** sp
+: Defined in doio.c, used only in pp_sys.c
p |I32 |do_semop |NN SV** mark|NN SV** sp
+: Defined in doio.c, used only in pp_sys.c
p |I32 |do_shmio |I32 optype|NN SV** mark|NN SV** sp
#endif
Ap |void |do_join |NN SV *sv|NN SV *delim|NN SV **mark|NN SV **sp
+: Used in pp.c and pp_hot.c
p |OP* |do_kv
Apmb |bool |do_open |NN GV* gv|NN const char* name|I32 len|int as_raw \
|int rawmode|int rawperm|NULLOK PerlIO* supplied_fp
@@ -246,17 +278,28 @@ Ap |bool |do_openn |NN GV *gv|NN const char *oname|I32 len \
|int as_raw|int rawmode|int rawperm \
|NULLOK PerlIO *supplied_fp|NULLOK SV **svp \
|I32 num
+: Used in pp_hot.c and pp_sys.c
p |bool |do_print |NULLOK SV* sv|NN PerlIO* fp
+: Used in pp_sys.c
pR |OP* |do_readline
+: Used in pp.c
p |I32 |do_chomp |NN SV* sv
+: Defined in doio.c, used only in pp_sys.c
p |bool |do_seek |NULLOK GV* gv|Off_t pos|int whence
Ap |void |do_sprintf |NN SV* sv|I32 len|NN SV** sarg
+: Defined in doio.c, used only in pp_sys.c
p |Off_t |do_sysseek |NN GV* gv|Off_t pos|int whence
+: Defined in doio.c, used only in pp_sys.c
pR |Off_t |do_tell |NN GV* gv
+: Defined in doop.c, used only in pp.c
p |I32 |do_trans |NN SV* sv
+: Used in my.c and pp.c
p |UV |do_vecget |NN SV* sv|I32 offset|I32 size
+: Defined in doop.c, used only in mg.c (with /* XXX slurp this routine */)
p |void |do_vecset |NN SV* sv
+: Defined in doop.c, used only in pp.c
p |void |do_vop |I32 optype|NN SV* sv|NN SV* left|NN SV* right
+: Used in perly.y
p |OP* |dofile |NN OP* term|I32 force_builtin
ApR |I32 |dowantarray
Ap |void |dump_all
@@ -273,17 +316,25 @@ Ap |void |dump_sub |NN const GV* gv
Apd |void |fbm_compile |NN SV* sv|U32 flags
ApdR |char* |fbm_instr |NN unsigned char* big|NN unsigned char* bigend \
|NN SV* littlestr|U32 flags
+: Defined in util.c, used only in perl.c
p |char* |find_script |NN const char *scriptname|bool dosearch \
|NULLOK const char *const *const search_ext|I32 flags
-p |OP* |force_list |NULLOK OP* arg
-p |OP* |fold_constants |NN OP *o
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+s |OP* |force_list |NULLOK OP* arg
+: FIXME
+s |OP* |fold_constants |NN OP *o
+#endif
Afpd |char* |form |NN const char* pat|...
Ap |char* |vform |NN const char* pat|NULLOK va_list* args
Ap |void |free_tmps
-p |OP* |gen_constant_list|NULLOK OP* o
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+s |OP* |gen_constant_list|NULLOK OP* o
+#endif
#if !defined(HAS_GETENV_LEN)
+: Used in hv.c
p |char* |getenv_len |NN const char *env_elem|NN unsigned long *len
#endif
+: Used in pp_ctl.c and pp_hot.c
pox |void |get_db_sub |NULLOK SV **svp|NN CV *cv
Ap |void |gp_free |NULLOK GV* gv
Ap |GP* |gp_ref |NULLOK GP* gp
@@ -309,6 +360,7 @@ Ap |GV* |gv_fetchpv |NN const char *nambeg|I32 add|const svtype sv_type
Ap |void |gv_fullname |NN SV* sv|NN const GV* gv
Apmb |void |gv_fullname3 |NN SV* sv|NN const GV* gv|NULLOK const char* prefix
Ap |void |gv_fullname4 |NN SV* sv|NN const GV* gv|NULLOK const char* prefix|bool keepmain
+: Used in scope.c
pMox |GP * |newGP |NN GV *const gv
Ap |void |gv_init |NN GV* gv|NULLOK HV* stash|NN const char* name|STRLEN len|int multi
Ap |void |gv_name_set |NN GV* gv|NN const char *name|U32 len|U32 flags
@@ -316,6 +368,7 @@ Apd |HV* |gv_stashpv |NN const char* name|I32 flags
Apd |HV* |gv_stashpvn |NN const char* name|U32 namelen|I32 flags
Apd |HV* |gv_stashsv |NN SV* sv|I32 flags
Apd |void |hv_clear |NULLOK HV *hv
+: used in SAVEHINTS() and op.c
poM |HV * |hv_copy_hints_hv|NULLOK HV *const ohv
Ap |void |hv_delayfree_ent|NN HV *hv|NULLOK HE *entry
Abmd |SV* |hv_delete |NULLOK HV *hv|NN const char *key|I32 klen \
@@ -342,11 +395,15 @@ ApMdR |HE* |hv_iternext_flags|NN HV *hv|I32 flags
ApdR |SV* |hv_iterval |NN HV *hv|NN HE *entry
Ap |void |hv_ksplit |NN HV *hv|IV newmax
Apdbm |void |hv_magic |NN HV *hv|NULLOK GV *gv|int how
+: Used in B.xs
XEdpoM |HV * |refcounted_he_chain_2hv|NULLOK const struct refcounted_he *c
+: Used in APItest.xs
XEpoM |SV * |refcounted_he_fetch|NULLOK const struct refcounted_he *chain \
|NULLOK SV *keysv|NULLOK const char *key \
|STRLEN klen, int flags, U32 hash
+: Used in various files
dpoM |void |refcounted_he_free|NULLOK struct refcounted_he *he
+: Used in various files
XEdpoM |struct refcounted_he *|refcounted_he_new \
|NULLOK struct refcounted_he *const parent \
|NULLOK SV *const key|NULLOK SV *const value
@@ -370,16 +427,22 @@ ApP |I32 |ibcmp_locale |NN const char* a|NN const char* b|I32 len
Apd |I32 |ibcmp_utf8 |NN const char *s1|NULLOK char **pe1|UV l1 \
|bool u1|NN const char *s2|NULLOK char **pe2 \
|UV l2|bool u2
-pR |bool |ingroup |Gid_t testgid|bool effective
+#if defined(PERL_IN_DOIO_C) || defined(PERL_DECL_PROT)
+sR |bool |ingroup |Gid_t testgid|bool effective
+#endif
+: Used in toke.c
p |void |init_argv_symbols|int argc|NN char **argv
+: Used in mg.c
p |void |init_debugger
Ap |void |init_stacks
Ap |void |init_tm |NN struct tm *ptm
+: Used in perly.y
pd |U32 |intro_my
ApPR |char* |instr |NN const char* big|NN const char* little
+: Used in sv.c
p |bool |io_close |NN IO* io|bool not_implicit
+: Used in perly.y
pR |OP* |invert |NULLOK OP* cmd
-dpR |bool |is_gv_magical |NN const char *name|STRLEN len|U32 flags
ApR |I32 |is_lvalue_sub
ApPR |U32 |to_uni_upper_lc|U32 c
ApPR |U32 |to_uni_title_lc|U32 c
@@ -436,20 +499,29 @@ ApR |bool |is_utf8_print |NN const U8 *p
ApR |bool |is_utf8_punct |NN const U8 *p
ApR |bool |is_utf8_xdigit |NN const U8 *p
ApR |bool |is_utf8_mark |NN const U8 *p
+: Used in perly.y
p |OP* |jmaybe |NN OP *o
+: Used in pp.c
pP |I32 |keyword |NN const char *name|I32 len|bool all_keywords
Ap |void |leave_scope |I32 base
+: Used in pp_ctl.c, and by Data::Alias
EXp |void |lex_end
+: Used in various files
p |void |lex_start |NULLOK SV* line|NULLOK PerlIO *rsfp|bool new_filter
Ap |void |op_null |NN OP* o
+: FIXME. Used by Data::Alias
EXp |void |op_clear |NN OP* o
Ap |void |op_refcnt_lock
Ap |void |op_refcnt_unlock
-p |OP* |linklist |NN OP* o
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+s |OP* |linklist |NN OP *o
+s |OP* |listkids |NULLOK OP* o
+#endif
+: Used in S_doeval in pp_ctl.c
p |OP* |list |NULLOK OP* o
-p |OP* |listkids |NULLOK OP* o
Apd |void |load_module|U32 flags|NN SV* name|NULLOK SV* ver|...
Ap |void |vload_module|U32 flags|NN SV* name|NULLOK SV* ver|NULLOK va_list* args
+: Used in perly.y
p |OP* |localize |NN OP *o|I32 lex
ApdR |I32 |looks_like_number|NN SV *const sv
Apd |UV |grok_bin |NN const char* start|NN STRLEN* len_p|NN I32* flags|NULLOK NV *result
@@ -457,6 +529,7 @@ Apd |UV |grok_hex |NN const char* start|NN STRLEN* len_p|NN I32* flags|NULLOK NV
Apd |int |grok_number |NN const char *pv|STRLEN len|NULLOK UV *valuep
ApdR |bool |grok_numeric_radix|NN const char **sp|NN const char *send
Apd |UV |grok_oct |NN const char* start|NN STRLEN* len_p|NN I32* flags|NULLOK NV *result
+: These are all indirectly referenced by globals.c. This is somewhat annoying.
p |int |magic_clearenv |NN SV* sv|NN MAGIC* mg
p |int |magic_clear_all_env|NN SV* sv|NN MAGIC* mg
dp |int |magic_clearhint|NN SV* sv|NN MAGIC* mg
@@ -504,21 +577,24 @@ p |int |magic_setutf8 |NN SV* sv|NN MAGIC* mg
p |int |magic_set_all_env|NN SV* sv|NN MAGIC* mg
p |U32 |magic_sizepack |NN SV* sv|NN MAGIC* mg
p |int |magic_wipepack |NN SV* sv|NN MAGIC* mg
-p |void |magicname |NN const char* sym|NULLOK const char* name|I32 namlen
Ap |void |markstack_grow
#if defined(USE_LOCALE_COLLATE)
p |int |magic_setcollxfrm|NN SV* sv|NN MAGIC* mg
+: Defined in locale.c, used only in sv.c
p |char* |mem_collxfrm |NN const char* s|STRLEN len|NN STRLEN* xlen
#endif
Afp |SV* |mess |NN const char* pat|...
Ap |SV* |vmess |NN const char* pat|NULLOK va_list* args
+: FIXME - either make it public, or stop exporting it. (Data::Alias uses this)
+: Used in gv.c, op.c, toke.c
EXp |void |qerror |NN SV* err
Apd |void |sortsv |NULLOK SV** array|size_t num_elts|NN SVCOMPARE_t cmp
Apd |void |sortsv_flags |NULLOK SV** array|size_t num_elts|NN SVCOMPARE_t cmp|U32 flags
Apd |int |mg_clear |NN SV* sv
Apd |int |mg_copy |NN SV *sv|NN SV *nsv|NULLOK const char *key \
|I32 klen
-pd |void |mg_localize |NN SV* sv|NN SV* nsv
+: Defined in mg.c, used only in scope.c
+pd |void |mg_localize |NN SV* sv|NN SV* nsv|bool setmagic
ApdR |MAGIC* |mg_find |NULLOK const SV* sv|int type
Apd |int |mg_free |NN SV* sv
Apd |int |mg_get |NN SV* sv
@@ -527,10 +603,11 @@ Apd |void |mg_magical |NN SV* sv
Apd |int |mg_set |NN SV* sv
Ap |I32 |mg_size |NN SV* sv
Ap |void |mini_mktime |NN struct tm *ptm
+: Used by MOD(), which Data::Alias uses
EXp |OP* |mod |NULLOK OP* o|I32 type
+: Used in op.c and pp_sys.c
p |int |mode_from_discipline|NULLOK const char* s|STRLEN len
Ap |const char* |moreswitches |NN const char* s
-p |OP* |my |NN OP* o
Ap |NV |my_atof |NN const char *s
#if (!defined(HAS_MEMCPY) && !defined(HAS_BCOPY)) || (!defined(HAS_MEMMOVE) && !defined(HAS_SAFE_MEMCPY) && !defined(HAS_SAFE_BCOPY))
Anp |char* |my_bcopy |NN const char* from|NN char* to|I32 len
@@ -562,6 +639,7 @@ ApPa |short |my_swap |short s
ApPa |long |my_htonl |long l
ApPa |long |my_ntohl |long l
#endif
+: Used in pp_ctl.c
p |void |my_unexec
Apa |OP* |newANONLIST |NULLOK OP* o
Apa |OP* |newANONHASH |NULLOK OP* o
@@ -643,28 +721,41 @@ Apd |SV* |vnumify |NN SV *vs
Apd |SV* |vnormal |NN SV *vs
Apd |SV* |vstringify |NN SV *vs
Apd |int |vcmp |NN SV *lhv|NN SV *rhv
+: Used in pp_hot.c and pp_sys.c
p |PerlIO*|nextargv |NN GV* gv
ApP |char* |ninstr |NN const char* big|NN const char* bigend \
|NN const char* little|NN const char* lend
-pr |OP* |oopsCV |NN OP* o
Ap |void |op_free |NULLOK OP* arg
+: Used in perly.y
#ifdef PERL_MAD
p |OP* |package |NN OP* o
#else
p |void |package |NN OP* o
#endif
+: Used in op.c
pd |PADOFFSET|pad_alloc |I32 optype|U32 tmptype
+: Used in toke.c and perly.y
p |PADOFFSET|allocmy |NN const char *const name
+: Used in op.c and toke.c
pdR |PADOFFSET|pad_findmy |NN const char* name
Ap |PADOFFSET|find_rundefsvoffset |
+: Used in perly.y
pR |OP* |oopsAV |NN OP* o
+: Used in perly.y
pR |OP* |oopsHV |NN OP* o
+: Defined in pad.c, used only in op.c
pd |void |pad_leavemy
Apd |SV* |pad_sv |PADOFFSET po
+: Defined in pad.c, used only in op.c
pd |void |pad_free |PADOFFSET po
-pd |void |pad_reset
+#if defined(PERL_IN_PAD_C) || defined(PERL_DECL_PROT)
+sd |void |pad_reset
+#endif
+: Used in op.c
pd |void |pad_swipe |PADOFFSET po|bool refadjust
+: FIXME
p |void |peep |NULLOK OP* o
+: Defined in doio.c, used only in pp_hot.c
dopM |PerlIO*|start_glob |NN SV *tmpglob|NN IO *io
#if defined(USE_REENTRANT_API)
Ap |void |reentrant_size
@@ -681,9 +772,9 @@ Ap |void |despatch_signals
Ap |OP * |doref |NN OP *o|I32 type|bool set_op_ref
Apd |SV* |eval_pv |NN const char* p|I32 croak_on_error
Apd |I32 |eval_sv |NN SV* sv|I32 flags
-Apd |SV* |get_sv |NN const char* name|I32 create
-Apd |AV* |get_av |NN const char* name|I32 create
-Apd |HV* |get_hv |NN const char* name|I32 create
+Apd |SV* |get_sv |NN const char *name|I32 flags
+Apd |AV* |get_av |NN const char *name|I32 flags
+Apd |HV* |get_hv |NN const char *name|I32 flags
Apd |CV* |get_cv |NN const char* name|I32 flags
Apd |CV* |get_cvn_flags |NN const char* name|STRLEN len|I32 flags
Ap |int |init_i18nl10n |int printwarn
@@ -698,17 +789,23 @@ Apd |void |require_pv |NN const char* pv
Apd |void |pack_cat |NN SV *cat|NN const char *pat|NN const char *patend \
|NN SV **beglist|NN SV **endlist|NN SV ***next_in_list|U32 flags
Apd |void |packlist |NN SV *cat|NN const char *pat|NN const char *patend|NN SV **beglist|NN SV **endlist
-#ifdef PERL_USES_PL_PIDSTATUS
-p |void |pidgone |Pid_t pid|int status
+#if defined(PERL_USES_PL_PIDSTATUS) && defined(PERL_IN_UTIL_C)
+s |void |pidgone |Pid_t pid|int status
#endif
Ap |void |pmflag |NN U32* pmfl|int ch
+: Used in perly.y
p |OP* |pmruntime |NN OP *o|NN OP *expr|bool isreg
-p |OP* |pmtrans |NN OP* o|NN OP* expr|NN OP* repl
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+s |OP* |pmtrans |NN OP* o|NN OP* expr|NN OP* repl
+#endif
Ap |void |pop_scope
+: Used in perly.y
p |OP* |prepend_elem |I32 optype|NULLOK OP* head|NULLOK OP* tail
Ap |void |push_scope
Amb |OP* |ref |NULLOK OP* o|I32 type
-p |OP* |refkids |NULLOK OP* o|I32 type
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+s |OP* |refkids |NULLOK OP* o|I32 type
+#endif
Ap |void |regdump |NN const regexp* r
Ap |void |regdump |NN const regexp* r
Ap |SV* |regclass_swash |NULLOK const regexp *prog \
@@ -719,13 +816,14 @@ Ap |I32 |pregexec |NN REGEXP * const prog|NN char* stringarg \
|NN SV* screamer|U32 nosave
Ap |void |pregfree |NULLOK REGEXP* r
Ap |void |pregfree2 |NN REGEXP *rx
+: FIXME - is anything in re using this now?
EXp |REGEXP*|reg_temp_copy |NN REGEXP* r
Ap |void |regfree_internal|NN REGEXP *const rx
#if defined(USE_ITHREADS)
Ap |void* |regdupe_internal|NN REGEXP * const r|NN CLONE_PARAMS* param
#endif
-Ap |REGEXP*|pregcomp |NN const SV * const pattern|const U32 flags
-Ap |REGEXP*|re_compile |NN const SV * const pattern|U32 flags
+Ap |REGEXP*|pregcomp |NN SV * const pattern|const U32 flags
+Ap |REGEXP*|re_compile |NN SV * const pattern|U32 flags
Ap |char* |re_intuit_start|NN REGEXP * const rx|NULLOK SV* sv|NN char* strpos \
|NN char* strend|const U32 flags \
|NULLOK re_scream_pos_data *data
@@ -746,24 +844,35 @@ Ap |SV*|reg_named_buff_nextkey |NN REGEXP * const rx|const U32 flags
Ap |SV*|reg_named_buff_scalar |NN REGEXP * const rx|const U32 flags
Ap |SV*|reg_named_buff_all |NN REGEXP * const rx|const U32 flags
+: FIXME - is anything in re using this now?
EXp |void|reg_numbered_buff_fetch|NN REGEXP * const rx|const I32 paren|NULLOK SV * const sv
+: FIXME - is anything in re using this now?
EXp |void|reg_numbered_buff_store|NN REGEXP * const rx|const I32 paren|NULLOK SV const * const value
+: FIXME - is anything in re using this now?
EXp |I32|reg_numbered_buff_length|NN REGEXP * const rx|NN const SV * const sv|const I32 paren
+: FIXME - is anything in re using this now?
EXp |SV*|reg_qr_package|NN REGEXP * const rx
+: FIXME - why the E?
Ep |void |regprop |NULLOK const regexp *prog|NN SV* sv|NN const regnode* o
Ap |void |repeatcpy |NN char* to|NN const char* from|I32 len|I32 count
ApP |char* |rninstr |NN const char* big|NN const char* bigend \
|NN const char* little|NN const char* lend
Ap |Sighandler_t|rsignal |int i|Sighandler_t t
+: Used in pp_sys.c
p |int |rsignal_restore|int i|NULLOK Sigsave_t* t
+: Used in pp_sys.c
p |int |rsignal_save |int i|Sighandler_t t1|NN Sigsave_t* save
Ap |Sighandler_t|rsignal_state|int i
-p |void |rxres_free |NN void** rsp
-p |void |rxres_restore |NN void **rsp|NN REGEXP *rx
+#if defined(PERL_IN_PP_CTL_C) || defined(PERL_DECL_PROT)
+s |void |rxres_free |NN void** rsp
+s |void |rxres_restore |NN void **rsp|NN REGEXP *rx
+#endif
+: Used in pp_hot.c
p |void |rxres_save |NN void **rsp|NN REGEXP *rx
#if !defined(HAS_RENAME)
+: Used in pp_sys.c
p |I32 |same_dirent |NN const char* a|NN const char* b
#endif
Apda |char* |savepv |NULLOK const char* pv
@@ -780,17 +889,21 @@ Ap |AV* |save_ary |NN GV* gv
Ap |void |save_bool |NN bool* boolp
Ap |void |save_clearsv |NN SV** svp
Ap |void |save_delete |NN HV *hv|NN char *key|I32 klen
+Ap |void |save_adelete |NN AV *av|I32 key
Ap |void |save_destructor|DESTRUCTORFUNC_NOCONTEXT_t f|NN void* p
Ap |void |save_destructor_x|DESTRUCTORFUNC_t f|NULLOK void* p
-Ap |void |save_freesv |NULLOK SV* sv
-p |void |save_freeop |NULLOK OP* o
-Ap |void |save_freepv |NULLOK char* pv
+Apmb |void |save_freesv |NULLOK SV* sv
+: Used in SAVEFREOP(), used in op.c, pp_ctl.c
+pmb |void |save_freeop |NULLOK OP* o
+Apmb |void |save_freepv |NULLOK char* pv
Ap |void |save_generic_svref|NN SV** sptr
Ap |void |save_generic_pvref|NN char** str
Ap |void |save_shared_pvref|NN char** str
Ap |void |save_gp |NN GV* gv|I32 empty
Ap |HV* |save_hash |NN GV* gv
-Ap |void |save_helem |NN HV *hv|NN SV *key|NN SV **sptr
+p |void |save_hints
+Amp |void |save_helem |NN HV *hv|NN SV *key|NN SV **sptr
+Ap |void |save_helem_flags|NN HV *hv|NN SV *key|NN SV **sptr|const U32 flags
Ap |void |save_hptr |NN HV** hptr
Ap |void |save_I16 |NN I16* intp
Ap |void |save_I32 |NN I32* intp
@@ -800,9 +913,10 @@ Ap |void |save_item |NN SV* item
Ap |void |save_iv |NN IV *ivp
Ap |void |save_list |NN SV** sarg|I32 maxsarg
Ap |void |save_long |NN long* longp
-Ap |void |save_mortalizesv|NN SV* sv
+Apmb |void |save_mortalizesv|NN SV* sv
Ap |void |save_nogv |NN GV* gv
-p |void |save_op
+: Used in SAVEFREOP(), used in gv.c, op.c, perl.c, pp_ctl.c, pp_sort.c
+pmb |void |save_op
Ap |SV* |save_scalar |NN GV* gv
Ap |void |save_pptr |NN char** pptr
Ap |void |save_vptr |NN void *ptr
@@ -810,24 +924,38 @@ Ap |void |save_re_context
Ap |void |save_padsv_and_mortalize|PADOFFSET off
Ap |void |save_sptr |NN SV** sptr
Ap |SV* |save_svref |NN SV** sptr
+Ap |void |save_pushptr |NULLOK void *const ptr|const int type
+: Used by SAVECOPARYBASE() in op.c
+p |void |save_pushi32ptr|const I32 i|NULLOK void *const ptr|const int type
+: Used by SAVESWITCHSTACK() in pp.c
+p |void |save_pushptrptr|NULLOK void *const ptr1 \
+ |NULLOK void *const ptr2|const int type
+#if defined(PERL_IN_SCOPE_C) || defined(PERL_DECL_PROT)
+s |void |save_pushptri32ptr|NULLOK void *const ptr1|const I32 i \
+ |NULLOK void *const ptr2|const int type
+#endif
+: Used in perly.y
p |OP* |sawparens |NULLOK OP* o
+: Used in perly.y
p |OP* |scalar |NULLOK OP* o
-p |OP* |scalarkids |NULLOK OP* o
-p |OP* |scalarseq |NULLOK OP* o
+#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+s |OP* |scalarkids |NULLOK OP* o
+s |OP* |scalarseq |NULLOK OP* o
+#endif
+: Used in pp_ctl.c
p |OP* |scalarvoid |NN OP* o
Apd |NV |scan_bin |NN const char* start|STRLEN len|NN STRLEN* retlen
Apd |NV |scan_hex |NN const char* start|STRLEN len|NN STRLEN* retlen
Ap |char* |scan_num |NN const char* s|NN YYSTYPE *lvalp
Apd |NV |scan_oct |NN const char* start|STRLEN len|NN STRLEN* retlen
+: Used in perly.y
p |OP* |scope |NULLOK OP* o
Ap |char* |screaminstr |NN SV *bigstr|NN SV *littlestr|I32 start_shift \
|I32 end_shift|NN I32 *old_posp|I32 last
-#if !defined(VMS)
-p |I32 |setenv_getix |NN const char* nam
-#endif
-EXp |void |setdefout |NULLOK GV* gv
+Apd |void |setdefout |NULLOK GV* gv
Ap |HEK* |share_hek |NN const char* str|I32 len|U32 hash
#if defined(HAS_SIGACTION) && defined(SA_SIGINFO)
+: Used in perl.c
np |Signal_t |sighandler |int sig|NULLOK siginfo_t *info|NULLOK void *uap
Anp |Signal_t |csighandler |int sig|NULLOK siginfo_t *info|NULLOK void *uap
#else
@@ -836,12 +964,13 @@ Anp |Signal_t |csighandler |int sig
#endif
Ap |SV** |stack_grow |NN SV** sp|NN SV** p|int n
Ap |I32 |start_subparse |I32 is_format|U32 flags
+: Used in pp_ctl.c
p |void |sub_crush_depth|NN CV* cv
Apd |bool |sv_2bool |NN SV *const sv
Apd |CV* |sv_2cv |NULLOK SV* sv|NN HV **const st|NN GV **const gvp \
|const I32 lref
Apd |IO* |sv_2io |NN SV *const sv
-#ifdef PERL_IN_SV_C
+#if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
s |bool |glob_2number |NN GV* const gv
s |char* |glob_2pv |NN GV* const gv|NULLOK STRLEN * const len
#endif
@@ -849,6 +978,7 @@ Amb |IV |sv_2iv |NULLOK SV *sv
Apd |IV |sv_2iv_flags |NULLOK SV *const sv|const I32 flags
Apd |SV* |sv_2mortal |NULLOK SV *const sv
Apd |NV |sv_2nv |NULLOK SV *const sv
+: Used in pp.c, pp_hot.c, sv.c
pMd |SV* |sv_2num |NN SV *const sv
Amb |char* |sv_2pv |NULLOK SV *sv|NULLOK STRLEN *lp
Apd |char* |sv_2pv_flags |NULLOK SV *const sv|NULLOK STRLEN *const lp|const I32 flags
@@ -864,7 +994,10 @@ Apd |char* |sv_pvn |NN SV *sv|NN STRLEN *lp
Apd |char* |sv_pvutf8n |NN SV *sv|NN STRLEN *lp
Apd |char* |sv_pvbyten |NN SV *sv|NN STRLEN *lp
Apd |I32 |sv_true |NULLOK SV *const sv
-pd |void |sv_add_arena |NN char *const ptr|const U32 size|const U32 flags
+#if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+sd |void |sv_add_arena |NN char *const ptr|const U32 size \
+ |const U32 flags
+#endif
Apd |int |sv_backoff |NN SV *const sv
Apd |SV* |sv_bless |NN SV *const sv|NN HV *const stash
Afpd |void |sv_catpvf |NN SV *const sv|NN const char *const pat|...
@@ -874,7 +1007,9 @@ Apd |void |sv_catpv |NN SV *const sv|NULLOK const char* ptr
Amdb |void |sv_catpvn |NN SV *dsv|NN const char *sstr|STRLEN len
Amdb |void |sv_catsv |NN SV *dstr|NULLOK SV *sstr
Apd |void |sv_chop |NN SV *const sv|NULLOK const char *const ptr
+: Used only in perl.c
pd |I32 |sv_clean_all
+: Used only in perl.c
pd |void |sv_clean_objs
Apd |void |sv_clear |NN SV *const sv
Apd |I32 |sv_cmp |NULLOK SV *const sv1|NULLOK SV *const sv2
@@ -891,7 +1026,10 @@ ApdR |bool |sv_derived_from|NN SV* sv|NN const char *const name
ApdR |bool |sv_does |NN SV* sv|NN const char *const name
Apd |I32 |sv_eq |NULLOK SV* sv1|NULLOK SV* sv2
Apd |void |sv_free |NULLOK SV *const sv
+: FIXME Used in SvREFCNT_dec() but only
+: if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
poMX |void |sv_free2 |NN SV *const sv
+: Used only in perl.c
pd |void |sv_free_arenas
Apd |char* |sv_gets |NN SV *const sv|NN PerlIO *const fp|I32 append
Apd |char* |sv_grow |NN SV *const sv|STRLEN newlen
@@ -978,7 +1116,9 @@ Apd |I32 |unpack_str |NN const char *pat|NN const char *patend|NN const char *s
Apd |I32 |unpackstring |NN const char *pat|NN const char *patend|NN const char *s \
|NN const char *strend|U32 flags
Ap |void |unsharepvn |NULLOK const char* sv|I32 len|U32 hash
+: Used in gv.c, hv.c
p |void |unshare_hek |NULLOK HEK* hek
+: Used in perly.y
#ifdef PERL_MAD
p |OP * |utilize |int aver|I32 floor|NULLOK OP* version \
|NN OP* idop|NULLOK OP* arg
@@ -1015,26 +1155,41 @@ Ap |U8* |uvchr_to_utf8_flags |NN U8 *d|UV uv|UV flags
Apd |U8* |uvuni_to_utf8_flags |NN U8 *d|UV uv|UV flags
Apd |char* |pv_uni_display |NN SV *dsv|NN const U8 *spv|STRLEN len|STRLEN pvlim|UV flags
ApdR |char* |sv_uni_display |NN SV *dsv|NN SV *ssv|STRLEN pvlim|UV flags
+: Used by Data::Alias
EXp |void |vivify_defelem |NN SV* sv
+: Used in pp.c
p |void |vivify_ref |NN SV* sv|U32 to_what
+: Used in pp_sys.c
p |I32 |wait4pid |Pid_t pid|NN int* statusp|int flags
+: Used in locale.c and perl.c
p |U32 |parse_unicode_opts|NN const char **popt
Ap |U32 |seed
+: Only used in perl.c
pR |UV |get_hash_seed
+: Used in doio.c, pp_hot.c, pp_sys.c
p |void |report_evil_fh |NULLOK const GV *gv|NULLOK const IO *io|I32 op
-XEpd |void |report_uninit |NULLOK SV* uninit_sv
+: Used in mg.c, pp.c, pp_hot.c, regcomp.c
+XEpd |void |report_uninit |NULLOK const SV *uninit_sv
Afpd |void |warn |NN const char* pat|...
Ap |void |vwarn |NN const char* pat|NULLOK va_list* args
Afp |void |warner |U32 err|NN const char* pat|...
Ap |void |vwarner |U32 err|NN const char* pat|NULLOK va_list* args
+: FIXME
p |void |watch |NN char** addr
Ap |I32 |whichsig |NN const char* sig
+: Used in pp_ctl.c
p |void |write_to_stderr|NN const char* message|int msglen
+: Used in op.c
p |int |yyerror |NN const char *const s
+: Used in perly.y, and by Data::Alias
EXp |int |yylex
+: Used in perl.c, pp_ctl.c
p |int |yyparse
+: Only used in scope.c
p |void |parser_free |NN const yy_parser *parser
-p |int |yywarn |NN const char *const s
+#if defined(PERL_IN_TOKE_C) || defined(PERL_DECL_PROT)
+s |int |yywarn |NN const char *const s
+#endif
#if defined(MYMALLOC)
Ap |void |dump_mstats |NN const char* s
Ap |int |get_mstats |NN perl_mstats_t *buf|int buflen|int level
@@ -1103,6 +1258,7 @@ AmdbR |char* |sv_pv |NN SV *sv
AmdbR |char* |sv_pvutf8 |NN SV *sv
AmdbR |char* |sv_pvbyte |NN SV *sv
Amdb |STRLEN |sv_utf8_upgrade|NN SV *sv
+Amd |STRLEN |sv_utf8_upgrade_nomg|NN SV *sv
ApdM |bool |sv_utf8_downgrade|NN SV *const sv|const bool fail_ok
Apd |void |sv_utf8_encode |NN SV *const sv
ApdM |bool |sv_utf8_decode |NN SV *const sv
@@ -1110,6 +1266,7 @@ Apdmb |void |sv_force_normal|NN SV *sv
Apd |void |sv_force_normal_flags|NN SV *const sv|const U32 flags
Ap |void |tmps_grow |I32 n
Apd |SV* |sv_rvweaken |NN SV *const sv
+: This is indirectly referenced by globals.c. This is somewhat annoying.
p |int |magic_killbackrefs|NN SV *sv|NN MAGIC *mg
Ap |OP* |newANONATTRSUB |I32 floor|NULLOK OP *proto|NULLOK OP *attrs|NULLOK OP *block
Ap |CV* |newATTRSUB |I32 floor|NULLOK OP *o|NULLOK OP *proto|NULLOK OP *attrs|NULLOK OP *block
@@ -1119,7 +1276,9 @@ Apr |OP * |newMYSUB |I32 floor|NULLOK OP *o|NULLOK OP *proto \
#else
Apr |void |newMYSUB |I32 floor|NULLOK OP *o|NULLOK OP *proto|NULLOK OP *attrs|NULLOK OP *block
#endif
+: Used in perly.y
p |OP * |my_attrs |NN OP *o|NULLOK OP *attrs
+: Only used in perl.c
p |void |boot_core_xsutils
#if defined(USE_ITHREADS)
ApR |PERL_CONTEXT*|cx_dup |NULLOK PERL_CONTEXT* cx|I32 ix|I32 max|NN CLONE_PARAMS* param
@@ -1187,6 +1346,7 @@ s |HV* |require_tie_mod|NN GV *gv|NN const char *varpv|NN SV* namesv \
#endif
: #if defined(PERL_IN_HV_C) || defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+: Used in hv.c
paRxo |void* |get_arena |const size_t svtype|const U32 misc
: #endif
@@ -1218,6 +1378,7 @@ s |void |unwind_handler_stack|NN const void *p
#endif
#if defined(PERL_IN_OP_C) || defined(PERL_DECL_PROT)
+: These are all indirectly referenced by globals.c. This is somewhat annoying.
pR |OP* |ck_anoncode |NN OP *o
pR |OP* |ck_bitop |NN OP *o
pR |OP* |ck_concat |NN OP *o
@@ -1271,6 +1432,7 @@ s |void |cop_free |NN COP *cop
s |OP* |modkids |NULLOK OP *o|I32 type
s |OP* |scalarboolean |NN OP *o
sR |OP* |newDEFSVOP
+sR |OP* |search_const |NN OP *o
sR |OP* |new_logop |I32 type|I32 flags|NN OP **firstp|NN OP **otherp
s |void |simplify_sort |NN OP *o
s |const char* |gv_ename |NN GV *gv
@@ -1296,8 +1458,11 @@ s |void |process_special_blocks |NN const char *const fullname\
Apa |void* |Slab_Alloc |size_t sz
Ap |void |Slab_Free |NN void *op
# if defined(PERL_DEBUG_READONLY_OPS)
+: Used in perl.c
poxM |void |pending_Slabs_to_ro
+: Used in OpREFCNT_inc() in sv.c
poxM |OP * |op_refcnt_inc |NULLOK OP *o
+: FIXME - can be static.
poxM |PADOFFSET |op_refcnt_dec |NN OP *o
# if defined(PERL_IN_OP_C)
s |void |Slab_to_rw |NN void *op
@@ -1308,7 +1473,9 @@ s |void |Slab_to_rw |NN void *op
#if defined(PERL_IN_PERL_C) || defined(PERL_DECL_PROT)
s |void |find_beginning |NN SV* linestr_sv|NN PerlIO *rsfp
s |void |forbid_setid |const char flag|const bool suidscript
-s |void |incpush |NULLOK const char *dir|bool addsubdirs|bool addoldvers|bool usesep|bool canrelocate
+s |void |incpush |NN const char *const dir|STRLEN len \
+ |U32 flags
+s |void |incpush_use_sep|NN const char *p|STRLEN len|U32 flags
s |void |init_interp
s |void |init_ids
s |void |init_main_stash
@@ -1320,36 +1487,20 @@ s |void |nuke_stacks
s |int |open_script |NN const char *scriptname|bool dosearch \
|NN bool *suidscript|NN PerlIO **rsfpp
s |void |usage |NN const char *name
-#ifdef DOSUID
-# ifdef IAMSUID
-so |void |validate_suid |NN const char *validarg \
- |int fdscript \
- |bool suidscript|NN SV* linestr_sv \
- |NN PerlIO *rsfp
-# else
-so |void |validate_suid |NN const char *validarg \
- |NN const char *scriptname|int fdscript \
- |NN SV* linestr_sv \
- |NN PerlIO *rsfp
-# endif
-#else
-# ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
+#ifndef SETUID_SCRIPTS_ARE_SECURE_NOW
so |void |validate_suid |NN PerlIO *rsfp
-# endif
#endif
-# if defined(IAMSUID)
-s |int |fd_on_nosuid_fs|int fd
-# endif
s |void* |parse_body |NULLOK char **env|XSINIT_t xsinit
rs |void |run_body |I32 oldscope
-s |SV * |incpush_if_exists|NN SV *dir
+s |SV * |incpush_if_exists|NN AV *const av|NN SV *dir|NN SV *const stem
#endif
#if defined(PERL_IN_PP_C) || defined(PERL_DECL_PROT)
sR |SV* |refto |NN SV* sv
#endif
#if defined(PERL_IN_PP_C) || defined(PERL_IN_PP_HOT_C) || defined(PERL_DECL_PROT)
+: Used in pp_hot.c
pRxo |GV* |softref2xv |NN SV *const sv|NN const char *const what \
|const svtype type|NN SV ***spp
#endif
@@ -1549,14 +1700,16 @@ s |SV* |pm_description |NN const PMOP *pm
#endif
#if defined(PERL_IN_SCOPE_C) || defined(PERL_DECL_PROT)
-s |SV* |save_scalar_at |NN SV **sptr
+s |SV* |save_scalar_at |NN SV **sptr|const U32 flags
#endif
#if defined(PERL_IN_GV_C) || defined(PERL_IN_SV_C) || defined(PERL_IN_PAD_C) || defined(PERL_DECL_PROT)
+: Used in gv.c
po |void |sv_add_backref |NN SV *const tsv|NN SV *const sv
#endif
#if defined(PERL_IN_HV_C) || defined(PERL_IN_MG_C) || defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+: Used in hv.c and mg.c
poM |int |sv_kill_backrefs |NN SV *const sv|NN AV *const av
#endif
@@ -1566,8 +1719,9 @@ s |void |sv_unglob |NN SV *const sv
s |void |not_a_number |NN SV *const sv
s |I32 |visit |NN SVFUNC_t f|const U32 flags|const U32 mask
s |void |sv_del_backref |NN SV *const tsv|NN SV *const sv
-sR |SV * |varname |NULLOK GV *gv|const char gvtype|PADOFFSET targ \
- |NULLOK SV *keyname|I32 aindex|int subscript_type
+sR |SV * |varname |NULLOK const GV *const gv|const char gvtype \
+ |PADOFFSET targ|NULLOK const SV *const keyname \
+ |I32 aindex|int subscript_type
# ifdef DEBUGGING
s |void |del_sv |NN SV *p
# endif
@@ -1660,7 +1814,8 @@ s |void |printbuf |NN const char *const fmt|NN const char *const s
#endif
#if defined(PERL_IN_UNIVERSAL_C) || defined(PERL_DECL_PROT)
-s |bool|isa_lookup |NULLOK HV *stash|NN const char * const name|NULLOK const HV * const name_stash
+s |bool|isa_lookup |NN HV *stash|NN const char * const name
+so |HV * |get_isa_hash |NN HV *const stash
#endif
#if defined(PERL_IN_LOCALE_C) || defined(PERL_DECL_PROT)
@@ -1677,6 +1832,13 @@ s |const char *|vdie_croak_common|NULLOK const char *pat|NULLOK va_list *args \
s |bool |vdie_common |NULLOK const char *message|STRLEN msglen\
|I32 utf8|bool warn
sr |char * |write_no_mem
+#if defined(PERL_MEM_LOG) && defined(PERL_MEM_LOG_STDERR)
+sn |void |mem_log_common |enum mem_log_type mlt|const UV n|const UV typesize \
+ |NN const char *type_name|NULLOK const SV *sv \
+ |Malloc_t oldalloc|Malloc_t newalloc \
+ |NN const char *filename|const int linenumber \
+ |NN const char *funcname
+#endif
#endif
#if defined(PERL_IN_NUMERIC_C) || defined(PERL_DECL_PROT)
@@ -1695,13 +1857,15 @@ Apd |void |sv_setsv_flags |NN SV *dstr|NULLOK SV *sstr|const I32 flags
Apd |void |sv_catpvn_flags|NN SV *const dstr|NN const char *sstr|const STRLEN len \
|const I32 flags
Apd |void |sv_catsv_flags |NN SV *const dsv|NULLOK SV *const ssv|const I32 flags
-Apd |STRLEN |sv_utf8_upgrade_flags|NN SV *const sv|const I32 flags
+Apmd |STRLEN |sv_utf8_upgrade_flags|NN SV *const sv|const I32 flags
+Apd |STRLEN |sv_utf8_upgrade_flags_grow|NN SV *const sv|const I32 flags|STRLEN extra
Apd |char* |sv_pvn_force_flags|NN SV *const sv|NULLOK STRLEN *const lp|const I32 flags
Apd |void |sv_copypv |NN SV *const dsv|NN SV *const ssv
Ap |char* |my_atof2 |NN const char *s|NN NV* value
Apn |int |my_socketpair |int family|int type|int protocol|int fd[2]
Ap |int |my_dirfd |NULLOK DIR* dir
#ifdef PERL_OLD_COPY_ON_WRITE
+: Used in pp_hot.c and regexec.c
pMXE |SV* |sv_setsv_cow |NN SV* dstr|NN SV* sstr
#endif
@@ -1738,27 +1902,40 @@ ApR |PerlIO *|PerlIO_stdout
ApR |PerlIO *|PerlIO_stderr
#endif /* PERLIO_LAYERS */
+: Only used in dump.c
p |void |deb_stack_all
-#ifdef PERL_IN_DEB_C
+#if defined(PERL_IN_DEB_C) || defined(PERL_DECL_PROT)
s |void |deb_stack_n |NN SV** stack_base|I32 stack_min \
|I32 stack_max|I32 mark_min|I32 mark_max
#endif
+: Used in perl.c, pp_ctl.c, toke.c
pda |PADLIST*|pad_new |int flags
+: Only used in op.c
pd |void |pad_undef |NN CV* cv
+: Only used in op.c
pd |PADOFFSET|pad_add_name |NN const char *name\
|NULLOK HV* typestash|NULLOK HV* ourstash|bool clone|bool state
+: Only used in op.c
pd |PADOFFSET|pad_add_anon |NN SV* sv|OPCODE op_type
+: Only used in op.c
pd |void |pad_check_dup |NN const char* name|bool is_our|NN const HV* ourstash
#ifdef DEBUGGING
+: Only used PAD_SETSV() in op.c
pd |void |pad_setsv |PADOFFSET po|NN SV* sv
#endif
+: Only used in op.c
pd |void |pad_block_start|int full
+: Only used in op.c
pd |void |pad_tidy |padtidy_type type
+: Used in dump.c
pd |void |do_dump_pad |I32 level|NN PerlIO *file|NULLOK PADLIST *padlist|int full
+: Only used in op.c
pd |void |pad_fixup_inner_anons|NN PADLIST *padlist|NN CV *old_cv|NN CV *new_cv
+: Used in pp_ctl.c, pp_hot.c, pp_sort.c
pdX |void |pad_push |NN PADLIST *padlist|int depth
+: Only used in PAD_COMPNAME_TYPE() in op.c
pR |HV* |pad_compname_type|const PADOFFSET po
#if defined(PERL_IN_PAD_C) || defined(PERL_DECL_PROT)
@@ -1770,8 +1947,10 @@ sd |void |cv_dump |NN const CV *cv|NN const char *title
# endif
#endif
ApdR |CV* |find_runcv |NULLOK U32 *db_seqp
+: Only used in perl.c
p |void |free_tied_hv_pool
#if defined(DEBUGGING)
+: Used in mg.c
pR |int |get_debug_opts |NN const char **s|bool givehelp
#endif
Ap |void |save_set_svflags|NN SV *sv|U32 mask|U32 val
@@ -1783,21 +1962,27 @@ ApoR |HE** |hv_eiter_p |NN HV *hv
Apo |void |hv_riter_set |NN HV *hv|I32 riter
Apo |void |hv_eiter_set |NN HV *hv|NULLOK HE *eiter
Ap |void |hv_name_set |NN HV *hv|NULLOK const char *name|U32 len|U32 flags
+: Used in dump.c and hv.c
poM |AV** |hv_backreferences_p |NN HV *hv
#if defined(PERL_IN_DUMP_C) || defined(PERL_IN_HV_C) || defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
+: Only used in sv.c
poM |void |hv_kill_backrefs |NN HV *hv
#endif
Apd |void |hv_clear_placeholders |NN HV *hv
ApoR |I32* |hv_placeholders_p |NN HV *hv
-ApoR |I32 |hv_placeholders_get |NN HV *hv
+ApoR |I32 |hv_placeholders_get |NN const HV *hv
Apo |void |hv_placeholders_set |NN HV *hv|I32 ph
+: This is indirectly referenced by globals.c. This is somewhat annoying.
p |SV* |magic_scalarpack|NN HV *hv|NN MAGIC *mg
#if defined(PERL_IN_SV_C) || defined(PERL_DECL_PROT)
-s |SV * |find_hash_subscript|NULLOK HV *hv|NN SV *val
-s |I32 |find_array_subscript|NULLOK AV *av|NN SV *val
-sMd |SV* |find_uninit_var|NULLOK OP* obase|NULLOK SV* uninit_sv|bool top
+s |SV * |find_hash_subscript|NULLOK const HV *const hv \
+ |NN const SV *const val
+s |I32 |find_array_subscript|NULLOK const AV *const av \
+ |NN const SV *const val
+sMd |SV* |find_uninit_var|NULLOK const OP *const obase \
+ |NULLOK const SV *const uninit_sv|bool top
#endif
#ifdef PERL_NEED_MY_HTOLE16
@@ -1874,15 +2059,19 @@ np |long |my_htobel |long n
np |long |my_betohl |long n
#endif
+: I think that these are only used by the above, which are macros, and in turn
+: currently they are only used in pp_pack.c, but this is in util.c
np |void |my_swabn |NN void* ptr|int n
Ap |GV* |gv_fetchpvn_flags|NN const char* name|STRLEN len|I32 flags|const svtype sv_type
Ap |GV* |gv_fetchsv|NN SV *name|I32 flags|const svtype sv_type
-dpR |bool |is_gv_magical_sv|NN SV *name|U32 flags
+: Only used in pp.c
+dpR |bool |is_gv_magical_sv|NN SV *const name_sv|U32 flags
ApR |bool |stashpv_hvname_match|NN const COP *c|NN const HV *hv
#ifdef DEBUG_LEAKING_SCALARS_FORK_DUMP
+: Used in sv.c
p |void |dump_sv_child |NN SV *sv
#endif
@@ -1891,9 +2080,11 @@ Ap |GV* |gv_SVadd |NN GV* gv
#endif
Apo |bool |ckwarn |U32 w
Apo |bool |ckwarn_d |U32 w
+: FIXME - exported for ByteLoader - public or private?
XEopMa |STRLEN *|new_warnings_bitfield|NULLOK STRLEN *buffer \
|NN const char *const bits|STRLEN size
+: Used in av.c, hv.c
p |void |offer_nice_chunk |NN void *const chunk|const U32 chunk_size
#ifndef SPRINTF_RETURNS_STRLEN
@@ -1903,6 +2094,7 @@ Apnod |int |my_sprintf |NN char *buffer|NN const char *pat|...
Apnodf |int |my_snprintf |NN char *buffer|const Size_t len|NN const char *format|...
Apnod |int |my_vsnprintf |NN char *buffer|const Size_t len|NN const char *format|va_list ap
+: Used in mg.c, sv.c
px |void |my_clearenv
#ifdef PERL_IMPLICIT_CONTEXT
@@ -1975,26 +2167,41 @@ Mp |int |madparse
AMdnoP |int |Perl_signbit |NV f
#endif
+: Used by B
XEMop |void |emulate_cop_io |NN const COP *const c|NN SV *const sv
+: Used by SvRX and SvRXOK
XEMop |REGEXP *|get_re_arg|NULLOK SV *sv
-p |struct mro_meta* |mro_meta_init |NN HV* stash
+Aop |SV* |mro_get_private_data|NN struct mro_meta *const smeta \
+ |NN const struct mro_alg *const which
+Aop |SV* |mro_set_private_data|NN struct mro_meta *const smeta \
+ |NN const struct mro_alg *const which \
+ |NN SV *const data
+Aop |const struct mro_alg *|mro_get_from_name|NN SV *name
+Aop |void |mro_register |NN const struct mro_alg *mro
+Aop |void |mro_set_mro |NN struct mro_meta *const meta \
+ |NN SV *const name
+: Used in HvMROMETA(), which is public.
+Xpo |struct mro_meta* |mro_meta_init |NN HV* stash
#if defined(USE_ITHREADS)
+: Only used in sv.c
p |struct mro_meta* |mro_meta_dup |NN struct mro_meta* smeta|NN CLONE_PARAMS* param
#endif
Apd |AV* |mro_get_linear_isa|NN HV* stash
#if defined(PERL_IN_MRO_C) || defined(PERL_DECL_PROT)
-sd |AV* |mro_get_linear_isa_c3|NN HV* stash|I32 level
-sd |AV* |mro_get_linear_isa_dfs|NN HV* stash|I32 level
+sd |AV* |mro_get_linear_isa_dfs|NN HV* stash|U32 level
#endif
+: Used in hv.c, mg.c, pp.c, sv.c
pd |void |mro_isa_changed_in|NN HV* stash
Apd |void |mro_method_changed_in |NN HV* stash
+: Only used in perl.c
p |void |boot_core_mro
Apon |void |sys_init |NN int* argc|NN char*** argv
Apon |void |sys_init3 |NN int* argc|NN char*** argv|NN char*** env
Apon |void |sys_term
ApoM |const char *|fetch_cop_label|NULLOK struct refcounted_he *const chain \
|NULLOK STRLEN *len|NULLOK U32 *flags
+: Only used in op.c
xpoM |struct refcounted_he *|store_cop_label \
|NULLOK struct refcounted_he *const chain|NN const char *label
diff --git a/ext/Devel-PPPort/parts/inc/misc b/ext/Devel-PPPort/parts/inc/misc
index 8044df92a1..9900812d8e 100644
--- a/ext/Devel-PPPort/parts/inc/misc
+++ b/ext/Devel-PPPort/parts/inc/misc
@@ -1,8 +1,8 @@
################################################################################
##
-## $Revision: 51 $
+## $Revision: 52 $
## $Author: mhx $
-## $Date: 2009/01/23 18:28:31 +0100 $
+## $Date: 2009/03/15 06:51:00 +0100 $
##
################################################################################
##
@@ -91,7 +91,6 @@ typedef NVTYPE NV;
#endif
#ifndef INT2PTR
-
# if (IVSIZE == PTRSIZE) && (UVSIZE == PTRSIZE)
# define PTRV UV
# define INT2PTR(any,d) (any)(d)
@@ -103,19 +102,21 @@ typedef NVTYPE NV;
# endif
# define INT2PTR(any,d) (any)(PTRV)(d)
# endif
+#endif
-# define NUM2PTR(any,d) (any)(PTRV)(d)
-# define PTR2IV(p) INT2PTR(IV,p)
-# define PTR2UV(p) INT2PTR(UV,p)
-# define PTR2NV(p) NUM2PTR(NV,p)
-
+#ifndef PTR2ul
# if PTRSIZE == LONGSIZE
# define PTR2ul(p) (unsigned long)(p)
# else
# define PTR2ul(p) INT2PTR(unsigned long,p)
# endif
+#endif
-#endif /* !INT2PTR */
+__UNDEFINED__ PTR2nat(p) (PTRV)(p)
+__UNDEFINED__ NUM2PTR(any,d) (any)PTR2nat(d)
+__UNDEFINED__ PTR2IV(p) INT2PTR(IV,p)
+__UNDEFINED__ PTR2UV(p) INT2PTR(UV,p)
+__UNDEFINED__ PTR2NV(p) NUM2PTR(NV,p)
#undef START_EXTERN_C
#undef END_EXTERN_C
@@ -314,6 +315,23 @@ newXS("Devel::PPPort::dAXMARK", XS_Devel__PPPort_dAXMARK, file);
=xsubs
int
+ptrtests()
+ PREINIT:
+ int var, *p = &var;
+
+ CODE:
+ RETVAL = 0;
+ RETVAL += PTR2nat(p) != 0 ? 1 : 0;
+ RETVAL += PTR2ul(p) != 0UL ? 2 : 0;
+ RETVAL += PTR2UV(p) != (UV) 0 ? 4 : 0;
+ RETVAL += PTR2IV(p) != (IV) 0 ? 8 : 0;
+ RETVAL += PTR2NV(p) != (NV) 0 ? 16 : 0;
+ RETVAL += p > NUM2PTR(int *, 0) ? 32 : 0;
+
+ OUTPUT:
+ RETVAL
+
+int
gv_stashpvn(name, create)
char *name
I32 create
@@ -457,7 +475,7 @@ Perl_ppaddr_t(string)
LEAVE;
XSRETURN(1);
-=tests plan => 38
+=tests plan => 39
use vars qw($my_sv @my_av %my_hv);
@@ -534,3 +552,5 @@ ok(Devel::PPPort::SVf('abc'), $] >= 5.004 ? '[abc]' : 'abc');
ok(&Devel::PPPort::Perl_ppaddr_t("FOO"), "foo");
+ok(&Devel::PPPort::ptrtests(), 63);
+
diff --git a/ext/Devel-PPPort/parts/todo/5007002 b/ext/Devel-PPPort/parts/todo/5007002
index 2fba735a96..cb28d72bf3 100644
--- a/ext/Devel-PPPort/parts/todo/5007002
+++ b/ext/Devel-PPPort/parts/todo/5007002
@@ -13,4 +13,5 @@ sv_catpvn_flags # U
sv_catsv_flags # U
sv_setsv_flags # U
sv_utf8_upgrade_flags # U
+sv_utf8_upgrade_nomg # U
swash_fetch # E (Perl_swash_fetch)
diff --git a/ext/Devel-PPPort/parts/todo/5011000 b/ext/Devel-PPPort/parts/todo/5011000
index 857f62f439..0676f22c1c 100644
--- a/ext/Devel-PPPort/parts/todo/5011000
+++ b/ext/Devel-PPPort/parts/todo/5011000
@@ -9,9 +9,18 @@ croak_xs_usage # U
fetch_cop_label # U
gv_fetchmethod_flags # U
hv_assert # U
+mro_get_from_name # U
+mro_get_private_data # U
+mro_register # U
+mro_set_mro # U
+mro_set_private_data # U
pad_sv # U
pregfree2 # U
ref # U (Perl_ref)
+save_adelete # U
+save_helem_flags # U
save_padsv_and_mortalize # U
+save_pushptr # U
stashpv_hvname_match # U
sv_insert_flags # U
+sv_utf8_upgrade_flags_grow # U
diff --git a/ext/Devel-PPPort/soak b/ext/Devel-PPPort/soak
index 9a67665b9a..c7e3f483e6 100644
--- a/ext/Devel-PPPort/soak
+++ b/ext/Devel-PPPort/soak
@@ -33,7 +33,7 @@ use File::Find;
use List::Util qw(max);
use Config;
-my $VERSION = do { my @r = '$Snapshot: /Devel-PPPort/3.16 $' =~ /(\d+\.\d+(?:_\d+)?)/; @r ? $r[0] : '9.99' };
+my $VERSION = do { my @r = '$Snapshot: /Devel-PPPort/3.17 $' =~ /(\d+\.\d+(?:_\d+)?)/; @r ? $r[0] : '9.99' };
$| = 1;
my %OPT = (
diff --git a/ext/Devel-PPPort/t/misc.t b/ext/Devel-PPPort/t/misc.t
index d7ab504848..9dcc565547 100644
--- a/ext/Devel-PPPort/t/misc.t
+++ b/ext/Devel-PPPort/t/misc.t
@@ -30,9 +30,9 @@ BEGIN {
require 'testutil.pl' if $@;
}
- if (38) {
+ if (39) {
load();
- plan(tests => 38);
+ plan(tests => 39);
}
}
@@ -123,3 +123,5 @@ ok(Devel::PPPort::SVf('abc'), $] >= 5.004 ? '[abc]' : 'abc');
ok(&Devel::PPPort::Perl_ppaddr_t("FOO"), "foo");
+ok(&Devel::PPPort::ptrtests(), 63);
+
diff --git a/ext/Devel-Peek/Makefile.PL b/ext/Devel-Peek/Makefile.PL
index f6d0cc9caa..41fab879ed 100644
--- a/ext/Devel-Peek/Makefile.PL
+++ b/ext/Devel-Peek/Makefile.PL
@@ -8,5 +8,4 @@ WriteMakefile(
SUFFIX => 'gz',
DIST_DEFAULT => 'all tardist',
},
- MAN3PODS => {},
);
diff --git a/ext/Digest-SHA/Makefile.PL b/ext/Digest-SHA/Makefile.PL
index dff827040f..df63c2bfbf 100644
--- a/ext/Digest-SHA/Makefile.PL
+++ b/ext/Digest-SHA/Makefile.PL
@@ -37,7 +37,6 @@ my %att = (
$PERL_CORE ? () : (
'EXE_FILES' => [ 'shasum' ],
'INSTALLDIRS' => ($] >= 5.010) ? 'perl' : 'site',
- 'MAN3PODS' => {}, # Pods will be built by installman.
),
);
diff --git a/ext/DynaLoader/Makefile.PL b/ext/DynaLoader/Makefile.PL
index 1f06c5cbd6..2a9aa7b340 100644
--- a/ext/DynaLoader/Makefile.PL
+++ b/ext/DynaLoader/Makefile.PL
@@ -4,7 +4,6 @@ WriteMakefile(
NAME => 'DynaLoader',
LINKTYPE => 'static',
DEFINE => '-DLIBC="$(LIBC)"',
- MAN3PODS => {}, # Pods will be built by installman.
SKIP => [qw(dynamic dynamic_lib dynamic_bs)],
XSPROTOARG => '-noprototypes', # XXX remove later?
VERSION_FROM => 'DynaLoader_pm.PL',
diff --git a/ext/DynaLoader/dl_aix.xs b/ext/DynaLoader/dl_aix.xs
index c91a2fce2a..eac313f8cb 100644
--- a/ext/DynaLoader/dl_aix.xs
+++ b/ext/DynaLoader/dl_aix.xs
@@ -762,4 +762,19 @@ dl_error()
OUTPUT:
RETVAL
+#if defined(USE_ITHREADS)
+
+void
+CLONE(...)
+ CODE:
+ MY_CXT_CLONE;
+
+ /* MY_CXT_CLONE just does a memcpy on the whole structure, so to avoid
+ * using Perl variables that belong to another thread, we create our
+ * own for this thread.
+ */
+ MY_CXT.x_dl_last_error = newSVpvn("", 0);
+
+#endif
+
# end.
diff --git a/ext/DynaLoader/dl_beos.xs b/ext/DynaLoader/dl_beos.xs
index 3453d6801b..2b310ac283 100644
--- a/ext/DynaLoader/dl_beos.xs
+++ b/ext/DynaLoader/dl_beos.xs
@@ -116,4 +116,19 @@ dl_error()
OUTPUT:
RETVAL
+#if defined(USE_ITHREADS)
+
+void
+CLONE(...)
+ CODE:
+ MY_CXT_CLONE;
+
+ /* MY_CXT_CLONE just does a memcpy on the whole structure, so to avoid
+ * using Perl variables that belong to another thread, we create our
+ * own for this thread.
+ */
+ MY_CXT.x_dl_last_error = newSVpvn("", 0);
+
+#endif
+
# end.
diff --git a/ext/DynaLoader/dl_dld.xs b/ext/DynaLoader/dl_dld.xs
index ab72ca3c6c..b60d25baee 100644
--- a/ext/DynaLoader/dl_dld.xs
+++ b/ext/DynaLoader/dl_dld.xs
@@ -187,4 +187,21 @@ dl_error()
OUTPUT:
RETVAL
+#if defined(USE_ITHREADS)
+
+void
+CLONE(...)
+ CODE:
+ MY_CXT_CLONE;
+
+ /* MY_CXT_CLONE just does a memcpy on the whole structure, so to avoid
+ * using Perl variables that belong to another thread, we create our
+ * own for this thread.
+ */
+ MY_CXT.x_dl_last_error = newSVpvn("", 0);
+ dl_resolve_using = get_av("DynaLoader::dl_resolve_using", GV_ADDMULTI);
+ dl_require_symbols = get_av("DynaLoader::dl_require_symbols", GV_ADDMULTI);
+
+#endif
+
# end.
diff --git a/ext/DynaLoader/dl_dllload.xs b/ext/DynaLoader/dl_dllload.xs
index 61611d7b6d..9d5b2c2c71 100644
--- a/ext/DynaLoader/dl_dllload.xs
+++ b/ext/DynaLoader/dl_dllload.xs
@@ -188,4 +188,19 @@ dl_error()
OUTPUT:
RETVAL
+#if defined(USE_ITHREADS)
+
+void
+CLONE(...)
+ CODE:
+ MY_CXT_CLONE;
+
+ /* MY_CXT_CLONE just does a memcpy on the whole structure, so to avoid
+ * using Perl variables that belong to another thread, we create our
+ * own for this thread.
+ */
+ MY_CXT.x_dl_last_error = newSVpvn("", 0);
+
+#endif
+
# end.
diff --git a/ext/DynaLoader/dl_dlopen.xs b/ext/DynaLoader/dl_dlopen.xs
index 3332758b63..dfa9d0675a 100644
--- a/ext/DynaLoader/dl_dlopen.xs
+++ b/ext/DynaLoader/dl_dlopen.xs
@@ -264,4 +264,19 @@ dl_error()
OUTPUT:
RETVAL
+#if defined(USE_ITHREADS)
+
+void
+CLONE(...)
+ CODE:
+ MY_CXT_CLONE;
+
+ /* MY_CXT_CLONE just does a memcpy on the whole structure, so to avoid
+ * using Perl variables that belong to another thread, we create our
+ * own for this thread.
+ */
+ MY_CXT.x_dl_last_error = newSVpvn("", 0);
+
+#endif
+
# end.
diff --git a/ext/DynaLoader/dl_dyld.xs b/ext/DynaLoader/dl_dyld.xs
index 8bdadd75b9..b7ae161efb 100644
--- a/ext/DynaLoader/dl_dyld.xs
+++ b/ext/DynaLoader/dl_dyld.xs
@@ -221,4 +221,19 @@ dl_error()
OUTPUT:
RETVAL
+#if defined(USE_ITHREADS)
+
+void
+CLONE(...)
+ CODE:
+ MY_CXT_CLONE;
+
+ /* MY_CXT_CLONE just does a memcpy on the whole structure, so to avoid
+ * using Perl variables that belong to another thread, we create our
+ * own for this thread.
+ */
+ MY_CXT.x_dl_last_error = newSVpvn("", 0);
+
+#endif
+
# end.
diff --git a/ext/DynaLoader/dl_hpux.xs b/ext/DynaLoader/dl_hpux.xs
index f85dea1eb9..583cfc270c 100644
--- a/ext/DynaLoader/dl_hpux.xs
+++ b/ext/DynaLoader/dl_hpux.xs
@@ -177,4 +177,20 @@ dl_error()
OUTPUT:
RETVAL
+#if defined(USE_ITHREADS)
+
+void
+CLONE(...)
+ CODE:
+ MY_CXT_CLONE;
+
+ /* MY_CXT_CLONE just does a memcpy on the whole structure, so to avoid
+ * using Perl variables that belong to another thread, we create our
+ * own for this thread.
+ */
+ MY_CXT.x_dl_last_error = newSVpvn("", 0);
+ dl_resolve_using = get_av("DynaLoader::dl_resolve_using", GV_ADDMULTI);
+
+#endif
+
# end.
diff --git a/ext/DynaLoader/dl_mac.xs b/ext/DynaLoader/dl_mac.xs
index 474cd99eac..d06bb3b506 100644
--- a/ext/DynaLoader/dl_mac.xs
+++ b/ext/DynaLoader/dl_mac.xs
@@ -144,4 +144,19 @@ dl_error()
OUTPUT:
RETVAL
+#if defined(USE_ITHREADS)
+
+void
+CLONE(...)
+ CODE:
+ MY_CXT_CLONE;
+
+ /* MY_CXT_CLONE just does a memcpy on the whole structure, so to avoid
+ * using Perl variables that belong to another thread, we create our
+ * own for this thread.
+ */
+ MY_CXT.x_dl_last_error = newSVpvn("", 0);
+
+#endif
+
# end.
diff --git a/ext/DynaLoader/dl_mpeix.xs b/ext/DynaLoader/dl_mpeix.xs
index a73e22a00f..0c810adf7b 100644
--- a/ext/DynaLoader/dl_mpeix.xs
+++ b/ext/DynaLoader/dl_mpeix.xs
@@ -128,4 +128,19 @@ dl_error()
OUTPUT:
RETVAL
+#if defined(USE_ITHREADS)
+
+void
+CLONE(...)
+ CODE:
+ MY_CXT_CLONE;
+
+ /* MY_CXT_CLONE just does a memcpy on the whole structure, so to avoid
+ * using Perl variables that belong to another thread, we create our
+ * own for this thread.
+ */
+ MY_CXT.x_dl_last_error = newSVpvn("", 0);
+
+#endif
+
# end.
diff --git a/ext/DynaLoader/dl_next.xs b/ext/DynaLoader/dl_next.xs
index 40842fd4ac..e5774c0ac3 100644
--- a/ext/DynaLoader/dl_next.xs
+++ b/ext/DynaLoader/dl_next.xs
@@ -321,4 +321,20 @@ dl_error()
OUTPUT:
RETVAL
+#if defined(USE_ITHREADS)
+
+void
+CLONE(...)
+ CODE:
+ MY_CXT_CLONE;
+
+ /* MY_CXT_CLONE just does a memcpy on the whole structure, so to avoid
+ * using Perl variables that belong to another thread, we create our
+ * own for this thread.
+ */
+ MY_CXT.x_dl_last_error = newSVpvn("", 0);
+ dl_resolve_using = get_av("DynaLoader::dl_resolve_using", GV_ADDMULTI);
+
+#endif
+
# end.
diff --git a/ext/DynaLoader/dl_symbian.xs b/ext/DynaLoader/dl_symbian.xs
index 1461142ef3..d10720b7a4 100644
--- a/ext/DynaLoader/dl_symbian.xs
+++ b/ext/DynaLoader/dl_symbian.xs
@@ -221,4 +221,19 @@ dl_error()
OUTPUT:
RETVAL
+#if defined(USE_ITHREADS)
+
+void
+CLONE(...)
+ CODE:
+ MY_CXT_CLONE;
+
+ /* MY_CXT_CLONE just does a memcpy on the whole structure, so to avoid
+ * using Perl variables that belong to another thread, we create our
+ * own for this thread.
+ */
+ MY_CXT.x_dl_last_error = newSVpvn("", 0);
+
+#endif
+
# end.
diff --git a/ext/DynaLoader/dl_vmesa.xs b/ext/DynaLoader/dl_vmesa.xs
index 606c89e4e5..02bb0b26ad 100644
--- a/ext/DynaLoader/dl_vmesa.xs
+++ b/ext/DynaLoader/dl_vmesa.xs
@@ -174,4 +174,19 @@ dl_error()
OUTPUT:
RETVAL
+#if defined(USE_ITHREADS)
+
+void
+CLONE(...)
+ CODE:
+ MY_CXT_CLONE;
+
+ /* MY_CXT_CLONE just does a memcpy on the whole structure, so to avoid
+ * using Perl variables that belong to another thread, we create our
+ * own for this thread.
+ */
+ MY_CXT.x_dl_last_error = newSVpvn("", 0);
+
+#endif
+
# end.
diff --git a/ext/DynaLoader/dl_vms.xs b/ext/DynaLoader/dl_vms.xs
index 6ebcd9bfaa..7029c97688 100644
--- a/ext/DynaLoader/dl_vms.xs
+++ b/ext/DynaLoader/dl_vms.xs
@@ -99,20 +99,10 @@ copy_errmsg(msg,unused)
dTHX;
dMY_CXT;
if (*(msg->dsc$a_pointer) == '%') { /* first line */
- if (dl_last_error)
- strncpy((dl_last_error = saferealloc(dl_last_error,msg->dsc$w_length+1)),
- msg->dsc$a_pointer, msg->dsc$w_length);
- else
- strncpy((dl_last_error = safemalloc(msg->dsc$w_length+1)),
- msg->dsc$a_pointer, msg->dsc$w_length);
- dl_last_error[msg->dsc$w_length] = '\0';
+ sv_setpvn(MY_CXT.x_dl_last_error, msg->dsc$a_pointer, (STRLEN)msg->dsc$w_length);
}
else { /* continuation line */
- int errlen = strlen(dl_last_error);
- dl_last_error = saferealloc(dl_last_error, errlen + msg->dsc$w_length + 2);
- dl_last_error[errlen] = '\n'; dl_last_error[errlen+1] = '\0';
- strncat(dl_last_error, msg->dsc$a_pointer, msg->dsc$w_length);
- dl_last_error[errlen+msg->dsc$w_length+1] = '\0';
+ sv_catpvn(MY_CXT.x_dl_last_error, msg->dsc$a_pointer, (STRLEN)msg->dsc$w_length);
}
DLDEBUG(2,PerlIO_printf(Perl_debug_log, "Saved error message: %s\n", dl_last_error));
return 0;
@@ -153,7 +143,7 @@ dl_private_init(pTHX)
dl_generic_private_init(aTHX);
{
dMY_CXT;
- dl_require_symbols = get_av("DynaLoader::dl_require_symbols", 0x4);
+ dl_require_symbols = get_av("DynaLoader::dl_require_symbols", GV_ADDMULTI);
/* Set up the static control blocks for dl_expand_filespec() */
dl_fab = cc$rms_fab;
dl_nam = cc$rms_nam;
@@ -368,4 +358,20 @@ dl_error()
OUTPUT:
RETVAL
+#if defined(USE_ITHREADS)
+
+void
+CLONE(...)
+ CODE:
+ MY_CXT_CLONE;
+
+ /* MY_CXT_CLONE just does a memcpy on the whole structure, so to avoid
+ * using Perl variables that belong to another thread, we create our
+ * own for this thread.
+ */
+ MY_CXT.x_dl_last_error = newSVpvn("", 0);
+ dl_require_symbols = get_av("DynaLoader::dl_require_symbols", GV_ADDMULTI);
+
+#endif
+
# end.
diff --git a/ext/Encode/AUTHORS b/ext/Encode/AUTHORS
index 022a3c45c7..c928a3200c 100644
--- a/ext/Encode/AUTHORS
+++ b/ext/Encode/AUTHORS
@@ -33,6 +33,7 @@ Jarkko Hietaniemi <jhi@iki.fi>
Jungshik Shin <jshin@mailaps.org>
KONNO Hiroharu <hiroharu.konno@bowneglobal.co.jp>
Laszlo Molnar <ml1050@freemail.hu>
+MATSUNO Tokuhiro <tokuhirom+cpan@gmail.com>
MORIYAMA Masayuki <msyk@mtg.biglobe.ne.jp>
Makamaka <makamaka@donzoko.net>
Mark-Jason Dominus <mjd@plover.com>
diff --git a/ext/Encode/Changes b/ext/Encode/Changes
index 1828e49861..5c68f4829c 100644
--- a/ext/Encode/Changes
+++ b/ext/Encode/Changes
@@ -1,8 +1,25 @@
# Revision history for Perl extension Encode.
#
-# $Id: Changes,v 2.31 2009/02/16 06:18:09 dankogai Exp dankogai $
+# $Id: Changes,v 2.33 2009/03/25 07:55:57 dankogai Exp dankogai $
#
-$Revision: 2.31 $ $Date: 2009/02/16 06:18:09 $
+$Revision: 2.33 $ $Date: 2009/03/25 07:55:57 $
+! lib/Encode/MIME/Header.pm
+ Decontaminated $& which sneaked in on 2.31.
+ <67FC9F3A39C746DA95AAB6BB01539099@robmhp>
+ <693254b90903242352x2dc26ba6p5e68deb871fa88ae@mail.gmail.com>
+ http://coderepos.org/share/changeset/31542
+
+2.32 2009/03/07 07:32:37
+! lib/Encode/Alias.pm t/Alias.t
+ Encode now resolves 'en_US.UTF-8' to utf-8-strict like 'ja_JP.euc'
+ Those who set locale on their shells should be happier now.
+! AUTHORS
+ added tokuhirom
+! Encode.pm
+ "encode(undef, 'str') should die earlier"
+ http://coderepos.org/share/changeset/30790
+
+2.31 2009/02/16 06:18:09
! lib/Encode/MIME/Header.pm
"Revert [29767] and [29771] since it breaks perl 5.8" by miyagawa
http://coderepos.org/share/changeset/30111
diff --git a/ext/Encode/Encode.pm b/ext/Encode/Encode.pm
index b0344d1fb8..c6ba72ffe0 100644
--- a/ext/Encode/Encode.pm
+++ b/ext/Encode/Encode.pm
@@ -1,10 +1,10 @@
#
-# $Id: Encode.pm,v 2.31 2009/02/16 06:13:11 dankogai Exp $
+# $Id: Encode.pm,v 2.33 2009/03/25 07:53:19 dankogai Exp $
#
package Encode;
use strict;
use warnings;
-our $VERSION = sprintf "%d.%02d", q$Revision: 2.31 $ =~ /(\d+)/g;
+our $VERSION = sprintf "%d.%02d", q$Revision: 2.33 $ =~ /(\d+)/g;
sub DEBUG () { 0 }
use XSLoader ();
XSLoader::load( __PACKAGE__, $VERSION );
@@ -146,6 +146,10 @@ sub encode($$;$) {
return undef unless defined $string;
$string .= '' if ref $string; # stringify;
$check ||= 0;
+ unless ( defined $name ) {
+ require Carp;
+ Carp::croak("Encoding name should not be undef");
+ }
my $enc = find_encoding($name);
unless ( defined $enc ) {
require Carp;
diff --git a/ext/Encode/lib/Encode/Alias.pm b/ext/Encode/lib/Encode/Alias.pm
index 5fb12e4b0e..f142403ca9 100644
--- a/ext/Encode/lib/Encode/Alias.pm
+++ b/ext/Encode/lib/Encode/Alias.pm
@@ -2,7 +2,7 @@ package Encode::Alias;
use strict;
use warnings;
no warnings 'redefine';
-our $VERSION = do { my @r = ( q$Revision: 2.11 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
+our $VERSION = do { my @r = ( q$Revision: 2.12 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
sub DEBUG () { 0 }
use base qw(Exporter);
@@ -256,7 +256,7 @@ sub init_aliases {
}
# utf8 is blessed :)
- define_alias( qr/^UTF-8$/i => '"utf-8-strict"' );
+ define_alias( qr/\bUTF-8$/i => '"utf-8-strict"' );
# At last, Map white space and _ to '-'
define_alias( qr/^(\S+)[\s_]+(.*)$/i => '"$1-$2"' );
diff --git a/ext/Encode/lib/Encode/MIME/Header.pm b/ext/Encode/lib/Encode/MIME/Header.pm
index 624bf17bbf..aba5b3bc2f 100644
--- a/ext/Encode/lib/Encode/MIME/Header.pm
+++ b/ext/Encode/lib/Encode/MIME/Header.pm
@@ -3,7 +3,7 @@ use strict;
use warnings;
no warnings 'redefine';
-our $VERSION = do { my @r = ( q$Revision: 2.9 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
+our $VERSION = do { my @r = ( q$Revision: 2.10 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };
use Encode qw(find_encoding encode_utf8 decode_utf8);
use MIME::Base64;
use Carp;
@@ -175,9 +175,9 @@ sub _encode_q {
my $chunk = shift;
$chunk = encode_utf8($chunk);
$chunk =~ s{
- [^0-9A-Za-z]
+ ([^0-9A-Za-z])
}{
- join("" => map {sprintf "=%02X", $_} unpack("C*", $&))
+ join("" => map {sprintf "=%02X", $_} unpack("C*", $1))
}egox;
return HEAD . 'Q?' . $chunk . TAIL;
}
diff --git a/ext/Encode/t/Aliases.t b/ext/Encode/t/Aliases.t
index 716cb8ce6d..fd088d5275 100644
--- a/ext/Encode/t/Aliases.t
+++ b/ext/Encode/t/Aliases.t
@@ -23,6 +23,7 @@ sub init_a2c{
'US-ascii' => 'ascii',
'ISO-646-US' => 'ascii',
'UTF-8' => 'utf-8-strict',
+ 'en_US.UTF-8' => 'utf-8-strict',
'UCS-2' => 'UCS-2BE',
'UCS2' => 'UCS-2BE',
'iso-10646-1' => 'UCS-2BE',
diff --git a/ext/Errno/Errno_pm.PL b/ext/Errno/Errno_pm.PL
index 49e6a66ae6..dc8eaba8b0 100644
--- a/ext/Errno/Errno_pm.PL
+++ b/ext/Errno/Errno_pm.PL
@@ -13,7 +13,8 @@ my $IsSymbian = exists $ENV{SDK} && -d "$ENV{SDK}\\epoc32";
my $IsMSWin32 = $^O eq 'MSWin32' && !$IsSymbian;
unlink "Errno.pm" if -f "Errno.pm";
-open OUT, ">Errno.pm" or die "Cannot open Errno.pm: $!";
+unlink "Errno.tmp" if -f "Errno.tmp";
+open OUT, ">Errno.tmp" or die "Cannot open Errno.tmp: $!";
select OUT;
my $file;
my @files = get_files();
@@ -39,6 +40,9 @@ else {
}
write_errno_pm();
unlink "errno.c" if -f "errno.c";
+close OUT or die "Error closing Errno.tmp: $!";
+select STDOUT;
+rename "Errno.tmp", "Errno.pm" or die "Cannot rename Errno.tmp to Errno.pm: $!";
sub process_file {
my($file) = @_;
diff --git a/ext/Errno/Makefile.PL b/ext/Errno/Makefile.PL
index 9f5b3e77b6..cc45afbfa2 100644
--- a/ext/Errno/Makefile.PL
+++ b/ext/Errno/Makefile.PL
@@ -1,8 +1,6 @@
use ExtUtils::MakeMaker;
use Config;
-@VMS = ($^O eq 'VMS') ? (MAN3PODS => {}) : ();
-
my $arch = "$Config{'archname'}-$Config{'osvers'}";
my $got = "";
if (-e 'arch.txt') {
@@ -24,7 +22,6 @@ if ($got ne $arch) {
WriteMakefile(
NAME => 'Errno',
VERSION_FROM => 'Errno_pm.PL',
- MAN3PODS => {}, # Pods will be built by installman.
PL_FILES => {'Errno_pm.PL'=>'Errno.pm'},
PM => {'Errno.pm' => '$(INST_LIBDIR)/Errno.pm'},
'clean' => {FILES => 'Errno.pm arch.txt'},
@@ -33,7 +30,6 @@ WriteMakefile(
SUFFIX => '.gz',
DIST_DEFAULT => 'd/Errno.pm tardist',
},
- @VMS,
);
sub MY::postamble {
diff --git a/ext/Fcntl/Makefile.PL b/ext/Fcntl/Makefile.PL
index f1d9bdf2c9..43067893eb 100644
--- a/ext/Fcntl/Makefile.PL
+++ b/ext/Fcntl/Makefile.PL
@@ -2,7 +2,6 @@ use ExtUtils::MakeMaker;
use ExtUtils::Constant 0.11 'WriteConstants';
WriteMakefile(
NAME => 'Fcntl',
- MAN3PODS => {}, # Pods will be built by installman.
XSPROTOARG => '-noprototypes', # XXX remove later?
VERSION_FROM => 'Fcntl.pm',
realclean => {FILES=> 'const-c.inc const-xs.inc'},
diff --git a/ext/File-Glob/Makefile.PL b/ext/File-Glob/Makefile.PL
index 0d4267a25b..a0f4e6e856 100644
--- a/ext/File-Glob/Makefile.PL
+++ b/ext/File-Glob/Makefile.PL
@@ -3,7 +3,6 @@ use ExtUtils::Constant 0.11 'WriteConstants';
WriteMakefile(
NAME => 'File::Glob',
VERSION_FROM => 'Glob.pm',
- MAN3PODS => {}, # Pods will be built by installman.
OBJECT => 'bsd_glob$(OBJ_EXT) Glob$(OBJ_EXT)',
realclean => {FILES=> 'const-c.inc const-xs.inc'},
diff --git a/ext/File-Glob/bsd_glob.c b/ext/File-Glob/bsd_glob.c
index c6fce1e205..db36007b0f 100644
--- a/ext/File-Glob/bsd_glob.c
+++ b/ext/File-Glob/bsd_glob.c
@@ -82,11 +82,8 @@ static char sscsid[]= "$OpenBSD: glob.c,v 1.8.10.1 2001/04/10 jason Exp $";
#ifndef MAXPATHLEN
# ifdef PATH_MAX
# define MAXPATHLEN PATH_MAX
-# ifdef MACOS_TRADITIONAL
-# define MAXPATHLEN 255
-# else
-# define MAXPATHLEN 1024
-# endif
+# else
+# define MAXPATHLEN 1024
# endif
#endif
@@ -95,20 +92,16 @@ static char sscsid[]= "$OpenBSD: glob.c,v 1.8.10.1 2001/04/10 jason Exp $";
#endif
#ifndef ARG_MAX
-# ifdef MACOS_TRADITIONAL
-# define ARG_MAX 65536 /* Mac OS is actually unlimited */
+# ifdef _SC_ARG_MAX
+# define ARG_MAX (sysconf(_SC_ARG_MAX))
# else
-# ifdef _SC_ARG_MAX
-# define ARG_MAX (sysconf(_SC_ARG_MAX))
+# ifdef _POSIX_ARG_MAX
+# define ARG_MAX _POSIX_ARG_MAX
# else
-# ifdef _POSIX_ARG_MAX
-# define ARG_MAX _POSIX_ARG_MAX
+# ifdef WIN32
+# define ARG_MAX 14500 /* from VC's limits.h */
# else
-# ifdef WIN32
-# define ARG_MAX 14500 /* from VC's limits.h */
-# else
-# define ARG_MAX 4096 /* from POSIX, be conservative */
-# endif
+# define ARG_MAX 4096 /* from POSIX, be conservative */
# endif
# endif
# endif
@@ -123,11 +116,7 @@ static char sscsid[]= "$OpenBSD: glob.c,v 1.8.10.1 2001/04/10 jason Exp $";
#define BG_QUOTE '\\'
#define BG_RANGE '-'
#define BG_RBRACKET ']'
-#ifdef MACOS_TRADITIONAL
-# define BG_SEP ':'
-#else
-# define BG_SEP '/'
-#endif
+#define BG_SEP '/'
#ifdef DOSISH
#define BG_SEP2 '\\'
#endif
@@ -227,23 +216,6 @@ my_readdir(DIR *d)
#endif
-#ifdef MACOS_TRADITIONAL
-#include <Files.h>
-#include <Types.h>
-#include <string.h>
-
-#define NO_UPDIR_ERR 1 /* updir resolving failed */
-
-static Boolean g_matchVol; /* global variable */
-static short updir(char *path);
-static short resolve_updirs(char *new_pattern);
-static void remove_trColon(char *path);
-static short glob_mark_Mac(Char *pathbuf, Char *pathend, Char *pathend_last);
-static OSErr GetVolInfo(short volume, Boolean indexed, FSSpec *spec);
-static void name_f_FSSpec(StrFileName volname, FSSpec *spec);
-
-#endif
-
int
bsd_glob(const char *pattern, int flags,
int (*errfunc)(const char *, int), glob_t *pglob)
@@ -251,16 +223,7 @@ bsd_glob(const char *pattern, int flags,
const U8 *patnext;
int c;
Char *bufnext, *bufend, patbuf[MAXPATHLEN];
-
-#ifdef MACOS_TRADITIONAL
- char *new_pat, *p, *np;
- int err;
- size_t len;
-#endif
-
-#ifndef MACOS_TRADITIONAL
patnext = (U8 *) pattern;
-#endif
/* TODO: GLOB_APPEND / GLOB_DOOFFS aren't supported yet */
#if 0
if (!(flags & GLOB_APPEND)) {
@@ -300,61 +263,6 @@ bsd_glob(const char *pattern, int flags,
}
#endif
-#ifdef MACOS_TRADITIONAL
- /* Check if we need to match a volume name (e.g. '*HD:*') */
- g_matchVol = false;
- p = (char *) pattern;
- if (*p != BG_SEP) {
- p++;
- while (*p != BG_EOS) {
- if (*p == BG_SEP) {
- g_matchVol = true;
- break;
- }
- p++;
- }
- }
-
- /* Transform the pattern:
- * (a) Resolve updirs, e.g.
- * '*:t*p::' -> '*:'
- * ':a*:tmp::::' -> '::'
- * ':base::t*p:::' -> '::'
- * '*HD::' -> return 0 (error, quit silently)
- *
- * (b) Remove a single trailing ':', unless it's a "match volume only"
- * pattern like '*HD:'; e.g.
- * '*:tmp:' -> '*:tmp' but
- * '*HD:' -> '*HD:'
- * (If we don't do that, even filenames will have a trailing ':' in
- * the result.)
- */
-
- /* We operate on a copy of the pattern */
- len = strlen(pattern);
- Newx(new_pat, len + 1, char);
- if (new_pat == NULL)
- return (GLOB_NOSPACE);
-
- p = (char *) pattern;
- np = new_pat;
- while (*np++ = *p++) ;
-
- /* Resolve updirs ... */
- err = resolve_updirs(new_pat);
- if (err) {
- Safefree(new_pat);
- /* The pattern is incorrect: tried to move
- up above the volume root, see above.
- We quit silently. */
- return 0;
- }
- /* remove trailing colon ... */
- remove_trColon(new_pat);
- patnext = (U8 *) new_pat;
-
-#endif /* MACOS_TRADITIONAL */
-
if (flags & GLOB_QUOTE) {
/* Protect the quoted characters. */
while (bufnext < bufend && (c = *patnext++) != BG_EOS)
@@ -382,19 +290,10 @@ bsd_glob(const char *pattern, int flags,
*bufnext++ = c;
*bufnext = BG_EOS;
-#ifdef MACOS_TRADITIONAL
- if (flags & GLOB_BRACE)
- err = globexp1(patbuf, pglob);
- else
- err = glob0(patbuf, pglob);
- Safefree(new_pat);
- return err;
-#else
if (flags & GLOB_BRACE)
return globexp1(patbuf, pglob);
else
return glob0(patbuf, pglob);
-#endif
}
/*
@@ -613,12 +512,6 @@ glob0(const Char *pattern, glob_t *pglob)
Char *bufnext, patbuf[MAXPATHLEN];
size_t limit = 0;
-#ifdef MACOS_TRADITIONAL
- if ( (*pattern == BG_TILDE) && (pglob->gl_flags & GLOB_TILDE) ) {
- return(globextend(pattern, pglob, &limit));
- }
-#endif
-
qpat = globtilde(pattern, patbuf, MAXPATHLEN, pglob);
qpatnext = qpat;
oldflags = pglob->gl_flags;
@@ -777,17 +670,10 @@ glob2(Char *pathbuf, Char *pathbuf_last, Char *pathend, Char *pathend_last,
(S_ISLNK(sb.st_mode) &&
(g_stat(pathbuf, &sb, pglob) == 0) &&
S_ISDIR(sb.st_mode)))) {
-#ifdef MACOS_TRADITIONAL
- short err;
- err = glob_mark_Mac(pathbuf, pathend, pathend_last);
- if (err)
- return (err);
-#else
if (pathend+1 > pathend_last)
return (1);
*pathend++ = BG_SEP;
*pathend = BG_EOS;
-#endif
}
++pglob->gl_matchc;
#ifdef GLOB_DEBUG
@@ -873,49 +759,6 @@ glob3(Char *pathbuf, Char *pathbuf_last, Char *pathend, Char *pathend_last,
}
#endif
-#ifdef MACOS_TRADITIONAL
- if ((!*pathbuf) && (g_matchVol)) {
- FSSpec spec;
- short index;
- StrFileName vol_name; /* unsigned char[64] on MacOS */
-
- err = 0;
- nocase = ((pglob->gl_flags & GLOB_NOCASE) != 0);
-
- /* Get and match a list of volume names */
- for (index = 0; !GetVolInfo(index+1, true, &spec); ++index) {
- register U8 *sc;
- register Char *dc;
-
- name_f_FSSpec(vol_name, &spec);
-
- /* Initial BG_DOT must be matched literally. */
- if (*vol_name == BG_DOT && *pattern != BG_DOT)
- continue;
- dc = pathend;
- sc = (U8 *) vol_name;
- while (dc < pathend_last && (*dc++ = *sc++) != BG_EOS)
- ;
- if (dc >= pathend_last) {
- *dc = BG_EOS;
- err = 1;
- break;
- }
-
- if (!match(pathend, pattern, restpattern, nocase)) {
- *pathend = BG_EOS;
- continue;
- }
- err = glob2(pathbuf, pathbuf_last, --dc, pathend_last,
- restpattern, restpattern_last, pglob, limitp);
- if (err)
- break;
- }
- return(err);
-
- } else { /* open dir */
-#endif /* MACOS_TRADITIONAL */
-
if ((dirp = g_opendir(pathbuf, pglob)) == NULL) {
/* TODO: don't call for ENOENT or ENOTDIR? */
if (pglob->gl_errfunc) {
@@ -968,10 +811,6 @@ glob3(Char *pathbuf, Char *pathbuf_last, Char *pathend, Char *pathend_last,
else
PerlDir_close(dirp);
return(err);
-
-#ifdef MACOS_TRADITIONAL
- }
-#endif
}
@@ -1130,11 +969,7 @@ g_opendir(register Char *str, glob_t *pglob)
char buf[MAXPATHLEN];
if (!*str) {
-#ifdef MACOS_TRADITIONAL
- my_strlcpy(buf, ":", sizeof(buf));
-#else
my_strlcpy(buf, ".", sizeof(buf));
-#endif
} else {
if (g_Ctoc(str, buf, sizeof(buf)))
return(NULL);
@@ -1212,209 +1047,3 @@ qprintf(const char *str, register Char *s)
(void)printf("\n");
}
#endif /* GLOB_DEBUG */
-
-
-#ifdef MACOS_TRADITIONAL
-
-/* Replace the last occurrence of the pattern ":[^:]+::", e.g. ":lib::",
- with a single ':', if possible. It is not an error, if the pattern
- doesn't match (we return -1), but if there are two consecutive colons
- '::', there must be a preceding ':[^:]+'. Hence, a volume path like
- "HD::" is considered to be an error (we return 1), that is, it can't
- be resolved. We return 0 on success.
-*/
-
-static short
-updir(char *path)
-{
- char *pb, *pe, *lastchar;
- char *bgn_mark, *end_mark;
- char *f, *m, *b; /* front, middle, back */
- size_t len;
-
- len = strlen(path);
- lastchar = path + (len-1);
- b = lastchar;
- m = lastchar-1;
- f = lastchar-2;
-
- /* find a '[^:]::' (e.g. b::) pattern ... */
- while ( !( (*f != BG_SEP) && (*m == BG_SEP) && (*b == BG_SEP) )
- && (f >= path)) {
- f--;
- m--;
- b--;
- }
-
- if (f < path) { /* no (more) match */
- return -1;
- }
-
- end_mark = b;
-
- /* ... and now find its preceding colon ':' */
- while ((*f != BG_SEP) && (f >= path)) {
- f--;
- }
- if (f < path) {
- /* No preceding colon found, must be a
- volume path. We can't move up the
- tree and that's an error */
- return 1;
- }
- bgn_mark = f;
-
- /* Shrink path, i.e. exclude all characters between
- bgn_mark and end_mark */
-
- pb = bgn_mark;
- pe = end_mark;
- while (*pb++ = *pe++) ;
- return 0;
-}
-
-
-/* Resolve all updirs in pattern. */
-
-static short
-resolve_updirs(char *new_pattern)
-{
- short err;
-
- do {
- err = updir(new_pattern);
- } while (!err);
- if (err == 1) {
- return NO_UPDIR_ERR;
- }
- return 0;
-}
-
-
-/* Remove a trailing colon from the path, but only if it's
- not a volume path (e.g. HD:) and not a path consisting
- solely of colons. */
-
-static void
-remove_trColon(char *path)
-{
- char *lastchar, *lc;
-
- /* if path matches the pattern /:[^:]+:$/, we can
- remove the trailing ':' */
-
- lc = lastchar = path + (strlen(path) - 1);
- if (*lastchar == BG_SEP) {
- /* there's a trailing ':', there must be at least
- one preceding char != ':' and a preceding ':' */
- lc--;
- if ((*lc != BG_SEP) && (lc >= path)) {
- lc--;
- } else {
- return;
- }
- while ((*lc != BG_SEP) && (lc >= path)) {
- lc--;
- }
- if (lc >= path) {
- /* ... there's a preceding ':', we remove
- the trailing colon */
- *lastchar = BG_EOS;
- }
- }
-}
-
-
-/* With the GLOB_MARK flag on, we append a colon, if pathbuf
- is a directory. If the directory name contains no colons,
- e.g. 'lib', we can't simply append a ':', since this (e.g.
- 'lib:') is not a valid (relative) path on Mac OS. Instead,
- we add a leading _and_ trailing ':'. */
-
-static short
-glob_mark_Mac(Char *pathbuf, Char *pathend, Char *pathend_last)
-{
- Char *p, *pe;
- Boolean is_file = true;
-
- /* check if pathbuf contains a ':',
- i.e. is not a file name */
- p = pathbuf;
- while (*p != BG_EOS) {
- if (*p == BG_SEP) {
- is_file = false;
- break;
- }
- p++;
- }
-
- if (is_file) {
- if (pathend+2 > pathend_last) {
- return (1);
- }
- /* right shift one char */
- pe = p = pathend;
- p--;
- pathend++;
- while (p >= pathbuf) {
- *pe-- = *p--;
- }
- /* first char becomes a colon */
- *pathbuf = BG_SEP;
- /* append a colon */
- *pathend++ = BG_SEP;
- *pathend = BG_EOS;
-
- } else {
- if (pathend+1 > pathend_last) {
- return (1);
- }
- *pathend++ = BG_SEP;
- *pathend = BG_EOS;
- }
- return 0;
-}
-
-
-/* Return a FSSpec record for the specified volume
- (borrowed from MacPerl.xs). */
-
-static OSErr
-GetVolInfo(short volume, Boolean indexed, FSSpec* spec)
-{
- OSErr err; /* OSErr: 16-bit integer */
- HParamBlockRec pb;
-
- pb.volumeParam.ioNamePtr = spec->name;
- pb.volumeParam.ioVRefNum = indexed ? 0 : volume;
- pb.volumeParam.ioVolIndex = indexed ? volume : 0;
-
- if (err = PBHGetVInfoSync(&pb))
- return err;
-
- spec->vRefNum = pb.volumeParam.ioVRefNum;
- spec->parID = 1;
-
- return noErr; /* 0 */
-}
-
-/* Extract a C name from a FSSpec. Note that there are
- no leading or trailing colons. */
-
-static void
-name_f_FSSpec(StrFileName name, FSSpec *spec)
-{
- unsigned char *nc;
- const short len = spec->name[0];
- short i;
-
- /* FSSpec.name is a Pascal string,
- convert it to C ... */
- nc = name;
- for (i=1; i<=len; i++) {
- *nc++ = spec->name[i];
- }
- *nc = BG_EOS;
-}
-
-#endif /* MACOS_TRADITIONAL */
diff --git a/ext/Filter-Util-Call/Makefile.PL b/ext/Filter-Util-Call/Makefile.PL
deleted file mode 100644
index 030dbc2d31..0000000000
--- a/ext/Filter-Util-Call/Makefile.PL
+++ /dev/null
@@ -1,7 +0,0 @@
-use ExtUtils::MakeMaker;
-
-WriteMakefile(
- NAME => 'Filter::Util::Call',
- VERSION_FROM => 'Call.pm',
- MAN3PODS => {}, # Pods will be built by installman.
-);
diff --git a/ext/GDBM_File/Makefile.PL b/ext/GDBM_File/Makefile.PL
index 1286dcd670..24e6ee4cb5 100644
--- a/ext/GDBM_File/Makefile.PL
+++ b/ext/GDBM_File/Makefile.PL
@@ -3,7 +3,6 @@ use ExtUtils::Constant 0.11 'WriteConstants';
WriteMakefile(
NAME => 'GDBM_File',
LIBS => ["-lgdbm", "-ldbm"],
- MAN3PODS => {}, # Pods will be built by installman.
XSPROTOARG => '-noprototypes', # XXX remove later?
VERSION_FROM => 'GDBM_File.pm',
realclean => {FILES=> 'const-c.inc const-xs.inc'},
diff --git a/ext/Hash-Util-FieldHash/Makefile.PL b/ext/Hash-Util-FieldHash/Makefile.PL
deleted file mode 100644
index 4793ec912b..0000000000
--- a/ext/Hash-Util-FieldHash/Makefile.PL
+++ /dev/null
@@ -1,22 +0,0 @@
-use 5.009004;
-use ExtUtils::MakeMaker;
-# See lib/ExtUtils/MakeMaker.pm for details of how to influence
-# the contents of the Makefile that is written.
-WriteMakefile(
- NAME => 'Hash::Util::FieldHash',
- VERSION_FROM => 'lib/Hash/Util/FieldHash.pm', # finds $VERSION
- PREREQ_PM => {}, # e.g., Module::Name => 1.1
- ($] >= 5.005 ? ## Add these new keywords supported since 5.005
- (ABSTRACT_FROM => 'lib/Hash/Util/FieldHash.pm',
- AUTHOR => 'Anno Siegel <anno4000@zrz.tu-berlin.de>') : ()),
- LIBS => [''], # e.g., '-lm'
- DEFINE => '', # e.g., '-DHAVE_SOMETHING'
- # Insert -I. if you add *.h files later:
- INC => '', # e.g., '-I/usr/include/other'
- # Un-comment this if you add C files to link with later:
- # OBJECT => '$(O_FILES)', # link all the C files too
- # Don't manify in core build
- (grep( /^PERL_CORE=1$/, @ARGV) ?
- (MAN3PODS => {}) :
- ()),
-);
diff --git a/ext/Hash-Util/Makefile.PL b/ext/Hash-Util/Makefile.PL
index eee40c5e34..9faef90d2a 100644
--- a/ext/Hash-Util/Makefile.PL
+++ b/ext/Hash-Util/Makefile.PL
@@ -5,10 +5,8 @@ use ExtUtils::MakeMaker;
WriteMakefile(
VERSION_FROM => "lib/Hash/Util.pm",
- MAN3PODS => {}, # Pods will be built by installman.
NAME => "Hash::Util",
DEFINE => "-DPERL_EXT",
- NORECURS => 1, # Hash::Util::FieldHash is treated as distinct.
);
package MY;
diff --git a/ext/I18N-Langinfo/Makefile.PL b/ext/I18N-Langinfo/Makefile.PL
index b307aca2e0..eace2657b0 100644
--- a/ext/I18N-Langinfo/Makefile.PL
+++ b/ext/I18N-Langinfo/Makefile.PL
@@ -12,7 +12,6 @@ WriteMakefile(
'DEFINE' => '', # e.g., '-DHAVE_SOMETHING'
# Insert -I. if you add *.h files later:
'INC' => '', # e.g., '-I/usr/include/other'
- 'MAN3PODS' => {}, # Pods will be built by installman
realclean => {FILES=> 'const-c.inc const-xs.inc'},
# Un-comment this if you add C files to link with later:
# 'OBJECT' => '$(O_FILES)', # link all the C files too
diff --git a/ext/Compress-Zlib/Changes b/ext/IO-Compress/Changes
index 931eea6e94..ae9ba36ac6 100644
--- a/ext/Compress-Zlib/Changes
+++ b/ext/IO-Compress/Changes
@@ -1,6 +1,62 @@
CHANGES
-------
+ 2.019 4 May 2009
+
+ * IO::Uncompress::Adapter::Bunzip2
+ - Fixed problem with EOF check.
+
+ 2.018 3 May 2009
+
+ * IO::Unompress::Bunzip2
+ - The interface to Compress-Raw-Bzip2 now uses the new LimitOutput
+ feature. This will make all of the bzip2-related IO-Compress modules
+ less greedy in their memory consumption.
+
+ * IO::Compress::Zip
+ - Fixed exTime & exUnix2
+
+ - Fixed 'Use of uninitialized value in pack' warning when using
+ ZIP_CM_STORE.
+
+ 2.017 30 March 2009
+
+ * Merged IO-Compress-Base, IO-Compress-Bzip2, IO-Compress-Zlib &
+ Compress-Zlib into IO-Compress.
+
+ * The interface to Compress-Raw-Zlib now uses the new LimitOutput
+ feature. This will make all of the zlib-related IO-Compress modules
+ less greedy in their memory consumption.
+
+ * Removed MAN3PODS from Makefile.PL
+
+ * A few changes to get the test harness to work on VMS courtesy of
+ Craig. A. Berry.
+
+ * IO::Compress::Base & IO::Uncompress::Base
+ Downgraded some croaks in the constructors to just set $! (by letting
+ the code attempt to open a file and fail).
+ This makes the behavior more consistent to a standard open.
+ [RT #42657]
+
+ * IO::Uncompress::Base
+ Doing a seek with MultiStream could drop some of the uncompressed
+ data. Fixed.
+
+ * IO::Compress::Zip
+ - Fixed problem with the uncompressed & uncompressed fields when
+ zip64 is enabled. They were set to 0x0000FFFF instead of
+ 0xFFFFFFFF. Also the ZIP64 extra field was 4 bytes short.
+ Problem spotted by Dino Chiesa.
+
+ * IO::Uncompress::Unzip
+ - use POSIX::mktime instead of Time::Local::timelocal to convert
+ the zip DOS time field into Unix time.
+
+ * Compress::Zlib
+ - Documented Compress::Zlib::zlib_version()
+
+
2.015 3 September 2008
* Makefile.PL
@@ -11,31 +67,98 @@ CHANGES
* Makefile.PL
Updated to check for indirect dependencies.
+ 2.013 18 July 2008
+
+ * IO::Compress::Base
+ - Allow IO::Compress::Base::Parameters::parse to accept an
+ IO::Compress::Base::Parameters object.
+
2.012 15 July 2008
- * No Changes
+ * IO::Compress::Base
+ - Silenced an uninitialised value warning when reading a line
+ at a time from a zip file where the content uses ZIP_CM_STORE.
+ [Problem spotted & fixed by Jeff Holt]
+ * IO::Compress::Base & IO::Uncompress::Base
+ - local-ise $!, $? et al in the DESTROY methods.
+
2.011 17 May 2008
- * No Changes
+ * IO::Compress::Base
+ - Fixed problem that prevented the creation of a zip file that
+ contained more than one compression method.
+
+ * IO::Compress::Base::Common
+ - The private Validator class in this module clashes with another
+ CPAN module. Moved Validator into the IO::Compress::Base::Common
+ namespace.
+ [RT #35954]
+
+ * IO::Uncompress::Unzip
+ - Print an error message if the zip file contains a
+ member compressed with bzip2 and IO::Uncompress::Bunzip2 is
+ not available.
+ - Could not cope with mixed compression zip files. For example a
+ zip file that contains both STORED and DEFLATED content.
+ [RT #35573]
2.010 5 May 2008
* Fixed problem that meant Perl 5.10 could not upgrade this module.
- [RT #35341]
+ [RT #35342 & 35341]
2.009 20 April 2008
- * Minor documentation issue with flush.
- [rt.cpan.org #31446]
+ * Removed the alpha status from File::GlobMapper
+
+ * IO::Compress::Base
+ When writing output never output a zero length buffer.
+ Done to improve interoperability with other tied filenandle
+ modules.
+
+ * Changed IO::Uncompress::Base to not use the offset parameter of
+ the read method when reading from a filehandle.
+
+ The object returned from Net::FTP::retr implements a non-standard
+ read method. The third parameter is used for a timeout value
+ rather than an offset.
+ [rt.cpan#33231]
+
+ * Changed IO::Uncompress::Base to not use the eof method when
+ reading from a filehandle.
+
+ The object returned from Net::FTP::retr implements both the read
+ method and the eof method. Unfortunately the implementation of
+ the read method uses non-buffered IO (by using sysread) while
+ the eof method uses buffered IO. Mixing buffered and non-buffered
+ IO results in data corruption.
+
+ * IO::Compress::Zip
+
+ - Added exUnix2 option to allow storing of UID & GID.
+ - When running on a Unix derivative the ExtAttr option now defaults
+ to the equivalent of 0666. For all other systems the default
+ remains 0.
+
+ * Compress::Zlib
+ - Minor documentation issue with flush.
+ [rt.cpan.org #31446]
+
2.008 2 November 2007
* Minor documentation changes in README
- 2.007 22 September 20007
+ * t/compress/truncate.pl
+ EBCDIC Cleanup.
- * lib/Compress/Zlib.pm -- 1.x Backward Compatability issues
+ * IO::Compress::Gzip::Constants.pm
+ Tidied up the character classes used to defined invalid
+ FNAME & FCOMMENT fields for EBCDIC.
+
+ * Compress::Zlib
+ lib/Compress/Zlib.pm -- 1.x Backward Compatability issues
gzclose - documented return value was wrong, should be 0 for ok.
gzflush - return value didn't match 1.x, should return 0 if ok.
[rt.cpan.org #29215] and Debian bug #440943 http://bugs.debian.org/440943
@@ -46,22 +169,77 @@ CHANGES
Added INSTALLDIRS directive to install as a core module when built
on a perl >= 5.9.
- * t/03zlib-v1.t
- Fixed crc32 and adler32 tests in to remove ascii assumption.
+ * IO::Uncompress::RawDeflate
+
+ - Fixed export problem - "$RawDeflateError" and "rawdeflate" were
+ not being exported with ":all".
+
+ * Compress::Zlib
+ - t/03zlib-v1.t
+ Fixed crc32 and adler32 tests in to remove ascii assumption.
+
+ - lib/Compress/Zlib.pm
+ Make gzreadline not support $/, just like in Compress::Zlib 1.x
+ Folk who want $/ with readline support can get it in
+ IO::Uncompress::Gunzip. [rt.cpan.org #28663] and
+ Debian bug #435656 http://bugs.debian.org/435656
+
- * lib/Compress/Zlib.pm
- Make gzreadline not support $/, just like in Compress::Zlib 1.x
- Folk who want $/ with readline support can get it in
- IO::Uncompress::Gunzip.
- [rt.cpan.org #28663] and Debian bug #435656 http://bugs.debian.org/435656
2.005 18 June 2007
- * Added info about removing Compress::Zlib version 1, before
+ * Stephen Turner reported a problem when using IO::Uncompress::Gunzip
+ with XML::Parser. Turns out there were two issues.
+
+ Firstly an IO::Uncompress object isn't an IO::Handle. It is now.
+
+ Secondly the implementation of "read" wasn't honouring this
+
+ SCALAR will be grown or shrunk to the length actually read.
+
+ In particular it didn't do the right thing on EOF.
+ This has been fixed.
+
+ * IO::Compress::Gzip & IO::Uncompress::Gunzip
+
+ - RFC1952 says that the FNAME & FCOMMENT header fields must be ISO
+ 8859-1 (LATIN-1) characters. The code can optionally police this.
+ Added a fix for this logic when running on EBCDIC.
+
+ * Compress::Zlib
+ Added info about removing Compress::Zlib version 1, before
installing version 2.
2.004 3 March 2007
- * rewrote memGzip using IO::Compress::Gzip::gzip
+ * Made seek less wasteful of memory.
+
+ * IO::Compress::Zip
+
+ - Added Zip64 documentation.
+
+ - Fixed extended timestamp.
+ Creation time isn't available in Unix so only store the
+ modification time and the last access time in the extended field.
+
+ - Fixed file mode.
+
+ - Added ExtAttr option to control the value of the "external file
+ attributes" field in the central directory.
+
+ - Added Unix2 extended attribute ("Ux").
+ This stores the UID & GID.
+
+ * IO::Compress::Gzip
+
+ - Fixed 050interop-gzip.t for Windows
+
+ * IO::Compress::Bzip2
+
+ - Fixed 050interop-bzip2.t for Windows
+
+ * Compress::Zlib
+
+ - rewrote memGzip using IO::Compress::Gzip::gzip
2.003 2 January 2007
@@ -71,10 +249,18 @@ CHANGES
* Documentation updates.
- * Fix append mode with gzopen.
- rt-cpan.org 24041
+ * Added IO::Handle to the ISA test in isaFilehandle
+
+ * Add an explicit use_ok test for Scalar::Util in the test harness.
+ The error message reported by 01misc implied the problem was
+ somewhere else.
+ Also explictly check that 'dualvar' is available.
+
+ * Compress::Zlib
+ - Fix append mode with gzopen.
+ rt-cpan.org 24041
- * Allow gzopen to read from and write to a scalar reference.
+ - Allow gzopen to read from and write to a scalar reference.
2.001 1 November 2006
@@ -82,34 +268,162 @@ CHANGES
2.000_14 26 October 2006
- * No changes.
+ * IO::Uncompress::Base
+ Added support for $/ in record mode
+
+ * IO::Uncompress::Base
+ The readline interface was substantially slower than the 1.x
+ equivalent. This has now been sorted.
+ Thanks to Andreas J. Koenig for spotting the problem.
+
+ * IO::Uncompress::AnyUncompress
+ Added IO::Uncompress::Lzf to the list of supported uncompresors.
+
+ * IO::Uncompress::Base
+ Added TrailingData to one-shot interface.
+
+ * IO::Uncompress::AnyUncompress
+ Remove raw-deflate (RFC1951) from the default list of compressors
+ to check.
+ It can still be included if the new RawInflate parameter is
+ supplied.
+ This change was made because the only way to tell if content is
+ raw-deflate is to attempt to uncompress it - a few false positives
+ have popped up recently, which suggests that auto-detecting raw
+ deflate is far from perfect.
+ The equivalent change has been made to IO::Uncompress::AnyInflate.
+ [Core patch #28445]
+
+ * Don't check that filehandles are writable. It would seem that
+ "-w *STDOUT" on windows returns false.
+ [Core Patch #28415]
+
+ * IO::Uncompress::Deflate
+ Beefed up the magic signature check. Means less false positives
+ when auto-detecting the compression type.
+
+ * IO::Uncompress::UnZip
+ Tighten up the zip64 extra field processing to cope with the case
+ wheere only some of the local header fields are superceeded.
+
+ * IO::Uncompress::AnyInflate
+ Remove raw-deflate (RFC 1951) from the default list of compressors
+ to check.
+ It can still be included if the new RawInflate parameter is
+ supplied.
+ This change was made because the only way to tell if content is
+ raw-deflate is to attempt to uncompress it - a few false positives
+ have popped up recently, which suggests that auto-detecting raw
+ deflate is far from perfect.
+ The equivalent change has been made to IO::Uncompress::AnyUncompress.
+ [Core patch #28445]
2.000_13 20 June 2006
- * No changes.
+ * Store compress & uncompressed sizes as 64-bit.
+
+ * For one-shot uncompression, like this
+
+ unzip "some.zip" => \@a, MultiStream => 1;
+
+ Push each uncompressed stream from "some.zip" onto @a.
+
+ * Added IO::Compress::Base::FilterEnvelope
+
+ * Added IO::Uncompress::Base::nextStream
+
+ * The '-' filehandle now maps to either *STDIN or *STDOUT.
+ This keeps mod_perl happier. Was using these before
+
+ new IO::File("<-")
+ new IO::File(">-")
+
+ * Preliminary support for reading zip files with zip64 members.
+
+ 2.000_12 3 May 2006
+
+ * Moved the code for creating and parsing the gzip extra field into
+ IO::Compress::Zlib::Extra.pm so that IO::Compress::Zip &
+ IO::Uncompress::Unzip can use it as well.
+
+ * Added ExtraFieldLocal & ExtraFieldCentral options to IO::Compress::Zip.
+ These allow the creation of user-defined extra fields in the local
+ and central headers, just like the ExtraField option in
+ IO::Compress::Gzip.
- 2.000_12 16 April 2006
+ * Moved the zip constants into IO::Compress::Zip::Constants
- * Fixed gzread to zap the output buffer to an empty string when zero
+ * Added exTime option to IO::Compress::Zip.
+ This allows creation of the extended timestamp extra field.
+
+ * Added Minimal option to IO::Compress::Zip.
+ This disables the creation of all extended fields.
+
+ * Added TextFlag option to IO::Compress::Zip.
+
+ * Documented Comment and ZipComment options in IO::Compress::Zip.
+
+ * Compress::Zlib
+ Fixed gzread to zap the output buffer to an empty string when zero
bytes are requested. This matches the behaviour of C::Z 1.x
2.000_11 10 April 2006
- * No changes.
+ * Transparent + InputLength made more robust where input data is not
+ compressed.
+
+ * Updated Documentation for zip modules.
+
+ * Changed IO::Compress::Zip 'Store' option to 'Method' and added
+ symbolic constants ZIP_CM_STORE, ZIP_CM_DEFLATE and ZIP_CM_BZIP2 to
+ allow the compression method to be picked by the user.
+
+ * Added support to allow bzip2 compressed data to be written/read
+ with IO::Compress::Zip and IO::Uncompress::Unzip.
+
+ * Beefed up 050interop-gzip.t to check that the external gzip command
+ works as expected before starting the tests. This means that
+ this test harness will just be skipped on problematic systems.
+
+ * Merged core patch 27565 from Steve Peters. This works around a
+ problem with gzip on OpenBSD where it doesn't seem to like
+ compressing files < 10 bytes long.
+
+ * Beefed up 050interop-bzip2.t to check that the external bzip2 command
+ works as expected before starting the tests. This means that
+ this test harness will just be skipped on problematic systems.
2.000_10 13 March 2006
- * Changed gzread so that its behaviour matches C::Z::gzread 1.x if it
+ * AnyUncompress doesn't assume that IO-Compress-Zlib is installed any
+ more.
+
+ * Documentation updates.
+
+ * Compress::Zlib
+ Changed gzread so that its behaviour matches C::Z::gzread 1.x if it
is called after eof. In this case it will write an empty string
into the output parameter. This change is solely for backward
compatability reasons.
2.000_09 3 March 2006
- * Posted to CPAN
+ * Released to CPAN.
2.000_08 2 March 2006
+ * Split IO::Compress::Base into its own distribution.
+
+ * Split IO::Compress::Bzip2 into its own distribution.
+
+ * Added opened, autoflush and input_line_number.
+
+ * Beefed up support for $.
+
+ * Split IO::Compress::Zlib into its own distribution.
+
+ * Beefed up support for zip/unzip
+
* Breakout zlib specific code into separate modules.
* Limited support for reading/writing zip files
@@ -159,6 +473,8 @@ CHANGES
* First Beta relase of Compress::zlib rewrite.
+Compress-Zlib version 1 Changes
+
1.38 - 6 September 2005
* Integrate core change 25304 -- Symbian Update
diff --git a/ext/IO_Compress_Base/Makefile.PL b/ext/IO-Compress/Makefile.PL
index 751442ae30..801c2a6c90 100644
--- a/ext/IO_Compress_Base/Makefile.PL
+++ b/ext/IO-Compress/Makefile.PL
@@ -3,14 +3,16 @@
use strict ;
require 5.004 ;
+$::VERSION = '2.019' ;
+
use private::MakeUtil;
use ExtUtils::MakeMaker 5.16 ;
-UpDowngrade(getPerlFiles('MANIFEST'))
+UpDowngrade(getPerlFiles('MANIFEST'))
unless $ENV{PERL_CORE};
WriteMakefile(
- NAME => 'IO::Compress::Base',
+ NAME => 'IO::Compress',
VERSION_FROM => 'lib/IO/Compress/Base.pm',
'dist' => { COMPRESS => 'gzip',
TARFLAGS => '-chvf',
@@ -20,8 +22,9 @@ WriteMakefile(
(
$ENV{SKIP_FOR_CORE}
- ? (MAN3PODS => {})
- : (PREREQ_PM => { 'Scalar::Util' => 0,
+ ? ()
+ : (PREREQ_PM => { 'Compress::Raw::Bzip2' => $::VERSION,
+ 'Compress::Raw::Zlib' => $::VERSION,
$] >= 5.005 && $] < 5.006
? ('File::BSDGlob' => 0)
: () }
@@ -30,13 +33,13 @@ WriteMakefile(
(
$] >= 5.005
- ? (ABSTRACT_FROM => 'lib/IO/Compress/Base.pm',
- AUTHOR => 'Paul Marquess <pmqs@cpan.org>')
+ ? (ABSTRACT => 'IO Interface to compressed data files/buffers',
+ AUTHOR => 'Paul Marquess <pmqs@cpan.org>')
: ()
),
INSTALLDIRS => ($] >= 5.009 ? 'perl' : 'site'),
-
+
(
$] >= 5.009 && ! $ENV{PERL_CORE}
? (INST_LIB => 'blib/arch')
@@ -44,10 +47,9 @@ WriteMakefile(
),
((ExtUtils::MakeMaker->VERSION() gt '6.30') ?
- ('LICENSE' => 'perl') : ()),
-
+ ('LICENSE' => 'perl') : ()),
+
) ;
# end of file Makefile.PL
-
diff --git a/ext/IO_Compress_Zlib/README b/ext/IO-Compress/README
index a61d40a6c2..49797879ad 100644
--- a/ext/IO_Compress_Zlib/README
+++ b/ext/IO-Compress/README
@@ -1,29 +1,40 @@
- IO-Compress-Zlib
+ IO-Compress
- Version 2.015
+ Version 2.019
- 2nd September 2008
+ 4th May 2009
- Copyright (c) 2005-2008 Paul Marquess. All rights reserved.
+ Copyright (c) 1995-2009 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.
DESCRIPTION
-----------
-This module provides a Perl interface to allow reading and writing of RFC
-1950, 1951, 1952 (i.e. gzip) and zip files/buffers.
+This distribution provides a Perl interface to allow reading and writing of
+compressed data created with the zlib and bzip2 libraries.
+
+IO-Compress supports reading and writing of bzip2, RFC 1950, RFC
+1951, RFC 1952 (i.e. gzip) and zip files/buffers.
+
+The following modules used to be distributed separately, but are now
+included with the IO-Compress distribution.
+
+ Compress-Zlib
+ IO-Compress-Zlib
+ IO-Compress-Bzip2
+ IO-Compress-Base
PREREQUISITES
-------------
-Before you can build IO-Compress-Zlib you need to have the following
+Before you can build IO-Compress you need to have the following
installed on your system:
* Perl 5.004 or better.
* Compress::Raw::Zlib
- * IO::Compress::Base
+ * Compress::Raw::Bzip2
BUILDING THE MODULE
-------------------
@@ -38,32 +49,17 @@ using this sequence of commands:
INSTALLATION
------------
-To install IO-Compress-Zlib, run the command below:
+To install IO-Compress, run the command below:
make install
TROUBLESHOOTING
---------------
-The t/020isize Test Suite
-------------------------
-
-This test suite checks that IO-Compress-Zlib can cope with gzip files
-that are larger than 2^32 bytes.
-
-By default these tests are NOT run when you do a "make test". If you
-really want to run them, you need to execute "make longtest".
-
-Be warned though -- this test suite can take hours to run on a slow box.
-
-Also, due to the way the tests are constructed, some architectures will
-run out of memory during this test. This should not be considered a bug
-in the IO-Compress-Zlib module.
-
FEEDBACK
--------
-How to report a problem with IO-Compress-Zlib.
+How to report a problem with IO-Compress.
To help me help you, I need all of the following information:
@@ -80,8 +76,8 @@ To help me help you, I need all of the following information:
If your perl does not understand the "-V" option it is too
old. This module needs Perl version 5.004 or better.
- b. The version of IO-Compress-Zlib you have.
- If you have successfully installed IO-Compress-Zlib, this one-liner
+ b. The version of IO-Compress you have.
+ If you have successfully installed IO-Compress, this one-liner
will tell you:
perl -MIO::Compress::Gzip -e 'print qq[ver $IO::Compress::Gzip::VERSION\n]'
@@ -90,13 +86,13 @@ To help me help you, I need all of the following information:
perl -MIO::Compress::Gzip -e "print qq[ver $IO::Compress::Gzip::VERSION\n]"
- If you haven't installed IO-Compress-Zlib then search IO::Compress::Gzip.pm
+ If you haven't installed IO-Compress then search IO::Compress::Gzip.pm
for a line like this:
- $VERSION = "2.015" ;
+ $VERSION = "2.019" ;
- 2. If you are having problems building IO-Compress-Zlib, send me a
- complete log of what happened. Start by unpacking the IO-Compress-Zlib
+ 2. If you are having problems building IO-Compress, send me a
+ complete log of what happened. Start by unpacking the IO-Compress
module into a fresh directory and keep a log of all the steps
[edit config.in, if necessary]
diff --git a/ext/Compress-Zlib/examples/filtdef b/ext/IO-Compress/examples/compress-zlib/filtdef
index 57dfeb9068..57dfeb9068 100755
--- a/ext/Compress-Zlib/examples/filtdef
+++ b/ext/IO-Compress/examples/compress-zlib/filtdef
diff --git a/ext/Compress-Zlib/examples/filtinf b/ext/IO-Compress/examples/compress-zlib/filtinf
index 1df202b1d7..1df202b1d7 100755
--- a/ext/Compress-Zlib/examples/filtinf
+++ b/ext/IO-Compress/examples/compress-zlib/filtinf
diff --git a/ext/Compress-Zlib/examples/gzcat b/ext/IO-Compress/examples/compress-zlib/gzcat
index 5241a5a11f..5241a5a11f 100755
--- a/ext/Compress-Zlib/examples/gzcat
+++ b/ext/IO-Compress/examples/compress-zlib/gzcat
diff --git a/ext/Compress-Zlib/examples/gzgrep b/ext/IO-Compress/examples/compress-zlib/gzgrep
index 324d3e615f..324d3e615f 100755
--- a/ext/Compress-Zlib/examples/gzgrep
+++ b/ext/IO-Compress/examples/compress-zlib/gzgrep
diff --git a/ext/Compress-Zlib/examples/gzstream b/ext/IO-Compress/examples/compress-zlib/gzstream
index faacb0a0dd..faacb0a0dd 100755
--- a/ext/Compress-Zlib/examples/gzstream
+++ b/ext/IO-Compress/examples/compress-zlib/gzstream
diff --git a/ext/IO-Compress/examples/io/anycat b/ext/IO-Compress/examples/io/anycat
new file mode 100755
index 0000000000..9db9c41faf
--- /dev/null
+++ b/ext/IO-Compress/examples/io/anycat
@@ -0,0 +1,17 @@
+#!/usr/local/bin/perl
+
+use strict ;
+use warnings ;
+
+use IO::Uncompress::AnyInflate qw( anyinflate $AnyInflateError );
+
+@ARGV = '-' unless @ARGV ;
+
+foreach my $file (@ARGV) {
+
+ anyinflate $file => '-',
+ Transparent => 1,
+ Strict => 0,
+ or die "Cannot uncompress '$file': $AnyInflateError\n" ;
+
+}
diff --git a/ext/IO-Compress/examples/io/bzip2/bzcat b/ext/IO-Compress/examples/io/bzip2/bzcat
new file mode 100755
index 0000000000..81123200c5
--- /dev/null
+++ b/ext/IO-Compress/examples/io/bzip2/bzcat
@@ -0,0 +1,29 @@
+#!/usr/local/bin/perl
+
+use IO::Uncompress::Bunzip2 qw( $Bunzip2Error );
+use strict ;
+use warnings ;
+
+#die "Usage: gzcat file...\n"
+# unless @ARGV ;
+
+my $file ;
+my $buffer ;
+my $s;
+
+@ARGV = '-' unless @ARGV ;
+
+foreach $file (@ARGV) {
+
+ my $gz = new IO::Uncompress::Bunzip2 $file
+ or die "Cannot open $file: $Bunzip2Error\n" ;
+
+ print $buffer
+ while ($s = $gz->read($buffer)) > 0 ;
+
+ die "Error reading from $file: $Bunzip2Error\n"
+ if $s < 0 ;
+
+ $gz->close() ;
+}
+
diff --git a/ext/IO-Compress/examples/io/bzip2/bzgrep b/ext/IO-Compress/examples/io/bzip2/bzgrep
new file mode 100755
index 0000000000..ceb4e8412b
--- /dev/null
+++ b/ext/IO-Compress/examples/io/bzip2/bzgrep
@@ -0,0 +1,25 @@
+#!/usr/bin/perl
+
+use strict ;
+use warnings ;
+use IO::Uncompress::Bunzip2 qw($Bunzip2Error);
+
+die "Usage: gzgrep pattern [file...]\n"
+ unless @ARGV >= 1;
+
+my $pattern = shift ;
+my $file ;
+
+@ARGV = '-' unless @ARGV ;
+
+foreach $file (@ARGV) {
+ my $gz = new IO::Uncompress::Bunzip2 $file
+ or die "Cannot uncompress $file: $Bunzip2Error\n" ;
+
+ while (<$gz>) {
+ print if /$pattern/ ;
+ }
+
+ die "Error reading from $file: $Bunzip2Error\n"
+ if $Bunzip2Error ;
+}
diff --git a/ext/IO-Compress/examples/io/bzip2/bzstream b/ext/IO-Compress/examples/io/bzip2/bzstream
new file mode 100755
index 0000000000..3e88d68258
--- /dev/null
+++ b/ext/IO-Compress/examples/io/bzip2/bzstream
@@ -0,0 +1,9 @@
+#!/usr/local/bin/perl
+
+use strict ;
+use warnings ;
+use IO::Compress::Bzip2 qw(:all);
+
+bzip2 '-' => '-'
+ or die "bzstream: $Bzip2Error\n" ;
+
diff --git a/ext/IO_Compress_Zlib/examples/gzappend b/ext/IO-Compress/examples/io/gzip/gzappend
index a4a60a9aad..a4a60a9aad 100644
--- a/ext/IO_Compress_Zlib/examples/gzappend
+++ b/ext/IO-Compress/examples/io/gzip/gzappend
diff --git a/ext/IO_Compress_Zlib/examples/gzcat b/ext/IO-Compress/examples/io/gzip/gzcat
index 5572bae959..5572bae959 100755
--- a/ext/IO_Compress_Zlib/examples/gzcat
+++ b/ext/IO-Compress/examples/io/gzip/gzcat
diff --git a/ext/IO_Compress_Zlib/examples/gzgrep b/ext/IO-Compress/examples/io/gzip/gzgrep
index 33820ba064..33820ba064 100755
--- a/ext/IO_Compress_Zlib/examples/gzgrep
+++ b/ext/IO-Compress/examples/io/gzip/gzgrep
diff --git a/ext/IO_Compress_Zlib/examples/gzstream b/ext/IO-Compress/examples/io/gzip/gzstream
index 9d03bc5749..9d03bc5749 100755
--- a/ext/IO_Compress_Zlib/examples/gzstream
+++ b/ext/IO-Compress/examples/io/gzip/gzstream
diff --git a/ext/Compress-Zlib/lib/Compress/Zlib.pm b/ext/IO-Compress/lib/Compress/Zlib.pm
index 7c712f6330..142ff3d5f9 100644
--- a/ext/Compress-Zlib/lib/Compress/Zlib.pm
+++ b/ext/IO-Compress/lib/Compress/Zlib.pm
@@ -8,17 +8,17 @@ use Carp ;
use IO::Handle ;
use Scalar::Util qw(dualvar);
-use IO::Compress::Base::Common 2.015 ;
-use Compress::Raw::Zlib 2.015 ;
-use IO::Compress::Gzip 2.015 ;
-use IO::Uncompress::Gunzip 2.015 ;
+use IO::Compress::Base::Common 2.019 ;
+use Compress::Raw::Zlib 2.019 ;
+use IO::Compress::Gzip 2.019 ;
+use IO::Uncompress::Gunzip 2.019 ;
use strict ;
use warnings ;
use bytes ;
our ($VERSION, $XS_VERSION, @ISA, @EXPORT, $AUTOLOAD);
-$VERSION = '2.015';
+$VERSION = '2.019';
$XS_VERSION = $VERSION;
$VERSION = eval $VERSION;
@@ -452,7 +452,7 @@ sub inflate
package Compress::Zlib ;
-use IO::Compress::Gzip::Constants 2.015 ;
+use IO::Compress::Gzip::Constants 2.019 ;
sub memGzip($)
{
@@ -632,8 +632,7 @@ Compress::Zlib - Interface to zlib compression library
$crc = adler32_combine($crc1, $crc2, $len2)l
$crc = crc32_combine($adler1, $adler2, $len2)
- ZLIB_VERSION
- ZLIB_VERNUM
+ my $version = Compress::Raw::Zlib::zlib_version();
=head1 DESCRIPTION
@@ -1406,6 +1405,12 @@ CRC-related functions are available.
These functions allow checksums to be merged.
+=head1 Misc
+
+=head2 my $version = Compress::Zlib::zlib_version();
+
+Returns the version of the zlib library.
+
=head1 CONSTANTS
All the I<zlib> constants are automatically imported when you make use
@@ -1444,7 +1449,7 @@ See the Changes file.
=head1 COPYRIGHT AND LICENSE
-Copyright (c) 1995-2008 Paul Marquess. All rights reserved.
+Copyright (c) 1995-2009 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.
diff --git a/ext/IO_Compress_Base/lib/File/GlobMapper.pm b/ext/IO-Compress/lib/File/GlobMapper.pm
index 40a606309e..40a606309e 100644
--- a/ext/IO_Compress_Base/lib/File/GlobMapper.pm
+++ b/ext/IO-Compress/lib/File/GlobMapper.pm
diff --git a/ext/IO-Compress/lib/IO/Compress/Adapter/Bzip2.pm b/ext/IO-Compress/lib/IO/Compress/Adapter/Bzip2.pm
new file mode 100644
index 0000000000..ebc2882dd7
--- /dev/null
+++ b/ext/IO-Compress/lib/IO/Compress/Adapter/Bzip2.pm
@@ -0,0 +1,162 @@
+package IO::Compress::Adapter::Bzip2 ;
+
+use strict;
+use warnings;
+use bytes;
+
+use IO::Compress::Base::Common 2.019 qw(:Status);
+
+#use Compress::Bzip2 ;
+use Compress::Raw::Bzip2 2.019 ;
+
+our ($VERSION);
+$VERSION = '2.019';
+
+sub mkCompObject
+{
+ my $BlockSize100K = shift ;
+ my $WorkFactor = shift ;
+ my $Verbosity = shift ;
+
+ my ($def, $status) = new Compress::Raw::Bzip2(1, $BlockSize100K,
+ $WorkFactor, $Verbosity);
+ #my ($def, $status) = bzdeflateInit();
+ #-BlockSize100K => $params->value('BlockSize100K'),
+ #-WorkFactor => $params->value('WorkFactor');
+
+ return (undef, "Could not create Deflate object: $status", $status)
+ if $status != BZ_OK ;
+
+ return bless {'Def' => $def,
+ 'Error' => '',
+ 'ErrorNo' => 0,
+ } ;
+}
+
+sub compr
+{
+ my $self = shift ;
+
+ my $def = $self->{Def};
+
+ #my ($out, $status) = $def->bzdeflate(defined ${$_[0]} ? ${$_[0]} : "") ;
+ my $status = $def->bzdeflate($_[0], $_[1]) ;
+ $self->{ErrorNo} = $status;
+
+ if ($status != BZ_RUN_OK)
+ {
+ $self->{Error} = "Deflate Error: $status";
+ return STATUS_ERROR;
+ }
+
+ #${ $_[1] } .= $out if defined $out;
+
+ return STATUS_OK;
+}
+
+sub flush
+{
+ my $self = shift ;
+
+ my $def = $self->{Def};
+
+ #my ($out, $status) = $def->bzflush($opt);
+ #my $status = $def->bzflush($_[0], $opt);
+ my $status = $def->bzflush($_[0]);
+ $self->{ErrorNo} = $status;
+
+ if ($status != BZ_RUN_OK)
+ {
+ $self->{Error} = "Deflate Error: $status";
+ return STATUS_ERROR;
+ }
+
+ #${ $_[0] } .= $out if defined $out ;
+ return STATUS_OK;
+
+}
+
+sub close
+{
+ my $self = shift ;
+
+ my $def = $self->{Def};
+
+ #my ($out, $status) = $def->bzclose();
+ my $status = $def->bzclose($_[0]);
+ $self->{ErrorNo} = $status;
+
+ if ($status != BZ_STREAM_END)
+ {
+ $self->{Error} = "Deflate Error: $status";
+ return STATUS_ERROR;
+ }
+
+ #${ $_[0] } .= $out if defined $out ;
+ return STATUS_OK;
+
+}
+
+
+sub reset
+{
+ my $self = shift ;
+
+ my $outer = $self->{Outer};
+
+ my ($def, $status) = new Compress::Raw::Bzip2();
+ $self->{ErrorNo} = ($status == BZ_OK) ? 0 : $status ;
+
+ if ($status != BZ_OK)
+ {
+ $self->{Error} = "Cannot create Deflate object: $status";
+ return STATUS_ERROR;
+ }
+
+ $self->{Def} = $def;
+
+ return STATUS_OK;
+}
+
+sub compressedBytes
+{
+ my $self = shift ;
+ $self->{Def}->compressedBytes();
+}
+
+sub uncompressedBytes
+{
+ my $self = shift ;
+ $self->{Def}->uncompressedBytes();
+}
+
+#sub total_out
+#{
+# my $self = shift ;
+# 0;
+#}
+#
+
+#sub total_in
+#{
+# my $self = shift ;
+# $self->{Def}->total_in();
+#}
+#
+#sub crc32
+#{
+# my $self = shift ;
+# $self->{Def}->crc32();
+#}
+#
+#sub adler32
+#{
+# my $self = shift ;
+# $self->{Def}->adler32();
+#}
+
+
+1;
+
+__END__
+
diff --git a/ext/IO_Compress_Zlib/lib/IO/Compress/Adapter/Deflate.pm b/ext/IO-Compress/lib/IO/Compress/Adapter/Deflate.pm
index 4425e3670d..aa2975f0cd 100644
--- a/ext/IO_Compress_Zlib/lib/IO/Compress/Adapter/Deflate.pm
+++ b/ext/IO-Compress/lib/IO/Compress/Adapter/Deflate.pm
@@ -4,12 +4,12 @@ use strict;
use warnings;
use bytes;
-use IO::Compress::Base::Common 2.015 qw(:Status);
+use IO::Compress::Base::Common 2.019 qw(:Status);
-use Compress::Raw::Zlib 2.015 qw(Z_OK Z_FINISH MAX_WBITS) ;
+use Compress::Raw::Zlib 2.019 qw(Z_OK Z_FINISH MAX_WBITS) ;
our ($VERSION);
-$VERSION = '2.015';
+$VERSION = '2.019';
sub mkCompObject
{
diff --git a/ext/IO_Compress_Zlib/lib/IO/Compress/Adapter/Identity.pm b/ext/IO-Compress/lib/IO/Compress/Adapter/Identity.pm
index 1b1998e120..54cc35f3c3 100644
--- a/ext/IO_Compress_Zlib/lib/IO/Compress/Adapter/Identity.pm
+++ b/ext/IO-Compress/lib/IO/Compress/Adapter/Identity.pm
@@ -4,10 +4,10 @@ use strict;
use warnings;
use bytes;
-use IO::Compress::Base::Common 2.015 qw(:Status);
+use IO::Compress::Base::Common 2.019 qw(:Status);
our ($VERSION);
-$VERSION = '2.015';
+$VERSION = '2.019';
sub mkCompObject
{
diff --git a/ext/IO_Compress_Base/lib/IO/Compress/Base.pm b/ext/IO-Compress/lib/IO/Compress/Base.pm
index 484c0cfb77..eb8e7ee970 100644
--- a/ext/IO_Compress_Base/lib/IO/Compress/Base.pm
+++ b/ext/IO-Compress/lib/IO/Compress/Base.pm
@@ -6,7 +6,7 @@ require 5.004 ;
use strict ;
use warnings;
-use IO::Compress::Base::Common 2.015 ;
+use IO::Compress::Base::Common 2.019 ;
use IO::File ;
use Scalar::Util qw(blessed readonly);
@@ -20,7 +20,7 @@ use bytes;
our (@ISA, $VERSION);
@ISA = qw(Exporter IO::File);
-$VERSION = '2.015';
+$VERSION = '2.019';
#Can't locate object method "SWASHNEW" via package "utf8" (perhaps you forgot to load "utf8"?) at .../ext/Compress-Zlib/Gzip/blib/lib/Compress/Zlib/Common.pm line 16.
@@ -217,8 +217,9 @@ sub _create
}
# If output is a file, check that it is writable
- if ($outType eq 'filename' && -e $outValue && ! -w _)
- { return $obj->saveErrorString(undef, "Output file '$outValue' is not writable" ) }
+ #no warnings;
+ #if ($outType eq 'filename' && -e $outValue && ! -w _)
+ # { return $obj->saveErrorString(undef, "Output file '$outValue' is not writable" ) }
@@ -260,6 +261,7 @@ sub _create
}
}
elsif ($outType eq 'filename') {
+ no warnings;
my $mode = '>' ;
$mode = '>>'
if $appendOutput;
@@ -299,8 +301,8 @@ sub ckOutputParam
$self->croakError("$from: output parameter not a filename, filehandle or scalar ref")
if ! $outType ;
- $self->croakError("$from: output filename is undef or null string")
- if $outType eq 'filename' && (! defined $_[0] || $_[0] eq '') ;
+ #$self->croakError("$from: output filename is undef or null string")
+ #if $outType eq 'filename' && (! defined $_[0] || $_[0] eq '') ;
$self->croakError("$from: output buffer is read-only")
if $outType eq 'buffer' && readonly(${ $_[0] });
@@ -972,7 +974,7 @@ See the Changes file.
=head1 COPYRIGHT AND LICENSE
-Copyright (c) 2005-2008 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2009 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.
diff --git a/ext/IO_Compress_Base/lib/IO/Compress/Base/Common.pm b/ext/IO-Compress/lib/IO/Compress/Base/Common.pm
index d35a4dff7d..f7851f2be3 100644
--- a/ext/IO_Compress_Base/lib/IO/Compress/Base/Common.pm
+++ b/ext/IO-Compress/lib/IO/Compress/Base/Common.pm
@@ -11,7 +11,7 @@ use File::GlobMapper;
require Exporter;
our ($VERSION, @ISA, @EXPORT, %EXPORT_TAGS, $HAS_ENCODE);
@ISA = qw(Exporter);
-$VERSION = '2.015';
+$VERSION = '2.019';
@EXPORT = qw( isaFilehandle isaFilename whatIsInput whatIsOutput
isaFileGlobString cleanFileGlobString oneTarget
diff --git a/ext/IO-Compress/lib/IO/Compress/Bzip2.pm b/ext/IO-Compress/lib/IO/Compress/Bzip2.pm
new file mode 100644
index 0000000000..9e31e433a9
--- /dev/null
+++ b/ext/IO-Compress/lib/IO/Compress/Bzip2.pm
@@ -0,0 +1,758 @@
+package IO::Compress::Bzip2 ;
+
+use strict ;
+use warnings;
+use bytes;
+require Exporter ;
+
+use IO::Compress::Base 2.019 ;
+
+use IO::Compress::Base::Common 2.019 qw(createSelfTiedObject);
+use IO::Compress::Adapter::Bzip2 2.019 ;
+
+
+
+our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $Bzip2Error);
+
+$VERSION = '2.019';
+$Bzip2Error = '';
+
+@ISA = qw(Exporter IO::Compress::Base);
+@EXPORT_OK = qw( $Bzip2Error bzip2 ) ;
+%EXPORT_TAGS = %IO::Compress::Base::EXPORT_TAGS ;
+push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ;
+Exporter::export_ok_tags('all');
+
+
+
+sub new
+{
+ my $class = shift ;
+
+ my $obj = createSelfTiedObject($class, \$Bzip2Error);
+ return $obj->_create(undef, @_);
+}
+
+sub bzip2
+{
+ my $obj = createSelfTiedObject(undef, \$Bzip2Error);
+ $obj->_def(@_);
+}
+
+
+sub mkHeader
+{
+ my $self = shift ;
+ return '';
+
+}
+
+sub getExtraParams
+{
+ my $self = shift ;
+
+ use IO::Compress::Base::Common 2.019 qw(:Parse);
+
+ return (
+ 'BlockSize100K' => [0, 1, Parse_unsigned, 1],
+ 'WorkFactor' => [0, 1, Parse_unsigned, 0],
+ 'Verbosity' => [0, 1, Parse_boolean, 0],
+ );
+}
+
+
+
+sub ckParams
+{
+ my $self = shift ;
+ my $got = shift;
+
+ # check that BlockSize100K is a number between 1 & 9
+ if ($got->parsed('BlockSize100K')) {
+ my $value = $got->value('BlockSize100K');
+ return $self->saveErrorString(undef, "Parameter 'BlockSize100K' not between 1 and 9, got $value")
+ unless defined $value && $value >= 1 && $value <= 9;
+
+ }
+
+ # check that WorkFactor between 0 & 250
+ if ($got->parsed('WorkFactor')) {
+ my $value = $got->value('WorkFactor');
+ return $self->saveErrorString(undef, "Parameter 'WorkFactor' not between 0 and 250, got $value")
+ unless $value >= 0 && $value <= 250;
+ }
+
+ return 1 ;
+}
+
+
+sub mkComp
+{
+ my $self = shift ;
+ my $got = shift ;
+
+ my $BlockSize100K = $got->value('BlockSize100K');
+ my $WorkFactor = $got->value('WorkFactor');
+ my $Verbosity = $got->value('Verbosity');
+
+ my ($obj, $errstr, $errno) = IO::Compress::Adapter::Bzip2::mkCompObject(
+ $BlockSize100K, $WorkFactor,
+ $Verbosity);
+
+ return $self->saveErrorString(undef, $errstr, $errno)
+ if ! defined $obj;
+
+ return $obj;
+}
+
+
+sub mkTrailer
+{
+ my $self = shift ;
+ return '';
+}
+
+sub mkFinalTrailer
+{
+ return '';
+}
+
+#sub newHeader
+#{
+# my $self = shift ;
+# return '';
+#}
+
+sub getInverseClass
+{
+ return ('IO::Uncompress::Bunzip2');
+}
+
+sub getFileInfo
+{
+ my $self = shift ;
+ my $params = shift;
+ my $file = shift ;
+
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+IO::Compress::Bzip2 - Write bzip2 files/buffers
+
+
+
+=head1 SYNOPSIS
+
+ use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error) ;
+
+ my $status = bzip2 $input => $output [,OPTS]
+ or die "bzip2 failed: $Bzip2Error\n";
+
+ my $z = new IO::Compress::Bzip2 $output [,OPTS]
+ or die "bzip2 failed: $Bzip2Error\n";
+
+ $z->print($string);
+ $z->printf($format, $string);
+ $z->write($string);
+ $z->syswrite($string [, $length, $offset]);
+ $z->flush();
+ $z->tell();
+ $z->eof();
+ $z->seek($position, $whence);
+ $z->binmode();
+ $z->fileno();
+ $z->opened();
+ $z->autoflush();
+ $z->input_line_number();
+ $z->newStream( [OPTS] );
+
+ $z->close() ;
+
+ $Bzip2Error ;
+
+ # IO::File mode
+
+ print $z $string;
+ printf $z $format, $string;
+ tell $z
+ eof $z
+ seek $z, $position, $whence
+ binmode $z
+ fileno $z
+ close $z ;
+
+
+=head1 DESCRIPTION
+
+This module provides a Perl interface that allows writing bzip2
+compressed data to files or buffer.
+
+For reading bzip2 files/buffers, see the companion module
+L<IO::Uncompress::Bunzip2|IO::Uncompress::Bunzip2>.
+
+=head1 Functional Interface
+
+A top-level function, C<bzip2>, is provided to carry out
+"one-shot" compression between buffers and/or files. For finer
+control over the compression process, see the L</"OO Interface">
+section.
+
+ use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error) ;
+
+ bzip2 $input => $output [,OPTS]
+ or die "bzip2 failed: $Bzip2Error\n";
+
+The functional interface needs Perl5.005 or better.
+
+=head2 bzip2 $input => $output [, OPTS]
+
+C<bzip2> expects at least two parameters, C<$input> and C<$output>.
+
+=head3 The C<$input> parameter
+
+The parameter, C<$input>, is used to define the source of
+the uncompressed data.
+
+It can take one of the following forms:
+
+=over 5
+
+=item A filename
+
+If the C<$input> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for reading and the input data
+will be read from it.
+
+=item A filehandle
+
+If the C<$input> parameter is a filehandle, the input data will be
+read from it.
+The string '-' can be used as an alias for standard input.
+
+=item A scalar reference
+
+If C<$input> is a scalar reference, the input data will be read
+from C<$$input>.
+
+=item An array reference
+
+If C<$input> is an array reference, each element in the array must be a
+filename.
+
+The input data will be read from each file in turn.
+
+The complete array will be walked to ensure that it only
+contains valid filenames before any data is compressed.
+
+=item An Input FileGlob string
+
+If C<$input> is a string that is delimited by the characters "<" and ">"
+C<bzip2> will assume that it is an I<input fileglob string>. The
+input is the list of files that match the fileglob.
+
+If the fileglob does not match any files ...
+
+See L<File::GlobMapper|File::GlobMapper> for more details.
+
+=back
+
+If the C<$input> parameter is any other type, C<undef> will be returned.
+
+=head3 The C<$output> parameter
+
+The parameter C<$output> is used to control the destination of the
+compressed data. This parameter can take one of these forms.
+
+=over 5
+
+=item A filename
+
+If the C<$output> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for writing and the compressed
+data will be written to it.
+
+=item A filehandle
+
+If the C<$output> parameter is a filehandle, the compressed data
+will be written to it.
+The string '-' can be used as an alias for standard output.
+
+=item A scalar reference
+
+If C<$output> is a scalar reference, the compressed data will be
+stored in C<$$output>.
+
+=item An Array Reference
+
+If C<$output> is an array reference, the compressed data will be
+pushed onto the array.
+
+=item An Output FileGlob
+
+If C<$output> is a string that is delimited by the characters "<" and ">"
+C<bzip2> will assume that it is an I<output fileglob string>. The
+output is the list of files that match the fileglob.
+
+When C<$output> is an fileglob string, C<$input> must also be a fileglob
+string. Anything else is an error.
+
+=back
+
+If the C<$output> parameter is any other type, C<undef> will be returned.
+
+=head2 Notes
+
+When C<$input> maps to multiple files/buffers and C<$output> is a single
+file/buffer the input files/buffers will be stored
+in C<$output> as a concatenated series of compressed data streams.
+
+=head2 Optional Parameters
+
+Unless specified below, the optional parameters for C<bzip2>,
+C<OPTS>, are the same as those used with the OO interface defined in the
+L</"Constructor Options"> section below.
+
+=over 5
+
+=item C<< AutoClose => 0|1 >>
+
+This option applies to any input or output data streams to
+C<bzip2> that are filehandles.
+
+If C<AutoClose> is specified, and the value is true, it will result in all
+input and/or output filehandles being closed once C<bzip2> has
+completed.
+
+This parameter defaults to 0.
+
+=item C<< BinModeIn => 0|1 >>
+
+When reading from a file or filehandle, set C<binmode> before reading.
+
+Defaults to 0.
+
+=item C<< Append => 0|1 >>
+
+TODO
+
+=back
+
+=head2 Examples
+
+To read the contents of the file C<file1.txt> and write the compressed
+data to the file C<file1.txt.bz2>.
+
+ use strict ;
+ use warnings ;
+ use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error) ;
+
+ my $input = "file1.txt";
+ bzip2 $input => "$input.bz2"
+ or die "bzip2 failed: $Bzip2Error\n";
+
+To read from an existing Perl filehandle, C<$input>, and write the
+compressed data to a buffer, C<$buffer>.
+
+ use strict ;
+ use warnings ;
+ use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error) ;
+ use IO::File ;
+
+ my $input = new IO::File "<file1.txt"
+ or die "Cannot open 'file1.txt': $!\n" ;
+ my $buffer ;
+ bzip2 $input => \$buffer
+ or die "bzip2 failed: $Bzip2Error\n";
+
+To compress all files in the directory "/my/home" that match "*.txt"
+and store the compressed data in the same directory
+
+ use strict ;
+ use warnings ;
+ use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error) ;
+
+ bzip2 '</my/home/*.txt>' => '<*.bz2>'
+ or die "bzip2 failed: $Bzip2Error\n";
+
+and if you want to compress each file one at a time, this will do the trick
+
+ use strict ;
+ use warnings ;
+ use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error) ;
+
+ for my $input ( glob "/my/home/*.txt" )
+ {
+ my $output = "$input.bz2" ;
+ bzip2 $input => $output
+ or die "Error compressing '$input': $Bzip2Error\n";
+ }
+
+=head1 OO Interface
+
+=head2 Constructor
+
+The format of the constructor for C<IO::Compress::Bzip2> is shown below
+
+ my $z = new IO::Compress::Bzip2 $output [,OPTS]
+ or die "IO::Compress::Bzip2 failed: $Bzip2Error\n";
+
+It returns an C<IO::Compress::Bzip2> object on success and undef on failure.
+The variable C<$Bzip2Error> will contain an error message on failure.
+
+If you are running Perl 5.005 or better the object, C<$z>, returned from
+IO::Compress::Bzip2 can be used exactly like an L<IO::File|IO::File> filehandle.
+This means that all normal output file operations can be carried out
+with C<$z>.
+For example, to write to a compressed file/buffer you can use either of
+these forms
+
+ $z->print("hello world\n");
+ print $z "hello world\n";
+
+The mandatory parameter C<$output> is used to control the destination
+of the compressed data. This parameter can take one of these forms.
+
+=over 5
+
+=item A filename
+
+If the C<$output> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for writing and the compressed data
+will be written to it.
+
+=item A filehandle
+
+If the C<$output> parameter is a filehandle, the compressed data will be
+written to it.
+The string '-' can be used as an alias for standard output.
+
+=item A scalar reference
+
+If C<$output> is a scalar reference, the compressed data will be stored
+in C<$$output>.
+
+=back
+
+If the C<$output> parameter is any other type, C<IO::Compress::Bzip2>::new will
+return undef.
+
+=head2 Constructor Options
+
+C<OPTS> is any combination of the following options:
+
+=over 5
+
+=item C<< AutoClose => 0|1 >>
+
+This option is only valid when the C<$output> parameter is a filehandle. If
+specified, and the value is true, it will result in the C<$output> being
+closed once either the C<close> method is called or the C<IO::Compress::Bzip2>
+object is destroyed.
+
+This parameter defaults to 0.
+
+=item C<< Append => 0|1 >>
+
+Opens C<$output> in append mode.
+
+The behaviour of this option is dependent on the type of C<$output>.
+
+=over 5
+
+=item * A Buffer
+
+If C<$output> is a buffer and C<Append> is enabled, all compressed data
+will be append to the end if C<$output>. Otherwise C<$output> will be
+cleared before any data is written to it.
+
+=item * A Filename
+
+If C<$output> is a filename and C<Append> is enabled, the file will be
+opened in append mode. Otherwise the contents of the file, if any, will be
+truncated before any compressed data is written to it.
+
+=item * A Filehandle
+
+If C<$output> is a filehandle, the file pointer will be positioned to the
+end of the file via a call to C<seek> before any compressed data is written
+to it. Otherwise the file pointer will not be moved.
+
+=back
+
+This parameter defaults to 0.
+
+=item C<< BlockSize100K => number >>
+
+Specify the number of 100K blocks bzip2 uses during compression.
+
+Valid values are from 1 to 9, where 9 is best compression.
+
+The default is 1.
+
+=item C<< WorkFactor => number >>
+
+Specifies how much effort bzip2 should take before resorting to a slower
+fallback compression algorithm.
+
+Valid values range from 0 to 250, where 0 means use the default value 30.
+
+The default is 0.
+
+=item C<< Strict => 0|1 >>
+
+This is a placeholder option.
+
+=back
+
+=head2 Examples
+
+TODO
+
+=head1 Methods
+
+=head2 print
+
+Usage is
+
+ $z->print($data)
+ print $z $data
+
+Compresses and outputs the contents of the C<$data> parameter. This
+has the same behaviour as the C<print> built-in.
+
+Returns true if successful.
+
+=head2 printf
+
+Usage is
+
+ $z->printf($format, $data)
+ printf $z $format, $data
+
+Compresses and outputs the contents of the C<$data> parameter.
+
+Returns true if successful.
+
+=head2 syswrite
+
+Usage is
+
+ $z->syswrite $data
+ $z->syswrite $data, $length
+ $z->syswrite $data, $length, $offset
+
+Compresses and outputs the contents of the C<$data> parameter.
+
+Returns the number of uncompressed bytes written, or C<undef> if
+unsuccessful.
+
+=head2 write
+
+Usage is
+
+ $z->write $data
+ $z->write $data, $length
+ $z->write $data, $length, $offset
+
+Compresses and outputs the contents of the C<$data> parameter.
+
+Returns the number of uncompressed bytes written, or C<undef> if
+unsuccessful.
+
+=head2 flush
+
+Usage is
+
+ $z->flush;
+
+Flushes any pending compressed data to the output file/buffer.
+
+TODO
+
+Returns true on success.
+
+=head2 tell
+
+Usage is
+
+ $z->tell()
+ tell $z
+
+Returns the uncompressed file offset.
+
+=head2 eof
+
+Usage is
+
+ $z->eof();
+ eof($z);
+
+Returns true if the C<close> method has been called.
+
+=head2 seek
+
+ $z->seek($position, $whence);
+ seek($z, $position, $whence);
+
+Provides a sub-set of the C<seek> functionality, with the restriction
+that it is only legal to seek forward in the output file/buffer.
+It is a fatal error to attempt to seek backward.
+
+Empty parts of the file/buffer will have NULL (0x00) bytes written to them.
+
+The C<$whence> parameter takes one the usual values, namely SEEK_SET,
+SEEK_CUR or SEEK_END.
+
+Returns 1 on success, 0 on failure.
+
+=head2 binmode
+
+Usage is
+
+ $z->binmode
+ binmode $z ;
+
+This is a noop provided for completeness.
+
+=head2 opened
+
+ $z->opened()
+
+Returns true if the object currently refers to a opened file/buffer.
+
+=head2 autoflush
+
+ my $prev = $z->autoflush()
+ my $prev = $z->autoflush(EXPR)
+
+If the C<$z> object is associated with a file or a filehandle, this method
+returns the current autoflush setting for the underlying filehandle. If
+C<EXPR> is present, and is non-zero, it will enable flushing after every
+write/print operation.
+
+If C<$z> is associated with a buffer, this method has no effect and always
+returns C<undef>.
+
+B<Note> that the special variable C<$|> B<cannot> be used to set or
+retrieve the autoflush setting.
+
+=head2 input_line_number
+
+ $z->input_line_number()
+ $z->input_line_number(EXPR)
+
+This method always returns C<undef> when compressing.
+
+=head2 fileno
+
+ $z->fileno()
+ fileno($z)
+
+If the C<$z> object is associated with a file or a filehandle, C<fileno>
+will return the underlying file descriptor. Once the C<close> method is
+called C<fileno> will return C<undef>.
+
+If the C<$z> object is is associated with a buffer, this method will return
+C<undef>.
+
+=head2 close
+
+ $z->close() ;
+ close $z ;
+
+Flushes any pending compressed data and then closes the output file/buffer.
+
+For most versions of Perl this method will be automatically invoked if
+the IO::Compress::Bzip2 object is destroyed (either explicitly or by the
+variable with the reference to the object going out of scope). The
+exceptions are Perl versions 5.005 through 5.00504 and 5.8.0. In
+these cases, the C<close> method will be called automatically, but
+not until global destruction of all live objects when the program is
+terminating.
+
+Therefore, if you want your scripts to be able to run on all versions
+of Perl, you should call C<close> explicitly and not rely on automatic
+closing.
+
+Returns true on success, otherwise 0.
+
+If the C<AutoClose> option has been enabled when the IO::Compress::Bzip2
+object was created, and the object is associated with a file, the
+underlying file will also be closed.
+
+=head2 newStream([OPTS])
+
+Usage is
+
+ $z->newStream( [OPTS] )
+
+Closes the current compressed data stream and starts a new one.
+
+OPTS consists of any of the the options that are available when creating
+the C<$z> object.
+
+See the L</"Constructor Options"> section for more details.
+
+=head1 Importing
+
+No symbolic constants are required by this IO::Compress::Bzip2 at present.
+
+=over 5
+
+=item :all
+
+Imports C<bzip2> and C<$Bzip2Error>.
+Same as doing this
+
+ use IO::Compress::Bzip2 qw(bzip2 $Bzip2Error) ;
+
+
+
+=back
+
+=head1 EXAMPLES
+
+=head2 Apache::GZip Revisited
+
+See L<IO::Compress::Bzip2::FAQ|IO::Compress::Bzip2::FAQ/"Apache::GZip Revisited">
+
+
+
+=head2 Working with Net::FTP
+
+See L<IO::Compress::Bzip2::FAQ|IO::Compress::Bzip2::FAQ/"Compressed files and Net::FTP">
+
+=head1 SEE ALSO
+
+L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
+
+L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+
+L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
+L<Archive::Tar|Archive::Tar>,
+L<IO::Zlib|IO::Zlib>
+
+The primary site for the bzip2 program is F<http://www.bzip.org>.
+
+See the module L<Compress::Bzip2|Compress::Bzip2>
+
+=head1 AUTHOR
+
+This module was written by Paul Marquess, F<pmqs@cpan.org>.
+
+=head1 MODIFICATION HISTORY
+
+See the Changes file.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 2005-2008 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.
+
diff --git a/ext/IO_Compress_Zlib/lib/IO/Compress/Deflate.pm b/ext/IO-Compress/lib/IO/Compress/Deflate.pm
index fae42bf3db..89740aee77 100644
--- a/ext/IO_Compress_Zlib/lib/IO/Compress/Deflate.pm
+++ b/ext/IO-Compress/lib/IO/Compress/Deflate.pm
@@ -6,16 +6,16 @@ use bytes;
require Exporter ;
-use IO::Compress::RawDeflate 2.015 ;
+use IO::Compress::RawDeflate 2.019 ;
-use Compress::Raw::Zlib 2.015 ;
-use IO::Compress::Zlib::Constants 2.015 ;
-use IO::Compress::Base::Common 2.015 qw(createSelfTiedObject);
+use Compress::Raw::Zlib 2.019 ;
+use IO::Compress::Zlib::Constants 2.019 ;
+use IO::Compress::Base::Common 2.019 qw(createSelfTiedObject);
our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $DeflateError);
-$VERSION = '2.015';
+$VERSION = '2.019';
$DeflateError = '';
@ISA = qw(Exporter IO::Compress::RawDeflate);
@@ -841,13 +841,13 @@ These symbolic constants are used by the C<Strategy> option in the constructor.
=head2 Apache::GZip Revisited
-See L<IO::Compress::Zlib::FAQ|IO::Compress::Zlib::FAQ/"Apache::GZip Revisited">
+See L<IO::Compress::FAQ|IO::Compress::FAQ/"Apache::GZip Revisited">
=head2 Working with Net::FTP
-See L<IO::Compress::Zlib::FAQ|IO::Compress::Zlib::FAQ/"Compressed files and Net::FTP">
+See L<IO::Compress::FAQ|IO::Compress::FAQ/"Compressed files and Net::FTP">
=head1 SEE ALSO
@@ -882,7 +882,7 @@ See the Changes file.
=head1 COPYRIGHT AND LICENSE
-Copyright (c) 2005-2008 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2009 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.
diff --git a/ext/IO_Compress_Zlib/lib/IO/Compress/Gzip.pm b/ext/IO-Compress/lib/IO/Compress/Gzip.pm
index dfd41e3374..51ba711751 100644
--- a/ext/IO_Compress_Zlib/lib/IO/Compress/Gzip.pm
+++ b/ext/IO-Compress/lib/IO/Compress/Gzip.pm
@@ -8,12 +8,12 @@ use warnings;
use bytes;
-use IO::Compress::RawDeflate 2.015 ;
+use IO::Compress::RawDeflate 2.019 ;
-use Compress::Raw::Zlib 2.015 ;
-use IO::Compress::Base::Common 2.015 qw(:Status :Parse createSelfTiedObject);
-use IO::Compress::Gzip::Constants 2.015 ;
-use IO::Compress::Zlib::Extra 2.015 ;
+use Compress::Raw::Zlib 2.019 ;
+use IO::Compress::Base::Common 2.019 qw(:Status :Parse createSelfTiedObject);
+use IO::Compress::Gzip::Constants 2.019 ;
+use IO::Compress::Zlib::Extra 2.019 ;
BEGIN
{
@@ -27,7 +27,7 @@ require Exporter ;
our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $GzipError);
-$VERSION = '2.015';
+$VERSION = '2.019';
$GzipError = '' ;
@ISA = qw(Exporter IO::Compress::RawDeflate);
@@ -1153,13 +1153,13 @@ These symbolic constants are used by the C<Strategy> option in the constructor.
=head2 Apache::GZip Revisited
-See L<IO::Compress::Zlib::FAQ|IO::Compress::Zlib::FAQ/"Apache::GZip Revisited">
+See L<IO::Compress::FAQ|IO::Compress::FAQ/"Apache::GZip Revisited">
=head2 Working with Net::FTP
-See L<IO::Compress::Zlib::FAQ|IO::Compress::Zlib::FAQ/"Compressed files and Net::FTP">
+See L<IO::Compress::FAQ|IO::Compress::FAQ/"Compressed files and Net::FTP">
=head1 SEE ALSO
@@ -1194,7 +1194,7 @@ See the Changes file.
=head1 COPYRIGHT AND LICENSE
-Copyright (c) 2005-2008 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2009 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.
diff --git a/ext/IO_Compress_Zlib/lib/IO/Compress/Gzip/Constants.pm b/ext/IO-Compress/lib/IO/Compress/Gzip/Constants.pm
index ac38b97894..dfda77d666 100644
--- a/ext/IO_Compress_Zlib/lib/IO/Compress/Gzip/Constants.pm
+++ b/ext/IO-Compress/lib/IO/Compress/Gzip/Constants.pm
@@ -9,7 +9,7 @@ require Exporter;
our ($VERSION, @ISA, @EXPORT, %GZIP_OS_Names);
our ($GZIP_FNAME_INVALID_CHAR_RE, $GZIP_FCOMMENT_INVALID_CHAR_RE);
-$VERSION = '2.015';
+$VERSION = '2.019';
@ISA = qw(Exporter);
diff --git a/ext/IO_Compress_Zlib/lib/IO/Compress/RawDeflate.pm b/ext/IO-Compress/lib/IO/Compress/RawDeflate.pm
index 5540d4c34d..76e48ddf76 100644
--- a/ext/IO_Compress_Zlib/lib/IO/Compress/RawDeflate.pm
+++ b/ext/IO-Compress/lib/IO/Compress/RawDeflate.pm
@@ -7,16 +7,16 @@ use warnings;
use bytes;
-use IO::Compress::Base 2.015 ;
-use IO::Compress::Base::Common 2.015 qw(:Status createSelfTiedObject);
-use IO::Compress::Adapter::Deflate 2.015 ;
+use IO::Compress::Base 2.019 ;
+use IO::Compress::Base::Common 2.019 qw(:Status createSelfTiedObject);
+use IO::Compress::Adapter::Deflate 2.019 ;
require Exporter ;
our ($VERSION, @ISA, @EXPORT_OK, %DEFLATE_CONSTANTS, %EXPORT_TAGS, $RawDeflateError);
-$VERSION = '2.015';
+$VERSION = '2.019';
$RawDeflateError = '';
@ISA = qw(Exporter IO::Compress::Base);
@@ -142,8 +142,8 @@ sub getZlibParams
{
my $self = shift ;
- use IO::Compress::Base::Common 2.015 qw(:Parse);
- use Compress::Raw::Zlib 2.015 qw(Z_DEFLATED Z_DEFAULT_COMPRESSION Z_DEFAULT_STRATEGY);
+ use IO::Compress::Base::Common 2.019 qw(:Parse);
+ use Compress::Raw::Zlib 2.019 qw(Z_DEFLATED Z_DEFAULT_COMPRESSION Z_DEFAULT_STRATEGY);
return (
@@ -928,13 +928,13 @@ These symbolic constants are used by the C<Strategy> option in the constructor.
=head2 Apache::GZip Revisited
-See L<IO::Compress::Zlib::FAQ|IO::Compress::Zlib::FAQ/"Apache::GZip Revisited">
+See L<IO::Compress::FAQ|IO::Compress::FAQ/"Apache::GZip Revisited">
=head2 Working with Net::FTP
-See L<IO::Compress::Zlib::FAQ|IO::Compress::Zlib::FAQ/"Compressed files and Net::FTP">
+See L<IO::Compress::FAQ|IO::Compress::FAQ/"Compressed files and Net::FTP">
=head1 SEE ALSO
@@ -969,7 +969,7 @@ See the Changes file.
=head1 COPYRIGHT AND LICENSE
-Copyright (c) 2005-2008 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2009 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.
diff --git a/ext/IO_Compress_Zlib/lib/IO/Compress/Zip.pm b/ext/IO-Compress/lib/IO/Compress/Zip.pm
index 976ec484cb..07bff4a82c 100644
--- a/ext/IO_Compress_Zlib/lib/IO/Compress/Zip.pm
+++ b/ext/IO-Compress/lib/IO/Compress/Zip.pm
@@ -4,22 +4,27 @@ use strict ;
use warnings;
use bytes;
-use IO::Compress::Base::Common 2.015 qw(:Status createSelfTiedObject);
-use IO::Compress::RawDeflate 2.015 ;
-use IO::Compress::Adapter::Deflate 2.015 ;
-use IO::Compress::Adapter::Identity 2.015 ;
-use IO::Compress::Zlib::Extra 2.015 ;
-use IO::Compress::Zip::Constants 2.015 ;
+use IO::Compress::Base::Common 2.019 qw(:Status createSelfTiedObject);
+use IO::Compress::RawDeflate 2.019 ;
+use IO::Compress::Adapter::Deflate 2.019 ;
+use IO::Compress::Adapter::Identity 2.019 ;
+use IO::Compress::Zlib::Extra 2.019 ;
+use IO::Compress::Zip::Constants 2.019 ;
-use Compress::Raw::Zlib 2.015 qw(crc32) ;
+use Compress::Raw::Zlib 2.019 qw(crc32) ;
BEGIN
{
eval { require IO::Compress::Adapter::Bzip2 ;
- import IO::Compress::Adapter::Bzip2 2.015 ;
+ import IO::Compress::Adapter::Bzip2 2.019 ;
require IO::Compress::Bzip2 ;
- import IO::Compress::Bzip2 2.015 ;
+ import IO::Compress::Bzip2 2.019 ;
} ;
+# eval { require IO::Compress::Adapter::Lzma ;
+# import IO::Compress::Adapter::Lzma 2.018 ;
+# require IO::Compress::Lzma ;
+# import IO::Compress::Lzma 2.018 ;
+# } ;
}
@@ -27,7 +32,7 @@ require Exporter ;
our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $ZipError);
-$VERSION = '2.015';
+$VERSION = '2.019';
$ZipError = '';
@ISA = qw(Exporter IO::Compress::RawDeflate);
@@ -66,6 +71,7 @@ sub mkComp
$got->value('Level'),
$got->value('Strategy')
);
+ *$self->{ZipData}{CRC32} = crc32(undef);
}
elsif (*$self->{ZipData}{Method} == ZIP_CM_DEFLATE) {
($obj, $errstr, $errno) = IO::Compress::Adapter::Deflate::mkCompObject(
@@ -83,6 +89,11 @@ sub mkComp
);
*$self->{ZipData}{CRC32} = crc32(undef);
}
+# elsif (*$self->{ZipData}{Method} == ZIP_CM_LZMA) {
+# ($obj, $errstr, $errno) = IO::Compress::Adapter::Lzma::mkCompObject(
+# );
+# *$self->{ZipData}{CRC32} = crc32(undef);
+# }
return $self->saveErrorString(undef, $errstr, $errno)
if ! defined $obj;
@@ -146,13 +157,13 @@ sub mkHeader
if $osCode == ZIP_OS_CODE_UNIX ;
if (*$self->{ZipData}{Zip64}) {
- $empty = 0xFFFF;
+ $empty = 0xFFFFFFFF;
my $x = '';
$x .= pack "V V", 0, 0 ; # uncompressedLength
$x .= pack "V V", 0, 0 ; # compressedLength
$x .= *$self->{ZipData}{Offset}->getPacked_V64() ; # offset to local hdr
- #$x .= pack "V ", 0 ; # disk no
+ $x .= pack "V", 0 ; # disk no
$x = IO::Compress::Zlib::Extra::mkSubField(ZIP_EXTRA_ID_ZIP64, $x);
$extra .= $x;
@@ -380,7 +391,7 @@ sub ckParams
$got->value('Time' => time) ;
}
- if (! $got->parsed('exTime') ) {
+ if ($got->parsed('exTime') ) {
my $timeRef = $got->value('exTime');
if ( defined $timeRef) {
return $self->saveErrorString(undef, "exTime not a 3-element array ref")
@@ -393,7 +404,7 @@ sub ckParams
}
# Unix2 Extended Attribute
- if (! $got->parsed('exUnix2') ) {
+ if ($got->parsed('exUnix2') ) {
my $timeRef = $got->value('exUnix2');
if ( defined $timeRef) {
return $self->saveErrorString(undef, "exUnix2 not a 2-element array ref")
@@ -418,6 +429,10 @@ sub ckParams
if $method == ZIP_CM_BZIP2 and
! defined $IO::Compress::Adapter::Bzip2::VERSION;
+# return $self->saveErrorString(undef, "Lzma not available")
+# if $method == ZIP_CM_LZMA and
+# ! defined $IO::Compress::Adapter::Lzma::VERSION;
+
*$self->{ZipData}{Method} = $method;
*$self->{ZipData}{ZipComment} = $got->value('ZipComment') ;
@@ -452,8 +467,8 @@ sub getExtraParams
{
my $self = shift ;
- use IO::Compress::Base::Common 2.015 qw(:Parse);
- use Compress::Raw::Zlib 2.015 qw(Z_DEFLATED Z_DEFAULT_COMPRESSION Z_DEFAULT_STRATEGY);
+ use IO::Compress::Base::Common 2.019 qw(:Parse);
+ use Compress::Raw::Zlib 2.019 qw(Z_DEFLATED Z_DEFAULT_COMPRESSION Z_DEFAULT_STRATEGY);
my @Bzip2 = ();
@@ -514,6 +529,7 @@ sub getFileInfo
$params->value('MTime' => $mtime) ;
$params->value('ATime' => $atime) ;
$params->value('CTime' => undef) ; # No Creation time
+ $params->value("exTime", [$mtime, $atime, undef]);
}
# NOTE - Unix specific code alert
@@ -1464,13 +1480,13 @@ constructor.
=head2 Apache::GZip Revisited
-See L<IO::Compress::Zlib::FAQ|IO::Compress::Zlib::FAQ/"Apache::GZip Revisited">
+See L<IO::Compress::FAQ|IO::Compress::FAQ/"Apache::GZip Revisited">
=head2 Working with Net::FTP
-See L<IO::Compress::Zlib::FAQ|IO::Compress::Zlib::FAQ/"Compressed files and Net::FTP">
+See L<IO::Compress::FAQ|IO::Compress::FAQ/"Compressed files and Net::FTP">
=head1 SEE ALSO
@@ -1505,7 +1521,7 @@ See the Changes file.
=head1 COPYRIGHT AND LICENSE
-Copyright (c) 2005-2008 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2009 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.
diff --git a/ext/IO_Compress_Zlib/lib/IO/Compress/Zip/Constants.pm b/ext/IO-Compress/lib/IO/Compress/Zip/Constants.pm
index ead53978b8..f5f5880d1b 100644
--- a/ext/IO_Compress_Zlib/lib/IO/Compress/Zip/Constants.pm
+++ b/ext/IO-Compress/lib/IO/Compress/Zip/Constants.pm
@@ -7,7 +7,7 @@ require Exporter;
our ($VERSION, @ISA, @EXPORT, %ZIP_CM_MIN_VERSIONS);
-$VERSION = '2.015';
+$VERSION = '2.019';
@ISA = qw(Exporter);
@@ -38,6 +38,8 @@ $VERSION = '2.015';
ZIP_EXTRA_ID_ZIP64
ZIP_EXTRA_ID_EXT_TIMESTAMP
ZIP_EXTRA_ID_INFO_ZIP_UNIX2
+ ZIP_EXTRA_ID_INFO_ZIP_UNIXn
+ ZIP_EXTRA_ID_JAVA_EXE
ZIP_OS_CODE_UNIX
ZIP_OS_CODE_DEFAULT
diff --git a/ext/IO_Compress_Zlib/lib/IO/Compress/Zlib/Constants.pm b/ext/IO-Compress/lib/IO/Compress/Zlib/Constants.pm
index bf2eb22555..4d942e0e1c 100644
--- a/ext/IO_Compress_Zlib/lib/IO/Compress/Zlib/Constants.pm
+++ b/ext/IO-Compress/lib/IO/Compress/Zlib/Constants.pm
@@ -9,7 +9,7 @@ require Exporter;
our ($VERSION, @ISA, @EXPORT);
-$VERSION = '2.015';
+$VERSION = '2.019';
@ISA = qw(Exporter);
diff --git a/ext/IO_Compress_Zlib/lib/IO/Compress/Zlib/Extra.pm b/ext/IO-Compress/lib/IO/Compress/Zlib/Extra.pm
index 1c02d18d9f..287d0d1b88 100644
--- a/ext/IO_Compress_Zlib/lib/IO/Compress/Zlib/Extra.pm
+++ b/ext/IO-Compress/lib/IO/Compress/Zlib/Extra.pm
@@ -8,9 +8,9 @@ use bytes;
our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS);
-$VERSION = '2.015';
+$VERSION = '2.019';
-use IO::Compress::Gzip::Constants 2.015 ;
+use IO::Compress::Gzip::Constants 2.019 ;
sub ExtraFieldError
{
diff --git a/ext/IO-Compress/lib/IO/Uncompress/Adapter/Bunzip2.pm b/ext/IO-Compress/lib/IO/Uncompress/Adapter/Bunzip2.pm
new file mode 100644
index 0000000000..4d5df44d6f
--- /dev/null
+++ b/ext/IO-Compress/lib/IO/Uncompress/Adapter/Bunzip2.pm
@@ -0,0 +1,111 @@
+package IO::Uncompress::Adapter::Bunzip2;
+
+use strict;
+use warnings;
+use bytes;
+
+use IO::Compress::Base::Common 2.019 qw(:Status);
+
+use Compress::Raw::Bzip2 2.019 ;
+
+our ($VERSION, @ISA);
+$VERSION = '2.019';
+
+sub mkUncompObject
+{
+ my $small = shift || 0;
+ my $verbosity = shift || 0;
+
+ my ($inflate, $status) = new Compress::Raw::Bunzip2(1, 1, $small, $verbosity, 1);
+
+ return (undef, "Could not create Inflation object: $status", $status)
+ if $status != BZ_OK ;
+
+ return bless {'Inf' => $inflate,
+ 'CompSize' => 0,
+ 'UnCompSize' => 0,
+ 'Error' => '',
+ } ;
+
+}
+
+sub uncompr
+{
+ my $self = shift ;
+ my $from = shift ;
+ my $to = shift ;
+ my $eof = shift ;
+
+ my $inf = $self->{Inf};
+
+ my $status = $inf->bzinflate($from, $to);
+ $self->{ErrorNo} = $status;
+
+ if ($status != BZ_OK && $status != BZ_STREAM_END )
+ {
+ $self->{Error} = "Inflation Error: $status";
+ return STATUS_ERROR;
+ }
+
+
+ return STATUS_OK if $status == BZ_OK ;
+ return STATUS_ENDSTREAM if $status == BZ_STREAM_END ;
+ return STATUS_ERROR ;
+}
+
+
+sub reset
+{
+ my $self = shift ;
+
+ my ($inf, $status) = new Compress::Raw::Bunzip2();
+ $self->{ErrorNo} = ($status == BZ_OK) ? 0 : $status ;
+
+ if ($status != BZ_OK)
+ {
+ $self->{Error} = "Cannot create Inflate object: $status";
+ return STATUS_ERROR;
+ }
+
+ $self->{Inf} = $inf;
+
+ return STATUS_OK ;
+}
+
+sub compressedBytes
+{
+ my $self = shift ;
+ $self->{Inf}->compressedBytes();
+}
+
+sub uncompressedBytes
+{
+ my $self = shift ;
+ $self->{Inf}->uncompressedBytes();
+}
+
+sub crc32
+{
+ my $self = shift ;
+ #$self->{Inf}->crc32();
+}
+
+sub adler32
+{
+ my $self = shift ;
+ #$self->{Inf}->adler32();
+}
+
+sub sync
+{
+ my $self = shift ;
+ #( $self->{Inf}->inflateSync(@_) == BZ_OK)
+ # ? STATUS_OK
+ # : STATUS_ERROR ;
+}
+
+
+1;
+
+__END__
+
diff --git a/ext/IO_Compress_Zlib/lib/IO/Uncompress/Adapter/Identity.pm b/ext/IO-Compress/lib/IO/Uncompress/Adapter/Identity.pm
index ed96393f55..df71eabcbc 100644..100755
--- a/ext/IO_Compress_Zlib/lib/IO/Uncompress/Adapter/Identity.pm
+++ b/ext/IO-Compress/lib/IO/Uncompress/Adapter/Identity.pm
@@ -4,13 +4,13 @@ use warnings;
use strict;
use bytes;
-use IO::Compress::Base::Common 2.015 qw(:Status);
+use IO::Compress::Base::Common 2.019 qw(:Status);
our ($VERSION);
-$VERSION = '2.015';
+$VERSION = '2.019';
-use Compress::Raw::Zlib 2.015 ();
+use Compress::Raw::Zlib 2.019 ();
sub mkUncompObject
{
diff --git a/ext/IO_Compress_Zlib/lib/IO/Uncompress/Adapter/Inflate.pm b/ext/IO-Compress/lib/IO/Uncompress/Adapter/Inflate.pm
index d87b9f5e26..6ff1fb6fb3 100644
--- a/ext/IO_Compress_Zlib/lib/IO/Uncompress/Adapter/Inflate.pm
+++ b/ext/IO-Compress/lib/IO/Uncompress/Adapter/Inflate.pm
@@ -4,11 +4,11 @@ use strict;
use warnings;
use bytes;
-use IO::Compress::Base::Common 2.015 qw(:Status);
-use Compress::Raw::Zlib 2.015 qw(Z_OK Z_DATA_ERROR Z_STREAM_END Z_FINISH MAX_WBITS);
+use IO::Compress::Base::Common 2.019 qw(:Status);
+use Compress::Raw::Zlib 2.019 qw(Z_OK Z_BUF_ERROR Z_STREAM_END Z_FINISH MAX_WBITS);
our ($VERSION);
-$VERSION = '2.015';
+$VERSION = '2.019';
@@ -24,6 +24,7 @@ sub mkUncompObject
if ($scan)
{
($inflate, $status) = new Compress::Raw::Zlib::InflateScan
+ #LimitOutput => 1,
CRC32 => $crc32,
ADLER32 => $adler32,
WindowBits => - MAX_WBITS ;
@@ -32,6 +33,7 @@ sub mkUncompObject
{
($inflate, $status) = new Compress::Raw::Zlib::Inflate
AppendOutput => 1,
+ LimitOutput => 1,
CRC32 => $crc32,
ADLER32 => $adler32,
WindowBits => - MAX_WBITS ;
@@ -60,19 +62,13 @@ sub uncompr
my $status = $inf->inflate($from, $to, $eof);
$self->{ErrorNo} = $status;
- if ($status != Z_STREAM_END && $eof)
- {
- $self->{Error} = "unexpected end of file";
- return STATUS_ERROR;
- }
-
- if ($status != Z_OK && $status != Z_STREAM_END )
+ if ($status != Z_OK && $status != Z_STREAM_END && $status != Z_BUF_ERROR)
{
$self->{Error} = "Inflation Error: $status";
return STATUS_ERROR;
}
-
-
+
+ return STATUS_OK if $status == Z_BUF_ERROR ; # ???
return STATUS_OK if $status == Z_OK ;
return STATUS_ENDSTREAM if $status == Z_STREAM_END ;
return STATUS_ERROR ;
diff --git a/ext/IO_Compress_Zlib/lib/IO/Uncompress/AnyInflate.pm b/ext/IO-Compress/lib/IO/Uncompress/AnyInflate.pm
index f350f32238..d0cfb118f5 100644
--- a/ext/IO_Compress_Zlib/lib/IO/Uncompress/AnyInflate.pm
+++ b/ext/IO-Compress/lib/IO/Uncompress/AnyInflate.pm
@@ -6,22 +6,22 @@ use strict;
use warnings;
use bytes;
-use IO::Compress::Base::Common 2.015 qw(createSelfTiedObject);
+use IO::Compress::Base::Common 2.019 qw(createSelfTiedObject);
-use IO::Uncompress::Adapter::Inflate 2.015 ();
+use IO::Uncompress::Adapter::Inflate 2.019 ();
-use IO::Uncompress::Base 2.015 ;
-use IO::Uncompress::Gunzip 2.015 ;
-use IO::Uncompress::Inflate 2.015 ;
-use IO::Uncompress::RawInflate 2.015 ;
-use IO::Uncompress::Unzip 2.015 ;
+use IO::Uncompress::Base 2.019 ;
+use IO::Uncompress::Gunzip 2.019 ;
+use IO::Uncompress::Inflate 2.019 ;
+use IO::Uncompress::RawInflate 2.019 ;
+use IO::Uncompress::Unzip 2.019 ;
require Exporter ;
our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $AnyInflateError);
-$VERSION = '2.015';
+$VERSION = '2.019';
$AnyInflateError = '';
@ISA = qw( Exporter IO::Uncompress::Base );
@@ -48,7 +48,7 @@ sub anyinflate
sub getExtraParams
{
- use IO::Compress::Base::Common 2.015 qw(:Parse);
+ use IO::Compress::Base::Common 2.019 qw(:Parse);
return ( 'RawInflate' => [1, 1, Parse_boolean, 0] ) ;
}
@@ -939,7 +939,7 @@ See the Changes file.
=head1 COPYRIGHT AND LICENSE
-Copyright (c) 2005-2008 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2009 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.
diff --git a/ext/IO_Compress_Base/lib/IO/Uncompress/AnyUncompress.pm b/ext/IO-Compress/lib/IO/Uncompress/AnyUncompress.pm
index bdd28222f7..86971f1f76 100644
--- a/ext/IO_Compress_Base/lib/IO/Uncompress/AnyUncompress.pm
+++ b/ext/IO-Compress/lib/IO/Uncompress/AnyUncompress.pm
@@ -4,16 +4,16 @@ use strict;
use warnings;
use bytes;
-use IO::Compress::Base::Common 2.015 qw(createSelfTiedObject);
+use IO::Compress::Base::Common 2.019 qw(createSelfTiedObject);
-use IO::Uncompress::Base 2.015 ;
+use IO::Uncompress::Base 2.019 ;
require Exporter ;
our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $AnyUncompressError);
-$VERSION = '2.015';
+$VERSION = '2.019';
$AnyUncompressError = '';
@ISA = qw( Exporter IO::Uncompress::Base );
@@ -27,18 +27,20 @@ Exporter::export_ok_tags('all');
BEGIN
{
- eval ' use IO::Uncompress::Adapter::Inflate 2.015 ;';
- eval ' use IO::Uncompress::Adapter::Bunzip2 2.015 ;';
- eval ' use IO::Uncompress::Adapter::LZO 2.015 ;';
- eval ' use IO::Uncompress::Adapter::Lzf 2.015 ;';
-
- eval ' use IO::Uncompress::Bunzip2 2.015 ;';
- eval ' use IO::Uncompress::UnLzop 2.015 ;';
- eval ' use IO::Uncompress::Gunzip 2.015 ;';
- eval ' use IO::Uncompress::Inflate 2.015 ;';
- eval ' use IO::Uncompress::RawInflate 2.015 ;';
- eval ' use IO::Uncompress::Unzip 2.015 ;';
- eval ' use IO::Uncompress::UnLzf 2.015 ;';
+ eval ' use IO::Uncompress::Adapter::Inflate 2.019 ;';
+ eval ' use IO::Uncompress::Adapter::Bunzip2 2.019 ;';
+ eval ' use IO::Uncompress::Adapter::LZO 2.019 ;';
+ eval ' use IO::Uncompress::Adapter::Lzf 2.019 ;';
+ #eval ' use IO::Uncompress::Adapter::UnLzma 2.018 ;';
+
+ eval ' use IO::Uncompress::Bunzip2 2.019 ;';
+ eval ' use IO::Uncompress::UnLzop 2.019 ;';
+ eval ' use IO::Uncompress::Gunzip 2.019 ;';
+ eval ' use IO::Uncompress::Inflate 2.019 ;';
+ eval ' use IO::Uncompress::RawInflate 2.019 ;';
+ eval ' use IO::Uncompress::Unzip 2.019 ;';
+ eval ' use IO::Uncompress::UnLzf 2.019 ;';
+ #eval ' use IO::Uncompress::UnLzma 2.018 ;';
}
sub new
@@ -56,7 +58,7 @@ sub anyuncompress
sub getExtraParams
{
- use IO::Compress::Base::Common 2.015 qw(:Parse);
+ use IO::Compress::Base::Common 2.019 qw(:Parse);
return ( 'RawInflate' => [1, 1, Parse_boolean, 0] ) ;
}
@@ -103,6 +105,25 @@ sub mkUncomp
}
}
+# if (defined $IO::Uncompress::UnLzma::VERSION )
+# {
+# my ($obj, $errstr, $errno) = IO::Uncompress::Adapter::UnLzma::mkUncompObject();
+#
+# return $self->saveErrorString(undef, $errstr, $errno)
+# if ! defined $obj;
+#
+# *$self->{Uncomp} = $obj;
+#
+# my @possible = qw( UnLzma );
+# #unshift @possible, 'RawInflate'
+# # if $got->value('RawInflate');
+#
+# if ( *$self->{Info} = $self->ckMagic( @possible ))
+# {
+# return 1;
+# }
+# }
+
if (defined $IO::Uncompress::Bunzip2::VERSION and
$magic = $self->ckMagic('Bunzip2')) {
*$self->{Info} = $self->readHeader($magic)
@@ -915,7 +936,7 @@ See the Changes file.
=head1 COPYRIGHT AND LICENSE
-Copyright (c) 2005-2008 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2009 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.
diff --git a/ext/IO_Compress_Base/lib/IO/Uncompress/Base.pm b/ext/IO-Compress/lib/IO/Uncompress/Base.pm
index faeb8232ed..54d079871a 100644
--- a/ext/IO_Compress_Base/lib/IO/Uncompress/Base.pm
+++ b/ext/IO-Compress/lib/IO/Uncompress/Base.pm
@@ -9,12 +9,12 @@ our (@ISA, $VERSION, @EXPORT_OK, %EXPORT_TAGS);
@ISA = qw(Exporter IO::File);
-$VERSION = '2.015';
+$VERSION = '2.019';
use constant G_EOF => 0 ;
use constant G_ERR => -1 ;
-use IO::Compress::Base::Common 2.015 ;
+use IO::Compress::Base::Common 2.019 ;
#use Parse::Parameters ;
use IO::File ;
@@ -410,6 +410,7 @@ sub _create
if $got->value('Scan');
}
else {
+ no warnings ;
my $mode = '<';
$mode = '+<' if $got->value('Scan');
*$obj->{StdIO} = ($inValue eq '-');
@@ -502,17 +503,17 @@ sub ckInputParam
$self->croakError("$from: input parameter not a filename, filehandle, array ref or scalar ref")
if ! $inType ;
- if ($inType eq 'filename' )
- {
- $self->croakError("$from: input filename is undef or null string")
- if ! defined $_[0] || $_[0] eq '' ;
-
- if ($_[0] ne '-' && ! -e $_[0] )
- {
- return $self->saveErrorString(undef,
- "input file '$_[0]' does not exist", STATUS_ERROR);
- }
- }
+# if ($inType eq 'filename' )
+# {
+# return $self->saveErrorString(1, "$from: input filename is undef or null string", STATUS_ERROR)
+# if ! defined $_[0] || $_[0] eq '' ;
+#
+# if ($_[0] ne '-' && ! -e $_[0] )
+# {
+# return $self->saveErrorString(1,
+# "input file '$_[0]' does not exist", STATUS_ERROR);
+# }
+# }
return 1;
}
@@ -715,6 +716,9 @@ sub _rd2
$x->{buff} = \$buff;
}
+ last if $status < 0 || $z->smartEof();
+ #last if $status < 0 ;
+
last
unless *$self->{MultiStream};
@@ -849,9 +853,14 @@ sub _raw_read
$status = *$self->{Uncomp}->uncompr(\$temp_buf, $buffer,
defined *$self->{CompressedInputLengthDone} ||
$self->smartEof(), $outSize);
+
+ $self->pushBack($temp_buf) if $beforeC_len != length $temp_buf;
+#return $self->saveErrorString(G_ERR, "unexpected end of file", STATUS_ERROR)
+# if $self->smartEof() && $status != STATUS_ENDSTREAM;
+
return $self->saveErrorString(G_ERR, *$self->{Uncomp}{Error}, *$self->{Uncomp}{ErrorNo})
- if $self->saveStatus($status) == STATUS_ERROR;
+ if $self->saveStatus($status) == STATUS_ERROR;
$self->postBlockChk($buffer, $before_len) == STATUS_OK
or return G_ERR;
@@ -874,8 +883,8 @@ sub _raw_read
if ($status == STATUS_ENDSTREAM) {
*$self->{EndStream} = 1 ;
- $self->pushBack($temp_buf) ;
- $temp_buf = '';
+#$self->pushBack($temp_buf) ;
+#$temp_buf = '';
my $trailer;
my $trailer_size = *$self->{Info}{TrailerLength} ;
@@ -1081,6 +1090,7 @@ sub read
# Need to jump through more hoops - either length or offset
# or both are specified.
my $out_buffer = *$self->{Pending} ;
+ *$self->{Pending} = '';
while (! *$self->{EndStream} && length($out_buffer) < $length)
@@ -1336,6 +1346,7 @@ sub seek
last if $offset == 0 ;
}
+ $here = $self->tell() ;
return $offset == 0 ? 1 : 0 ;
}
@@ -1448,9 +1459,8 @@ See the Changes file.
=head1 COPYRIGHT AND LICENSE
-Copyright (c) 2005-2008 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2009 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.
-
diff --git a/ext/IO-Compress/lib/IO/Uncompress/Bunzip2.pm b/ext/IO-Compress/lib/IO/Uncompress/Bunzip2.pm
new file mode 100644
index 0000000000..3b16c9f141
--- /dev/null
+++ b/ext/IO-Compress/lib/IO/Uncompress/Bunzip2.pm
@@ -0,0 +1,858 @@
+package IO::Uncompress::Bunzip2 ;
+
+use strict ;
+use warnings;
+use bytes;
+
+use IO::Compress::Base::Common 2.019 qw(:Status createSelfTiedObject);
+
+use IO::Uncompress::Base 2.019 ;
+use IO::Uncompress::Adapter::Bunzip2 2.019 ;
+
+require Exporter ;
+our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $Bunzip2Error);
+
+$VERSION = '2.019';
+$Bunzip2Error = '';
+
+@ISA = qw( Exporter IO::Uncompress::Base );
+@EXPORT_OK = qw( $Bunzip2Error bunzip2 ) ;
+#%EXPORT_TAGS = %IO::Uncompress::Base::EXPORT_TAGS ;
+push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ;
+#Exporter::export_ok_tags('all');
+
+
+sub new
+{
+ my $class = shift ;
+ my $obj = createSelfTiedObject($class, \$Bunzip2Error);
+
+ $obj->_create(undef, 0, @_);
+}
+
+sub bunzip2
+{
+ my $obj = createSelfTiedObject(undef, \$Bunzip2Error);
+ return $obj->_inf(@_);
+}
+
+sub getExtraParams
+{
+ my $self = shift ;
+
+ use IO::Compress::Base::Common 2.019 qw(:Parse);
+
+ return (
+ 'Verbosity' => [1, 1, Parse_boolean, 0],
+ 'Small' => [1, 1, Parse_boolean, 0],
+ );
+}
+
+
+sub ckParams
+{
+ my $self = shift ;
+ my $got = shift ;
+
+ return 1;
+}
+
+sub mkUncomp
+{
+ my $self = shift ;
+ my $got = shift ;
+
+ my $magic = $self->ckMagic()
+ or return 0;
+
+ *$self->{Info} = $self->readHeader($magic)
+ or return undef ;
+
+ my $Small = $got->value('Small');
+ my $Verbosity = $got->value('Verbosity');
+
+ my ($obj, $errstr, $errno) = IO::Uncompress::Adapter::Bunzip2::mkUncompObject(
+ $Small, $Verbosity);
+
+ return $self->saveErrorString(undef, $errstr, $errno)
+ if ! defined $obj;
+
+ *$self->{Uncomp} = $obj;
+
+ return 1;
+
+}
+
+
+sub ckMagic
+{
+ my $self = shift;
+
+ my $magic ;
+ $self->smartReadExact(\$magic, 4);
+
+ *$self->{HeaderPending} = $magic ;
+
+ return $self->HeaderError("Header size is " .
+ 4 . " bytes")
+ if length $magic != 4;
+
+ return $self->HeaderError("Bad Magic.")
+ if ! isBzip2Magic($magic) ;
+
+
+ *$self->{Type} = 'bzip2';
+ return $magic;
+}
+
+sub readHeader
+{
+ my $self = shift;
+ my $magic = shift ;
+
+ $self->pushBack($magic);
+ *$self->{HeaderPending} = '';
+
+
+ return {
+ 'Type' => 'bzip2',
+ 'FingerprintLength' => 4,
+ 'HeaderLength' => 4,
+ 'TrailerLength' => 0,
+ 'Header' => '$magic'
+ };
+
+}
+
+sub chkTrailer
+{
+ return STATUS_OK;
+}
+
+
+
+sub isBzip2Magic
+{
+ my $buffer = shift ;
+ return $buffer =~ /^BZh\d$/;
+}
+
+1 ;
+
+__END__
+
+
+=head1 NAME
+
+IO::Uncompress::Bunzip2 - Read bzip2 files/buffers
+
+=head1 SYNOPSIS
+
+ use IO::Uncompress::Bunzip2 qw(bunzip2 $Bunzip2Error) ;
+
+ my $status = bunzip2 $input => $output [,OPTS]
+ or die "bunzip2 failed: $Bunzip2Error\n";
+
+ my $z = new IO::Uncompress::Bunzip2 $input [OPTS]
+ or die "bunzip2 failed: $Bunzip2Error\n";
+
+ $status = $z->read($buffer)
+ $status = $z->read($buffer, $length)
+ $status = $z->read($buffer, $length, $offset)
+ $line = $z->getline()
+ $char = $z->getc()
+ $char = $z->ungetc()
+ $char = $z->opened()
+
+ $data = $z->trailingData()
+ $status = $z->nextStream()
+ $data = $z->getHeaderInfo()
+ $z->tell()
+ $z->seek($position, $whence)
+ $z->binmode()
+ $z->fileno()
+ $z->eof()
+ $z->close()
+
+ $Bunzip2Error ;
+
+ # IO::File mode
+
+ <$z>
+ read($z, $buffer);
+ read($z, $buffer, $length);
+ read($z, $buffer, $length, $offset);
+ tell($z)
+ seek($z, $position, $whence)
+ binmode($z)
+ fileno($z)
+ eof($z)
+ close($z)
+
+=head1 DESCRIPTION
+
+This module provides a Perl interface that allows the reading of
+bzip2 files/buffers.
+
+For writing bzip2 files/buffers, see the companion module IO::Compress::Bzip2.
+
+=head1 Functional Interface
+
+A top-level function, C<bunzip2>, is provided to carry out
+"one-shot" uncompression between buffers and/or files. For finer
+control over the uncompression process, see the L</"OO Interface">
+section.
+
+ use IO::Uncompress::Bunzip2 qw(bunzip2 $Bunzip2Error) ;
+
+ bunzip2 $input => $output [,OPTS]
+ or die "bunzip2 failed: $Bunzip2Error\n";
+
+The functional interface needs Perl5.005 or better.
+
+=head2 bunzip2 $input => $output [, OPTS]
+
+C<bunzip2> expects at least two parameters, C<$input> and C<$output>.
+
+=head3 The C<$input> parameter
+
+The parameter, C<$input>, is used to define the source of
+the compressed data.
+
+It can take one of the following forms:
+
+=over 5
+
+=item A filename
+
+If the C<$input> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for reading and the input data
+will be read from it.
+
+=item A filehandle
+
+If the C<$input> parameter is a filehandle, the input data will be
+read from it.
+The string '-' can be used as an alias for standard input.
+
+=item A scalar reference
+
+If C<$input> is a scalar reference, the input data will be read
+from C<$$input>.
+
+=item An array reference
+
+If C<$input> is an array reference, each element in the array must be a
+filename.
+
+The input data will be read from each file in turn.
+
+The complete array will be walked to ensure that it only
+contains valid filenames before any data is uncompressed.
+
+=item An Input FileGlob string
+
+If C<$input> is a string that is delimited by the characters "<" and ">"
+C<bunzip2> will assume that it is an I<input fileglob string>. The
+input is the list of files that match the fileglob.
+
+If the fileglob does not match any files ...
+
+See L<File::GlobMapper|File::GlobMapper> for more details.
+
+=back
+
+If the C<$input> parameter is any other type, C<undef> will be returned.
+
+=head3 The C<$output> parameter
+
+The parameter C<$output> is used to control the destination of the
+uncompressed data. This parameter can take one of these forms.
+
+=over 5
+
+=item A filename
+
+If the C<$output> parameter is a simple scalar, it is assumed to be a
+filename. This file will be opened for writing and the uncompressed
+data will be written to it.
+
+=item A filehandle
+
+If the C<$output> parameter is a filehandle, the uncompressed data
+will be written to it.
+The string '-' can be used as an alias for standard output.
+
+=item A scalar reference
+
+If C<$output> is a scalar reference, the uncompressed data will be
+stored in C<$$output>.
+
+=item An Array Reference
+
+If C<$output> is an array reference, the uncompressed data will be
+pushed onto the array.
+
+=item An Output FileGlob
+
+If C<$output> is a string that is delimited by the characters "<" and ">"
+C<bunzip2> will assume that it is an I<output fileglob string>. The
+output is the list of files that match the fileglob.
+
+When C<$output> is an fileglob string, C<$input> must also be a fileglob
+string. Anything else is an error.
+
+=back
+
+If the C<$output> parameter is any other type, C<undef> will be returned.
+
+=head2 Notes
+
+When C<$input> maps to multiple compressed files/buffers and C<$output> is
+a single file/buffer, after uncompression C<$output> will contain a
+concatenation of all the uncompressed data from each of the input
+files/buffers.
+
+=head2 Optional Parameters
+
+Unless specified below, the optional parameters for C<bunzip2>,
+C<OPTS>, are the same as those used with the OO interface defined in the
+L</"Constructor Options"> section below.
+
+=over 5
+
+=item C<< AutoClose => 0|1 >>
+
+This option applies to any input or output data streams to
+C<bunzip2> that are filehandles.
+
+If C<AutoClose> is specified, and the value is true, it will result in all
+input and/or output filehandles being closed once C<bunzip2> has
+completed.
+
+This parameter defaults to 0.
+
+=item C<< BinModeOut => 0|1 >>
+
+When writing to a file or filehandle, set C<binmode> before writing to the
+file.
+
+Defaults to 0.
+
+=item C<< Append => 0|1 >>
+
+TODO
+
+=item C<< MultiStream => 0|1 >>
+
+If the input file/buffer contains multiple compressed data streams, this
+option will uncompress the whole lot as a single data stream.
+
+Defaults to 0.
+
+=item C<< TrailingData => $scalar >>
+
+Returns the data, if any, that is present immediately after the compressed
+data stream once uncompression is complete.
+
+This option can be used when there is useful information immediately
+following the compressed data stream, and you don't know the length of the
+compressed data stream.
+
+If the input is a buffer, C<trailingData> will return everything from the
+end of the compressed data stream to the end of the buffer.
+
+If the input is a filehandle, C<trailingData> will return the data that is
+left in the filehandle input buffer once the end of the compressed data
+stream has been reached. You can then use the filehandle to read the rest
+of the input file.
+
+Don't bother using C<trailingData> if the input is a filename.
+
+If you know the length of the compressed data stream before you start
+uncompressing, you can avoid having to use C<trailingData> by setting the
+C<InputLength> option.
+
+=back
+
+=head2 Examples
+
+To read the contents of the file C<file1.txt.bz2> and write the
+compressed data to the file C<file1.txt>.
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::Bunzip2 qw(bunzip2 $Bunzip2Error) ;
+
+ my $input = "file1.txt.bz2";
+ my $output = "file1.txt";
+ bunzip2 $input => $output
+ or die "bunzip2 failed: $Bunzip2Error\n";
+
+To read from an existing Perl filehandle, C<$input>, and write the
+uncompressed data to a buffer, C<$buffer>.
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::Bunzip2 qw(bunzip2 $Bunzip2Error) ;
+ use IO::File ;
+
+ my $input = new IO::File "<file1.txt.bz2"
+ or die "Cannot open 'file1.txt.bz2': $!\n" ;
+ my $buffer ;
+ bunzip2 $input => \$buffer
+ or die "bunzip2 failed: $Bunzip2Error\n";
+
+To uncompress all files in the directory "/my/home" that match "*.txt.bz2" and store the compressed data in the same directory
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::Bunzip2 qw(bunzip2 $Bunzip2Error) ;
+
+ bunzip2 '</my/home/*.txt.bz2>' => '</my/home/#1.txt>'
+ or die "bunzip2 failed: $Bunzip2Error\n";
+
+and if you want to compress each file one at a time, this will do the trick
+
+ use strict ;
+ use warnings ;
+ use IO::Uncompress::Bunzip2 qw(bunzip2 $Bunzip2Error) ;
+
+ for my $input ( glob "/my/home/*.txt.bz2" )
+ {
+ my $output = $input;
+ $output =~ s/.bz2// ;
+ bunzip2 $input => $output
+ or die "Error compressing '$input': $Bunzip2Error\n";
+ }
+
+=head1 OO Interface
+
+=head2 Constructor
+
+The format of the constructor for IO::Uncompress::Bunzip2 is shown below
+
+ my $z = new IO::Uncompress::Bunzip2 $input [OPTS]
+ or die "IO::Uncompress::Bunzip2 failed: $Bunzip2Error\n";
+
+Returns an C<IO::Uncompress::Bunzip2> object on success and undef on failure.
+The variable C<$Bunzip2Error> will contain an error message on failure.
+
+If you are running Perl 5.005 or better the object, C<$z>, returned from
+IO::Uncompress::Bunzip2 can be used exactly like an L<IO::File|IO::File> filehandle.
+This means that all normal input file operations can be carried out with
+C<$z>. For example, to read a line from a compressed file/buffer you can
+use either of these forms
+
+ $line = $z->getline();
+ $line = <$z>;
+
+The mandatory parameter C<$input> is used to determine the source of the
+compressed data. This parameter can take one of three forms.
+
+=over 5
+
+=item A filename
+
+If the C<$input> parameter is a scalar, it is assumed to be a filename. This
+file will be opened for reading and the compressed data will be read from it.
+
+=item A filehandle
+
+If the C<$input> parameter is a filehandle, the compressed data will be
+read from it.
+The string '-' can be used as an alias for standard input.
+
+=item A scalar reference
+
+If C<$input> is a scalar reference, the compressed data will be read from
+C<$$output>.
+
+=back
+
+=head2 Constructor Options
+
+The option names defined below are case insensitive and can be optionally
+prefixed by a '-'. So all of the following are valid
+
+ -AutoClose
+ -autoclose
+ AUTOCLOSE
+ autoclose
+
+OPTS is a combination of the following options:
+
+=over 5
+
+=item C<< AutoClose => 0|1 >>
+
+This option is only valid when the C<$input> parameter is a filehandle. If
+specified, and the value is true, it will result in the file being closed once
+either the C<close> method is called or the IO::Uncompress::Bunzip2 object is
+destroyed.
+
+This parameter defaults to 0.
+
+=item C<< MultiStream => 0|1 >>
+
+Allows multiple concatenated compressed streams to be treated as a single
+compressed stream. Decompression will stop once either the end of the
+file/buffer is reached, an error is encountered (premature eof, corrupt
+compressed data) or the end of a stream is not immediately followed by the
+start of another stream.
+
+This parameter defaults to 0.
+
+=item C<< Prime => $string >>
+
+This option will uncompress the contents of C<$string> before processing the
+input file/buffer.
+
+This option can be useful when the compressed data is embedded in another
+file/data structure and it is not possible to work out where the compressed
+data begins without having to read the first few bytes. If this is the
+case, the uncompression can be I<primed> with these bytes using this
+option.
+
+=item C<< Transparent => 0|1 >>
+
+If this option is set and the input file/buffer is not compressed data,
+the module will allow reading of it anyway.
+
+In addition, if the input file/buffer does contain compressed data and
+there is non-compressed data immediately following it, setting this option
+will make this module treat the whole file/bufffer as a single data stream.
+
+This option defaults to 1.
+
+=item C<< BlockSize => $num >>
+
+When reading the compressed input data, IO::Uncompress::Bunzip2 will read it in
+blocks of C<$num> bytes.
+
+This option defaults to 4096.
+
+=item C<< InputLength => $size >>
+
+When present this option will limit the number of compressed bytes read
+from the input file/buffer to C<$size>. This option can be used in the
+situation where there is useful data directly after the compressed data
+stream and you know beforehand the exact length of the compressed data
+stream.
+
+This option is mostly used when reading from a filehandle, in which case
+the file pointer will be left pointing to the first byte directly after the
+compressed data stream.
+
+This option defaults to off.
+
+=item C<< Append => 0|1 >>
+
+This option controls what the C<read> method does with uncompressed data.
+
+If set to 1, all uncompressed data will be appended to the output parameter
+of the C<read> method.
+
+If set to 0, the contents of the output parameter of the C<read> method
+will be overwritten by the uncompressed data.
+
+Defaults to 0.
+
+=item C<< Strict => 0|1 >>
+
+This option is a no-op.
+
+=item C<< Small => 0|1 >>
+
+When non-zero this options will make bzip2 use a decompression algorithm
+that uses less memory at the expense of increasing the amount of time
+taken for decompression.
+
+Default is 0.
+
+=back
+
+=head2 Examples
+
+TODO
+
+=head1 Methods
+
+=head2 read
+
+Usage is
+
+ $status = $z->read($buffer)
+
+Reads a block of compressed data (the size the the compressed block is
+determined by the C<Buffer> option in the constructor), uncompresses it and
+writes any uncompressed data into C<$buffer>. If the C<Append> parameter is
+set in the constructor, the uncompressed data will be appended to the
+C<$buffer> parameter. Otherwise C<$buffer> will be overwritten.
+
+Returns the number of uncompressed bytes written to C<$buffer>, zero if eof
+or a negative number on error.
+
+=head2 read
+
+Usage is
+
+ $status = $z->read($buffer, $length)
+ $status = $z->read($buffer, $length, $offset)
+
+ $status = read($z, $buffer, $length)
+ $status = read($z, $buffer, $length, $offset)
+
+Attempt to read C<$length> bytes of uncompressed data into C<$buffer>.
+
+The main difference between this form of the C<read> method and the
+previous one, is that this one will attempt to return I<exactly> C<$length>
+bytes. The only circumstances that this function will not is if end-of-file
+or an IO error is encountered.
+
+Returns the number of uncompressed bytes written to C<$buffer>, zero if eof
+or a negative number on error.
+
+=head2 getline
+
+Usage is
+
+ $line = $z->getline()
+ $line = <$z>
+
+Reads a single line.
+
+This method fully supports the use of of the variable C<$/> (or
+C<$INPUT_RECORD_SEPARATOR> or C<$RS> when C<English> is in use) to
+determine what constitutes an end of line. Paragraph mode, record mode and
+file slurp mode are all supported.
+
+=head2 getc
+
+Usage is
+
+ $char = $z->getc()
+
+Read a single character.
+
+=head2 ungetc
+
+Usage is
+
+ $char = $z->ungetc($string)
+
+=head2 getHeaderInfo
+
+Usage is
+
+ $hdr = $z->getHeaderInfo();
+ @hdrs = $z->getHeaderInfo();
+
+This method returns either a hash reference (in scalar context) or a list
+or hash references (in array context) that contains information about each
+of the header fields in the compressed data stream(s).
+
+=head2 tell
+
+Usage is
+
+ $z->tell()
+ tell $z
+
+Returns the uncompressed file offset.
+
+=head2 eof
+
+Usage is
+
+ $z->eof();
+ eof($z);
+
+Returns true if the end of the compressed input stream has been reached.
+
+=head2 seek
+
+ $z->seek($position, $whence);
+ seek($z, $position, $whence);
+
+Provides a sub-set of the C<seek> functionality, with the restriction
+that it is only legal to seek forward in the input file/buffer.
+It is a fatal error to attempt to seek backward.
+
+The C<$whence> parameter takes one the usual values, namely SEEK_SET,
+SEEK_CUR or SEEK_END.
+
+Returns 1 on success, 0 on failure.
+
+=head2 binmode
+
+Usage is
+
+ $z->binmode
+ binmode $z ;
+
+This is a noop provided for completeness.
+
+=head2 opened
+
+ $z->opened()
+
+Returns true if the object currently refers to a opened file/buffer.
+
+=head2 autoflush
+
+ my $prev = $z->autoflush()
+ my $prev = $z->autoflush(EXPR)
+
+If the C<$z> object is associated with a file or a filehandle, this method
+returns the current autoflush setting for the underlying filehandle. If
+C<EXPR> is present, and is non-zero, it will enable flushing after every
+write/print operation.
+
+If C<$z> is associated with a buffer, this method has no effect and always
+returns C<undef>.
+
+B<Note> that the special variable C<$|> B<cannot> be used to set or
+retrieve the autoflush setting.
+
+=head2 input_line_number
+
+ $z->input_line_number()
+ $z->input_line_number(EXPR)
+
+Returns the current uncompressed line number. If C<EXPR> is present it has
+the effect of setting the line number. Note that setting the line number
+does not change the current position within the file/buffer being read.
+
+The contents of C<$/> are used to to determine what constitutes a line
+terminator.
+
+=head2 fileno
+
+ $z->fileno()
+ fileno($z)
+
+If the C<$z> object is associated with a file or a filehandle, C<fileno>
+will return the underlying file descriptor. Once the C<close> method is
+called C<fileno> will return C<undef>.
+
+If the C<$z> object is is associated with a buffer, this method will return
+C<undef>.
+
+=head2 close
+
+ $z->close() ;
+ close $z ;
+
+Closes the output file/buffer.
+
+For most versions of Perl this method will be automatically invoked if
+the IO::Uncompress::Bunzip2 object is destroyed (either explicitly or by the
+variable with the reference to the object going out of scope). The
+exceptions are Perl versions 5.005 through 5.00504 and 5.8.0. In
+these cases, the C<close> method will be called automatically, but
+not until global destruction of all live objects when the program is
+terminating.
+
+Therefore, if you want your scripts to be able to run on all versions
+of Perl, you should call C<close> explicitly and not rely on automatic
+closing.
+
+Returns true on success, otherwise 0.
+
+If the C<AutoClose> option has been enabled when the IO::Uncompress::Bunzip2
+object was created, and the object is associated with a file, the
+underlying file will also be closed.
+
+=head2 nextStream
+
+Usage is
+
+ my $status = $z->nextStream();
+
+Skips to the next compressed data stream in the input file/buffer. If a new
+compressed data stream is found, the eof marker will be cleared and C<$.>
+will be reset to 0.
+
+Returns 1 if a new stream was found, 0 if none was found, and -1 if an
+error was encountered.
+
+=head2 trailingData
+
+Usage is
+
+ my $data = $z->trailingData();
+
+Returns the data, if any, that is present immediately after the compressed
+data stream once uncompression is complete. It only makes sense to call
+this method once the end of the compressed data stream has been
+encountered.
+
+This option can be used when there is useful information immediately
+following the compressed data stream, and you don't know the length of the
+compressed data stream.
+
+If the input is a buffer, C<trailingData> will return everything from the
+end of the compressed data stream to the end of the buffer.
+
+If the input is a filehandle, C<trailingData> will return the data that is
+left in the filehandle input buffer once the end of the compressed data
+stream has been reached. You can then use the filehandle to read the rest
+of the input file.
+
+Don't bother using C<trailingData> if the input is a filename.
+
+If you know the length of the compressed data stream before you start
+uncompressing, you can avoid having to use C<trailingData> by setting the
+C<InputLength> option in the constructor.
+
+=head1 Importing
+
+No symbolic constants are required by this IO::Uncompress::Bunzip2 at present.
+
+=over 5
+
+=item :all
+
+Imports C<bunzip2> and C<$Bunzip2Error>.
+Same as doing this
+
+ use IO::Uncompress::Bunzip2 qw(bunzip2 $Bunzip2Error) ;
+
+=back
+
+=head1 EXAMPLES
+
+=head2 Working with Net::FTP
+
+See L<IO::Uncompress::Bunzip2::FAQ|IO::Uncompress::Bunzip2::FAQ/"Compressed files and Net::FTP">
+
+=head1 SEE ALSO
+
+L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
+
+L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
+
+L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
+L<Archive::Tar|Archive::Tar>,
+L<IO::Zlib|IO::Zlib>
+
+The primary site for the bzip2 program is F<http://www.bzip.org>.
+
+See the module L<Compress::Bzip2|Compress::Bzip2>
+
+=head1 AUTHOR
+
+This module was written by Paul Marquess, F<pmqs@cpan.org>.
+
+=head1 MODIFICATION HISTORY
+
+See the Changes file.
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 2005-2008 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.
+
diff --git a/ext/IO_Compress_Zlib/lib/IO/Uncompress/Gunzip.pm b/ext/IO-Compress/lib/IO/Uncompress/Gunzip.pm
index 72dd5cff49..9f289cb59f 100644
--- a/ext/IO_Compress_Zlib/lib/IO/Uncompress/Gunzip.pm
+++ b/ext/IO-Compress/lib/IO/Uncompress/Gunzip.pm
@@ -9,12 +9,12 @@ use strict ;
use warnings;
use bytes;
-use IO::Uncompress::RawInflate 2.015 ;
+use IO::Uncompress::RawInflate 2.019 ;
-use Compress::Raw::Zlib 2.015 qw( crc32 ) ;
-use IO::Compress::Base::Common 2.015 qw(:Status createSelfTiedObject);
-use IO::Compress::Gzip::Constants 2.015 ;
-use IO::Compress::Zlib::Extra 2.015 ;
+use Compress::Raw::Zlib 2.019 qw( crc32 ) ;
+use IO::Compress::Base::Common 2.019 qw(:Status createSelfTiedObject);
+use IO::Compress::Gzip::Constants 2.019 ;
+use IO::Compress::Zlib::Extra 2.019 ;
require Exporter ;
@@ -28,7 +28,7 @@ Exporter::export_ok_tags('all');
$GunzipError = '';
-$VERSION = '2.015';
+$VERSION = '2.019';
sub new
{
@@ -47,7 +47,7 @@ sub gunzip
sub getExtraParams
{
- use IO::Compress::Base::Common 2.015 qw(:Parse);
+ use IO::Compress::Base::Common 2.019 qw(:Parse);
return ( 'ParseExtra' => [1, 1, Parse_boolean, 0] ) ;
}
@@ -1063,7 +1063,7 @@ See the Changes file.
=head1 COPYRIGHT AND LICENSE
-Copyright (c) 2005-2008 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2009 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.
diff --git a/ext/IO_Compress_Zlib/lib/IO/Uncompress/Inflate.pm b/ext/IO-Compress/lib/IO/Uncompress/Inflate.pm
index 23fe2db209..e58146a4bc 100644
--- a/ext/IO_Compress_Zlib/lib/IO/Uncompress/Inflate.pm
+++ b/ext/IO-Compress/lib/IO/Uncompress/Inflate.pm
@@ -5,15 +5,15 @@ use strict ;
use warnings;
use bytes;
-use IO::Compress::Base::Common 2.015 qw(:Status createSelfTiedObject);
-use IO::Compress::Zlib::Constants 2.015 ;
+use IO::Compress::Base::Common 2.019 qw(:Status createSelfTiedObject);
+use IO::Compress::Zlib::Constants 2.019 ;
-use IO::Uncompress::RawInflate 2.015 ;
+use IO::Uncompress::RawInflate 2.019 ;
require Exporter ;
our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $InflateError);
-$VERSION = '2.015';
+$VERSION = '2.019';
$InflateError = '';
@ISA = qw( Exporter IO::Uncompress::RawInflate );
@@ -934,7 +934,7 @@ See the Changes file.
=head1 COPYRIGHT AND LICENSE
-Copyright (c) 2005-2008 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2009 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.
diff --git a/ext/IO_Compress_Zlib/lib/IO/Uncompress/RawInflate.pm b/ext/IO-Compress/lib/IO/Uncompress/RawInflate.pm
index def05a885f..08815cb2fc 100644..100755
--- a/ext/IO_Compress_Zlib/lib/IO/Uncompress/RawInflate.pm
+++ b/ext/IO-Compress/lib/IO/Uncompress/RawInflate.pm
@@ -5,19 +5,16 @@ use strict ;
use warnings;
use bytes;
-use Compress::Raw::Zlib 2.015 ;
-use IO::Compress::Base::Common 2.015 qw(:Status createSelfTiedObject);
-
-use IO::Uncompress::Base 2.015 ;
-use IO::Uncompress::Adapter::Inflate 2.015 ;
-
-
+use Compress::Raw::Zlib 2.019 ;
+use IO::Compress::Base::Common 2.019 qw(:Status createSelfTiedObject);
+use IO::Uncompress::Base 2.019 ;
+use IO::Uncompress::Adapter::Inflate 2.019 ;
require Exporter ;
our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, %DEFLATE_CONSTANTS, $RawInflateError);
-$VERSION = '2.015';
+$VERSION = '2.019';
$RawInflateError = '';
@ISA = qw( Exporter IO::Uncompress::Base );
@@ -27,7 +24,23 @@ $RawInflateError = '';
push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ;
Exporter::export_ok_tags('all');
-
+#{
+# # Execute at runtime
+# my %bad;
+# for my $module (qw(Compress::Raw::Zlib IO::Compress::Base::Common IO::Uncompress::Base IO::Uncompress::Adapter::Inflate))
+# {
+# my $ver = ${ $module . "::VERSION"} ;
+#
+# $bad{$module} = $ver
+# if $ver ne $VERSION;
+# }
+#
+# if (keys %bad)
+# {
+# my $string = join "\n", map { "$_ $bad{$_}" } keys %bad;
+# die caller(0)[0] . "needs version $VERSION mismatch\n$string\n";
+# }
+#}
sub new
{
@@ -142,9 +155,15 @@ sub _isRawx
*$self->{HeaderPending} = $temp_buf ;
$buffer = '';
my $status = *$self->{Uncomp}->uncompr(\$temp_buf, \$buffer, $self->smartEof()) ;
+
return $self->saveErrorString(undef, *$self->{Uncomp}{Error}, STATUS_ERROR)
if $status == STATUS_ERROR;
+ $self->pushBack($temp_buf) ;
+
+ return $self->saveErrorString(undef, "unexpected end of file", STATUS_ERROR)
+ if $self->smartEof() && $status != STATUS_ENDSTREAM;
+
#my $buf_len = *$self->{Uncomp}->uncompressedBytes();
my $buf_len = length $buffer;
@@ -153,11 +172,9 @@ sub _isRawx
&& (length $temp_buf || ! $self->smartEof())){
*$self->{NewStream} = 1 ;
*$self->{EndStream} = 0 ;
- $self->pushBack($temp_buf);
}
else {
*$self->{EndStream} = 1 ;
- $self->pushBack($temp_buf);
}
}
*$self->{HeaderPending} = $buffer ;
@@ -1045,7 +1062,7 @@ See the Changes file.
=head1 COPYRIGHT AND LICENSE
-Copyright (c) 2005-2008 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2009 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.
diff --git a/ext/IO_Compress_Zlib/lib/IO/Uncompress/Unzip.pm b/ext/IO-Compress/lib/IO/Uncompress/Unzip.pm
index 6ba7644520..6d30d28d93 100644
--- a/ext/IO_Compress_Zlib/lib/IO/Uncompress/Unzip.pm
+++ b/ext/IO-Compress/lib/IO/Uncompress/Unzip.pm
@@ -8,19 +8,21 @@ use strict ;
use warnings;
use bytes;
-use IO::Uncompress::RawInflate 2.015 ;
-use IO::Compress::Base::Common 2.015 qw(:Status createSelfTiedObject);
-use IO::Uncompress::Adapter::Inflate 2.015 ;
-use IO::Uncompress::Adapter::Identity 2.015 ;
-use IO::Compress::Zlib::Extra 2.015 ;
-use IO::Compress::Zip::Constants 2.015 ;
+use IO::Uncompress::RawInflate 2.019 ;
+use IO::Compress::Base::Common 2.019 qw(:Status createSelfTiedObject);
+use IO::Uncompress::Adapter::Inflate 2.019 ;
+use IO::Uncompress::Adapter::Identity 2.019 ;
+use IO::Compress::Zlib::Extra 2.019 ;
+use IO::Compress::Zip::Constants 2.019 ;
-use Compress::Raw::Zlib 2.015 qw(crc32) ;
+use Compress::Raw::Zlib 2.019 qw(crc32) ;
BEGIN
{
eval { require IO::Uncompress::Adapter::Bunzip2 ;
import IO::Uncompress::Adapter::Bunzip2 } ;
+ #eval { require IO::Uncompress::Adapter::UnLzma ;
+ # import IO::Uncompress::Adapter::UnLzma } ;
}
@@ -28,7 +30,7 @@ require Exporter ;
our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $UnzipError, %headerLookup);
-$VERSION = '2.015';
+$VERSION = '2.019';
$UnzipError = '';
@ISA = qw(Exporter IO::Uncompress::RawInflate);
@@ -61,7 +63,7 @@ sub unzip
sub getExtraParams
{
- use IO::Compress::Base::Common 2.015 qw(:Parse);
+ use IO::Compress::Base::Common 2.019 qw(:Parse);
return (
@@ -617,6 +619,18 @@ sub _readZipHeader($)
*$self->{Uncomp} = $obj;
*$self->{ZipData}{CRC32} = crc32(undef);
}
+# elsif ($compressedMethod == ZIP_CM_LZMA)
+# {
+# return $self->HeaderError("Unsupported Compression format $compressedMethod")
+# if ! defined $IO::Uncompress::Adapter::UnLzma::VERSION ;
+#
+# *$self->{Type} = 'zip-lzma';
+#
+# my $obj = IO::Uncompress::Adapter::UnLzma::mkUncompObject();
+#
+# *$self->{Uncomp} = $obj;
+# *$self->{ZipData}{CRC32} = crc32(undef);
+# }
elsif ($compressedMethod == ZIP_CM_STORE)
{
# TODO -- add support for reading uncompressed
@@ -688,12 +702,9 @@ sub filterUncompressed
}
-# from Archive::Zip
+# from Archive::Zip & info-zip
sub _dosToUnixTime
{
- #use Time::Local 'timelocal_nocheck';
- use Time::Local 'timelocal';
-
my $dt = shift;
my $year = ( ( $dt >> 25 ) & 0x7f ) + 80;
@@ -704,11 +715,11 @@ sub _dosToUnixTime
my $min = ( ( $dt >> 5 ) & 0x3f );
my $sec = ( ( $dt << 1 ) & 0x3e );
- # catch errors
- my $time_t =
- eval { timelocal( $sec, $min, $hour, $mday, $mon, $year ); };
- return 0
- if $@;
+
+ use POSIX 'mktime';
+
+ my $time_t = mktime( $sec, $min, $hour, $mday, $mon, $year, 0, 0, -1 );
+ return 0 if ! defined $time_t;
return $time_t;
}
@@ -1408,43 +1419,6 @@ Same as doing this
See L<IO::Uncompress::Unzip::FAQ|IO::Uncompress::Unzip::FAQ/"Compressed files and Net::FTP">
-=head2 Walking through a zip file
-
-The code below can be used to traverse a zip file, one compressed data
-stream at a time.
-
- use IO::Uncompress::Unzip qw($UnzipError);
-
- my $zipfile = "somefile.zip";
- my $u = new IO::Uncompress::Unzip $zipfile
- or die "Cannot open $zipfile: $UnzipError";
-
- my $status;
- for ($status = 1; ! $u->eof(); $status = $u->nextStream())
- {
-
- my $name = $u->getHeaderInfo()->{Name};
- warn "Processing member $name\n" ;
-
- my $buff;
- while (($status = $u->read($buff)) > 0) {
- # Do something here
- }
-
- last unless $status == 0;
- }
-
- die "Error processing $zipfile: $!\n"
- if $status < 0 ;
-
-Each individual compressed data stream is read until the logical
-end-of-file is reached. Then C<nextStream> is called. This will skip to the
-start of the next compressed data stream and clear the end-of-file flag.
-
-It is also worth noting that C<nextStream> can be called at any time -- you
-don't have to wait until you have exhausted a compressed data stream before
-skipping to the next one.
-
=head1 SEE ALSO
L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
@@ -1478,7 +1452,7 @@ See the Changes file.
=head1 COPYRIGHT AND LICENSE
-Copyright (c) 2005-2008 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2009 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.
diff --git a/ext/IO_Compress_Zlib/pod/FAQ.pod b/ext/IO-Compress/pod/FAQ.pod
index 31fd24f8b2..0fee2a9f6d 100644
--- a/ext/IO_Compress_Zlib/pod/FAQ.pod
+++ b/ext/IO-Compress/pod/FAQ.pod
@@ -1,7 +1,7 @@
=head1 NAME
-IO::Compress::Zlib::FAQ -- Frequently Asked Questions about IO::Compress::Zlib
+IO::Compress::FAQ -- Frequently Asked Questions about IO::Compress
=head1 DESCRIPTION
@@ -9,7 +9,10 @@ Common questions answered.
=head2 Compatibility with Unix compress/uncompress.
-This module is not compatible with Unix C<compress>.
+Although C<Compress::Zlib> has a pair of functions called C<compress> and
+C<uncompress>, they are I<not> related to the Unix programs of the same
+name. The C<Compress::Zlib> module is not compatible with Unix
+C<compress>.
If you have the C<uncompress> program available, you can use this to read
compressed files
@@ -37,11 +40,14 @@ available
=head2 Accessing .tar.Z files
-See previous FAQ item.
+The C<Archive::Tar> module can optionally use C<Compress::Zlib> (via the
+C<IO::Zlib> module) to access tar files that have been compressed with
+C<gzip>. Unfortunately tar files compressed with the Unix C<compress>
+utility cannot be read by C<Compress::Zlib> and so cannot be directly
+accessed by C<Archive::Tar>.
-If the C<Archive::Tar> module is installed and either the C<uncompress> or
-C<gunzip> programs are available, you can use one of these workarounds to
-read C<.tar.Z> files.
+If the C<uncompress> or C<gunzip> programs are available, you can use one
+of these workarounds to read C<.tar.Z> files from C<Archive::Tar>
Firstly with C<uncompress>
@@ -499,7 +505,7 @@ See the Changes file.
=head1 COPYRIGHT AND LICENSE
-Copyright (c) 2005-2008 Paul Marquess. All rights reserved.
+Copyright (c) 2005-2009 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.
diff --git a/ext/Compress-Zlib/private/MakeUtil.pm b/ext/IO-Compress/private/MakeUtil.pm
index e595910654..e595910654 100644
--- a/ext/Compress-Zlib/private/MakeUtil.pm
+++ b/ext/IO-Compress/private/MakeUtil.pm
diff --git a/ext/IO-Compress/t/000prereq.t b/ext/IO-Compress/t/000prereq.t
new file mode 100644
index 0000000000..f2a687b41e
--- /dev/null
+++ b/ext/IO-Compress/t/000prereq.t
@@ -0,0 +1,56 @@
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir 't' if -d 't';
+ @INC = ("../lib", "lib/compress");
+ }
+}
+
+use lib qw(t t/compress);
+use strict ;
+use warnings ;
+
+use Test::More ;
+
+BEGIN
+{
+ # use Test::NoWarnings, if available
+ my $extra = 0 ;
+ $extra = 1
+ if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 };
+
+
+ my $VERSION = '2.019';
+ my @NAMES = qw(
+ Compress::Raw::Bzip2
+ Compress::Raw::Zlib
+ );
+
+ my @OPT = qw(
+
+ );
+
+ plan tests => @NAMES + @OPT + $extra ;
+
+ foreach my $name (@NAMES)
+ {
+ use_ok($name, $VERSION);
+ }
+
+
+ foreach my $name (@OPT)
+ {
+ eval " require $name " ;
+ if ($@)
+ {
+ ok 1, "$name not available"
+ }
+ else
+ {
+ my $ver = eval("\$${name}::VERSION");
+ is $ver, $VERSION, "$name version should be $VERSION"
+ or diag "$name version is $ver, need $VERSION" ;
+ }
+ }
+
+}
+
diff --git a/ext/IO-Compress/t/001bzip2.t b/ext/IO-Compress/t/001bzip2.t
new file mode 100644
index 0000000000..40b9bcca59
--- /dev/null
+++ b/ext/IO-Compress/t/001bzip2.t
@@ -0,0 +1,206 @@
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir 't' if -d 't';
+ @INC = ("../lib", "lib/compress");
+ }
+}
+
+use lib qw(t t/compress);
+
+use strict;
+use warnings;
+use bytes;
+
+use Test::More ;
+use CompTestUtils;
+
+BEGIN
+{
+ # use Test::NoWarnings, if available
+ my $extra = 0 ;
+ $extra = 1
+ if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 };
+
+ plan tests => 841 + $extra ;
+};
+
+
+use IO::Compress::Bzip2 qw($Bzip2Error) ;
+use IO::Uncompress::Bunzip2 qw($Bunzip2Error) ;
+
+
+my $CompressClass = 'IO::Compress::Bzip2';
+my $UncompressClass = getInverse($CompressClass);
+my $Error = getErrorRef($CompressClass);
+my $UnError = getErrorRef($UncompressClass);
+
+sub myBZreadFile
+{
+ my $filename = shift ;
+ my $init = shift ;
+
+
+ my $fil = new $UncompressClass $filename,
+ -Strict => 1,
+ -Append => 1
+ ;
+
+ my $data = '';
+ $data = $init if defined $init ;
+ 1 while $fil->read($data) > 0;
+
+ $fil->close ;
+ return $data ;
+}
+
+
+{
+
+ title "Testing $CompressClass Errors";
+
+ my $buffer ;
+
+ for my $value (undef, -1, 'fred')
+ {
+ my $stringValue = defined $value ? $value : 'undef';
+ title "BlockSize100K => $stringValue";
+ my $err = "Parameter 'BlockSize100K' must be an unsigned int, got '$stringValue'";
+ my $bz ;
+ eval { $bz = new IO::Compress::Bzip2(\$buffer, BlockSize100K => $value) };
+ like $@, mkErr("IO::Compress::Bzip2: $err"),
+ " value $stringValue is bad";
+ is $Bzip2Error, "IO::Compress::Bzip2: $err",
+ " value $stringValue is bad";
+ ok ! $bz, " no bz object";
+ }
+
+ for my $value (0, 10, 99999)
+ {
+ my $stringValue = defined $value ? $value : 'undef';
+ title "BlockSize100K => $stringValue";
+ my $err = "Parameter 'BlockSize100K' not between 1 and 9, got $stringValue";
+ my $bz ;
+ eval { $bz = new IO::Compress::Bzip2(\$buffer, BlockSize100K => $value) };
+ like $@, mkErr("IO::Compress::Bzip2: $err"),
+ " value $stringValue is bad";
+ is $Bzip2Error, "IO::Compress::Bzip2: $err",
+ " value $stringValue is bad";
+ ok ! $bz, " no bz object";
+ }
+
+ for my $value (undef, -1, 'fred')
+ {
+ my $stringValue = defined $value ? $value : 'undef';
+ title "WorkFactor => $stringValue";
+ my $err = "Parameter 'WorkFactor' must be an unsigned int, got '$stringValue'";
+ my $bz ;
+ eval { $bz = new IO::Compress::Bzip2(\$buffer, WorkFactor => $value) };
+ like $@, mkErr("IO::Compress::Bzip2: $err"),
+ " value $stringValue is bad";
+ is $Bzip2Error, "IO::Compress::Bzip2: $err",
+ " value $stringValue is bad";
+ ok ! $bz, " no bz object";
+ }
+
+ for my $value (251, 99999)
+ {
+ my $stringValue = defined $value ? $value : 'undef';
+ title "WorkFactor => $stringValue";
+ my $err = "Parameter 'WorkFactor' not between 0 and 250, got $stringValue";
+ my $bz ;
+ eval { $bz = new IO::Compress::Bzip2(\$buffer, WorkFactor => $value) };
+ like $@, mkErr("IO::Compress::Bzip2: $err"),
+ " value $stringValue is bad";
+ is $Bzip2Error, "IO::Compress::Bzip2: $err",
+ " value $stringValue is bad";
+ ok ! $bz, " no bz object";
+ }
+
+}
+
+
+{
+ title "Testing $UncompressClass Errors";
+
+ my $buffer ;
+
+ for my $value (-1, 'fred')
+ {
+ my $stringValue = defined $value ? $value : 'undef';
+ title "Small => $stringValue";
+ my $err = "Parameter 'Small' must be an int, got '$stringValue'";
+ my $bz ;
+ eval { $bz = new IO::Uncompress::Bunzip2(\$buffer, Small => $value) };
+ like $@, mkErr("IO::Uncompress::Bunzip2: $err"),
+ " value $stringValue is bad";
+ is $Bunzip2Error, "IO::Uncompress::Bunzip2: $err",
+ " value $stringValue is bad";
+ ok ! $bz, " no bz object";
+ }
+
+}
+
+{
+ title "Testing $CompressClass and $UncompressClass";
+
+ my $hello = <<EOM ;
+hello world
+this is a test
+EOM
+
+ for my $value ( 1 .. 9 )
+ {
+ title "$CompressClass - BlockSize100K => $value";
+ my $lex = new LexFile my $name ;
+ my $bz ;
+ $bz = new IO::Compress::Bzip2($name, BlockSize100K => $value)
+ or diag $IO::Compress::Bzip2::Bzip2Error ;
+ ok $bz, " bz object ok";
+ $bz->write($hello);
+ $bz->close($hello);
+
+ is myBZreadFile($name), $hello, " got expected content";
+ }
+
+ for my $value ( 0 .. 250 )
+ {
+ title "$CompressClass - WorkFactor => $value";
+ my $lex = new LexFile my $name ;
+ my $bz ;
+ $bz = new IO::Compress::Bzip2($name, WorkFactor => $value);
+ ok $bz, " bz object ok";
+ $bz->write($hello);
+ $bz->close($hello);
+
+ is myBZreadFile($name), $hello, " got expected content";
+ }
+
+ for my $value ( 0 .. 1 )
+ {
+ title "$UncompressClass - Small => $value";
+ my $lex = new LexFile my $name ;
+ my $bz ;
+ $bz = new IO::Compress::Bzip2($name);
+ ok $bz, " bz object ok";
+ $bz->write($hello);
+ $bz->close($hello);
+
+ my $fil = new $UncompressClass $name,
+ Append => 1,
+ Small => $value ;
+
+ my $data = '';
+ 1 while $fil->read($data) > 0;
+
+ $fil->close ;
+
+ is $data, $hello, " got expected";
+ }
+}
+
+
+1;
+
+
+
+
diff --git a/ext/IO_Compress_Zlib/t/001zlib-generic-deflate.t b/ext/IO-Compress/t/001zlib-generic-deflate.t
index a988ab9791..a988ab9791 100644
--- a/ext/IO_Compress_Zlib/t/001zlib-generic-deflate.t
+++ b/ext/IO-Compress/t/001zlib-generic-deflate.t
diff --git a/ext/IO_Compress_Zlib/t/001zlib-generic-gzip.t b/ext/IO-Compress/t/001zlib-generic-gzip.t
index db9101d91f..db9101d91f 100644
--- a/ext/IO_Compress_Zlib/t/001zlib-generic-gzip.t
+++ b/ext/IO-Compress/t/001zlib-generic-gzip.t
diff --git a/ext/IO_Compress_Zlib/t/001zlib-generic-rawdeflate.t b/ext/IO-Compress/t/001zlib-generic-rawdeflate.t
index 4c491eb3a2..4c491eb3a2 100644
--- a/ext/IO_Compress_Zlib/t/001zlib-generic-rawdeflate.t
+++ b/ext/IO-Compress/t/001zlib-generic-rawdeflate.t
diff --git a/ext/IO_Compress_Zlib/t/001zlib-generic-zip.t b/ext/IO-Compress/t/001zlib-generic-zip.t
index a9c755537f..a9c755537f 100644
--- a/ext/IO_Compress_Zlib/t/001zlib-generic-zip.t
+++ b/ext/IO-Compress/t/001zlib-generic-zip.t
diff --git a/ext/IO_Compress_Zlib/t/002any-deflate.t b/ext/IO-Compress/t/002any-deflate.t
index 6a4387ef0c..6a4387ef0c 100644
--- a/ext/IO_Compress_Zlib/t/002any-deflate.t
+++ b/ext/IO-Compress/t/002any-deflate.t
diff --git a/ext/IO_Compress_Zlib/t/002any-gzip.t b/ext/IO-Compress/t/002any-gzip.t
index e93625fdfa..e93625fdfa 100644
--- a/ext/IO_Compress_Zlib/t/002any-gzip.t
+++ b/ext/IO-Compress/t/002any-gzip.t
diff --git a/ext/IO_Compress_Zlib/t/002any-rawdeflate.t b/ext/IO-Compress/t/002any-rawdeflate.t
index ef716c60c1..ef716c60c1 100644
--- a/ext/IO_Compress_Zlib/t/002any-rawdeflate.t
+++ b/ext/IO-Compress/t/002any-rawdeflate.t
diff --git a/ext/IO_Compress_Zlib/t/002any-transparent.t b/ext/IO-Compress/t/002any-transparent.t
index bb26bbcac0..bb26bbcac0 100644
--- a/ext/IO_Compress_Zlib/t/002any-transparent.t
+++ b/ext/IO-Compress/t/002any-transparent.t
diff --git a/ext/IO_Compress_Zlib/t/002any-zip.t b/ext/IO-Compress/t/002any-zip.t
index 27f1714899..27f1714899 100644
--- a/ext/IO_Compress_Zlib/t/002any-zip.t
+++ b/ext/IO-Compress/t/002any-zip.t
diff --git a/ext/IO_Compress_Zlib/t/004gziphdr.t b/ext/IO-Compress/t/004gziphdr.t
index 210d499a65..210d499a65 100644
--- a/ext/IO_Compress_Zlib/t/004gziphdr.t
+++ b/ext/IO-Compress/t/004gziphdr.t
diff --git a/ext/IO_Compress_Zlib/t/005defhdr.t b/ext/IO-Compress/t/005defhdr.t
index 990b79b3f1..990b79b3f1 100644
--- a/ext/IO_Compress_Zlib/t/005defhdr.t
+++ b/ext/IO-Compress/t/005defhdr.t
diff --git a/ext/IO_Compress_Zlib/t/006zip.t b/ext/IO-Compress/t/006zip.t
index fdb28ee97e..fdb28ee97e 100644
--- a/ext/IO_Compress_Zlib/t/006zip.t
+++ b/ext/IO-Compress/t/006zip.t
diff --git a/ext/IO-Compress/t/010examples-bzip2.t b/ext/IO-Compress/t/010examples-bzip2.t
new file mode 100644
index 0000000000..9bb5eb20e7
--- /dev/null
+++ b/ext/IO-Compress/t/010examples-bzip2.t
@@ -0,0 +1,145 @@
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir 't' if -d 't';
+ @INC = ("../lib", "lib/compress");
+ }
+}
+
+use lib qw(t t/compress);
+
+use strict;
+use warnings;
+use bytes;
+
+use Test::More ;
+use CompTestUtils;
+use IO::Compress::Bzip2 'bzip2' ;
+
+BEGIN
+{
+ plan(skip_all => "Examples needs Perl 5.005 or better - you have Perl $]" )
+ if $] < 5.005 ;
+
+ # use Test::NoWarnings, if available
+ my $extra = 0 ;
+ $extra = 1
+ if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 };
+
+ plan tests => 19 + $extra ;
+}
+
+
+my $Inc = join " ", map qq["-I$_"] => @INC;
+$Inc = '"-MExtUtils::testlib"'
+ if ! $ENV{PERL_CORE} && eval " require ExtUtils::testlib; " ;
+
+my $Perl = ($ENV{'FULLPERL'} or $^X or 'perl') ;
+$Perl = qq["$Perl"] if $^O eq 'MSWin32' ;
+
+$Perl = "$Perl $Inc -w" ;
+#$Perl .= " -Mblib " ;
+my $examples = $ENV{PERL_CORE} ? "../ext/IO-Compress/examples/io/bzip2"
+ : "./examples/io/bzip2";
+
+my $hello1 = <<EOM ;
+hello
+this is
+a test
+message
+x ttttt
+xuuuuuu
+the end
+EOM
+
+my @hello1 = grep(s/$/\n/, split(/\n/, $hello1)) ;
+
+my $hello2 = <<EOM;
+
+Howdy
+this is the
+second
+file
+x ppppp
+xuuuuuu
+really the end
+EOM
+
+my @hello2 = grep(s/$/\n/, split(/\n/, $hello2)) ;
+
+my $file1 = "hello1.gz" ;
+my $file2 = "hello2.gz" ;
+my $stderr = "err.out" ;
+
+for ($file1, $file2, $stderr) { 1 while unlink $_ } ;
+
+
+bzip2 \$hello1 => $file1 ;
+bzip2 \$hello2 => $file2 ;
+
+sub check
+{
+ my $command = shift ;
+ my $expected = shift ;
+
+ my $stderr = 'err.out';
+ 1 while unlink $stderr;
+
+ my $cmd = "$command 2>$stderr";
+ my $stdout = `$cmd` ;
+
+ my $aok = 1 ;
+
+ $aok &= is $?, 0, " exit status is 0" ;
+
+ $aok &= is readFile($stderr), '', " no stderr" ;
+
+ $aok &= is $stdout, $expected, " expected content is ok"
+ if defined $expected ;
+
+ if (! $aok) {
+ diag "Command line: $cmd";
+ my ($file, $line) = (caller)[1,2];
+ diag "Test called from $file, line $line";
+ }
+
+ 1 while unlink $stderr;
+}
+
+# bzcat
+# #####
+
+title "bzcat - command line" ;
+check "$Perl ${examples}/bzcat $file1 $file2", $hello1 . $hello2;
+
+title "bzcat - stdin" ;
+check "$Perl ${examples}/bzcat <$file1 ", $hello1;
+
+
+# bzgrep
+# ######
+
+title "bzgrep";
+check "$Perl ${examples}/bzgrep the $file1 $file2",
+ join('', grep(/the/, @hello1, @hello2));
+
+for ($file1, $file2, $stderr) { 1 while unlink $_ } ;
+
+
+
+# bzstream
+# ########
+
+{
+ title "bzstream" ;
+ writeFile($file1, $hello1) ;
+ check "$Perl ${examples}/bzstream <$file1 >$file2";
+
+ title "bzcat" ;
+ check "$Perl ${examples}/bzcat $file2", $hello1 ;
+}
+
+END
+{
+ for ($file1, $file2, $stderr) { 1 while unlink $_ } ;
+}
+
diff --git a/ext/IO_Compress_Zlib/t/010examples.t b/ext/IO-Compress/t/010examples-zlib.t
index a2562a2a0f..712c0b4934 100644
--- a/ext/IO_Compress_Zlib/t/010examples.t
+++ b/ext/IO-Compress/t/010examples-zlib.t
@@ -38,8 +38,8 @@ $Perl = qq["$Perl"] if $^O eq 'MSWin32' ;
$Perl = "$Perl $Inc -w" ;
#$Perl .= " -Mblib " ;
-my $examples = $ENV{PERL_CORE} ? "../ext/Compress-Zlib/examples"
- : "./examples";
+my $examples = $ENV{PERL_CORE} ? "../ext/IO-Compress/examples/io/gzip"
+ : "./examples/io/gzip";
my $hello1 = <<EOM ;
hello
diff --git a/ext/IO_Compress_Base/t/01misc.t b/ext/IO-Compress/t/01misc.t
index 27706f6cfa..27706f6cfa 100644
--- a/ext/IO_Compress_Base/t/01misc.t
+++ b/ext/IO-Compress/t/01misc.t
diff --git a/ext/IO_Compress_Zlib/t/020isize.t b/ext/IO-Compress/t/020isize.t
index c600c95f34..c600c95f34 100644
--- a/ext/IO_Compress_Zlib/t/020isize.t
+++ b/ext/IO-Compress/t/020isize.t
diff --git a/ext/IO_Compress_Zlib/t/050interop-gzip.t b/ext/IO-Compress/t/050interop-gzip.t
index 22be0646c8..22be0646c8 100644
--- a/ext/IO_Compress_Zlib/t/050interop-gzip.t
+++ b/ext/IO-Compress/t/050interop-gzip.t
diff --git a/ext/IO-Compress/t/100generic-bzip2.t b/ext/IO-Compress/t/100generic-bzip2.t
new file mode 100644
index 0000000000..a9f430e236
--- /dev/null
+++ b/ext/IO-Compress/t/100generic-bzip2.t
@@ -0,0 +1,21 @@
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir 't' if -d 't';
+ @INC = ("../lib", "lib/compress");
+ }
+}
+
+use lib qw(t t/compress);
+use strict;
+use warnings;
+
+use IO::Compress::Bzip2 qw($Bzip2Error) ;
+use IO::Uncompress::Bunzip2 qw($Bunzip2Error) ;
+
+sub identify
+{
+ 'IO::Compress::Bzip2';
+}
+
+require "generic.pl" ;
+run();
diff --git a/ext/IO_Compress_Zlib/t/100generic-deflate.t b/ext/IO-Compress/t/100generic-deflate.t
index 999c9561e2..999c9561e2 100644
--- a/ext/IO_Compress_Zlib/t/100generic-deflate.t
+++ b/ext/IO-Compress/t/100generic-deflate.t
diff --git a/ext/IO_Compress_Zlib/t/100generic-gzip.t b/ext/IO-Compress/t/100generic-gzip.t
index 614945ca80..614945ca80 100644
--- a/ext/IO_Compress_Zlib/t/100generic-gzip.t
+++ b/ext/IO-Compress/t/100generic-gzip.t
diff --git a/ext/IO_Compress_Zlib/t/100generic-rawdeflate.t b/ext/IO-Compress/t/100generic-rawdeflate.t
index b5a43697bd..b5a43697bd 100644
--- a/ext/IO_Compress_Zlib/t/100generic-rawdeflate.t
+++ b/ext/IO-Compress/t/100generic-rawdeflate.t
diff --git a/ext/IO_Compress_Zlib/t/100generic-zip.t b/ext/IO-Compress/t/100generic-zip.t
index 907dada4c5..907dada4c5 100644
--- a/ext/IO_Compress_Zlib/t/100generic-zip.t
+++ b/ext/IO-Compress/t/100generic-zip.t
diff --git a/ext/IO-Compress/t/101truncate-bzip2.t b/ext/IO-Compress/t/101truncate-bzip2.t
new file mode 100644
index 0000000000..7aba01dd39
--- /dev/null
+++ b/ext/IO-Compress/t/101truncate-bzip2.t
@@ -0,0 +1,37 @@
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir 't' if -d 't';
+ @INC = ("../lib", "lib/compress");
+ }
+}
+
+use lib qw(t t/compress);
+use strict;
+use warnings;
+
+use Test::More ;
+
+BEGIN {
+ # use Test::NoWarnings, if available
+ my $extra = 0 ;
+ $extra = 1
+ if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 };
+
+ plan tests => 912 + $extra;
+
+};
+
+
+#use Test::More skip_all => "not implemented yet";
+
+
+use IO::Compress::Bzip2 qw($Bzip2Error) ;
+use IO::Uncompress::Bunzip2 qw($Bunzip2Error) ;
+
+sub identify
+{
+ 'IO::Compress::Bzip2';
+}
+
+require "truncate.pl" ;
+run();
diff --git a/ext/IO_Compress_Zlib/t/101truncate-deflate.t b/ext/IO-Compress/t/101truncate-deflate.t
index 2ae2b312df..2ae2b312df 100644
--- a/ext/IO_Compress_Zlib/t/101truncate-deflate.t
+++ b/ext/IO-Compress/t/101truncate-deflate.t
diff --git a/ext/IO_Compress_Zlib/t/101truncate-gzip.t b/ext/IO-Compress/t/101truncate-gzip.t
index 1e546b47e9..1e546b47e9 100644
--- a/ext/IO_Compress_Zlib/t/101truncate-gzip.t
+++ b/ext/IO-Compress/t/101truncate-gzip.t
diff --git a/ext/IO_Compress_Zlib/t/101truncate-rawdeflate.t b/ext/IO-Compress/t/101truncate-rawdeflate.t
index cc4a2a3e2f..d81b54a7b3 100644
--- a/ext/IO_Compress_Zlib/t/101truncate-rawdeflate.t
+++ b/ext/IO-Compress/t/101truncate-rawdeflate.t
@@ -63,9 +63,9 @@ foreach my $CompressClass ( 'IO::Compress::RawDeflate')
-Transparent => 0))
or diag "$$Error\n";
my $un;
- ok $gz->read($un) > 0 ;
+ is $gz->read($un, length($hello)), length($hello);
ok $gz->close();
- ok $un eq $hello ;
+ is $un, $hello ;
for my $trans (0 .. 1)
{
@@ -95,7 +95,7 @@ foreach my $CompressClass ( 'IO::Compress::RawDeflate')
ok $gz;
ok ! $gz->error() ;
my $buff = '';
- is $gz->read($buff), length $part ;
+ is $gz->read($buff, length $part), length $part ;
is $buff, $part ;
ok $gz->eof() ;
$gz->close();
diff --git a/ext/IO_Compress_Zlib/t/101truncate-zip.t b/ext/IO-Compress/t/101truncate-zip.t
index 719da361ed..0bc2c100d0 100644
--- a/ext/IO_Compress_Zlib/t/101truncate-zip.t
+++ b/ext/IO-Compress/t/101truncate-zip.t
@@ -18,7 +18,7 @@ BEGIN {
$extra = 1
if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 };
- plan tests => 2316 + $extra;
+ plan tests => 2404 + $extra;
};
diff --git a/ext/IO-Compress/t/102tied-bzip2.t b/ext/IO-Compress/t/102tied-bzip2.t
new file mode 100644
index 0000000000..8503e02529
--- /dev/null
+++ b/ext/IO-Compress/t/102tied-bzip2.t
@@ -0,0 +1,21 @@
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir 't' if -d 't';
+ @INC = ("../lib", "lib/compress");
+ }
+}
+
+use lib qw(t t/compress);
+use strict;
+use warnings;
+
+use IO::Compress::Bzip2 qw($Bzip2Error) ;
+use IO::Uncompress::Bunzip2 qw($Bunzip2Error) ;
+
+sub identify
+{
+ 'IO::Compress::Bzip2';
+}
+
+require "tied.pl" ;
+run();
diff --git a/ext/IO_Compress_Zlib/t/102tied-deflate.t b/ext/IO-Compress/t/102tied-deflate.t
index 8747aee90f..8747aee90f 100644
--- a/ext/IO_Compress_Zlib/t/102tied-deflate.t
+++ b/ext/IO-Compress/t/102tied-deflate.t
diff --git a/ext/IO_Compress_Zlib/t/102tied-gzip.t b/ext/IO-Compress/t/102tied-gzip.t
index 52a502ecd3..52a502ecd3 100644
--- a/ext/IO_Compress_Zlib/t/102tied-gzip.t
+++ b/ext/IO-Compress/t/102tied-gzip.t
diff --git a/ext/IO_Compress_Zlib/t/102tied-rawdeflate.t b/ext/IO-Compress/t/102tied-rawdeflate.t
index f3ba80cfc8..f3ba80cfc8 100644
--- a/ext/IO_Compress_Zlib/t/102tied-rawdeflate.t
+++ b/ext/IO-Compress/t/102tied-rawdeflate.t
diff --git a/ext/IO_Compress_Zlib/t/102tied-zip.t b/ext/IO-Compress/t/102tied-zip.t
index 04be98dc6f..04be98dc6f 100644
--- a/ext/IO_Compress_Zlib/t/102tied-zip.t
+++ b/ext/IO-Compress/t/102tied-zip.t
diff --git a/ext/IO-Compress/t/103newtied-bzip2.t b/ext/IO-Compress/t/103newtied-bzip2.t
new file mode 100644
index 0000000000..ecf8a49893
--- /dev/null
+++ b/ext/IO-Compress/t/103newtied-bzip2.t
@@ -0,0 +1,21 @@
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir 't' if -d 't';
+ @INC = ("../lib", "lib/compress");
+ }
+}
+
+use lib qw(t t/compress);
+use strict;
+use warnings;
+
+use IO::Compress::Bzip2 qw($Bzip2Error) ;
+use IO::Uncompress::Bunzip2 qw($Bunzip2Error) ;
+
+sub identify
+{
+ 'IO::Compress::Bzip2';
+}
+
+require "newtied.pl" ;
+run();
diff --git a/ext/IO_Compress_Zlib/t/103newtied-deflate.t b/ext/IO-Compress/t/103newtied-deflate.t
index 42a3d3c2bd..42a3d3c2bd 100644
--- a/ext/IO_Compress_Zlib/t/103newtied-deflate.t
+++ b/ext/IO-Compress/t/103newtied-deflate.t
diff --git a/ext/IO_Compress_Zlib/t/103newtied-gzip.t b/ext/IO-Compress/t/103newtied-gzip.t
index 7a453fa479..7a453fa479 100644
--- a/ext/IO_Compress_Zlib/t/103newtied-gzip.t
+++ b/ext/IO-Compress/t/103newtied-gzip.t
diff --git a/ext/IO_Compress_Zlib/t/103newtied-rawdeflate.t b/ext/IO-Compress/t/103newtied-rawdeflate.t
index 93a5118526..93a5118526 100644
--- a/ext/IO_Compress_Zlib/t/103newtied-rawdeflate.t
+++ b/ext/IO-Compress/t/103newtied-rawdeflate.t
diff --git a/ext/IO_Compress_Zlib/t/103newtied-zip.t b/ext/IO-Compress/t/103newtied-zip.t
index 84b19453b7..84b19453b7 100644
--- a/ext/IO_Compress_Zlib/t/103newtied-zip.t
+++ b/ext/IO-Compress/t/103newtied-zip.t
diff --git a/ext/IO-Compress/t/104destroy-bzip2.t b/ext/IO-Compress/t/104destroy-bzip2.t
new file mode 100644
index 0000000000..e8c02cf3d2
--- /dev/null
+++ b/ext/IO-Compress/t/104destroy-bzip2.t
@@ -0,0 +1,21 @@
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir 't' if -d 't';
+ @INC = ("../lib", "lib/compress");
+ }
+}
+
+use lib qw(t t/compress);
+use strict;
+use warnings;
+
+use IO::Compress::Bzip2 qw($Bzip2Error) ;
+use IO::Uncompress::Bunzip2 qw($Bunzip2Error) ;
+
+sub identify
+{
+ 'IO::Compress::Bzip2';
+}
+
+require "destroy.pl" ;
+run();
diff --git a/ext/IO_Compress_Zlib/t/104destroy-deflate.t b/ext/IO-Compress/t/104destroy-deflate.t
index 37511f7df4..37511f7df4 100644
--- a/ext/IO_Compress_Zlib/t/104destroy-deflate.t
+++ b/ext/IO-Compress/t/104destroy-deflate.t
diff --git a/ext/IO_Compress_Zlib/t/104destroy-gzip.t b/ext/IO-Compress/t/104destroy-gzip.t
index 5f686f480c..5f686f480c 100644
--- a/ext/IO_Compress_Zlib/t/104destroy-gzip.t
+++ b/ext/IO-Compress/t/104destroy-gzip.t
diff --git a/ext/IO_Compress_Zlib/t/104destroy-rawdeflate.t b/ext/IO-Compress/t/104destroy-rawdeflate.t
index 1463000e23..1463000e23 100644
--- a/ext/IO_Compress_Zlib/t/104destroy-rawdeflate.t
+++ b/ext/IO-Compress/t/104destroy-rawdeflate.t
diff --git a/ext/IO_Compress_Zlib/t/104destroy-zip.t b/ext/IO-Compress/t/104destroy-zip.t
index d071a06d37..d071a06d37 100644
--- a/ext/IO_Compress_Zlib/t/104destroy-zip.t
+++ b/ext/IO-Compress/t/104destroy-zip.t
diff --git a/ext/IO-Compress/t/105oneshot-bzip2.t b/ext/IO-Compress/t/105oneshot-bzip2.t
new file mode 100644
index 0000000000..c402829fe4
--- /dev/null
+++ b/ext/IO-Compress/t/105oneshot-bzip2.t
@@ -0,0 +1,22 @@
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir 't' if -d 't';
+ @INC = ("../lib", "lib/compress");
+ }
+}
+
+use lib qw(t t/compress);
+use strict;
+use warnings;
+
+use IO::Compress::Bzip2 qw($Bzip2Error) ;
+use IO::Uncompress::Bunzip2 qw($Bunzip2Error) ;
+
+sub identify
+{
+ 'IO::Compress::Bzip2';
+}
+
+require "oneshot.pl" ;
+
+run();
diff --git a/ext/IO_Compress_Zlib/t/105oneshot-deflate.t b/ext/IO-Compress/t/105oneshot-deflate.t
index ab108eaa78..ab108eaa78 100644
--- a/ext/IO_Compress_Zlib/t/105oneshot-deflate.t
+++ b/ext/IO-Compress/t/105oneshot-deflate.t
diff --git a/ext/IO_Compress_Zlib/t/105oneshot-gzip-only.t b/ext/IO-Compress/t/105oneshot-gzip-only.t
index 0382df8e33..0382df8e33 100644
--- a/ext/IO_Compress_Zlib/t/105oneshot-gzip-only.t
+++ b/ext/IO-Compress/t/105oneshot-gzip-only.t
diff --git a/ext/IO_Compress_Zlib/t/105oneshot-gzip.t b/ext/IO-Compress/t/105oneshot-gzip.t
index 2aab93e67c..9a45222dc1 100644
--- a/ext/IO_Compress_Zlib/t/105oneshot-gzip.t
+++ b/ext/IO-Compress/t/105oneshot-gzip.t
@@ -18,4 +18,5 @@ sub identify
}
require "oneshot.pl" ;
+
run();
diff --git a/ext/IO_Compress_Zlib/t/105oneshot-rawdeflate.t b/ext/IO-Compress/t/105oneshot-rawdeflate.t
index 50cb80a3c1..50cb80a3c1 100644
--- a/ext/IO_Compress_Zlib/t/105oneshot-rawdeflate.t
+++ b/ext/IO-Compress/t/105oneshot-rawdeflate.t
diff --git a/ext/IO-Compress/t/105oneshot-zip-bzip2-only.t b/ext/IO-Compress/t/105oneshot-zip-bzip2-only.t
new file mode 100644
index 0000000000..861eaef8fd
--- /dev/null
+++ b/ext/IO-Compress/t/105oneshot-zip-bzip2-only.t
@@ -0,0 +1,168 @@
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir 't' if -d 't';
+ @INC = ("../lib", "lib/compress");
+ }
+}
+
+use lib qw(t t/compress);
+use strict;
+use warnings;
+use bytes;
+
+use Test::More ;
+use CompTestUtils;
+
+BEGIN {
+ plan(skip_all => "oneshot needs Perl 5.005 or better - you have Perl $]" )
+ if $] < 5.005 ;
+
+ plan(skip_all => "IO::Compress::Bzip2 not available" )
+ unless eval { require IO::Compress::Bzip2;
+ require IO::Uncompress::Bunzip2;
+ 1
+ } ;
+
+ # use Test::NoWarnings, if available
+ my $extra = 0 ;
+ $extra = 1
+ if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 };
+
+ plan tests => 120 + $extra ;
+
+ #use_ok('IO::Compress::Zip', qw(zip $ZipError :zip_method)) ;
+ use_ok('IO::Compress::Zip', qw(:all)) ;
+ use_ok('IO::Uncompress::Unzip', qw(unzip $UnzipError)) ;
+
+
+}
+
+
+sub zipGetHeader
+{
+ my $in = shift;
+ my $content = shift ;
+ my %opts = @_ ;
+
+ my $out ;
+ my $got ;
+
+ ok zip($in, \$out, %opts), " zip ok" ;
+ ok unzip(\$out, \$got), " unzip ok"
+ or diag $UnzipError ;
+ is $got, $content, " got expected content" ;
+
+ my $gunz = new IO::Uncompress::Unzip \$out, Strict => 0
+ or diag "UnzipError is $IO::Uncompress::Unzip::UnzipError" ;
+ ok $gunz, " Created IO::Uncompress::Unzip object";
+ my $hdr = $gunz->getHeaderInfo();
+ ok $hdr, " got Header info";
+ my $uncomp ;
+ ok $gunz->read($uncomp), " read ok" ;
+ is $uncomp, $content, " got expected content";
+ ok $gunz->close, " closed ok" ;
+
+ return $hdr ;
+
+}
+
+
+for my $stream (0, 1)
+{
+ for my $zip64 (0, 1)
+ {
+ next if $zip64 && ! $stream;
+
+ for my $method (ZIP_CM_STORE, ZIP_CM_DEFLATE, ZIP_CM_BZIP2)
+ {
+ title "Stream $stream, Zip64 $zip64, Method $method";
+
+ my $lex = new LexFile my $file1;
+
+ my $content = "hello ";
+ #writeFile($file1, $content);
+
+ ok zip(\$content => $file1 , Method => $method,
+ Zip64 => $zip64,
+ Stream => $stream), " zip ok"
+ or diag $ZipError ;
+
+ my $got ;
+ if ($stream && $method == ZIP_CM_STORE ) {
+ #eval ' unzip($file1 => \$got) ';
+ ok ! unzip($file1 => \$got), " unzip fails";
+ like $UnzipError, "/Streamed Stored content not supported/",
+ " Streamed Stored content not supported";
+ next ;
+ }
+
+ ok unzip($file1 => \$got), " unzip ok"
+ or diag $UnzipError ;
+
+ is $got, $content, " content ok";
+
+ my $u = new IO::Uncompress::Unzip $file1
+ or diag $ZipError ;
+
+ my $hdr = $u->getHeaderInfo();
+ ok $hdr, " got header";
+
+ is $hdr->{Stream}, $stream, " stream is $stream" ;
+ is $hdr->{MethodID}, $method, " MethodID is $method" ;
+ is $hdr->{Zip64}, $zip64, " Zip64 is $zip64" ;
+ }
+ }
+}
+
+for my $stream (0, 1)
+{
+ for my $zip64 (0, 1)
+ {
+ next if $zip64 && ! $stream;
+
+ for my $method (ZIP_CM_STORE, ZIP_CM_DEFLATE, ZIP_CM_BZIP2)
+ {
+ title "Stream $stream, Zip64 $zip64, Method $method";
+
+ my $file1;
+ my $file2;
+ my $zipfile;
+ my $lex = new LexFile $file1, $file2, $zipfile;
+
+ my $content1 = "hello ";
+ writeFile($file1, $content1);
+
+ my $content2 = "goodbye ";
+ writeFile($file2, $content2);
+
+ my %content = ( $file1 => $content1,
+ $file2 => $content2,
+ );
+
+ ok zip([$file1, $file2] => $zipfile , Method => $method,
+ Zip64 => $zip64,
+ Stream => $stream), " zip ok"
+ or diag $ZipError ;
+
+ for my $file ($file1, $file2)
+ {
+ my $got ;
+ if ($stream && $method == ZIP_CM_STORE ) {
+ #eval ' unzip($zipfile => \$got) ';
+ ok ! unzip($zipfile => \$got, Name => $file), " unzip fails";
+ like $UnzipError, "/Streamed Stored content not supported/",
+ " Streamed Stored content not supported";
+ next ;
+ }
+
+ ok unzip($zipfile => \$got, Name => $file), " unzip $file ok"
+ or diag $UnzipError ;
+
+ is $got, $content{$file}, " content ok";
+ }
+ }
+ }
+}
+
+# TODO add more error cases
+
diff --git a/ext/IO_Compress_Zlib/t/105oneshot-zip-only.t b/ext/IO-Compress/t/105oneshot-zip-only.t
index 807c9e9d61..807c9e9d61 100644
--- a/ext/IO_Compress_Zlib/t/105oneshot-zip-only.t
+++ b/ext/IO-Compress/t/105oneshot-zip-only.t
diff --git a/ext/IO_Compress_Zlib/t/105oneshot-zip.t b/ext/IO-Compress/t/105oneshot-zip.t
index e236fc66fa..e236fc66fa 100644
--- a/ext/IO_Compress_Zlib/t/105oneshot-zip.t
+++ b/ext/IO-Compress/t/105oneshot-zip.t
diff --git a/ext/IO-Compress/t/106prime-bzip2.t b/ext/IO-Compress/t/106prime-bzip2.t
new file mode 100644
index 0000000000..d5a0d98fff
--- /dev/null
+++ b/ext/IO-Compress/t/106prime-bzip2.t
@@ -0,0 +1,21 @@
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir 't' if -d 't';
+ @INC = ("../lib", "lib/compress");
+ }
+}
+
+use lib qw(t t/compress);
+use strict;
+use warnings;
+
+use IO::Compress::Bzip2 qw($Bzip2Error) ;
+use IO::Uncompress::Bunzip2 qw($Bunzip2Error) ;
+
+sub identify
+{
+ 'IO::Compress::Bzip2';
+}
+
+require "prime.pl" ;
+run();
diff --git a/ext/IO_Compress_Zlib/t/106prime-deflate.t b/ext/IO-Compress/t/106prime-deflate.t
index 0ef9bd8834..0ef9bd8834 100644
--- a/ext/IO_Compress_Zlib/t/106prime-deflate.t
+++ b/ext/IO-Compress/t/106prime-deflate.t
diff --git a/ext/IO_Compress_Zlib/t/106prime-gzip.t b/ext/IO-Compress/t/106prime-gzip.t
index b6ab10e6d2..b6ab10e6d2 100644
--- a/ext/IO_Compress_Zlib/t/106prime-gzip.t
+++ b/ext/IO-Compress/t/106prime-gzip.t
diff --git a/ext/IO_Compress_Zlib/t/106prime-rawdeflate.t b/ext/IO-Compress/t/106prime-rawdeflate.t
index 4c81f7c605..4c81f7c605 100644
--- a/ext/IO_Compress_Zlib/t/106prime-rawdeflate.t
+++ b/ext/IO-Compress/t/106prime-rawdeflate.t
diff --git a/ext/IO_Compress_Zlib/t/106prime-zip.t b/ext/IO-Compress/t/106prime-zip.t
index 702c40128a..702c40128a 100644
--- a/ext/IO_Compress_Zlib/t/106prime-zip.t
+++ b/ext/IO-Compress/t/106prime-zip.t
diff --git a/ext/IO-Compress/t/107multi-bzip2.t b/ext/IO-Compress/t/107multi-bzip2.t
new file mode 100644
index 0000000000..0e7f5dbef3
--- /dev/null
+++ b/ext/IO-Compress/t/107multi-bzip2.t
@@ -0,0 +1,21 @@
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir 't' if -d 't';
+ @INC = ("../lib", "lib/compress");
+ }
+}
+
+use lib qw(t t/compress);
+use strict;
+use warnings;
+
+use IO::Compress::Bzip2 qw($Bzip2Error) ;
+use IO::Uncompress::Bunzip2 qw($Bunzip2Error) ;
+
+sub identify
+{
+ 'IO::Compress::Bzip2';
+}
+
+require "multi.pl" ;
+run();
diff --git a/ext/IO_Compress_Zlib/t/107multi-deflate.t b/ext/IO-Compress/t/107multi-deflate.t
index 397869bc92..397869bc92 100644
--- a/ext/IO_Compress_Zlib/t/107multi-deflate.t
+++ b/ext/IO-Compress/t/107multi-deflate.t
diff --git a/ext/IO_Compress_Zlib/t/107multi-gzip.t b/ext/IO-Compress/t/107multi-gzip.t
index 10922ed0da..10922ed0da 100644
--- a/ext/IO_Compress_Zlib/t/107multi-gzip.t
+++ b/ext/IO-Compress/t/107multi-gzip.t
diff --git a/ext/IO_Compress_Zlib/t/107multi-rawdeflate.t b/ext/IO-Compress/t/107multi-rawdeflate.t
index 374cb67831..374cb67831 100644
--- a/ext/IO_Compress_Zlib/t/107multi-rawdeflate.t
+++ b/ext/IO-Compress/t/107multi-rawdeflate.t
diff --git a/ext/IO_Compress_Zlib/t/107multi-zip.t b/ext/IO-Compress/t/107multi-zip.t
index fea653fbf6..fea653fbf6 100644
--- a/ext/IO_Compress_Zlib/t/107multi-zip.t
+++ b/ext/IO-Compress/t/107multi-zip.t
diff --git a/ext/IO-Compress/t/108anyunc-bzip2.t b/ext/IO-Compress/t/108anyunc-bzip2.t
new file mode 100644
index 0000000000..4b981e6806
--- /dev/null
+++ b/ext/IO-Compress/t/108anyunc-bzip2.t
@@ -0,0 +1,29 @@
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir 't' if -d 't';
+ @INC = ("../lib", "lib/compress");
+ }
+}
+
+use lib qw(t t/compress);
+use strict;
+use warnings;
+
+use IO::Uncompress::AnyUncompress qw($AnyUncompressError) ;
+
+use IO::Compress::Bzip2 qw($Bzip2Error) ;
+use IO::Uncompress::Bunzip2 qw($Bunzip2Error) ;
+
+sub getClass
+{
+ 'AnyUncompress';
+}
+
+
+sub identify
+{
+ 'IO::Compress::Bzip2';
+}
+
+require "any.pl" ;
+run();
diff --git a/ext/IO_Compress_Zlib/t/108anyunc-deflate.t b/ext/IO-Compress/t/108anyunc-deflate.t
index ed5e6b5efe..ed5e6b5efe 100644
--- a/ext/IO_Compress_Zlib/t/108anyunc-deflate.t
+++ b/ext/IO-Compress/t/108anyunc-deflate.t
diff --git a/ext/IO_Compress_Zlib/t/108anyunc-gzip.t b/ext/IO-Compress/t/108anyunc-gzip.t
index bac6a6a9d0..bac6a6a9d0 100644
--- a/ext/IO_Compress_Zlib/t/108anyunc-gzip.t
+++ b/ext/IO-Compress/t/108anyunc-gzip.t
diff --git a/ext/IO_Compress_Zlib/t/108anyunc-rawdeflate.t b/ext/IO-Compress/t/108anyunc-rawdeflate.t
index 7d85dada9a..7d85dada9a 100644
--- a/ext/IO_Compress_Zlib/t/108anyunc-rawdeflate.t
+++ b/ext/IO-Compress/t/108anyunc-rawdeflate.t
diff --git a/ext/IO_Compress_Zlib/t/108anyunc-transparent.t b/ext/IO-Compress/t/108anyunc-transparent.t
index 687b1f5cd2..687b1f5cd2 100644
--- a/ext/IO_Compress_Zlib/t/108anyunc-transparent.t
+++ b/ext/IO-Compress/t/108anyunc-transparent.t
diff --git a/ext/IO_Compress_Zlib/t/108anyunc-zip.t b/ext/IO-Compress/t/108anyunc-zip.t
index 72e015a6a1..72e015a6a1 100644
--- a/ext/IO_Compress_Zlib/t/108anyunc-zip.t
+++ b/ext/IO-Compress/t/108anyunc-zip.t
diff --git a/ext/IO_Compress_Zlib/t/109merge-deflate.t b/ext/IO-Compress/t/109merge-deflate.t
index a489f354d3..a489f354d3 100644
--- a/ext/IO_Compress_Zlib/t/109merge-deflate.t
+++ b/ext/IO-Compress/t/109merge-deflate.t
diff --git a/ext/IO_Compress_Zlib/t/109merge-gzip.t b/ext/IO-Compress/t/109merge-gzip.t
index 3041a99420..3041a99420 100644
--- a/ext/IO_Compress_Zlib/t/109merge-gzip.t
+++ b/ext/IO-Compress/t/109merge-gzip.t
diff --git a/ext/IO_Compress_Zlib/t/109merge-rawdeflate.t b/ext/IO-Compress/t/109merge-rawdeflate.t
index 2c9663726e..2c9663726e 100644
--- a/ext/IO_Compress_Zlib/t/109merge-rawdeflate.t
+++ b/ext/IO-Compress/t/109merge-rawdeflate.t
diff --git a/ext/IO_Compress_Zlib/t/109merge-zip.t b/ext/IO-Compress/t/109merge-zip.t
index 74adf09bf9..74adf09bf9 100644
--- a/ext/IO_Compress_Zlib/t/109merge-zip.t
+++ b/ext/IO-Compress/t/109merge-zip.t
diff --git a/ext/IO-Compress/t/110encode-bzip2.t b/ext/IO-Compress/t/110encode-bzip2.t
new file mode 100644
index 0000000000..974dc8f24a
--- /dev/null
+++ b/ext/IO-Compress/t/110encode-bzip2.t
@@ -0,0 +1,21 @@
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir 't' if -d 't';
+ @INC = ("../lib", "lib/compress");
+ }
+}
+
+use lib qw(t t/compress);
+use strict;
+use warnings;
+
+use IO::Compress::Bzip2 qw($Bzip2Error) ;
+use IO::Uncompress::Bunzip2 qw($Bunzip2Error) ;
+
+sub identify
+{
+ 'IO::Compress::Bzip2';
+}
+
+require "encode.pl" ;
+run();
diff --git a/ext/IO_Compress_Zlib/t/110encode-deflate.t b/ext/IO-Compress/t/110encode-deflate.t
index a1f93a9512..a1f93a9512 100644
--- a/ext/IO_Compress_Zlib/t/110encode-deflate.t
+++ b/ext/IO-Compress/t/110encode-deflate.t
diff --git a/ext/IO_Compress_Zlib/t/110encode-gzip.t b/ext/IO-Compress/t/110encode-gzip.t
index d40c36e905..d40c36e905 100644
--- a/ext/IO_Compress_Zlib/t/110encode-gzip.t
+++ b/ext/IO-Compress/t/110encode-gzip.t
diff --git a/ext/IO_Compress_Zlib/t/110encode-rawdeflate.t b/ext/IO-Compress/t/110encode-rawdeflate.t
index 58fa7417b1..58fa7417b1 100644
--- a/ext/IO_Compress_Zlib/t/110encode-rawdeflate.t
+++ b/ext/IO-Compress/t/110encode-rawdeflate.t
diff --git a/ext/IO_Compress_Zlib/t/110encode-zip.t b/ext/IO-Compress/t/110encode-zip.t
index 80e99eec58..80e99eec58 100644
--- a/ext/IO_Compress_Zlib/t/110encode-zip.t
+++ b/ext/IO-Compress/t/110encode-zip.t
diff --git a/ext/IO-Compress/t/999pod.t b/ext/IO-Compress/t/999pod.t
new file mode 100644
index 0000000000..760f737716
--- /dev/null
+++ b/ext/IO-Compress/t/999pod.t
@@ -0,0 +1,16 @@
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir 't' if -d 't';
+ @INC = ("../lib", "lib/compress");
+ }
+}
+
+use lib qw(t t/compress);
+use Test::More;
+
+eval "use Test::Pod 1.00";
+
+plan skip_all => "Test::Pod 1.00 required for testing POD" if $@;
+
+all_pod_files_ok();
+
diff --git a/ext/IO-Compress/t/99pod.t b/ext/IO-Compress/t/99pod.t
new file mode 100644
index 0000000000..760f737716
--- /dev/null
+++ b/ext/IO-Compress/t/99pod.t
@@ -0,0 +1,16 @@
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir 't' if -d 't';
+ @INC = ("../lib", "lib/compress");
+ }
+}
+
+use lib qw(t t/compress);
+use Test::More;
+
+eval "use Test::Pod 1.00";
+
+plan skip_all => "Test::Pod 1.00 required for testing POD" if $@;
+
+all_pod_files_ok();
+
diff --git a/ext/Compress-Zlib/t/01version.t b/ext/IO-Compress/t/cz-01version.t
index 9d6f283a52..9d6f283a52 100644
--- a/ext/Compress-Zlib/t/01version.t
+++ b/ext/IO-Compress/t/cz-01version.t
diff --git a/ext/Compress-Zlib/t/05examples.t b/ext/IO-Compress/t/cz-05examples.t
index 48dad73c87..5a8fb33e20 100644
--- a/ext/Compress-Zlib/t/05examples.t
+++ b/ext/IO-Compress/t/cz-05examples.t
@@ -37,8 +37,8 @@ my $Perl = ($ENV{'FULLPERL'} or $^X or 'perl') ;
$Perl = qq["$Perl"] if $^O eq 'MSWin32' ;
$Perl = "$Perl $Inc -w" ;
-my $examples = $ENV{PERL_CORE} ? "../ext/Compress-Zlib/examples"
- : "./examples";
+my $examples = $ENV{PERL_CORE} ? "../ext/IO-Compress/examples/compress-zlib"
+ : "./examples/compress-zlib";
my $hello1 = <<EOM ;
hello
diff --git a/ext/Compress-Zlib/t/06gzsetp.t b/ext/IO-Compress/t/cz-06gzsetp.t
index 0f8d83d5ac..0f8d83d5ac 100644
--- a/ext/Compress-Zlib/t/06gzsetp.t
+++ b/ext/IO-Compress/t/cz-06gzsetp.t
diff --git a/ext/Compress-Zlib/t/08encoding.t b/ext/IO-Compress/t/cz-08encoding.t
index f377609e57..f377609e57 100644
--- a/ext/Compress-Zlib/t/08encoding.t
+++ b/ext/IO-Compress/t/cz-08encoding.t
diff --git a/ext/Compress-Zlib/t/14gzopen.t b/ext/IO-Compress/t/cz-14gzopen.t
index 85970d26b8..e876143b29 100644
--- a/ext/Compress-Zlib/t/14gzopen.t
+++ b/ext/IO-Compress/t/cz-14gzopen.t
@@ -20,150 +20,161 @@ BEGIN {
$extra = 1
if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 };
- plan tests => 250 + $extra ;
+ plan tests => 255 + $extra ;
use_ok('Compress::Zlib', 2) ;
use_ok('IO::Compress::Gzip::Constants') ;
}
-
-my $hello = <<EOM ;
+{
+ # Check zlib_version and ZLIB_VERSION are the same.
+ is Compress::Zlib::zlib_version, ZLIB_VERSION,
+ "ZLIB_VERSION matches Compress::Zlib::zlib_version" ;
+}
+
+{
+ # gzip tests
+ #===========
+
+ #my $name = "test.gz" ;
+ my $lex = new LexFile my $name ;
+
+ my $hello = <<EOM ;
hello world
this is a test
EOM
-my $len = length $hello ;
-
-# Check zlib_version and ZLIB_VERSION are the same.
-is Compress::Zlib::zlib_version, ZLIB_VERSION,
- "ZLIB_VERSION matches Compress::Zlib::zlib_version" ;
-
-# gzip tests
-#===========
-
-my $name = "test.gz" ;
-my ($x, $uncomp) ;
-
-ok my $fil = gzopen($name, "wb") ;
-
-is $gzerrno, 0, 'gzerrno is 0';
-is $fil->gzerror(), 0, "gzerror() returned 0";
-
-is $fil->gztell(), 0, "gztell returned 0";
-is $gzerrno, 0, 'gzerrno is 0';
-
-is $fil->gzwrite($hello), $len ;
-is $gzerrno, 0, 'gzerrno is 0';
-
-is $fil->gztell(), $len, "gztell returned $len";
-is $gzerrno, 0, 'gzerrno is 0';
-
-ok ! $fil->gzclose ;
-
-ok $fil = gzopen($name, "rb") ;
-
-ok ! $fil->gzeof() ;
-is $gzerrno, 0, 'gzerrno is 0';
-is $fil->gztell(), 0;
-
-is $fil->gzread($uncomp), $len;
-
-is $fil->gztell(), $len;
-ok $fil->gzeof() ;
-
-# gzread after eof bahavior
-
-my $xyz = "123" ;
-is $fil->gzread($xyz), 0, "gzread returns 0 on eof" ;
-is $xyz, "", "gzread on eof zaps the output buffer [Match 1,x behavior]" ;
-
-ok ! $fil->gzclose ;
-ok $fil->gzeof() ;
-
-
-1 while unlink $name ;
-
-ok $hello eq $uncomp ;
-
-# check that a number can be gzipped
-my $number = 7603 ;
-my $num_len = 4 ;
-
-ok $fil = gzopen($name, "wb") ;
-
-is $gzerrno, 0;
-
-is $fil->gzwrite($number), $num_len, "gzwrite returned $num_len" ;
-is $gzerrno, 0, 'gzerrno is 0';
-ok ! $fil->gzflush(Z_FINISH) ;
-
-is $gzerrno, 0, 'gzerrno is 0';
-
-ok ! $fil->gzclose ;
-
-cmp_ok $gzerrno, '==', 0;
-
-ok $fil = gzopen($name, "rb") ;
-
-ok (($x = $fil->gzread($uncomp)) == $num_len) ;
-
-ok $fil->gzerror() == 0 || $fil->gzerror() == Z_STREAM_END;
-ok $gzerrno == 0 || $gzerrno == Z_STREAM_END;
-ok $fil->gzeof() ;
-
-ok ! $fil->gzclose ;
-ok $fil->gzeof() ;
-
-ok $gzerrno == 0
- or print "# gzerrno is $gzerrno\n" ;
-
-1 while unlink $name ;
-
-ok $number == $uncomp ;
-ok $number eq $uncomp ;
-
-
-# now a bigger gzip test
-
-my $text = 'text' ;
-my $file = "$text.gz" ;
-
-ok my $f = gzopen($file, "wb") ;
-
-# generate a long random string
-my $contents = '' ;
-foreach (1 .. 5000)
- { $contents .= chr int rand 256 }
-
-$len = length $contents ;
-
-ok $f->gzwrite($contents) == $len ;
-
-ok ! $f->gzclose ;
-
-ok $f = gzopen($file, "rb") ;
-
-ok ! $f->gzeof() ;
-
-my $uncompressed ;
-is $f->gzread($uncompressed, $len), $len ;
-
-ok $contents eq $uncompressed
-
- or print "# Length orig $len" .
- ", Length uncompressed " . length($uncompressed) . "\n" ;
-
-ok $f->gzeof() ;
-ok ! $f->gzclose ;
+ my $len = length $hello ;
+
+ my ($x, $uncomp) ;
+
+ ok my $fil = gzopen($name, "wb") ;
+
+ is $gzerrno, 0, 'gzerrno is 0';
+ is $fil->gzerror(), 0, "gzerror() returned 0";
+
+ is $fil->gztell(), 0, "gztell returned 0";
+ is $gzerrno, 0, 'gzerrno is 0';
+
+ is $fil->gzwrite($hello), $len ;
+ is $gzerrno, 0, 'gzerrno is 0';
+
+ is $fil->gztell(), $len, "gztell returned $len";
+ is $gzerrno, 0, 'gzerrno is 0';
+
+ ok ! $fil->gzclose ;
+
+ ok $fil = gzopen($name, "rb") ;
+
+ ok ! $fil->gzeof() ;
+ is $gzerrno, 0, 'gzerrno is 0';
+ is $fil->gztell(), 0;
+
+ is $fil->gzread($uncomp), $len;
+
+ is $fil->gztell(), $len;
+ ok $fil->gzeof() ;
+
+ # gzread after eof bahavior
+
+ my $xyz = "123" ;
+ is $fil->gzread($xyz), 0, "gzread returns 0 on eof" ;
+ is $xyz, "", "gzread on eof zaps the output buffer [Match 1,x behavior]" ;
+
+ ok ! $fil->gzclose ;
+ ok $fil->gzeof() ;
+
+ ok $hello eq $uncomp ;
+}
-1 while unlink($file) ;
+{
+ title 'check that a number can be gzipped';
+ my $lex = new LexFile my $name ;
+
+
+ my $number = 7603 ;
+ my $num_len = 4 ;
+
+ ok my $fil = gzopen($name, "wb") ;
+
+ is $gzerrno, 0;
+
+ is $fil->gzwrite($number), $num_len, "gzwrite returned $num_len" ;
+ is $gzerrno, 0, 'gzerrno is 0';
+ ok ! $fil->gzflush(Z_FINISH) ;
+
+ is $gzerrno, 0, 'gzerrno is 0';
+
+ ok ! $fil->gzclose ;
+
+ cmp_ok $gzerrno, '==', 0;
+
+ ok $fil = gzopen($name, "rb") ;
+
+ my $uncomp;
+ ok ((my $x = $fil->gzread($uncomp)) == $num_len) ;
+
+ ok $fil->gzerror() == 0 || $fil->gzerror() == Z_STREAM_END;
+ ok $gzerrno == 0 || $gzerrno == Z_STREAM_END;
+ ok $fil->gzeof() ;
+
+ ok ! $fil->gzclose ;
+ ok $fil->gzeof() ;
+
+ ok $gzerrno == 0
+ or print "# gzerrno is $gzerrno\n" ;
+
+ 1 while unlink $name ;
+
+ ok $number == $uncomp ;
+ ok $number eq $uncomp ;
+}
-# gzip - readline tests
-# ======================
+{
+ title "now a bigger gzip test";
+
+ my $text = 'text' ;
+ my $lex = new LexFile my $file ;
+
+
+ ok my $f = gzopen($file, "wb") ;
+
+ # generate a long random string
+ my $contents = '' ;
+ foreach (1 .. 5000)
+ { $contents .= chr int rand 256 }
+
+ my $len = length $contents ;
+
+ is $f->gzwrite($contents), $len ;
+
+ ok ! $f->gzclose ;
+
+ ok $f = gzopen($file, "rb") ;
+
+ ok ! $f->gzeof() ;
+
+ my $uncompressed ;
+ is $f->gzread($uncompressed, $len), $len ;
+
+ is $contents, $uncompressed
+
+ or print "# Length orig $len" .
+ ", Length uncompressed " . length($uncompressed) . "\n" ;
+
+ ok $f->gzeof() ;
+ ok ! $f->gzclose ;
+
+}
-# first create a small gzipped text file
-$name = "test.gz" ;
-my @text = (<<EOM, <<EOM, <<EOM, <<EOM) ;
+{
+ title "gzip - readline tests";
+ # ======================
+
+ # first create a small gzipped text file
+ my $lex = new LexFile my $name ;
+
+ my @text = (<<EOM, <<EOM, <<EOM, <<EOM) ;
this is line 1
EOM
the second line
@@ -172,89 +183,96 @@ the line after the previous line
EOM
the final line
EOM
-
-$text = join("", @text) ;
-
-ok $fil = gzopen($name, "wb") ;
-ok $fil->gzwrite($text) == length $text ;
-ok ! $fil->gzclose ;
-
-# now try to read it back in
-ok $fil = gzopen($name, "rb") ;
-ok ! $fil->gzeof() ;
-my $line = '';
-for my $i (0 .. @text -2)
-{
- ok $fil->gzreadline($line) > 0;
- is $line, $text[$i] ;
+
+ my $text = join("", @text) ;
+
+ ok my $fil = gzopen($name, "wb") ;
+ is $fil->gzwrite($text), length($text) ;
+ ok ! $fil->gzclose ;
+
+ # now try to read it back in
+ ok $fil = gzopen($name, "rb") ;
ok ! $fil->gzeof() ;
+ my $line = '';
+ for my $i (0 .. @text -2)
+ {
+ ok $fil->gzreadline($line) > 0;
+ is $line, $text[$i] ;
+ ok ! $fil->gzeof() ;
+ }
+
+ # now read the last line
+ ok $fil->gzreadline($line) > 0;
+ is $line, $text[-1] ;
+ ok $fil->gzeof() ;
+
+ # read past the eof
+ is $fil->gzreadline($line), 0;
+
+ ok $fil->gzeof() ;
+ ok ! $fil->gzclose ;
+ ok $fil->gzeof() ;
}
-# now read the last line
-ok $fil->gzreadline($line) > 0;
-is $line, $text[-1] ;
-ok $fil->gzeof() ;
-
-# read past the eof
-is $fil->gzreadline($line), 0;
-
-ok $fil->gzeof() ;
-ok ! $fil->gzclose ;
-ok $fil->gzeof() ;
-1 while unlink($name) ;
-
-# a text file with a very long line (bigger than the internal buffer)
-my $line1 = ("abcdefghijklmnopq" x 2000) . "\n" ;
-my $line2 = "second line\n" ;
-$text = $line1 . $line2 ;
-ok $fil = gzopen($name, "wb") ;
-ok $fil->gzwrite($text) == length $text ;
-ok ! $fil->gzclose ;
-
-# now try to read it back in
-ok $fil = gzopen($name, "rb") ;
-ok ! $fil->gzeof() ;
-my $i = 0 ;
-my @got = ();
-while ($fil->gzreadline($line) > 0) {
- $got[$i] = $line ;
- ++ $i ;
-}
-is $i, 2 ;
-is $got[0], $line1 ;
-is $got[1], $line2 ;
-
-ok $fil->gzeof() ;
-ok ! $fil->gzclose ;
-ok $fil->gzeof() ;
-
-1 while unlink $name ;
-
-# a text file which is not termined by an EOL
-
-$line1 = "hello hello, I'm back again\n" ;
-$line2 = "there is no end in sight" ;
-
-$text = $line1 . $line2 ;
-ok $fil = gzopen($name, "wb") ;
-ok $fil->gzwrite($text) == length $text ;
-ok ! $fil->gzclose ;
+{
+ title "A text file with a very long line (bigger than the internal buffer)";
+ my $lex = new LexFile my $name ;
-# now try to read it back in
-ok $fil = gzopen($name, "rb") ;
-@got = () ; $i = 0 ;
-while ($fil->gzreadline($line) > 0) {
- $got[$i] = $line ;
- ++ $i ;
+ my $line1 = ("abcdefghijklmnopq" x 2000) . "\n" ;
+ my $line2 = "second line\n" ;
+ my $text = $line1 . $line2 ;
+ ok my $fil = gzopen($name, "wb"), " gzopen ok" ;
+ is $fil->gzwrite($text), length $text, " gzwrite ok" ;
+ ok ! $fil->gzclose, " gzclose" ;
+
+ # now try to read it back in
+ ok $fil = gzopen($name, "rb"), " gzopen" ;
+ ok ! $fil->gzeof(), "! eof" ;
+ my $i = 0 ;
+ my @got = ();
+ my $line;
+ while ($fil->gzreadline($line) > 0) {
+ $got[$i] = $line ;
+ ++ $i ;
+ }
+ is $i, 2, " looped twice" ;
+ is $got[0], $line1, " got line 1" ;
+ is $got[1], $line2, " hot line 2" ;
+
+ ok $fil->gzeof(), " gzeof" ;
+ ok ! $fil->gzclose, " gzclose" ;
+ ok $fil->gzeof(), " gzeof" ;
}
-is $i, 2 ;
-is $got[0], $line1 ;
-is $got[1], $line2 ;
-
-ok $fil->gzeof() ;
-ok ! $fil->gzclose ;
-1 while unlink $name ;
+{
+ title "a text file which is not termined by an EOL";
+
+ my $lex = new LexFile my $name ;
+
+ my $line1 = "hello hello, I'm back again\n" ;
+ my $line2 = "there is no end in sight" ;
+
+ my $text = $line1 . $line2 ;
+ ok my $fil = gzopen($name, "wb"), " gzopen" ;
+ is $fil->gzwrite($text), length $text, " gzwrite" ;
+ ok ! $fil->gzclose, " gzclose" ;
+
+ # now try to read it back in
+ ok $fil = gzopen($name, "rb"), " gzopen" ;
+ my @got = () ;
+ my $i = 0 ;
+ my $line;
+ while ($fil->gzreadline($line) > 0) {
+ $got[$i] = $line ;
+ ++ $i ;
+ }
+ is $i, 2, " got 2 lines" ;
+ is $got[0], $line1, " line 1 ok" ;
+ is $got[1], $line2, " line 2 ok" ;
+
+ ok $fil->gzeof(), " gzeof" ;
+ ok ! $fil->gzclose, " gzclose" ;
+}
{
@@ -264,11 +282,12 @@ ok ! $fil->gzclose ;
# smaller than the internal block used by
# gzreadline
my $lex = new LexFile my $name ;
- $line1 = "hello hello, I'm back again\n" ;
- $line2 = "abc" x 200 ;
+ my $line1 = "hello hello, I'm back again\n" ;
+ my $line2 = "abc" x 200 ;
my $line3 = "def" x 200 ;
+ my $line;
- $text = $line1 . $line2 . $line3 ;
+ my $text = $line1 . $line2 . $line3 ;
my $fil;
ok $fil = gzopen($name, "wb"), ' gzopen for write ok' ;
is $fil->gzwrite($text), length $text, ' gzwrite ok' ;
@@ -314,7 +333,7 @@ ok ! $fil->gzclose ;
$f = new IO::File "<$name" ;
ok $fil = gzopen($name, "rb") ;
- my $uncmomp;
+ my $uncomp; my $x;
ok (($x = $fil->gzread($uncomp)) == $len)
or print "# length $x, expected $len\n" ;
@@ -346,7 +365,7 @@ ok ! $fil->gzclose ;
open F, "<$name" ;
ok $fil = gzopen(*F, "rb") ;
- my $uncmomp;
+ my $uncomp; my $x;
$x = $fil->gzread($uncomp);
is $x, $len ;
@@ -393,7 +412,7 @@ foreach my $stdio ( ['-', '-'], [*STDIN, *STDOUT])
ok $fil = gzopen($stdin, "rb") ;
- my $uncmomp;
+ my $uncomp; my $x;
ok (($x = $fil->gzread($uncomp)) == $len)
or print "# length $x, expected $len\n" ;
@@ -451,7 +470,7 @@ foreach my $stdio ( ['-', '-'], [*STDIN, *STDOUT])
title 'write operations when opened for reading';
my $lex = new LexFile my $name ;
- my $test = "hello" ;
+ my $text = "hello" ;
my $fil;
ok $fil = gzopen($name, "wb"), " gzopen for writing" ;
is $fil->gzwrite($text), length $text, " gzwrite ok" ;
@@ -497,7 +516,7 @@ foreach my $stdio ( ['-', '-'], [*STDIN, *STDOUT])
ok ! -r $name, " input file not readable";
$gzerrno = 0;
- $fil = gzopen($name, "rb") ;
+ my $fil = gzopen($name, "rb") ;
ok !$fil, " gzopen returns undef" ;
ok $gzerrno, " gzerrno ok";
chmod 0777, $name ;
diff --git a/ext/IO-Compress/t/cz-99pod.t b/ext/IO-Compress/t/cz-99pod.t
new file mode 100644
index 0000000000..760f737716
--- /dev/null
+++ b/ext/IO-Compress/t/cz-99pod.t
@@ -0,0 +1,16 @@
+BEGIN {
+ if ($ENV{PERL_CORE}) {
+ chdir 't' if -d 't';
+ @INC = ("../lib", "lib/compress");
+ }
+}
+
+use lib qw(t t/compress);
+use Test::More;
+
+eval "use Test::Pod 1.00";
+
+plan skip_all => "Test::Pod 1.00 required for testing POD" if $@;
+
+all_pod_files_ok();
+
diff --git a/ext/IO_Compress_Base/t/globmapper.t b/ext/IO-Compress/t/globmapper.t
index 10a4d88716..10a4d88716 100644
--- a/ext/IO_Compress_Base/t/globmapper.t
+++ b/ext/IO-Compress/t/globmapper.t
diff --git a/ext/IO/Makefile.PL b/ext/IO/Makefile.PL
index 095d7c2b51..bc47a1b49f 100644
--- a/ext/IO/Makefile.PL
+++ b/ext/IO/Makefile.PL
@@ -1,9 +1,7 @@
use ExtUtils::MakeMaker;
-use Config qw(%Config);
WriteMakefile(
VERSION_FROM => "IO.pm",
NAME => "IO",
OBJECT => '$(O_FILES)',
- MAN3PODS => {}, # Pods will be built by installman.
);
diff --git a/ext/IO_Compress_Base/Changes b/ext/IO_Compress_Base/Changes
deleted file mode 100644
index 92142be4fb..0000000000
--- a/ext/IO_Compress_Base/Changes
+++ /dev/null
@@ -1,194 +0,0 @@
-CHANGES
--------
-
- 2.015 3 September 2008
-
- * Makefile.PL
- Backout changes made in 2.014
-
- 2.014 2 September 2008
-
- * Makefile.PL
- Updated to check for indirect dependencies.
-
- 2.013 18 July 2008
-
- * IO::Compress::Base
- - Allow IO::Compress::Base::Parameters::parse to accept an IO::Compress::Base::Parameters object.
-
- 2.012 15 July 2008
-
- * IO::Compress::Base
- - Silenced an uninitialised value warning when reading a line
- at a time from a zip file where the content uses ZIP_CM_STORE.
- [Problem spotted & fixed by Jeff Holt]
-
- * IO::Compress::Base & IO::Uncompress::Base
- - local-ise $!, $? et al in the DESTROY methods.
-
- 2.011 17 May 2008
-
- * IO::Compress::Base
- - Fixed problem that prevented the creation of a zip file that
- contained more than one compression method.
-
- * IO::Compress::Base::Common
- - The private Validator class in this module clashes with another
- CPAN module. Moved Validator into the IO::Compress::Base::Common
- namespace.
- [RT #35954]
-
- 2.010 5 May 2008
-
- * Fixed problem that meant Perl 5.10 could not upgrade this module.
- [RT #35342]
-
- 2.009 20 April 2008
-
- * Removed the alpha status from File::GlobMapper
-
- * IO::Compress::Base
- When writing output never output a zero length buffer.
- Done to improve interoperability with other tied filenandle
- modules.
-
- * Changed IO::Uncompress::Base to not use the offset parameter of
- the read method when reading from a filehandle.
-
- The object returned from Net::FTP::retr implements a non-standard
- read method. The third parameter is used for a timeout value
- rather than an offset.
- [rt.cpan#33231]
-
- * Changed IO::Uncompress::Base to not use the eof method when
- reading from a filehandle.
-
- The object returned from Net::FTP::retr implements both the read
- method and the eof method. Unfortunately the implementation of
- the read method uses non-buffered IO (by using sysread) while
- the eof method uses buffered IO. Mixing buffered and non-buffered
- IO results in data corruption.
-
- 2.008 2 November 2007
-
- * Minor documentation changes in README
-
- 2.006 1 September 20007
-
- * Makefile.PL
- Added INSTALLDIRS directive to install as a core module when built
- on a perl >= 5.9.
-
- 2.005 18 June 2007
-
- * Stephen Turner reported a problem when using IO::Uncompress::Gunzip
- with XML::Parser. Turns out there were two issues.
-
- Firstly an IO::Uncompress object isn't an IO::Handle. It is now.
-
- Secondly the implementation of "read" wasn't honouring this
-
- SCALAR will be grown or shrunk to the length actually read.
-
- In particular it didn't do the right thing on EOF.
- This has been fixed.
-
- 2.004 3 March 2007
-
- * Made seek less wasteful of memory.
-
- 2.003 2 January 2007
-
- * Added explicit version checking
-
- 2.002 29 December 2006
-
- * Documentation updates.
-
- * Added IO::Handle to the ISA test in isaFilehandle
-
- * Add an explicit use_ok test for Scalar::Util in the test harness.
- The error message reported by 01misc implied the problem was
- somewhere else.
- Also explictly check that 'dualvar' is available.
-
- 2.001 1 November 2006
-
- * Remove beta status.
-
- 2.000_14 26 October 2006
-
- * IO::Uncompress::Base
- Added support for $/ in record mode
-
- * IO::Uncompress::Base
- The readline interface was substantially slower than the 1.x
- equivalent. This has now been sorted.
- Thanks to Andreas J. Koenig for spotting the problem.
-
- * IO::Uncompress::AnyUncompress
- Added IO::Uncompress::Lzf to the list of supported uncompresors.
-
- * IO::Uncompress::Base
- Added TrailingData to one-shot interface.
-
- * IO::Uncompress::AnyUncompress
- Remove raw-deflate (RFC1951) from the default list of compressors
- to check.
- It can still be included if the new RawInflate parameter is
- supplied.
- This change was made because the only way to tell if content is
- raw-deflate is to attempt to uncompress it - a few false positives
- have popped up recently, which suggests that auto-detecting raw
- deflate is far from perfect.
- The equivalent change has been made to IO::Uncompress::AnyInflate.
- [Core patch #28445]
-
- * Don't check that filehandles are writable. It would seem that
- "-w *STDOUT" on windows returns false.
- [Core Patch #28415]
-
- 2.000_13 20 June 2006
-
- * Store compress & uncompressed sizes as 64-bit.
-
- * For one-shot uncompression, like this
-
- unzip "some.zip" => \@a, MultiStream => 1;
-
- Push each uncompressed stream from "some.zip" onto @a.
-
- * Added IO::Compress::Base::FilterEnvelope
-
- * Added IO::Uncompress::Base::nextStream
-
- * The '-' filehandle now maps to either *STDIN or *STDOUT.
- This keeps mod_perl happier. Was using these before
-
- new IO::File("<-")
- new IO::File(">-")
-
- 2.000_12 3 May 2006
-
- 2.000_11 10 April 2006
-
- * Transparent + InputLength made more robust where input data is not
- compressed.
-
- 2.000_10 13 March 2006
-
- * AnyUncompress doesn't assume that IO-Compress-Zlib is installed any
- more.
-
- 2.000_09 3 March 2006
-
- * Released to CPAN.
-
- 2.000_08 2 March 2006
-
- * Split IO::Compress::Base into its own distribution.
-
- * Added opened, autoflush and input_line_number.
-
- * Beefed up support for $.
-
diff --git a/ext/IO_Compress_Base/README b/ext/IO_Compress_Base/README
deleted file mode 100644
index 0cfa8730de..0000000000
--- a/ext/IO_Compress_Base/README
+++ /dev/null
@@ -1,90 +0,0 @@
-
- IO-Compress-Base
-
- Version 2.015
-
- 2nd September 2008
-
- Copyright (c) 2005-2008 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.
-
-DESCRIPTION
------------
-
-This module is the base class for all IO::Compress and IO::Uncompress
-modules.
-
-PREREQUISITES
--------------
-
-Before you can build IO-Compress-Base you need to have the following
-installed on your system:
-
- * Perl 5.004 or better.
-
-BUILDING THE MODULE
--------------------
-
-Assuming you have met all the prerequisites, the module can now be built
-using this sequence of commands:
-
- perl Makefile.PL
- make
- make test
-
-INSTALLATION
-------------
-
-To install IO-Compress-Base, run the command below:
-
- make install
-
-TROUBLESHOOTING
----------------
-
-FEEDBACK
---------
-
-How to report a problem with IO-Compress-Base.
-
-To help me help you, I need all of the following information:
-
- 1. The Versions of everything relevant.
- This includes:
-
- a. The *complete* output from running this
-
- perl -V
-
- Do not edit the output in any way.
- Note, I want you to run "perl -V" and NOT "perl -v".
-
- If your perl does not understand the "-V" option it is too
- old. This module needs Perl version 5.004 or better.
-
- b. The version of IO-Compress-Base you have.
- If you have successfully installed IO-Compress-Base, this one-liner
- will tell you:
-
- perl -MIO::Compress::Base -e 'print qq[ver $IO::Compress::Base::VERSION\n]'
-
- If you are running windows use this
-
- perl -MIO::Compress::Base -e "print qq[ver $IO::Compress::Base::VERSION\n]"
-
- If you haven't installed IO-Compress-Base then search IO::Compress::Base.pm
- for a line like this:
-
- $VERSION = "2.015" ;
-
- 2. If you are having problems building IO-Compress-Base, send me a
- complete log of what happened. Start by unpacking the IO-Compress-Base
- module into a fresh directory and keep a log of all the steps
-
- [edit config.in, if necessary]
- perl Makefile.PL
- make
- make test TEST_VERBOSE=1
-
-Paul Marquess <pmqs@cpan.org>
diff --git a/ext/IO_Compress_Base/pod/FAQ.pod b/ext/IO_Compress_Base/pod/FAQ.pod
deleted file mode 100644
index 16930fac27..0000000000
--- a/ext/IO_Compress_Base/pod/FAQ.pod
+++ /dev/null
@@ -1,346 +0,0 @@
-
-=head1 NAME
-
-IO::Compress::Base::FAQ -- Frequently Asked Questions about IO::Compress::Base
-
-=head1 DESCRIPTION
-
-Common questions answered.
-
-=head2 Compatibility with Unix compress/uncompress.
-
-This module is not compatible with Unix C<compress>.
-
-If you have the C<uncompress> program available, you can use this to read
-compressed files
-
- open F, "uncompress -c $filename |";
- while (<F>)
- {
- ...
-
-Alternatively, if you have the C<gunzip> program available, you can use
-this to read compressed files
-
- open F, "gunzip -c $filename |";
- while (<F>)
- {
- ...
-
-and this to write compress files, if you have the C<compress> program
-available
-
- open F, "| compress -c $filename ";
- print F "data";
- ...
- close F ;
-
-=head2 Accessing .tar.Z files
-
-See previous FAQ item.
-
-If the C<Archive::Tar> module is installed and either the C<uncompress> or
-C<gunzip> programs are available, you can use one of these workarounds to
-read C<.tar.Z> files.
-
-Firstly with C<uncompress>
-
- use strict;
- use warnings;
- use Archive::Tar;
-
- open F, "uncompress -c $filename |";
- my $tar = Archive::Tar->new(*F);
- ...
-
-and this with C<gunzip>
-
- use strict;
- use warnings;
- use Archive::Tar;
-
- open F, "gunzip -c $filename |";
- my $tar = Archive::Tar->new(*F);
- ...
-
-Similarly, if the C<compress> program is available, you can use this to
-write a C<.tar.Z> file
-
- use strict;
- use warnings;
- use Archive::Tar;
- use IO::File;
-
- my $fh = new IO::File "| compress -c >$filename";
- my $tar = Archive::Tar->new();
- ...
- $tar->write($fh);
- $fh->close ;
-
-=head2 Accessing Zip Files
-
-This module does not support reading/writing zip files.
-
-Support for reading/writing zip files is included with the
-C<IO::Compress::Zip> and C<IO::Uncompress::Unzip> modules.
-
-The primary focus of the C<IO::Compress::Zip> and C<IO::Uncompress::Unzip>
-modules is to provide an C<IO::File> compatible streaming read/write
-interface to zip files/buffers. They are not fully flegged archivers. If
-you are looking for an archiver check out the C<Archive::Zip> module. You
-can find it on CPAN at
-
- http://www.cpan.org/modules/by-module/Archive/Archive-Zip-*.tar.gz
-
-=head2 Compressed files and Net::FTP
-
-The C<Net::FTP> module provides two low-level methods called C<stor> and
-C<retr> that both return filehandles. These filehandles can used with the
-C<IO::Compress/Uncompress> modules to compress or uncompress files read
-from or written to an FTP Server on the fly, without having to create a
-temporary file.
-
-Firstly, here is code that uses C<retr> to uncompressed a file as it is
-read from the FTP Server.
-
- use Net::FTP;
- use IO::Uncompress::Bunzip2 qw(:all);
-
- my $ftp = new Net::FTP ...
-
- my $retr_fh = $ftp->retr($compressed_filename);
- bunzip2 $retr_fh => $outFilename, AutoClose => 1
- or die "Cannot uncompress '$compressed_file': $Bunzip2Error\n";
-
-and this to compress a file as it is written to the FTP Server
-
- use Net::FTP;
- use IO::Compress::Bzip2 qw(:all);
-
- my $stor_fh = $ftp->stor($filename);
- bzip2 "filename" => $stor_fh, AutoClose => 1
- or die "Cannot compress '$filename': $Bzip2Error\n";
-
-=head2 How do I recompress using a different compression?
-
-This is easier that you might expect if you realise that all the
-C<IO::Compress::*> objects are derived from C<IO::File> and that all the
-C<IO::Uncompress::*> modules can read from an C<IO::File> filehandle.
-
-So, for example, say you have a file compressed with gzip that you want to
-recompress with bzip2. Here is all that is needed to carry out the
-recompression.
-
- use IO::Uncompress::Gunzip ':all';
- use IO::Compress::Bzip2 ':all';
-
- my $gzipFile = "somefile.gz";
- my $bzipFile = "somefile.bz2";
-
- my $gunzip = new IO::Uncompress::Gunzip $gzipFile
- or die "Cannot gunzip $gzipFile: $GunzipError\n" ;
-
- bzip2 $gunzip => $bzipFile
- or die "Cannot bzip2 to $bzipFile: $Bzip2Error\n" ;
-
-Note, there is a limitation of this technique. Some compression file
-formats store extra information along with the compressed data payload. For
-example, gzip can optionally store the original filename and Zip stores a
-lot of information about the original file. If the original compressed file
-contains any of this extra information, it will not be transferred to the
-new compressed file usign the technique above.
-
-=head2 Using C<InputLength> to uncompress data embedded in a larger file/buffer.
-
-A fairly common use-case is where compressed data is embedded in a larger
-file/buffer and you want to read both.
-
-As an example consider the structure of a zip file. This is a well-defined
-file format that mixes both compressed and uncompressed sections of data in
-a single file.
-
-For the purposes of this discussion you can think of a zip file as sequence
-of compressed data streams, each of which is prefixed by an uncompressed
-local header. The local header contains information about the compressed
-data stream, including the name of the compressed file and, in particular,
-the length of the compressed data stream.
-
-To illustrate how to use C<InputLength> here is a script that walks a zip
-file and prints out how many lines are in each compressed file (if you
-intend write code to walking through a zip file for real see
-L<IO::Uncompress::Unzip/"Walking through a zip file"> )
-
- use strict;
- use warnings;
-
- use IO::File;
- use IO::Uncompress::RawInflate qw(:all);
-
- use constant ZIP_LOCAL_HDR_SIG => 0x04034b50;
- use constant ZIP_LOCAL_HDR_LENGTH => 30;
-
- my $file = $ARGV[0] ;
-
- my $fh = new IO::File "<$file"
- or die "Cannot open '$file': $!\n";
-
- while (1)
- {
- my $sig;
- my $buffer;
-
- my $x ;
- ($x = $fh->read($buffer, ZIP_LOCAL_HDR_LENGTH)) == ZIP_LOCAL_HDR_LENGTH
- or die "Truncated file: $!\n";
-
- my $signature = unpack ("V", substr($buffer, 0, 4));
-
- last unless $signature == ZIP_LOCAL_HDR_SIG;
-
- # Read Local Header
- my $gpFlag = unpack ("v", substr($buffer, 6, 2));
- my $compressedMethod = unpack ("v", substr($buffer, 8, 2));
- my $compressedLength = unpack ("V", substr($buffer, 18, 4));
- my $uncompressedLength = unpack ("V", substr($buffer, 22, 4));
- my $filename_length = unpack ("v", substr($buffer, 26, 2));
- my $extra_length = unpack ("v", substr($buffer, 28, 2));
-
- my $filename ;
- $fh->read($filename, $filename_length) == $filename_length
- or die "Truncated file\n";
-
- $fh->read($buffer, $extra_length) == $extra_length
- or die "Truncated file\n";
-
- if ($compressedMethod != 8 && $compressedMethod != 0)
- {
- warn "Skipping file '$filename' - not deflated $compressedMethod\n";
- $fh->read($buffer, $compressedLength) == $compressedLength
- or die "Truncated file\n";
- next;
- }
-
- if ($compressedMethod == 0 && $gpFlag & 8 == 8)
- {
- die "Streamed Stored not supported for '$filename'\n";
- }
-
- next if $compressedLength == 0;
-
- # Done reading the Local Header
-
- my $inf = new IO::Uncompress::RawInflate $fh,
- Transparent => 1,
- InputLength => $compressedLength
- or die "Cannot uncompress $file [$filename]: $RawInflateError\n" ;
-
- my $line_count = 0;
-
- while (<$inf>)
- {
- ++ $line_count;
- }
-
- print "$filename: $line_count\n";
- }
-
-The majority of the code above is concerned with reading the zip local
-header data. The code that I want to focus on is at the bottom.
-
- while (1) {
-
- # read local zip header data
- # get $filename
- # get $compressedLength
-
- my $inf = new IO::Uncompress::RawInflate $fh,
- Transparent => 1,
- InputLength => $compressedLength
- or die "Cannot uncompress $file [$filename]: $RawInflateError\n" ;
-
- my $line_count = 0;
-
- while (<$inf>)
- {
- ++ $line_count;
- }
-
- print "$filename: $line_count\n";
- }
-
-The call to C<IO::Uncompress::RawInflate> creates a new filehandle C<$inf>
-that can be used to read from the parent filehandle C<$fh>, uncompressing
-it as it goes. The use of the C<InputLength> option will guarantee that
-I<at most> C<$compressedLength> bytes of compressed data will be read from
-the C<$fh> filehandle (The only exception is for an error case like a
-truncated file or a corrupt data stream).
-
-This means that once RawInflate is finished C<$fh> will be left at the
-byte directly after the compressed data stream.
-
-Now consider what the code looks like without C<InputLength>
-
- while (1) {
-
- # read local zip header data
- # get $filename
- # get $compressedLength
-
- # read all the compressed data into $data
- read($fh, $data, $compressedLength);
-
- my $inf = new IO::Uncompress::RawInflate \$data,
- Transparent => 1,
- or die "Cannot uncompress $file [$filename]: $RawInflateError\n" ;
-
- my $line_count = 0;
-
- while (<$inf>)
- {
- ++ $line_count;
- }
-
- print "$filename: $line_count\n";
- }
-
-The difference here is the addition of the temporary variable C<$data>.
-This is used to store a copy of the compressed data while it is being
-uncompressed.
-
-If you know that C<$compressedLength> isn't that big then using temporary
-storage won't be a problem. But if C<$compressedLength> is very large or
-you are writing an application that other people will use, and so have no
-idea how big C<$compressedLength> will be, it could be an issue.
-
-Using C<InputLength> avoids the use of temporary storage and means the
-application can cope with large compressed data streams.
-
-One final point -- obviously C<InputLength> can only be used whenever you
-know the length of the compressed data beforehand, like here with a zip
-file.
-
-=head1 SEE ALSO
-
-L<Compress::Zlib>, L<IO::Compress::Gzip>, L<IO::Uncompress::Gunzip>, L<IO::Compress::Deflate>, L<IO::Uncompress::Inflate>, L<IO::Compress::RawDeflate>, L<IO::Uncompress::RawInflate>, L<IO::Compress::Bzip2>, L<IO::Uncompress::Bunzip2>, L<IO::Compress::Lzop>, L<IO::Uncompress::UnLzop>, L<IO::Compress::Lzf>, L<IO::Uncompress::UnLzf>, L<IO::Uncompress::AnyInflate>, L<IO::Uncompress::AnyUncompress>
-
-L<Compress::Zlib::FAQ|Compress::Zlib::FAQ>
-
-L<File::GlobMapper|File::GlobMapper>, L<Archive::Zip|Archive::Zip>,
-L<Archive::Tar|Archive::Tar>,
-L<IO::Zlib|IO::Zlib>
-
-=head1 AUTHOR
-
-This module was written by Paul Marquess, F<pmqs@cpan.org>.
-
-=head1 MODIFICATION HISTORY
-
-See the Changes file.
-
-=head1 COPYRIGHT AND LICENSE
-
-Copyright (c) 2005-2008 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.
-
diff --git a/ext/IO_Compress_Base/private/MakeUtil.pm b/ext/IO_Compress_Base/private/MakeUtil.pm
deleted file mode 100644
index e595910654..0000000000
--- a/ext/IO_Compress_Base/private/MakeUtil.pm
+++ /dev/null
@@ -1,381 +0,0 @@
-package MakeUtil ;
-package main ;
-
-use strict ;
-
-use Config qw(%Config);
-use File::Copy;
-
-my $VERSION = '1.0';
-
-
-BEGIN
-{
- eval { require File::Spec::Functions ; File::Spec::Functions->import() } ;
- if ($@)
- {
- *catfile = sub { return "$_[0]/$_[1]" }
- }
-}
-
-require VMS::Filespec if $^O eq 'VMS';
-
-
-unless($ENV{PERL_CORE}) {
- $ENV{PERL_CORE} = 1 if grep { $_ eq 'PERL_CORE=1' } @ARGV;
-}
-
-$ENV{SKIP_FOR_CORE} = 1 if $ENV{PERL_CORE} || $ENV{MY_PERL_CORE} ;
-
-
-
-sub MY::libscan
-{
- my $self = shift;
- my $path = shift;
-
- return undef
- if $path =~ /(~|\.bak|_bak)$/ ||
- $path =~ /\..*\.sw(o|p)$/ ||
- $path =~ /\B\.svn\b/;
-
- return $path;
-}
-
-sub MY::postamble
-{
- return ''
- if $ENV{PERL_CORE} ;
-
- my @files = getPerlFiles('MANIFEST');
-
- # Note: Once you remove all the layers of shell/makefile escaping
- # the regular expression below reads
- #
- # /^\s*local\s*\(\s*\$^W\s*\)/
- #
- my $postamble = '
-
-MyTrebleCheck:
- @echo Checking for $$^W in files: '. "@files" . '
- @perl -ne \' \
- exit 1 if /^\s*local\s*\(\s*\$$\^W\s*\)/; \
- \' ' . " @files || " . ' \
- (echo found unexpected $$^W ; exit 1)
- @echo All is ok.
-
-';
-
- return $postamble;
-}
-
-sub getPerlFiles
-{
- my @manifests = @_ ;
-
- my @files = ();
-
- for my $manifest (@manifests)
- {
- my $prefix = './';
-
- $prefix = $1
- if $manifest =~ m#^(.*/)#;
-
- open M, "<$manifest"
- or die "Cannot open '$manifest': $!\n";
- while (<M>)
- {
- chomp ;
- next if /^\s*#/ || /^\s*$/ ;
-
- s/^\s+//;
- s/\s+$//;
-
- /^(\S+)\s*(.*)$/;
-
- my ($file, $rest) = ($1, $2);
-
- if ($file =~ /\.(pm|pl|t)$/ and $file !~ /MakeUtil.pm/)
- {
- push @files, "$prefix$file";
- }
- elsif ($rest =~ /perl/i)
- {
- push @files, "$prefix$file";
- }
-
- }
- close M;
- }
-
- return @files;
-}
-
-sub UpDowngrade
-{
- return if defined $ENV{TipTop};
-
- my @files = @_ ;
-
- # our and use bytes/utf8 is stable from 5.6.0 onward
- # warnings is stable from 5.6.1 onward
-
- # Note: this code assumes that each statement it modifies is not
- # split across multiple lines.
-
-
- my $warn_sub = '';
- my $our_sub = '' ;
-
- my $upgrade ;
- my $downgrade ;
- my $do_downgrade ;
-
- my $caller = (caller(1))[3] || '';
-
- if ($caller =~ /downgrade/)
- {
- $downgrade = 1;
- }
- elsif ($caller =~ /upgrade/)
- {
- $upgrade = 1;
- }
- else
- {
- $do_downgrade = 1
- if $] < 5.006001 ;
- }
-
-# else
-# {
-# my $opt = shift @ARGV || '' ;
-# $upgrade = ($opt =~ /^-upgrade/i);
-# $downgrade = ($opt =~ /^-downgrade/i);
-# push @ARGV, $opt unless $downgrade || $upgrade;
-# }
-
-
- if ($downgrade || $do_downgrade) {
- # From: use|no warnings "blah"
- # To: local ($^W) = 1; # use|no warnings "blah"
- $warn_sub = sub {
- s/^(\s*)(no\s+warnings)/${1}local (\$^W) = 0; #$2/ ;
- s/^(\s*)(use\s+warnings)/${1}local (\$^W) = 1; #$2/ ;
- };
- }
- #elsif ($] >= 5.006001 || $upgrade) {
- elsif ($upgrade) {
- # From: local ($^W) = 1; # use|no warnings "blah"
- # To: use|no warnings "blah"
- $warn_sub = sub {
- s/^(\s*)local\s*\(\$\^W\)\s*=\s*\d+\s*;\s*#\s*((no|use)\s+warnings.*)/$1$2/ ;
- };
- }
-
- if ($downgrade || $do_downgrade) {
- $our_sub = sub {
- if ( /^(\s*)our\s+\(\s*([^)]+\s*)\)/ ) {
- my $indent = $1;
- my $vars = join ' ', split /\s*,\s*/, $2;
- $_ = "${indent}use vars qw($vars);\n";
- }
- elsif ( /^(\s*)((use|no)\s+(bytes|utf8)\s*;.*)$/)
- {
- $_ = "$1# $2\n";
- }
- };
- }
- #elsif ($] >= 5.006000 || $upgrade) {
- elsif ($upgrade) {
- $our_sub = sub {
- if ( /^(\s*)use\s+vars\s+qw\((.*?)\)/ ) {
- my $indent = $1;
- my $vars = join ', ', split ' ', $2;
- $_ = "${indent}our ($vars);\n";
- }
- elsif ( /^(\s*)#\s*((use|no)\s+(bytes|utf8)\s*;.*)$/)
- {
- $_ = "$1$2\n";
- }
- };
- }
-
- if (! $our_sub && ! $warn_sub) {
- warn "Up/Downgrade not needed.\n";
- if ($upgrade || $downgrade)
- { exit 0 }
- else
- { return }
- }
-
- foreach (@files) {
- #if (-l $_ )
- { doUpDown($our_sub, $warn_sub, $_) }
- #else
- #{ doUpDownViaCopy($our_sub, $warn_sub, $_) }
- }
-
- warn "Up/Downgrade complete.\n" ;
- exit 0 if $upgrade || $downgrade;
-
-}
-
-
-sub doUpDown
-{
- my $our_sub = shift;
- my $warn_sub = shift;
-
- return if -d $_[0];
-
- local ($^I) = ($^O eq 'VMS') ? "_bak" : ".bak";
- local (@ARGV) = shift;
-
- while (<>)
- {
- print, last if /^__(END|DATA)__/ ;
-
- &{ $our_sub }() if $our_sub ;
- &{ $warn_sub }() if $warn_sub ;
- print ;
- }
-
- return if eof ;
-
- while (<>)
- { print }
-}
-
-sub doUpDownViaCopy
-{
- my $our_sub = shift;
- my $warn_sub = shift;
- my $file = shift ;
-
- use File::Copy ;
-
- return if -d $file ;
-
- my $backup = $file . ($^O eq 'VMS') ? "_bak" : ".bak";
-
- copy($file, $backup)
- or die "Cannot copy $file to $backup: $!";
-
- my @keep = ();
-
- {
- open F, "<$file"
- or die "Cannot open $file: $!\n" ;
- while (<F>)
- {
- if (/^__(END|DATA)__/)
- {
- push @keep, $_;
- last ;
- }
-
- &{ $our_sub }() if $our_sub ;
- &{ $warn_sub }() if $warn_sub ;
- push @keep, $_;
- }
-
- if (! eof F)
- {
- while (<F>)
- { push @keep, $_ }
- }
- close F;
- }
-
- {
- open F, ">$file"
- or die "Cannot open $file: $!\n";
- print F @keep ;
- close F;
- }
-}
-
-
-sub FindBrokenDependencies
-{
- my $version = shift ;
- my %thisModule = map { $_ => 1} @_;
-
- my @modules = qw(
- IO::Compress::Base
- IO::Compress::Base::Common
- IO::Uncompress::Base
-
- Compress::Raw::Zlib
- Compress::Raw::Bzip2
-
- IO::Compress::RawDeflate
- IO::Uncompress::RawInflate
- IO::Compress::Deflate
- IO::Uncompress::Inflate
- IO::Compress::Gzip
- IO::Compress::Gzip::Constants
- IO::Uncompress::Gunzip
- IO::Compress::Zip
- IO::Uncompress::Unzip
-
- IO::Compress::Bzip2
- IO::Uncompress::Bunzip2
-
- IO::Compress::Lzf
- IO::Uncompress::UnLzf
-
- IO::Compress::Lzop
- IO::Uncompress::UnLzop
-
- Compress::Zlib
- );
-
- my @broken = ();
-
- foreach my $module ( grep { ! $thisModule{$_} } @modules)
- {
- my $hasVersion = getInstalledVersion($module);
-
- # No need to upgrade if the module isn't installed at all
- next
- if ! defined $hasVersion;
-
- # If already have C::Z version 1, then an upgrade to any of the
- # IO::Compress modules will not break it.
- next
- if $module eq 'Compress::Zlib' && $hasVersion < 2;
-
- if ($hasVersion < $version)
- {
- push @broken, $module
- }
- }
-
- return @broken;
-}
-
-sub getInstalledVersion
-{
- my $module = shift;
- my $version;
-
- eval " require $module; ";
-
- if ($@ eq '')
- {
- no strict 'refs';
- $version = ${ $module . "::VERSION" };
- $version = 0
- }
-
- return $version;
-}
-
-package MakeUtil ;
-
-1;
-
-
diff --git a/ext/IO_Compress_Zlib/Changes b/ext/IO_Compress_Zlib/Changes
deleted file mode 100644
index dfcb3781b1..0000000000
--- a/ext/IO_Compress_Zlib/Changes
+++ /dev/null
@@ -1,194 +0,0 @@
-CHANGES
--------
-
- 2.015 3 September 2008
-
- * Makefile.PL
- Backout changes made in 2.014
-
- 2.014 2 September 2008
-
- * Makefile.PL
- Updated to check for indirect dependencies.
-
- 2.012 15 July 2008
-
- * No Changes
-
- 2.011 17 May 2008
-
- * IO::Uncompress::Unzip
- - Print an error message if the zip file contains a
- member compressed with bzip2 and IO::Uncompress::Bunzip2 is
- not available.
- - Could not cope with mixed compression zip files. For example a
- zip file that contains both STORED and DEFLATED content.
- [RT #35573]
-
- 2.010 5 May 2008
-
- * Fixed problem that meant Perl 5.10 could not upgrade this module.
- [RT #35343]
-
- 2.009 20 April 2008
-
- * IO::Compress::Zip
-
- - Added exUnix2 option to allow storing of UID & GID.
- - When running on a Unix derivative the ExtAttr option now defaults
- to the equivalent of 0666. For all other systems the default
- remains 0.
-
- 2.008 2 November 2007
-
- * Minor documentation changes in README
-
- * t/compress/truncate.pl
- EBCDIC Cleanup.
-
- * IO::Compress::Gzip::Constants.pm
- Tidied up the character classes used to defined invalid
- FNAME & FCOMMENT fields for EBCDIC.
-
- 2.006 1 September 2007
-
- * Makefile.PL
- Added INSTALLDIRS directive to install as a core module when built
- on a perl >= 5.9.
-
- * IO::Uncompress::RawDeflate
-
- - Fixed export problem - "$RawDeflateError" and "rawdeflate" were
- not being exported with ":all".
-
- 2.005 18 June 2007
-
- * IO::Compress::Gzip & IO::Uncompress::Gunzip
-
- - RFC1952 says that the FNAME & FCOMMENT header fields must be ISO
- 8859-1 (LATIN-1) characters. The code can optionally police this.
- Added a fix for this logic when running on EBCDIC.
-
- * Makefile.PL
-
- - Check if IO::Compress::Bzip2 is already installed. If it is, add
- to the PREREQ_PM list.
-
- 2.004 3 March 2007
-
- * IO::Compress::Zip
-
- - Added Zip64 documentation.
-
- - Fixed extended timestamp.
- Creation time isn't available in Unix so only store the
- modification time and the last access time in the extended field.
-
- - Fixed file mode.
-
- - Added ExtAttr option to control the value of the "external file
- attributes" field in the central directory.
-
- - Added Unix2 extended attribute ("Ux").
- This stores the UID & GID.
-
- * IO::Compress::Gzip
-
- - Fixed 050interop-gzip.t for Windows
-
- 2.003 2 January 2007
-
- * Added explicit version checking
-
- 2.002 29 December 2006
-
- * Documentation updates.
-
- 2.001 1 November 2006
-
- * Remove beta status.
-
- 2.000_14 26 October 2006
-
- * IO::Uncompress::Deflate
- Beefed up the magic signature check. Means less false positives
- when auto-detecting the compression type.
-
- * IO::Uncompress::UnZip
- Tighten up the zip64 extra field processing to cope with the case
- wheere only some of the local header fields are superceeded.
-
- * IO::Uncompress::AnyInflate
- Remove raw-deflate (RFC 1951) from the default list of compressors
- to check.
- It can still be included if the new RawInflate parameter is
- supplied.
- This change was made because the only way to tell if content is
- raw-deflate is to attempt to uncompress it - a few false positives
- have popped up recently, which suggests that auto-detecting raw
- deflate is far from perfect.
- The equivalent change has been made to IO::Uncompress::AnyUncompress.
- [Core patch #28445]
-
- 2.000_13 20 June 2006
-
- * Preliminary support for reading zip files with zip64 members.
-
- 2.000_12 3 May 2006
-
- * Moved the code for creating and parsing the gzip extra field into
- IO::Compress::Zlib::Extra.pm so that IO::Compress::Zip &
- IO::Uncompress::Unzip can use it as well.
-
- * Added ExtraFieldLocal & ExtraFieldCentral options to IO::Compress::Zip.
- These allow the creation of user-defined extra fields in the local
- and central headers, just like the ExtraField option in
- IO::Compress::Gzip.
-
- * Moved the zip constants into IO::Compress::Zip::Constants
-
- * Added exTime option to IO::Compress::Zip.
- This allows creation of the extended timestamp extra field.
-
- * Added Minimal option to IO::Compress::Zip.
- This disables the creation of all extended fields.
-
- * Added TextFlag option to IO::Compress::Zip.
-
- * Documented Comment and ZipComment options in IO::Compress::Zip.
-
- 2.000_11 10 April 2006
-
- * Updated Documentation for zip modules.
-
- * Changed IO::Compress::Zip 'Store' option to 'Method' and added
- symbolic constants ZIP_CM_STORE, ZIP_CM_DEFLATE and ZIP_CM_BZIP2 to
- allow the compression method to be picked by the user.
-
- * Added support to allow bzip2 compressed data to be written/read
- with IO::Compress::Zip and IO::Uncompress::Unzip.
-
- * Beefed up 050interop-gzip.t to check that the external gzip command
- works as expected before starting the tests. This means that
- this test harness will just be skipped on problematic systems.
-
- * Merged core patch 27565 from Steve Peters. This works around a
- problem with gzip on OpenBSD where it doesn't seem to like
- compressing files < 10 bytes long.
-
- 2.000_10 13 March 2006
-
- * Documentation updates.
-
- 2.000_09 3 March 2006
-
- * Released to CPAN.
-
- 2.000_08 2 March 2006
-
- * Split IO::Compress::Zlib into its own distribution.
-
- * Beefed up support for zip/unzip
-
-
-
diff --git a/ext/IO_Compress_Zlib/Makefile.PL b/ext/IO_Compress_Zlib/Makefile.PL
deleted file mode 100644
index 854b1d9898..0000000000
--- a/ext/IO_Compress_Zlib/Makefile.PL
+++ /dev/null
@@ -1,67 +0,0 @@
-#! perl -w
-
-use strict ;
-require 5.004 ;
-
-$::VERSION = '2.015' ;
-
-use private::MakeUtil;
-use ExtUtils::MakeMaker 5.16 ;
-
-UpDowngrade(getPerlFiles('MANIFEST'))
- unless $ENV{PERL_CORE};
-
-my @MainPREREQ = qw(Compress::Raw::Zlib
- IO::Compress::Base
- IO::Uncompress::Base
- );
-
-# Bzip2 is an option prereq.
-push @MainPREREQ, qw(IO::Compress::Bzip2 IO::Uncompress::Bunzip2)
- if eval { require IO::Compress::Bzip2; };
-
-my %MainPREREQ = map { $_ => $::VERSION } @MainPREREQ;
-
-
-WriteMakefile(
- NAME => 'IO::Compress::Zlib',
- VERSION_FROM => 'lib/IO/Compress/Gzip.pm',
- 'dist' => { COMPRESS => 'gzip',
- TARFLAGS => '-chvf',
- SUFFIX => 'gz',
- DIST_DEFAULT => 'MyTrebleCheck tardist',
- },
-
- (
- $ENV{SKIP_FOR_CORE}
- ? (MAN3PODS => {})
- : (PREREQ_PM => { %MainPREREQ,
- $] >= 5.005 && $] < 5.006
- ? ('File::BSDGlob' => 0)
- : () }
- )
- ),
-
- (
- $] >= 5.005
- ? (ABSTRACT => 'Perl interface to zlib',
- AUTHOR => 'Paul Marquess <pmqs@cpan.org>')
- : ()
- ),
-
- INSTALLDIRS => ($] >= 5.009 ? 'perl' : 'site'),
-
- (
- $] >= 5.009 && ! $ENV{PERL_CORE}
- ? (INST_LIB => 'blib/arch')
- : ()
- ),
-
-
- ((ExtUtils::MakeMaker->VERSION() gt '6.30') ?
- ('LICENSE' => 'perl') : ()),
-
-) ;
-
-# end of file Makefile.PL
-
diff --git a/ext/IO_Compress_Zlib/examples/unzip b/ext/IO_Compress_Zlib/examples/unzip
deleted file mode 100644
index 0623253db0..0000000000
--- a/ext/IO_Compress_Zlib/examples/unzip
+++ /dev/null
@@ -1,73 +0,0 @@
-
-use strict;
-use warnings;
-
-use File::Path;
-use File::Basename;
-use IO::File;
-use IO::Uncompress::RawInflate qw(:all);
-
-
-die "Usage: zipcat file\n"
- if @ARGV != 1 ;
-
-my $file = $ARGV[0] ;
-
-my $fh = new IO::File "<$file"
- or die "Cannot open '$file': $!\n";
-
-while ()
-{
- my $FIXED_HEADER_LENGTH = 30 ;
- my $sig;
- my $buffer;
-
- my $x ;
- ($x = $fh->read($buffer, $FIXED_HEADER_LENGTH)) == $FIXED_HEADER_LENGTH
- or die "Truncated file top: $x $!\n";
-
- my $signature = unpack ("V", substr($buffer, 0, 4));
-
- last unless $signature == 0x04034b50;
-
- my $compressedMethod = unpack ("v", substr($buffer, 8, 2));
- my $compressedLength = unpack ("V", substr($buffer, 18, 4));
- #my $uncompressedLength = unpack ("V", substr($buffer, 22, 4));
- my $filename_length = unpack ("v", substr($buffer, 26, 2));
- my $extra_length = unpack ("v", substr($buffer, 28, 2));
-
- warn "Compressed Length $compressedLength\n";
- my $filename ;
- $fh->read($filename, $filename_length) == $filename_length
- or die "Truncated file\n";
-
- $fh->read($buffer, $extra_length) == $extra_length
- or die "Truncated file\n";
-
- if ($compressedMethod != 8 && $compressedMethod != 0)
- {
- warn "Skipping file '$filename' - not deflated $compressedMethod\n";
- $fh->read($buffer, $compressedLength) == $compressedLength
- or die "Truncated file\n";
- next;
- }
-
- next if $compressedLength == 0;
-
- warn "Writing file '$filename' $compressedMethod\n";
-
- #mkpath dirname $filename;
-
- #rawinflate $fh => $filename,
- rawinflate $fh => '-',
- Transparent => 1,
- InputLength => $compressedLength
- or die "Error uncompressing $file [$filename]: $RawInflateError\n" ;
-}
-
-sub decodeLocalFileHeader
-{
- my $buffer = shift ;
-}
-
-
diff --git a/ext/IO_Compress_Zlib/private/MakeUtil.pm b/ext/IO_Compress_Zlib/private/MakeUtil.pm
deleted file mode 100644
index e595910654..0000000000
--- a/ext/IO_Compress_Zlib/private/MakeUtil.pm
+++ /dev/null
@@ -1,381 +0,0 @@
-package MakeUtil ;
-package main ;
-
-use strict ;
-
-use Config qw(%Config);
-use File::Copy;
-
-my $VERSION = '1.0';
-
-
-BEGIN
-{
- eval { require File::Spec::Functions ; File::Spec::Functions->import() } ;
- if ($@)
- {
- *catfile = sub { return "$_[0]/$_[1]" }
- }
-}
-
-require VMS::Filespec if $^O eq 'VMS';
-
-
-unless($ENV{PERL_CORE}) {
- $ENV{PERL_CORE} = 1 if grep { $_ eq 'PERL_CORE=1' } @ARGV;
-}
-
-$ENV{SKIP_FOR_CORE} = 1 if $ENV{PERL_CORE} || $ENV{MY_PERL_CORE} ;
-
-
-
-sub MY::libscan
-{
- my $self = shift;
- my $path = shift;
-
- return undef
- if $path =~ /(~|\.bak|_bak)$/ ||
- $path =~ /\..*\.sw(o|p)$/ ||
- $path =~ /\B\.svn\b/;
-
- return $path;
-}
-
-sub MY::postamble
-{
- return ''
- if $ENV{PERL_CORE} ;
-
- my @files = getPerlFiles('MANIFEST');
-
- # Note: Once you remove all the layers of shell/makefile escaping
- # the regular expression below reads
- #
- # /^\s*local\s*\(\s*\$^W\s*\)/
- #
- my $postamble = '
-
-MyTrebleCheck:
- @echo Checking for $$^W in files: '. "@files" . '
- @perl -ne \' \
- exit 1 if /^\s*local\s*\(\s*\$$\^W\s*\)/; \
- \' ' . " @files || " . ' \
- (echo found unexpected $$^W ; exit 1)
- @echo All is ok.
-
-';
-
- return $postamble;
-}
-
-sub getPerlFiles
-{
- my @manifests = @_ ;
-
- my @files = ();
-
- for my $manifest (@manifests)
- {
- my $prefix = './';
-
- $prefix = $1
- if $manifest =~ m#^(.*/)#;
-
- open M, "<$manifest"
- or die "Cannot open '$manifest': $!\n";
- while (<M>)
- {
- chomp ;
- next if /^\s*#/ || /^\s*$/ ;
-
- s/^\s+//;
- s/\s+$//;
-
- /^(\S+)\s*(.*)$/;
-
- my ($file, $rest) = ($1, $2);
-
- if ($file =~ /\.(pm|pl|t)$/ and $file !~ /MakeUtil.pm/)
- {
- push @files, "$prefix$file";
- }
- elsif ($rest =~ /perl/i)
- {
- push @files, "$prefix$file";
- }
-
- }
- close M;
- }
-
- return @files;
-}
-
-sub UpDowngrade
-{
- return if defined $ENV{TipTop};
-
- my @files = @_ ;
-
- # our and use bytes/utf8 is stable from 5.6.0 onward
- # warnings is stable from 5.6.1 onward
-
- # Note: this code assumes that each statement it modifies is not
- # split across multiple lines.
-
-
- my $warn_sub = '';
- my $our_sub = '' ;
-
- my $upgrade ;
- my $downgrade ;
- my $do_downgrade ;
-
- my $caller = (caller(1))[3] || '';
-
- if ($caller =~ /downgrade/)
- {
- $downgrade = 1;
- }
- elsif ($caller =~ /upgrade/)
- {
- $upgrade = 1;
- }
- else
- {
- $do_downgrade = 1
- if $] < 5.006001 ;
- }
-
-# else
-# {
-# my $opt = shift @ARGV || '' ;
-# $upgrade = ($opt =~ /^-upgrade/i);
-# $downgrade = ($opt =~ /^-downgrade/i);
-# push @ARGV, $opt unless $downgrade || $upgrade;
-# }
-
-
- if ($downgrade || $do_downgrade) {
- # From: use|no warnings "blah"
- # To: local ($^W) = 1; # use|no warnings "blah"
- $warn_sub = sub {
- s/^(\s*)(no\s+warnings)/${1}local (\$^W) = 0; #$2/ ;
- s/^(\s*)(use\s+warnings)/${1}local (\$^W) = 1; #$2/ ;
- };
- }
- #elsif ($] >= 5.006001 || $upgrade) {
- elsif ($upgrade) {
- # From: local ($^W) = 1; # use|no warnings "blah"
- # To: use|no warnings "blah"
- $warn_sub = sub {
- s/^(\s*)local\s*\(\$\^W\)\s*=\s*\d+\s*;\s*#\s*((no|use)\s+warnings.*)/$1$2/ ;
- };
- }
-
- if ($downgrade || $do_downgrade) {
- $our_sub = sub {
- if ( /^(\s*)our\s+\(\s*([^)]+\s*)\)/ ) {
- my $indent = $1;
- my $vars = join ' ', split /\s*,\s*/, $2;
- $_ = "${indent}use vars qw($vars);\n";
- }
- elsif ( /^(\s*)((use|no)\s+(bytes|utf8)\s*;.*)$/)
- {
- $_ = "$1# $2\n";
- }
- };
- }
- #elsif ($] >= 5.006000 || $upgrade) {
- elsif ($upgrade) {
- $our_sub = sub {
- if ( /^(\s*)use\s+vars\s+qw\((.*?)\)/ ) {
- my $indent = $1;
- my $vars = join ', ', split ' ', $2;
- $_ = "${indent}our ($vars);\n";
- }
- elsif ( /^(\s*)#\s*((use|no)\s+(bytes|utf8)\s*;.*)$/)
- {
- $_ = "$1$2\n";
- }
- };
- }
-
- if (! $our_sub && ! $warn_sub) {
- warn "Up/Downgrade not needed.\n";
- if ($upgrade || $downgrade)
- { exit 0 }
- else
- { return }
- }
-
- foreach (@files) {
- #if (-l $_ )
- { doUpDown($our_sub, $warn_sub, $_) }
- #else
- #{ doUpDownViaCopy($our_sub, $warn_sub, $_) }
- }
-
- warn "Up/Downgrade complete.\n" ;
- exit 0 if $upgrade || $downgrade;
-
-}
-
-
-sub doUpDown
-{
- my $our_sub = shift;
- my $warn_sub = shift;
-
- return if -d $_[0];
-
- local ($^I) = ($^O eq 'VMS') ? "_bak" : ".bak";
- local (@ARGV) = shift;
-
- while (<>)
- {
- print, last if /^__(END|DATA)__/ ;
-
- &{ $our_sub }() if $our_sub ;
- &{ $warn_sub }() if $warn_sub ;
- print ;
- }
-
- return if eof ;
-
- while (<>)
- { print }
-}
-
-sub doUpDownViaCopy
-{
- my $our_sub = shift;
- my $warn_sub = shift;
- my $file = shift ;
-
- use File::Copy ;
-
- return if -d $file ;
-
- my $backup = $file . ($^O eq 'VMS') ? "_bak" : ".bak";
-
- copy($file, $backup)
- or die "Cannot copy $file to $backup: $!";
-
- my @keep = ();
-
- {
- open F, "<$file"
- or die "Cannot open $file: $!\n" ;
- while (<F>)
- {
- if (/^__(END|DATA)__/)
- {
- push @keep, $_;
- last ;
- }
-
- &{ $our_sub }() if $our_sub ;
- &{ $warn_sub }() if $warn_sub ;
- push @keep, $_;
- }
-
- if (! eof F)
- {
- while (<F>)
- { push @keep, $_ }
- }
- close F;
- }
-
- {
- open F, ">$file"
- or die "Cannot open $file: $!\n";
- print F @keep ;
- close F;
- }
-}
-
-
-sub FindBrokenDependencies
-{
- my $version = shift ;
- my %thisModule = map { $_ => 1} @_;
-
- my @modules = qw(
- IO::Compress::Base
- IO::Compress::Base::Common
- IO::Uncompress::Base
-
- Compress::Raw::Zlib
- Compress::Raw::Bzip2
-
- IO::Compress::RawDeflate
- IO::Uncompress::RawInflate
- IO::Compress::Deflate
- IO::Uncompress::Inflate
- IO::Compress::Gzip
- IO::Compress::Gzip::Constants
- IO::Uncompress::Gunzip
- IO::Compress::Zip
- IO::Uncompress::Unzip
-
- IO::Compress::Bzip2
- IO::Uncompress::Bunzip2
-
- IO::Compress::Lzf
- IO::Uncompress::UnLzf
-
- IO::Compress::Lzop
- IO::Uncompress::UnLzop
-
- Compress::Zlib
- );
-
- my @broken = ();
-
- foreach my $module ( grep { ! $thisModule{$_} } @modules)
- {
- my $hasVersion = getInstalledVersion($module);
-
- # No need to upgrade if the module isn't installed at all
- next
- if ! defined $hasVersion;
-
- # If already have C::Z version 1, then an upgrade to any of the
- # IO::Compress modules will not break it.
- next
- if $module eq 'Compress::Zlib' && $hasVersion < 2;
-
- if ($hasVersion < $version)
- {
- push @broken, $module
- }
- }
-
- return @broken;
-}
-
-sub getInstalledVersion
-{
- my $module = shift;
- my $version;
-
- eval " require $module; ";
-
- if ($@ eq '')
- {
- no strict 'refs';
- $version = ${ $module . "::VERSION" };
- $version = 0
- }
-
- return $version;
-}
-
-package MakeUtil ;
-
-1;
-
-
diff --git a/ext/IPC-SysV/Changes b/ext/IPC-SysV/Changes
index 22264ffd95..ed605596c9 100644
--- a/ext/IPC-SysV/Changes
+++ b/ext/IPC-SysV/Changes
@@ -1,3 +1,7 @@
+2.01 - 2009-03-15
+
+ released without changes
+
2.00_02 - 2008-11-28
* check for ENOMEM and EACCES and skip tests as neccessary
diff --git a/ext/IPC-SysV/lib/IPC/Msg.pm b/ext/IPC-SysV/lib/IPC/Msg.pm
index 7ffbc0b85f..44676757b6 100644
--- a/ext/IPC-SysV/lib/IPC/Msg.pm
+++ b/ext/IPC-SysV/lib/IPC/Msg.pm
@@ -21,7 +21,7 @@ use strict;
use vars qw($VERSION);
use Carp;
-$VERSION = do { my @r = '$Snapshot: /IPC-SysV/2.00_02 $' =~ /(\d+\.\d+(?:_\d+)?)/; @r ? $r[0] : '9.99' };
+$VERSION = do { my @r = '$Snapshot: /IPC-SysV/2.01 $' =~ /(\d+\.\d+(?:_\d+)?)/; @r ? $r[0] : '9.99' };
$VERSION = eval $VERSION;
# Figure out if we have support for native sized types
diff --git a/ext/IPC-SysV/lib/IPC/Semaphore.pm b/ext/IPC-SysV/lib/IPC/Semaphore.pm
index f3690a30b3..6f0c251ea4 100644
--- a/ext/IPC-SysV/lib/IPC/Semaphore.pm
+++ b/ext/IPC-SysV/lib/IPC/Semaphore.pm
@@ -22,7 +22,7 @@ use strict;
use vars qw($VERSION);
use Carp;
-$VERSION = do { my @r = '$Snapshot: /IPC-SysV/2.00_02 $' =~ /(\d+\.\d+(?:_\d+)?)/; @r ? $r[0] : '9.99' };
+$VERSION = do { my @r = '$Snapshot: /IPC-SysV/2.01 $' =~ /(\d+\.\d+(?:_\d+)?)/; @r ? $r[0] : '9.99' };
$VERSION = eval $VERSION;
# Figure out if we have support for native sized types
diff --git a/ext/IPC-SysV/lib/IPC/SharedMem.pm b/ext/IPC-SysV/lib/IPC/SharedMem.pm
index 65d3137e2e..06240f2fb8 100644
--- a/ext/IPC-SysV/lib/IPC/SharedMem.pm
+++ b/ext/IPC-SysV/lib/IPC/SharedMem.pm
@@ -21,7 +21,7 @@ use strict;
use vars qw($VERSION);
use Carp;
-$VERSION = do { my @r = '$Snapshot: /IPC-SysV/2.00_02 $' =~ /(\d+\.\d+(?:_\d+)?)/; @r ? $r[0] : '9.99' };
+$VERSION = do { my @r = '$Snapshot: /IPC-SysV/2.01 $' =~ /(\d+\.\d+(?:_\d+)?)/; @r ? $r[0] : '9.99' };
$VERSION = eval $VERSION;
# Figure out if we have support for native sized types
diff --git a/ext/IPC-SysV/lib/IPC/SysV.pm b/ext/IPC-SysV/lib/IPC/SysV.pm
index b6098282c7..eaa068bc46 100644
--- a/ext/IPC-SysV/lib/IPC/SysV.pm
+++ b/ext/IPC-SysV/lib/IPC/SysV.pm
@@ -24,7 +24,7 @@ use Config;
require Exporter;
@ISA = qw(Exporter);
-$VERSION = do { my @r = '$Snapshot: /IPC-SysV/2.00_02 $' =~ /(\d+\.\d+(?:_\d+)?)/; @r ? $r[0] : '9.99' };
+$VERSION = do { my @r = '$Snapshot: /IPC-SysV/2.01 $' =~ /(\d+\.\d+(?:_\d+)?)/; @r ? $r[0] : '9.99' };
$XS_VERSION = $VERSION;
$VERSION = eval $VERSION;
diff --git a/ext/List-Util/Makefile.PL b/ext/List-Util/Makefile.PL
index 48dccdb91d..9bc1c5adc1 100644
--- a/ext/List-Util/Makefile.PL
+++ b/ext/List-Util/Makefile.PL
@@ -2,7 +2,6 @@ use ExtUtils::MakeMaker;
WriteMakefile(
VERSION_FROM => "lib/List/Util.pm",
- MAN3PODS => {}, # Pods will be built by installman.
NAME => "List::Util",
DEFINE => "-DPERL_EXT",
);
diff --git a/ext/Math-BigInt-FastCalc/Makefile.PL b/ext/Math-BigInt-FastCalc/Makefile.PL
deleted file mode 100644
index 8ab4040c0e..0000000000
--- a/ext/Math-BigInt-FastCalc/Makefile.PL
+++ /dev/null
@@ -1,14 +0,0 @@
-use ExtUtils::MakeMaker;
-
-use strict;
-
-WriteMakefile(
- 'NAME' => 'Math::BigInt::FastCalc',
- 'VERSION_FROM' => 'FastCalc.pm',
- 'PREREQ_PM' => {
- 'Math::BigInt' => 1.88,
- },
- INSTALLDIRS => 'perl',
- PREREQ_FATAL => 1,
- MAN3PODS => {},
- );
diff --git a/ext/Module-Pluggable/Makefile.PL b/ext/Module-Pluggable/Makefile.PL
index c926c542a6..e1e9001081 100644
--- a/ext/Module-Pluggable/Makefile.PL
+++ b/ext/Module-Pluggable/Makefile.PL
@@ -12,18 +12,14 @@ my %dodgy_files = (
catfile(qw(EditorJunk Plugin .#Bar.pm)) => 'EditorJunk::Bar',
);
-my $core = grep { $_ eq 'PERL_CORE=1' } @ARGV;
-my @path = $core ? (File::Spec->updir, File::Spec->updir, File::Spec->updir,
- "t", "Module_Pluggable") : ($FindBin::Bin,"t");
-
my @files;
-if ($^O ne 'VMS' && $^O ne 'VOS') {
+unless (grep { lc($^O) eq $_ } qw(vms vos)) {
foreach my $test (keys %dodgy_files) {
- my ($file) = (catfile(@path, "lib", $test)=~/^(.*)$/);
- if (open(my $fh, ">", $file)) {
+ my ($file) = (catfile($FindBin::Bin, "t", "lib", $test)=~/^(.*)$/);
+ if (open(FH, ">$file")) {
my $name = $dodgy_files{$test};
- print $fh "package $name;\nsub new {}\n1;";
- close($fh);
+ print FH "package $name;\nsub new {}\n1;";
+ close(FH);
push @files, $file;
}
}
@@ -43,7 +39,5 @@ WriteMakefile
'INSTALLDIRS' => ($] >= 5.008009) ? "perl" : "site",
'PL_FILES' => {},
'realclean' => {FILES=> join ' ', @files},
- # In the core pods will be built by installman.
- $core ? (MAN3PODS => {}) : (),
)
;
diff --git a/ext/Module-Pluggable/lib/Module/Pluggable.pm b/ext/Module-Pluggable/lib/Module/Pluggable.pm
index 7de3033aa5..f9b707f094 100644
--- a/ext/Module-Pluggable/lib/Module/Pluggable.pm
+++ b/ext/Module-Pluggable/lib/Module/Pluggable.pm
@@ -9,7 +9,7 @@ use Module::Pluggable::Object;
# Peter Gibbons: I wouldn't say I've been missing it, Bob!
-$VERSION = '3.8';
+$VERSION = '3.9_01';
sub import {
my $class = shift;
diff --git a/ext/Module-Pluggable/lib/Module/Pluggable/Object.pm b/ext/Module-Pluggable/lib/Module/Pluggable/Object.pm
index d99eb9db90..e0ee993075 100644
--- a/ext/Module-Pluggable/lib/Module/Pluggable/Object.pm
+++ b/ext/Module-Pluggable/lib/Module/Pluggable/Object.pm
@@ -6,10 +6,9 @@ use File::Basename;
use File::Spec::Functions qw(splitdir catdir curdir catfile abs2rel);
use Carp qw(croak carp);
use Devel::InnerPackage;
-use Data::Dumper;
use vars qw($VERSION);
-$VERSION = '3.6';
+$VERSION = '3.9';
sub new {
@@ -34,14 +33,14 @@ sub plugins {
my $filename = $self->{'filename'};
my $pkg = $self->{'package'};
+ # Get the exception params instantiated
+ $self->_setup_exceptions;
+
# automatically turn a scalar search path or namespace into a arrayref
for (qw(search_path search_dirs)) {
$self->{$_} = [ $self->{$_} ] if exists $self->{$_} && !ref($self->{$_});
}
-
-
-
# default search path is '<Module>::<Name>::Plugin'
$self->{'search_path'} = ["${pkg}::Plugin"] unless $self->{'search_path'};
@@ -57,6 +56,7 @@ sub plugins {
my @plugins = $self->search_directories(@SEARCHDIR);
+ push(@plugins, $self->handle_innerpackages($_)) for @{$self->{'search_path'}};
# push @plugins, map { print STDERR "$_\n"; $_->require } list_packages($_) for (@{$self->{'search_path'}});
@@ -64,43 +64,12 @@ sub plugins {
return () unless @plugins;
- # exceptions
- my %only;
- my %except;
- my $only;
- my $except;
-
- if (defined $self->{'only'}) {
- if (ref($self->{'only'}) eq 'ARRAY') {
- %only = map { $_ => 1 } @{$self->{'only'}};
- } elsif (ref($self->{'only'}) eq 'Regexp') {
- $only = $self->{'only'}
- } elsif (ref($self->{'only'}) eq '') {
- $only{$self->{'only'}} = 1;
- }
- }
-
-
- if (defined $self->{'except'}) {
- if (ref($self->{'except'}) eq 'ARRAY') {
- %except = map { $_ => 1 } @{$self->{'except'}};
- } elsif (ref($self->{'except'}) eq 'Regexp') {
- $except = $self->{'except'}
- } elsif (ref($self->{'except'}) eq '') {
- $except{$self->{'except'}} = 1;
- }
- }
-
# remove duplicates
# probably not necessary but hey ho
my %plugins;
for(@plugins) {
- next if (keys %only && !$only{$_} );
- next unless (!defined $only || m!$only! );
-
- next if (keys %except && $except{$_} );
- next if (defined $except && m!$except! );
+ next unless $self->_is_legit($_);
$plugins{$_} = 1;
}
@@ -116,6 +85,58 @@ sub plugins {
}
+sub _setup_exceptions {
+ my $self = shift;
+
+ my %only;
+ my %except;
+ my $only;
+ my $except;
+
+ if (defined $self->{'only'}) {
+ if (ref($self->{'only'}) eq 'ARRAY') {
+ %only = map { $_ => 1 } @{$self->{'only'}};
+ } elsif (ref($self->{'only'}) eq 'Regexp') {
+ $only = $self->{'only'}
+ } elsif (ref($self->{'only'}) eq '') {
+ $only{$self->{'only'}} = 1;
+ }
+ }
+
+
+ if (defined $self->{'except'}) {
+ if (ref($self->{'except'}) eq 'ARRAY') {
+ %except = map { $_ => 1 } @{$self->{'except'}};
+ } elsif (ref($self->{'except'}) eq 'Regexp') {
+ $except = $self->{'except'}
+ } elsif (ref($self->{'except'}) eq '') {
+ $except{$self->{'except'}} = 1;
+ }
+ }
+ $self->{_exceptions}->{only_hash} = \%only;
+ $self->{_exceptions}->{only} = $only;
+ $self->{_exceptions}->{except_hash} = \%except;
+ $self->{_exceptions}->{except} = $except;
+
+}
+
+sub _is_legit {
+ my $self = shift;
+ my $plugin = shift;
+ my %only = %{$self->{_exceptions}->{only_hash}||{}};
+ my %except = %{$self->{_exceptions}->{except_hash}||{}};
+ my $only = $self->{_exceptions}->{only};
+ my $except = $self->{_exceptions}->{except};
+
+ return 0 if (keys %only && !$only{$plugin} );
+ return 0 unless (!defined $only || $plugin =~ m!$only! );
+
+ return 0 if (keys %except && $except{$plugin} );
+ return 0 if (defined $except && $plugin =~ m!$except! );
+
+ return 1;
+}
+
sub search_directories {
my $self = shift;
my @SEARCHDIR = @_;
@@ -125,7 +146,6 @@ sub search_directories {
foreach my $dir (@SEARCHDIR) {
push @plugins, $self->search_paths($dir);
}
-
return @plugins;
}
@@ -209,7 +229,7 @@ sub search_paths {
# now add stuff that may have been in package
# NOTE we should probably use all the stuff we've been given already
# but then we can't unload it :(
- push @plugins, $self->handle_innerpackages($searchpath) unless (exists $self->{inner} && !$self->{inner});
+ push @plugins, $self->handle_innerpackages($searchpath);
} # foreach $searchpath
return @plugins;
@@ -236,6 +256,7 @@ sub handle_finding_plugin {
my $plugin = shift;
return unless (defined $self->{'instantiate'} || $self->{'require'});
+ return unless $self->_is_legit($plugin);
$self->_require($plugin);
}
@@ -267,10 +288,11 @@ sub find_files {
sub handle_innerpackages {
my $self = shift;
+ return () if (exists $self->{inner} && !$self->{inner});
+
my $path = shift;
my @plugins;
-
foreach my $plugin (Devel::InnerPackage::list_packages($path)) {
my $err = $self->handle_finding_plugin($plugin);
#next if $err;
diff --git a/t/Module_Pluggable/01use.t b/ext/Module-Pluggable/t/01use.t
index be0b8481ac..be0b8481ac 100644
--- a/t/Module_Pluggable/01use.t
+++ b/ext/Module-Pluggable/t/01use.t
diff --git a/t/Module_Pluggable/02alsoworks.t b/ext/Module-Pluggable/t/02alsoworks.t
index 131df29da0..131df29da0 100644
--- a/t/Module_Pluggable/02alsoworks.t
+++ b/ext/Module-Pluggable/t/02alsoworks.t
diff --git a/t/Module_Pluggable/02works.t b/ext/Module-Pluggable/t/02works.t
index f748344a7a..f748344a7a 100644
--- a/t/Module_Pluggable/02works.t
+++ b/ext/Module-Pluggable/t/02works.t
diff --git a/t/Module_Pluggable/02works_taint.t b/ext/Module-Pluggable/t/02works_taint.t
index 0e1baa3dc0..0e1baa3dc0 100644
--- a/t/Module_Pluggable/02works_taint.t
+++ b/ext/Module-Pluggable/t/02works_taint.t
diff --git a/t/Module_Pluggable/03diffname.t b/ext/Module-Pluggable/t/03diffname.t
index d449fd0e04..d449fd0e04 100644
--- a/t/Module_Pluggable/03diffname.t
+++ b/ext/Module-Pluggable/t/03diffname.t
diff --git a/t/Module_Pluggable/04acmedir.t b/ext/Module-Pluggable/t/04acmedir.t
index e2572feb48..e2572feb48 100644
--- a/t/Module_Pluggable/04acmedir.t
+++ b/ext/Module-Pluggable/t/04acmedir.t
diff --git a/t/Module_Pluggable/04acmedir_single.t b/ext/Module-Pluggable/t/04acmedir_single.t
index adc5304b69..adc5304b69 100644
--- a/t/Module_Pluggable/04acmedir_single.t
+++ b/ext/Module-Pluggable/t/04acmedir_single.t
diff --git a/t/Module_Pluggable/04acmepath.t b/ext/Module-Pluggable/t/04acmepath.t
index 540158c496..540158c496 100644
--- a/t/Module_Pluggable/04acmepath.t
+++ b/ext/Module-Pluggable/t/04acmepath.t
diff --git a/t/Module_Pluggable/04acmepath_single.t b/ext/Module-Pluggable/t/04acmepath_single.t
index 976e77ec26..976e77ec26 100644
--- a/t/Module_Pluggable/04acmepath_single.t
+++ b/ext/Module-Pluggable/t/04acmepath_single.t
diff --git a/t/Module_Pluggable/05postpath.t b/ext/Module-Pluggable/t/05postpath.t
index 08c4052d26..08c4052d26 100644
--- a/t/Module_Pluggable/05postpath.t
+++ b/ext/Module-Pluggable/t/05postpath.t
diff --git a/t/Module_Pluggable/06multipath.t b/ext/Module-Pluggable/t/06multipath.t
index 6f74591289..6f74591289 100644
--- a/t/Module_Pluggable/06multipath.t
+++ b/ext/Module-Pluggable/t/06multipath.t
diff --git a/t/Module_Pluggable/07instantiate.t b/ext/Module-Pluggable/t/07instantiate.t
index 352d4d0926..352d4d0926 100644
--- a/t/Module_Pluggable/07instantiate.t
+++ b/ext/Module-Pluggable/t/07instantiate.t
diff --git a/t/Module_Pluggable/08nothing.t b/ext/Module-Pluggable/t/08nothing.t
index f5c6487189..f5c6487189 100644
--- a/t/Module_Pluggable/08nothing.t
+++ b/ext/Module-Pluggable/t/08nothing.t
diff --git a/t/Module_Pluggable/09require.t b/ext/Module-Pluggable/t/09require.t
index af5de5fd92..af5de5fd92 100644
--- a/t/Module_Pluggable/09require.t
+++ b/ext/Module-Pluggable/t/09require.t
diff --git a/t/Module_Pluggable/10innerpack.t b/ext/Module-Pluggable/t/10innerpack.t
index 0653fc84f1..0653fc84f1 100644
--- a/t/Module_Pluggable/10innerpack.t
+++ b/ext/Module-Pluggable/t/10innerpack.t
diff --git a/t/Module_Pluggable/10innerpack_inner.t b/ext/Module-Pluggable/t/10innerpack_inner.t
index 054d9b67d7..054d9b67d7 100644
--- a/t/Module_Pluggable/10innerpack_inner.t
+++ b/ext/Module-Pluggable/t/10innerpack_inner.t
diff --git a/t/Module_Pluggable/10innerpack_noinner.t b/ext/Module-Pluggable/t/10innerpack_noinner.t
index 1d670b02c3..1d670b02c3 100644
--- a/t/Module_Pluggable/10innerpack_noinner.t
+++ b/ext/Module-Pluggable/t/10innerpack_noinner.t
diff --git a/ext/Module-Pluggable/t/10innerpack_onefile.t b/ext/Module-Pluggable/t/10innerpack_onefile.t
new file mode 100644
index 0000000000..01caf3738e
--- /dev/null
+++ b/ext/Module-Pluggable/t/10innerpack_onefile.t
@@ -0,0 +1,27 @@
+#!perl -wT
+
+use strict;
+use Test::More tests => 2;
+use Data::Dumper;
+
+my $mc = MyClass->new();
+my $mc2 = MyClass2->new();
+
+
+is_deeply([$mc->plugins], [qw(MyClass::Plugin::MyPlugin)], "Got inner plugin");
+is_deeply([$mc2->plugins], [], "Didn't get plugin");
+
+package MyClass::Plugin::MyPlugin;
+sub pretty { print "I am pretty" };
+
+package MyClass;
+use Module::Pluggable inner => 1;
+
+sub new { return bless {}, $_[0] }
+
+package MyClass2;
+use Module::Pluggable search_path => "MyClass::Plugin", inner => 0;
+
+sub new { return bless {}, $_[0] }
+1;
+
diff --git a/t/Module_Pluggable/10innerpack_override.t b/ext/Module-Pluggable/t/10innerpack_override.t
index f9e863e930..f9e863e930 100644
--- a/t/Module_Pluggable/10innerpack_override.t
+++ b/ext/Module-Pluggable/t/10innerpack_override.t
diff --git a/t/Module_Pluggable/10innerpack_super.t b/ext/Module-Pluggable/t/10innerpack_super.t
index e9a58bd8fa..e9a58bd8fa 100644
--- a/t/Module_Pluggable/10innerpack_super.t
+++ b/ext/Module-Pluggable/t/10innerpack_super.t
diff --git a/t/Module_Pluggable/11usetwice.t b/ext/Module-Pluggable/t/11usetwice.t
index 8240318a4a..8240318a4a 100644
--- a/t/Module_Pluggable/11usetwice.t
+++ b/ext/Module-Pluggable/t/11usetwice.t
diff --git a/t/Module_Pluggable/12only.t b/ext/Module-Pluggable/t/12only.t
index 1150b60793..1150b60793 100644
--- a/t/Module_Pluggable/12only.t
+++ b/ext/Module-Pluggable/t/12only.t
diff --git a/t/Module_Pluggable/12onlyarray.t b/ext/Module-Pluggable/t/12onlyarray.t
index a37e7771d2..a37e7771d2 100644
--- a/t/Module_Pluggable/12onlyarray.t
+++ b/ext/Module-Pluggable/t/12onlyarray.t
diff --git a/t/Module_Pluggable/12onlyregex.t b/ext/Module-Pluggable/t/12onlyregex.t
index 78a9bd554f..78a9bd554f 100644
--- a/t/Module_Pluggable/12onlyregex.t
+++ b/ext/Module-Pluggable/t/12onlyregex.t
diff --git a/ext/Module-Pluggable/t/12onlyrequire.t b/ext/Module-Pluggable/t/12onlyrequire.t
new file mode 100644
index 0000000000..cf76b4dd03
--- /dev/null
+++ b/ext/Module-Pluggable/t/12onlyrequire.t
@@ -0,0 +1,21 @@
+#!perl -w
+use strict;
+use FindBin;
+use lib (($FindBin::Bin."/lib")=~/^(.*)$/);
+use Test::More tests => 2;
+
+my @packages = eval { Zot->_dist_types };
+is($@, '', "No warnings");
+is(scalar(@packages), 0, "Correctly only got 1 package");
+
+
+package Zot;
+use strict;
+use Module::Pluggable (
+ sub_name => '_dist_types',
+ search_path => __PACKAGE__,
+ only => qr/Zot::\w+$/,
+ require => 1,
+ );
+
+1;
diff --git a/t/Module_Pluggable/13except.t b/ext/Module-Pluggable/t/13except.t
index e08ffa905f..e08ffa905f 100644
--- a/t/Module_Pluggable/13except.t
+++ b/ext/Module-Pluggable/t/13except.t
diff --git a/t/Module_Pluggable/13exceptarray.t b/ext/Module-Pluggable/t/13exceptarray.t
index ec61ff4dae..ec61ff4dae 100644
--- a/t/Module_Pluggable/13exceptarray.t
+++ b/ext/Module-Pluggable/t/13exceptarray.t
diff --git a/t/Module_Pluggable/13exceptregex.t b/ext/Module-Pluggable/t/13exceptregex.t
index 2d842b387f..2d842b387f 100644
--- a/t/Module_Pluggable/13exceptregex.t
+++ b/ext/Module-Pluggable/t/13exceptregex.t
diff --git a/t/Module_Pluggable/14package.t b/ext/Module-Pluggable/t/14package.t
index aaca94ceab..aaca94ceab 100644
--- a/t/Module_Pluggable/14package.t
+++ b/ext/Module-Pluggable/t/14package.t
diff --git a/t/Module_Pluggable/15topicsafe.t b/ext/Module-Pluggable/t/15topicsafe.t
index 49305f2884..49305f2884 100644
--- a/t/Module_Pluggable/15topicsafe.t
+++ b/ext/Module-Pluggable/t/15topicsafe.t
diff --git a/t/Module_Pluggable/16different_extension.t b/ext/Module-Pluggable/t/16different_extension.t
index f628a7cd67..f628a7cd67 100644
--- a/t/Module_Pluggable/16different_extension.t
+++ b/ext/Module-Pluggable/t/16different_extension.t
diff --git a/t/Module_Pluggable/17devel_inner_package.t b/ext/Module-Pluggable/t/17devel_inner_package.t
index 30f32560d8..30f32560d8 100644
--- a/t/Module_Pluggable/17devel_inner_package.t
+++ b/ext/Module-Pluggable/t/17devel_inner_package.t
diff --git a/t/Module_Pluggable/18skipped_package.t b/ext/Module-Pluggable/t/18skipped_package.t
index c580d68cbb..c580d68cbb 100644
--- a/t/Module_Pluggable/18skipped_package.t
+++ b/ext/Module-Pluggable/t/18skipped_package.t
diff --git a/t/Module_Pluggable/19can_ok_clobber.t b/ext/Module-Pluggable/t/19can_ok_clobber.t
index 07c598b4ba..07c598b4ba 100644
--- a/t/Module_Pluggable/19can_ok_clobber.t
+++ b/ext/Module-Pluggable/t/19can_ok_clobber.t
diff --git a/t/Module_Pluggable/20dodgy_files.t b/ext/Module-Pluggable/t/20dodgy_files.t
index 8c0eb8e76e..8c0eb8e76e 100644
--- a/t/Module_Pluggable/20dodgy_files.t
+++ b/ext/Module-Pluggable/t/20dodgy_files.t
diff --git a/t/Module_Pluggable/21editor_junk.t b/ext/Module-Pluggable/t/21editor_junk.t
index 5f4b52b32e..5f4b52b32e 100644
--- a/t/Module_Pluggable/21editor_junk.t
+++ b/ext/Module-Pluggable/t/21editor_junk.t
diff --git a/t/Module_Pluggable/acme/Acme/MyTest/Plugin/Foo.pm b/ext/Module-Pluggable/t/acme/Acme/MyTest/Plugin/Foo.pm
index 29c888baf7..29c888baf7 100644
--- a/t/Module_Pluggable/acme/Acme/MyTest/Plugin/Foo.pm
+++ b/ext/Module-Pluggable/t/acme/Acme/MyTest/Plugin/Foo.pm
diff --git a/ext/Module-Pluggable/t/lib/Acme/Foo-Bar.pm b/ext/Module-Pluggable/t/lib/Acme/Foo-Bar.pm
new file mode 100644
index 0000000000..4fc48c6a18
--- /dev/null
+++ b/ext/Module-Pluggable/t/lib/Acme/Foo-Bar.pm
@@ -0,0 +1,6 @@
+package Acme::FooBar;
+
+our $quux = "hello";
+
+1;
+
diff --git a/t/Module_Pluggable/lib/Acme/MyTest/Plugin/Foo.pm b/ext/Module-Pluggable/t/lib/Acme/MyTest/Plugin/Foo.pm
index 29c888baf7..29c888baf7 100644
--- a/t/Module_Pluggable/lib/Acme/MyTest/Plugin/Foo.pm
+++ b/ext/Module-Pluggable/t/lib/Acme/MyTest/Plugin/Foo.pm
diff --git a/t/Module_Pluggable/lib/EditorJunk/Plugin/.gitignore b/ext/Module-Pluggable/t/lib/EditorJunk/Plugin/.gitignore
index 34796cc355..34796cc355 100644
--- a/t/Module_Pluggable/lib/EditorJunk/Plugin/.gitignore
+++ b/ext/Module-Pluggable/t/lib/EditorJunk/Plugin/.gitignore
diff --git a/t/Module_Pluggable/lib/EditorJunk/Plugin/Bar.pm b/ext/Module-Pluggable/t/lib/EditorJunk/Plugin/Bar.pm
index dcc870c4e5..dcc870c4e5 100644
--- a/t/Module_Pluggable/lib/EditorJunk/Plugin/Bar.pm
+++ b/ext/Module-Pluggable/t/lib/EditorJunk/Plugin/Bar.pm
diff --git a/t/Module_Pluggable/lib/EditorJunk/Plugin/Bar.pm.swo b/ext/Module-Pluggable/t/lib/EditorJunk/Plugin/Bar.pm.swo
index dcc870c4e5..dcc870c4e5 100644
--- a/t/Module_Pluggable/lib/EditorJunk/Plugin/Bar.pm.swo
+++ b/ext/Module-Pluggable/t/lib/EditorJunk/Plugin/Bar.pm.swo
diff --git a/t/Module_Pluggable/lib/EditorJunk/Plugin/Bar.pm.swp b/ext/Module-Pluggable/t/lib/EditorJunk/Plugin/Bar.pm.swp
index dcc870c4e5..dcc870c4e5 100644
--- a/t/Module_Pluggable/lib/EditorJunk/Plugin/Bar.pm.swp
+++ b/ext/Module-Pluggable/t/lib/EditorJunk/Plugin/Bar.pm.swp
diff --git a/t/Module_Pluggable/lib/EditorJunk/Plugin/Bar.pm~ b/ext/Module-Pluggable/t/lib/EditorJunk/Plugin/Bar.pm~
index dcc870c4e5..dcc870c4e5 100644
--- a/t/Module_Pluggable/lib/EditorJunk/Plugin/Bar.pm~
+++ b/ext/Module-Pluggable/t/lib/EditorJunk/Plugin/Bar.pm~
diff --git a/t/Module_Pluggable/lib/EditorJunk/Plugin/Foo.pm b/ext/Module-Pluggable/t/lib/EditorJunk/Plugin/Foo.pm
index 64b8bf4c7b..64b8bf4c7b 100644
--- a/t/Module_Pluggable/lib/EditorJunk/Plugin/Foo.pm
+++ b/ext/Module-Pluggable/t/lib/EditorJunk/Plugin/Foo.pm
diff --git a/t/Module_Pluggable/lib/ExtTest/Plugin/Bar.plugin b/ext/Module-Pluggable/t/lib/ExtTest/Plugin/Bar.plugin
index 2f9b6db0b0..2f9b6db0b0 100644
--- a/t/Module_Pluggable/lib/ExtTest/Plugin/Bar.plugin
+++ b/ext/Module-Pluggable/t/lib/ExtTest/Plugin/Bar.plugin
diff --git a/t/Module_Pluggable/lib/ExtTest/Plugin/Foo.plugin b/ext/Module-Pluggable/t/lib/ExtTest/Plugin/Foo.plugin
index 5386ba5b80..5386ba5b80 100644
--- a/t/Module_Pluggable/lib/ExtTest/Plugin/Foo.plugin
+++ b/ext/Module-Pluggable/t/lib/ExtTest/Plugin/Foo.plugin
diff --git a/t/Module_Pluggable/lib/ExtTest/Plugin/Quux/Foo.plugin b/ext/Module-Pluggable/t/lib/ExtTest/Plugin/Quux/Foo.plugin
index bb6e08667b..bb6e08667b 100644
--- a/t/Module_Pluggable/lib/ExtTest/Plugin/Quux/Foo.plugin
+++ b/ext/Module-Pluggable/t/lib/ExtTest/Plugin/Quux/Foo.plugin
diff --git a/t/Module_Pluggable/lib/InnerTest/Plugin/Foo.pm b/ext/Module-Pluggable/t/lib/InnerTest/Plugin/Foo.pm
index 4f5825ea65..4f5825ea65 100644
--- a/t/Module_Pluggable/lib/InnerTest/Plugin/Foo.pm
+++ b/ext/Module-Pluggable/t/lib/InnerTest/Plugin/Foo.pm
diff --git a/t/Module_Pluggable/lib/MyOtherTest/Plugin/Bar.pm b/ext/Module-Pluggable/t/lib/MyOtherTest/Plugin/Bar.pm
index 3c5d79dc9b..3c5d79dc9b 100644
--- a/t/Module_Pluggable/lib/MyOtherTest/Plugin/Bar.pm
+++ b/ext/Module-Pluggable/t/lib/MyOtherTest/Plugin/Bar.pm
diff --git a/t/Module_Pluggable/lib/MyOtherTest/Plugin/Foo.pm b/ext/Module-Pluggable/t/lib/MyOtherTest/Plugin/Foo.pm
index 14825724b3..14825724b3 100644
--- a/t/Module_Pluggable/lib/MyOtherTest/Plugin/Foo.pm
+++ b/ext/Module-Pluggable/t/lib/MyOtherTest/Plugin/Foo.pm
diff --git a/t/Module_Pluggable/lib/MyOtherTest/Plugin/Quux.pm b/ext/Module-Pluggable/t/lib/MyOtherTest/Plugin/Quux.pm
index 22fd55d3b9..22fd55d3b9 100644
--- a/t/Module_Pluggable/lib/MyOtherTest/Plugin/Quux.pm
+++ b/ext/Module-Pluggable/t/lib/MyOtherTest/Plugin/Quux.pm
diff --git a/t/Module_Pluggable/lib/MyOtherTest/Plugin/Quux/Foo.pm b/ext/Module-Pluggable/t/lib/MyOtherTest/Plugin/Quux/Foo.pm
index a8ecd69f11..a8ecd69f11 100644
--- a/t/Module_Pluggable/lib/MyOtherTest/Plugin/Quux/Foo.pm
+++ b/ext/Module-Pluggable/t/lib/MyOtherTest/Plugin/Quux/Foo.pm
diff --git a/t/Module_Pluggable/lib/MyTest/Extend/Plugin/Bar.pm b/ext/Module-Pluggable/t/lib/MyTest/Extend/Plugin/Bar.pm
index 6d112cf39f..6d112cf39f 100644
--- a/t/Module_Pluggable/lib/MyTest/Extend/Plugin/Bar.pm
+++ b/ext/Module-Pluggable/t/lib/MyTest/Extend/Plugin/Bar.pm
diff --git a/t/Module_Pluggable/lib/MyTest/Plugin/Bar.pm b/ext/Module-Pluggable/t/lib/MyTest/Plugin/Bar.pm
index 2f9b6db0b0..2f9b6db0b0 100644
--- a/t/Module_Pluggable/lib/MyTest/Plugin/Bar.pm
+++ b/ext/Module-Pluggable/t/lib/MyTest/Plugin/Bar.pm
diff --git a/t/Module_Pluggable/lib/MyTest/Plugin/Foo.pm b/ext/Module-Pluggable/t/lib/MyTest/Plugin/Foo.pm
index 6ca8317507..6ca8317507 100644
--- a/t/Module_Pluggable/lib/MyTest/Plugin/Foo.pm
+++ b/ext/Module-Pluggable/t/lib/MyTest/Plugin/Foo.pm
diff --git a/t/Module_Pluggable/lib/MyTest/Plugin/Quux/Foo.pm b/ext/Module-Pluggable/t/lib/MyTest/Plugin/Quux/Foo.pm
index bb6e08667b..bb6e08667b 100644
--- a/t/Module_Pluggable/lib/MyTest/Plugin/Quux/Foo.pm
+++ b/ext/Module-Pluggable/t/lib/MyTest/Plugin/Quux/Foo.pm
diff --git a/t/Module_Pluggable/lib/No/Middle.pm b/ext/Module-Pluggable/t/lib/No/Middle.pm
index 9d0e31ac12..9d0e31ac12 100644
--- a/t/Module_Pluggable/lib/No/Middle.pm
+++ b/ext/Module-Pluggable/t/lib/No/Middle.pm
diff --git a/t/Module_Pluggable/lib/OddTest/Plugin/.gitignore b/ext/Module-Pluggable/t/lib/OddTest/Plugin/.gitignore
index 8c9254e4d0..8c9254e4d0 100644
--- a/t/Module_Pluggable/lib/OddTest/Plugin/.gitignore
+++ b/ext/Module-Pluggable/t/lib/OddTest/Plugin/.gitignore
diff --git a/t/Module_Pluggable/lib/OddTest/Plugin/Foo.pm b/ext/Module-Pluggable/t/lib/OddTest/Plugin/Foo.pm
index bcf37e34bf..bcf37e34bf 100644
--- a/t/Module_Pluggable/lib/OddTest/Plugin/Foo.pm
+++ b/ext/Module-Pluggable/t/lib/OddTest/Plugin/Foo.pm
diff --git a/t/Module_Pluggable/lib/TA/C/A/I.pm b/ext/Module-Pluggable/t/lib/TA/C/A/I.pm
index 35575dfdde..35575dfdde 100644
--- a/t/Module_Pluggable/lib/TA/C/A/I.pm
+++ b/ext/Module-Pluggable/t/lib/TA/C/A/I.pm
diff --git a/ext/Module-Pluggable/t/lib/Zot/.Zork.pm b/ext/Module-Pluggable/t/lib/Zot/.Zork.pm
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/ext/Module-Pluggable/t/lib/Zot/.Zork.pm
diff --git a/ext/NDBM_File/Makefile.PL b/ext/NDBM_File/Makefile.PL
index 7b586017d7..a8adbf0121 100644
--- a/ext/NDBM_File/Makefile.PL
+++ b/ext/NDBM_File/Makefile.PL
@@ -2,7 +2,6 @@ use ExtUtils::MakeMaker;
WriteMakefile(
NAME => 'NDBM_File',
LIBS => ["-L/usr/local/lib -lndbm", "-ldbm -lucb"],
- MAN3PODS => {}, # Pods will be built by installman.
XSPROTOARG => '-noprototypes', # XXX remove later?
VERSION_FROM => 'NDBM_File.pm',
INC => ($^O eq "MacOS" ? "-i ::::db:include" : "")
diff --git a/ext/ODBM_File/Makefile.PL b/ext/ODBM_File/Makefile.PL
index 2732a32ac3..0ae31f9c71 100644
--- a/ext/ODBM_File/Makefile.PL
+++ b/ext/ODBM_File/Makefile.PL
@@ -2,7 +2,6 @@ use ExtUtils::MakeMaker;
WriteMakefile(
NAME => 'ODBM_File',
LIBS => ["-ldbm -lucb"],
- MAN3PODS => {}, # Pods will be built by installman.
XSPROTOARG => '-noprototypes', # XXX remove later?
VERSION_FROM => 'ODBM_File.pm',
);
diff --git a/ext/Opcode/Makefile.PL b/ext/Opcode/Makefile.PL
deleted file mode 100644
index 890832acec..0000000000
--- a/ext/Opcode/Makefile.PL
+++ /dev/null
@@ -1,6 +0,0 @@
-use ExtUtils::MakeMaker;
-WriteMakefile(
- NAME => 'Opcode',
- MAN3PODS => {},
- VERSION_FROM => 'Opcode.pm',
-);
diff --git a/ext/POSIX/Makefile.PL b/ext/POSIX/Makefile.PL
index 5f6679d145..5569e17fd8 100644
--- a/ext/POSIX/Makefile.PL
+++ b/ext/POSIX/Makefile.PL
@@ -20,7 +20,6 @@ if ($^O ne 'MSWin32') {
WriteMakefile(
NAME => 'POSIX',
@libs,
- MAN3PODS => {}, # Pods will be built by installman.
XSPROTOARG => '-noprototypes', # XXX remove later?
VERSION_FROM => 'POSIX.pm',
realclean => {FILES=> 'const-c.inc const-xs.inc'},
diff --git a/ext/POSIX/POSIX.xs b/ext/POSIX/POSIX.xs
index c62cc01798..25357c2788 100644
--- a/ext/POSIX/POSIX.xs
+++ b/ext/POSIX/POSIX.xs
@@ -70,9 +70,6 @@
#ifdef I_UNISTD
#include <unistd.h>
#endif
-#ifdef MACOS_TRADITIONAL
-#undef fdopen
-#endif
#include <fcntl.h>
#ifdef HAS_TZNAME
@@ -196,7 +193,7 @@ char *tzname[] = { "" , "" };
#else
# ifndef HAS_MKFIFO
-# if defined(OS2) || defined(MACOS_TRADITIONAL)
+# if defined(OS2)
# define mkfifo(a,b) not_here("mkfifo")
# else /* !( defined OS2 ) */
# ifndef mkfifo
@@ -205,19 +202,14 @@ char *tzname[] = { "" , "" };
# endif
# endif /* !HAS_MKFIFO */
-# ifdef MACOS_TRADITIONAL
-# define ttyname(a) (char*)not_here("ttyname")
-# define tzset() not_here("tzset")
-# else
-# ifdef I_GRP
-# include <grp.h>
-# endif
-# include <sys/times.h>
-# ifdef HAS_UNAME
-# include <sys/utsname.h>
-# endif
-# include <sys/wait.h>
+# ifdef I_GRP
+# include <grp.h>
+# endif
+# include <sys/times.h>
+# ifdef HAS_UNAME
+# include <sys/utsname.h>
# endif
+# include <sys/wait.h>
# ifdef I_UTIME
# include <utime.h>
# endif
diff --git a/ext/PerlIO-encoding/Makefile.PL b/ext/PerlIO-encoding/Makefile.PL
deleted file mode 100644
index b6e0132259..0000000000
--- a/ext/PerlIO-encoding/Makefile.PL
+++ /dev/null
@@ -1,7 +0,0 @@
-use ExtUtils::MakeMaker;
-WriteMakefile(
- NAME => "PerlIO::encoding",
- MAN3PODS => {}, # Pods will be built by installman.
- VERSION_FROM => 'encoding.pm',
-);
-
diff --git a/ext/PerlIO-scalar/Makefile.PL b/ext/PerlIO-scalar/Makefile.PL
deleted file mode 100644
index 11a9ee538c..0000000000
--- a/ext/PerlIO-scalar/Makefile.PL
+++ /dev/null
@@ -1,7 +0,0 @@
-use ExtUtils::MakeMaker;
-WriteMakefile(
- NAME => "PerlIO::scalar",
- MAN3PODS => {}, # Pods will be built by installman.
- VERSION_FROM => 'scalar.pm',
-);
-
diff --git a/ext/PerlIO-via/Makefile.PL b/ext/PerlIO-via/Makefile.PL
deleted file mode 100644
index deb401f5e2..0000000000
--- a/ext/PerlIO-via/Makefile.PL
+++ /dev/null
@@ -1,7 +0,0 @@
-use ExtUtils::MakeMaker;
-WriteMakefile(
- NAME => "PerlIO::via",
- MAN3PODS => {}, # Pods will be built by installman.
- VERSION_FROM => 'via.pm',
-);
-
diff --git a/ext/SDBM_File/Makefile.PL b/ext/SDBM_File/Makefile.PL
index 1267efc859..fa16a79160 100644
--- a/ext/SDBM_File/Makefile.PL
+++ b/ext/SDBM_File/Makefile.PL
@@ -17,7 +17,6 @@ else { $myextlib = 'sdbm/libsdbm$(LIB_EXT)'; }
WriteMakefile(
NAME => 'SDBM_File',
MYEXTLIB => $myextlib,
- MAN3PODS => {}, # Pods will be built by installman.
XSPROTOARG => '-noprototypes', # XXX remove later?
VERSION_FROM => 'SDBM_File.pm',
DEFINE => $define,
diff --git a/ext/SDBM_File/sdbm/sdbm.c b/ext/SDBM_File/sdbm/sdbm.c
index cc6d0e9b39..c5f7aa8059 100644
--- a/ext/SDBM_File/sdbm/sdbm.c
+++ b/ext/SDBM_File/sdbm/sdbm.c
@@ -77,23 +77,28 @@ sdbm_open(register char *file, register int flags, register int mode)
register DBM *db;
register char *dirname;
register char *pagname;
- register int n;
+ size_t filelen;
+ const size_t dirfext_len = sizeof(DIRFEXT "");
+ const size_t pagfext_len = sizeof(PAGFEXT "");
if (file == NULL || !*file)
return errno = EINVAL, (DBM *) NULL;
/*
* need space for two seperate filenames
*/
- n = strlen(file) * 2 + strlen(DIRFEXT) + strlen(PAGFEXT) + 2;
+ filelen = strlen(file);
- if ((dirname = (char *) malloc((unsigned) n)) == NULL)
+ if ((dirname = (char *) malloc(filelen + dirfext_len + 1
+ + filelen + pagfext_len + 1)) == NULL)
return errno = ENOMEM, (DBM *) NULL;
/*
* build the file names
*/
- dirname = strcat(strcpy(dirname, file), DIRFEXT);
- pagname = strcpy(dirname + strlen(dirname) + 1, file);
- pagname = strcat(pagname, PAGFEXT);
+ memcpy(dirname, file, filelen);
+ memcpy(dirname + filelen, DIRFEXT, dirfext_len + 1);
+ pagname = dirname + filelen + dirfext_len + 1;
+ memcpy(pagname, file, filelen);
+ memcpy(pagname + filelen, PAGFEXT, pagfext_len + 1);
db = sdbm_prep(dirname, pagname, flags, mode);
free((char *) dirname);
diff --git a/ext/Socket/Makefile.PL b/ext/Socket/Makefile.PL
index 0746b67651..0389b70118 100644
--- a/ext/Socket/Makefile.PL
+++ b/ext/Socket/Makefile.PL
@@ -5,7 +5,6 @@ WriteMakefile(
NAME => 'Socket',
VERSION_FROM => 'Socket.pm',
($Config{libs} =~ /(-lsocks\S*)/ ? (LIBS => [ "$1" ] ) : ()),
- MAN3PODS => {}, # Pods will be built by installman.
XSPROTOARG => '-noprototypes', # XXX remove later?
realclean => {FILES=> 'const-c.inc const-xs.inc'},
);
diff --git a/ext/Socket/Socket.pm b/ext/Socket/Socket.pm
index ad5e61827f..7d130bace9 100644
--- a/ext/Socket/Socket.pm
+++ b/ext/Socket/Socket.pm
@@ -1,11 +1,11 @@
package Socket;
our($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
-$VERSION = "1.81";
+$VERSION = "1.82";
=head1 NAME
-Socket, sockaddr_in, sockaddr_un, inet_aton, inet_ntoa - load the C socket.h defines and structure manipulators
+Socket, sockaddr_in, sockaddr_un, inet_aton, inet_ntoa, inet_pton, inet_ntop - load the C socket.h defines and structure manipulators
=head1 SYNOPSIS
@@ -171,6 +171,21 @@ Takes a sockaddr_un structure (as returned by pack_sockaddr_un())
and returns the pathname. Will croak if the structure does not
have AF_UNIX in the right place.
+=item inet_pton ADDRESS_FAMILY, HOSTNAME
+
+Takes an address family, either AF_INET or AF_INET6, and a string giving
+the name of a host, and translates that to an opaque string
+(if programming in C, struct in_addr or struct in6_addr depending on the
+address family passed in). The host string may be a string hostname, such
+as 'www.perl.org', or an IP address. If using an IP address, the type of
+IP address must be consistant with the address family passed into the function.
+
+=item inet_ntop ADDRESS_FAMILY, IP_ADDRESS
+
+Takes an address family, either AF_INET or AF_INET6, and a string
+(an opaque string as returned by inet_aton() or inet_pton()) and
+translates it to an IPv4 or IPv6 address string.
+
=back
=cut
@@ -183,6 +198,7 @@ use XSLoader ();
@ISA = qw(Exporter);
@EXPORT = qw(
inet_aton inet_ntoa
+ inet_pton inet_ntop
sockaddr_family
pack_sockaddr_in unpack_sockaddr_in
pack_sockaddr_un unpack_sockaddr_un
diff --git a/ext/Socket/Socket.xs b/ext/Socket/Socket.xs
index 076297f25d..75d0f33870 100644
--- a/ext/Socket/Socket.xs
+++ b/ext/Socket/Socket.xs
@@ -442,3 +442,54 @@ unpack_sockaddr_in(sin_sv)
PUSHs(sv_2mortal(newSViv((IV) port)));
PUSHs(sv_2mortal(newSVpvn((char *)&ip_address, sizeof ip_address)));
}
+
+void
+inet_ntop(af, ip_address_sv)
+ int af
+ SV * ip_address_sv
+ CODE:
+#ifdef HAS_INETNTOP
+ STRLEN addrlen, struct_size;
+ struct in6_addr addr;
+ char str[INET6_ADDRSTRLEN];
+ char *ip_address = SvPV(ip_address_sv, addrlen);
+
+ if(af == AF_INET) {
+ struct_size = sizeof(struct in_addr);
+ } else if(af == AF_INET6) {
+ struct_size = sizeof(struct in6_addr);
+ } else {
+ croak("Bad address family for Socket::inet_ntop, got %d, should be either AF_INET or AF_INET6",
+ af);
+ }
+
+ Copy( ip_address, &addr, sizeof addr, char );
+ inet_ntop(af, &addr, str, INET6_ADDRSTRLEN);
+
+ ST(0) = sv_2mortal(newSVpv(str, strlen(str)));
+#else
+ ST(0) = (SV *)not_here("inet_ntop");
+#endif
+
+void
+inet_pton(af, host)
+ int af
+ const char * host
+ CODE:
+#ifdef HAS_INETPTON
+ int ok;
+ struct in6_addr ip_address;
+ if(af != AF_INET && af != AF_INET6) {
+ croak("Bad address family for %s, got %d, should be either AF_INET or AF_INET6",
+ "Socket::inet_pton",
+ af);
+ }
+ ok = (*host != '\0') && inet_pton(af, host, &ip_address);
+
+ ST(0) = sv_newmortal();
+ if (ok) {
+ sv_setpvn( ST(0), (char *)&ip_address, sizeof ip_address );
+ }
+#else
+ ST(0) = (SV *)not_here("inet_pton");
+#endif
diff --git a/ext/Socket/t/Socket.t b/ext/Socket/t/Socket.t
index f707999040..aeeb2a0352 100755
--- a/ext/Socket/t/Socket.t
+++ b/ext/Socket/t/Socket.t
@@ -14,7 +14,7 @@ BEGIN {
use Socket qw(:all);
-print "1..17\n";
+print "1..20\n";
$has_echo = $^O ne 'MSWin32';
$alarmed = 0;
@@ -167,3 +167,12 @@ if ($^O eq 'linux') {
# doesn't have abstract socket support
print "ok 17 - skipped on this platform\n";
}
+
+if($Config{d_inetntop} && $Config{d_inetaton}){
+ print ((inet_ntop(AF_INET, inet_pton(AF_INET, "10.20.30.40")) eq "10.20.30.40") ? "ok 18\n" : "not ok 18\n");
+ print ((inet_ntop(AF_INET, inet_aton("10.20.30.40")) eq "10.20.30.40") ? "ok 19\n" : "not ok 19\n");
+ print (lc(inet_ntop(AF_INET6, inet_pton(AF_INET6, "2001:503:BA3E::2:30")) eq "2001:503:ba3e::2:30") ? "ok 20\n" : "not ok 20\n");
+} else {
+ # no IPv6
+ print "ok $_ - skipped on this platform\n" for 18 .. 20;
+}
diff --git a/ext/Storable/Makefile.PL b/ext/Storable/Makefile.PL
index 985f56d7aa..b840b3919a 100644
--- a/ext/Storable/Makefile.PL
+++ b/ext/Storable/Makefile.PL
@@ -11,7 +11,6 @@ use Config;
WriteMakefile(
NAME => 'Storable',
DISTNAME => "Storable",
- MAN3PODS => {},
# We now ship this in t/
# PREREQ_PM => { 'Test::More' => '0.41' },
INSTALLDIRS => $] >= 5.007 ? 'perl' : 'site',
diff --git a/ext/Sys-Hostname/Makefile.PL b/ext/Sys-Hostname/Makefile.PL
deleted file mode 100644
index a0892f643e..0000000000
--- a/ext/Sys-Hostname/Makefile.PL
+++ /dev/null
@@ -1,8 +0,0 @@
-use ExtUtils::MakeMaker;
-
-WriteMakefile(
- NAME => 'Sys::Hostname',
- VERSION_FROM => 'Hostname.pm',
- MAN3PODS => {}, # Pods will be built by installman.
- XSPROTOARG => '-noprototypes',
-);
diff --git a/ext/Test-Harness/Changes b/ext/Test-Harness/Changes
index 4ae9f1d8f8..44c04bda3e 100644
--- a/ext/Test-Harness/Changes
+++ b/ext/Test-Harness/Changes
@@ -1,7 +1,26 @@
Revision history for Test-Harness
-
-3.14
+3.16 2009-02-19
+ - Fix path splicing on platforms where the path separator
+ is not ':'.
+ - Fixes/skips for failing Win32 tests.
+ - Don't break with older CPAN::Reporter versions.
+
+3.15 2009-02-17
+ - Refactor getter/setter generation into TAP::Object.
+ - The App::Prove::State::Result::Test now stores the parser object.
+ - After discussion with Andy, agreed to clean up the test output
+ somewhat. t/foo.....ok becomes t/foo.t ... ok
+ - Make Bail out! die instead of exiting. Dies with the same
+ message as 2.64 for (belated) backwards compatibility.
+ - Alex Vaniver's patch to refactor TAP::Formatter::Console into
+ a new class, TAP::Formatter::File and a common base class:
+ TAP::Formatter::Base.
+ - Fix a bug where PERL5LIB might be put in the wrong spot in @INC.
+ #40257
+ - Steve Purkis implemented a plugin mechanism for App::Prove.
+
+3.14 2008-09-13
- Created a proper (ha!) API for prove state results and tests.
- Added --count and --nocount options to prove to control X/Y display
while running tests.
diff --git a/ext/Test-Harness/Makefile.PL b/ext/Test-Harness/Makefile.PL
deleted file mode 100644
index 6bc533cde6..0000000000
--- a/ext/Test-Harness/Makefile.PL
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/usr/bin/perl -w
-
-# This Makefile.PL is provided for installation compatibility.
-# Extra developer actions are in the Build.PL.
-
-use ExtUtils::MakeMaker qw/WriteMakefile prompt/;
-
-use strict;
-
-my $core = grep { $_ eq 'PERL_CORE=1' } @ARGV;
-
-my %mm_args = (
- 'NAME' => 'Test::Harness',
- 'VERSION_FROM' => 'lib/Test/Harness.pm',
- 'PREREQ_PM' => {
- 'File::Spec' => 0.8,
- },
- 'INSTALLDIRS' => 'perl',
- 'PL_FILES' => {},
- 'test' => { 'TESTS' => 't/*.t t/compat/*.t' },
-
- # In the core pods will be built by installman, and prove found by
- # utils/prove.PL
- $core
- ? ( 'MAN3PODS' => {} )
- : ( 'EXE_FILES' => ['bin/prove'],
- ),
-);
-
-{
- local $^W = 0; # Silence warning about non-numeric version
- if ( $ExtUtils::MakeMaker::VERSION >= '6.31' ) {
- $mm_args{LICENSE} = 'perl';
- }
-}
-
-WriteMakefile(%mm_args);
-
-package MY;
-
-# Lifted from MM_Any.pm and modified so that make test tests against our
-# own code rather than the incumbent. If we don't do this we end up
-# loading a confused mixture of installed and new modules.
-sub test_via_harness {
- my ( $self, $perl, $tests ) = @_;
-
- return $self->SUPER::test_via_harness(
- qq{$perl "-I\$(INST_LIB)" "-I\$(INST_ARCHLIB)"}, $tests );
-}
diff --git a/ext/Test-Harness/bin/prove b/ext/Test-Harness/bin/prove
index 01df16055b..cde1b9b69c 100644
--- a/ext/Test-Harness/bin/prove
+++ b/ext/Test-Harness/bin/prove
@@ -259,6 +259,32 @@ names of any directories found in C<PERL5LIB> as -I switches. The net
effect of this is that C<PERL5LIB> is honoured even when prove is run in
taint mode.
+=head1 PLUGINS
+
+Plugins can be loaded using the C<< -PI<plugin> >> syntax, eg:
+
+ prove -PMyPlugin
+
+This will search for a module named C<App::Prove::Plugin::MyPlugin>, or failing
+that, C<MyPlugin>. If the plugin can't be found, C<prove> will complain & exit.
+
+You can pass arguments to your plugin by appending C<=arg1,arg2,etc> to the
+plugin name:
+
+ prove -PMyPlugin=fou,du,fafa
+
+Please check individual plugin documentation for more details.
+
+=head2 Available Plugins
+
+For an up-to-date list of plugins available, please check CPAN:
+
+L<http://search.cpan.org/search?query=App%3A%3AProve+Plugin>
+
+=head2 Writing Plugins
+
+Please see L<App::Prove/PLUGINS>.
+
=cut
# vim:ts=4:sw=4:et:sta
diff --git a/ext/Test-Harness/lib/App/Prove.pm b/ext/Test-Harness/lib/App/Prove.pm
index 29d2f8fd1f..bc665fac56 100644
--- a/ext/Test-Harness/lib/App/Prove.pm
+++ b/ext/Test-Harness/lib/App/Prove.pm
@@ -11,19 +11,17 @@ use Getopt::Long;
use App::Prove::State;
use Carp;
-@ISA = qw(TAP::Object);
-
=head1 NAME
App::Prove - Implements the C<prove> command.
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 DESCRIPTION
@@ -53,21 +51,16 @@ use constant PLUGINS => 'App::Prove::Plugin';
my @ATTR;
BEGIN {
+ @ISA = qw(TAP::Object);
+
@ATTR = qw(
archive argv blib show_count color directives exec failures fork
formatter harness includes modules plugins jobs lib merge parse quiet
really_quiet recurse backwards shuffle taint_fail taint_warn timer
verbose warnings_fail warnings_warn show_help show_man show_version
- test_args state dry extension ignore_exit rules state_manager
+ state_class test_args state dry extension ignore_exit rules state_manager
);
- for my $attr (@ATTR) {
- no strict 'refs';
- *$attr = sub {
- my $self = shift;
- $self->{$attr} = shift if @_;
- return $self->{$attr};
- };
- }
+ __PACKAGE__->mk_methods(@ATTR);
}
=head1 METHODS
@@ -108,27 +101,22 @@ sub _initialize {
while ( my ( $env, $attr ) = each %env_provides_default ) {
$self->{$attr} = 1 if $ENV{$env};
}
- $self->state_manager(
- $self->state_class->new( { store => STATE_FILE } ) );
-
+ $self->state_class('App::Prove::State');
return $self;
}
=head3 C<state_class>
-Returns the name of the class used for maintaining state. This class should
-either subclass from C<App::Prove::State> or provide an identical interface.
+Getter/setter for the name of the class used for maintaining state. This
+class should either subclass from C<App::Prove::State> or provide an identical
+interface.
=head3 C<state_manager>
-Getter/setter for the an instane of the C<state_class>.
+Getter/setter for the instance of the C<state_class>.
=cut
-sub state_class {
- return 'App::Prove::State';
-}
-
=head3 C<add_rc_file>
$prove->add_rc_file('myproj/.proverc');
@@ -400,19 +388,22 @@ sub _find_module {
}
sub _load_extension {
- my ( $self, $class, @search ) = @_;
+ my ( $self, $name, @search ) = @_;
my @args = ();
- if ( $class =~ /^(.*?)=(.*)/ ) {
- $class = $1;
+ if ( $name =~ /^(.*?)=(.*)/ ) {
+ $name = $1;
@args = split( /,/, $2 );
}
- if ( my $name = $self->_find_module( $class, @search ) ) {
- $name->import(@args);
+ if ( my $class = $self->_find_module( $name, @search ) ) {
+ $class->import(@args);
+ if ( $class->can('load') ) {
+ $class->load( { app_prove => $self, args => [@args] } );
+ }
}
else {
- croak "Can't load module $class";
+ croak "Can't load module $name";
}
}
@@ -437,6 +428,11 @@ command line tool consists of the following code:
sub run {
my $self = shift;
+ unless ( $self->state_manager ) {
+ $self->state_manager(
+ $self->state_class->new( { store => STATE_FILE } ) );
+ }
+
if ( $self->show_help ) {
$self->_help(1);
}
@@ -675,6 +671,8 @@ calling C<run>.
=item C<state>
+=item C<state_class>
+
=item C<taint_fail>
=item C<taint_warn>
@@ -690,3 +688,88 @@ calling C<run>.
=item C<warnings_warn>
=back
+
+=head1 PLUGINS
+
+C<App::Prove> provides support for 3rd-party plugins. These are currently
+loaded at run-time, I<after> arguments have been parsed (so you can not
+change the way arguments are processed, sorry), typically with the
+C<< -PI<plugin> >> switch, eg:
+
+ prove -PMyPlugin
+
+This will search for a module named C<App::Prove::Plugin::MyPlugin>, or failing
+that, C<MyPlugin>. If the plugin can't be found, C<prove> will complain & exit.
+
+You can pass an argument to your plugin by appending an C<=> after the plugin
+name, eg C<-PMyPlugin=foo>. You can pass multiple arguments using commas:
+
+ prove -PMyPlugin=foo,bar,baz
+
+These are passed in to your plugin's C<load()> class method (if it has one),
+along with a reference to the C<App::Prove> object that is invoking your plugin:
+
+ sub load {
+ my ($class, $p) = @_;
+
+ my @args = @{ $p->{args} };
+ # @args will contain ( 'foo', 'bar', 'baz' )
+ $p->{app_prove}->do_something;
+ ...
+ }
+
+Note that the user's arguments are also passed to your plugin's C<import()>
+function as a list, eg:
+
+ sub import {
+ my ($class, @args) = @_;
+ # @args will contain ( 'foo', 'bar', 'baz' )
+ ...
+ }
+
+This is for backwards compatibility, and may be deprecated in the future.
+
+=head2 Sample Plugin
+
+Here's a sample plugin, for your reference:
+
+ package App::Prove::Plugin::Foo;
+
+ # Sample plugin, try running with:
+ # prove -PFoo=bar -r -j3
+ # prove -PFoo -Q
+ # prove -PFoo=bar,My::Formatter
+
+ use strict;
+ use warnings;
+
+ sub load {
+ my ($class, $p) = @_;
+ my @args = @{ $p->{args} };
+ my $app = $p->{app_prove};
+
+ print "loading plugin: $class, args: ", join(', ', @args ), "\n";
+
+ # turn on verbosity
+ $app->verbose( 1 );
+
+ # set the formatter?
+ $app->formatter( $args[1] ) if @args > 1;
+
+ # print some of App::Prove's state:
+ for my $attr (qw( jobs quiet really_quiet recurse verbose )) {
+ my $val = $app->$attr;
+ $val = 'undef' unless defined( $val );
+ print "$attr: $val\n";
+ }
+
+ return 1;
+ }
+
+ 1;
+
+=head1 SEE ALSO
+
+L<prove>, L<TAP::Harness>
+
+=cut
diff --git a/ext/Test-Harness/lib/App/Prove/State.pm b/ext/Test-Harness/lib/App/Prove/State.pm
index 2b284d2074..6eef184a62 100644
--- a/ext/Test-Harness/lib/App/Prove/State.pm
+++ b/ext/Test-Harness/lib/App/Prove/State.pm
@@ -12,7 +12,10 @@ use TAP::Parser::YAMLish::Reader ();
use TAP::Parser::YAMLish::Writer ();
use TAP::Base;
-@ISA = qw( TAP::Base );
+BEGIN {
+ @ISA = qw( TAP::Base );
+ __PACKAGE__->mk_methods('result_class');
+}
use constant IS_WIN32 => ( $^O =~ /^(MS)?Win32$/ );
use constant NEED_GLOB => IS_WIN32;
@@ -23,11 +26,11 @@ App::Prove::State - State storage for the C<prove> command.
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 DESCRIPTION
@@ -48,6 +51,24 @@ and the operations that may be performed on it.
=head3 C<new>
+Accepts a hashref with the following key/value pairs:
+
+=over 4
+
+=item * C<store>
+
+The filename of the data store holding the data that App::Prove::State reads.
+
+=item * C<extension> (optional)
+
+The test name extension. Defaults to C<.t>.
+
+=item * C<result_class> (optional)
+
+The name of the C<result_class>. Defaults to C<App::Prove::State::Result>.
+
+=back
+
=cut
# override TAP::Base::new:
@@ -56,17 +77,19 @@ sub new {
my %args = %{ shift || {} };
my $self = bless {
- _ => $class->result_class->new(
- { tests => {},
- generation => 1,
- }
- ),
select => [],
seq => 1,
store => delete $args{store},
- extension => delete $args{extension} || '.t',
+ extension => ( delete $args{extension} || '.t' ),
+ result_class =>
+ ( delete $args{result_class} || 'App::Prove::State::Result' ),
}, $class;
+ $self->{_} = $self->result_class->new(
+ { tests => {},
+ generation => 1,
+ }
+ );
my $store = $self->{store};
$self->load($store)
if defined $store && -f $store;
@@ -76,16 +99,12 @@ sub new {
=head2 C<result_class>
-Returns the name of the class used for tracking test results. This class
-should either subclass from C<App::Prove::State::Result> or provide an
+Getter/setter for the name of the class used for tracking test results. This
+class should either subclass from C<App::Prove::State::Result> or provide an
identical interface.
=cut
-sub result_class {
- return 'App::Prove::State::Result';
-}
-
=head2 C<extension>
Get or set the extension files must have in order to be considered
@@ -107,7 +126,7 @@ Get the results of the last test run. Returns a C<result_class()> instance.
sub results {
my $self = shift;
- $self->{_} || $self->result_class->new
+ $self->{_} || $self->result_class->new;
}
=head2 C<commit>
@@ -118,8 +137,8 @@ Save the test results. Should be called after all tests have run.
sub commit {
my $self = shift;
- if ( $self->{should_save} && defined( my $store = $self->{store} ) ) {
- $self->save($store);
+ if ( $self->{should_save} ) {
+ $self->save;
}
}
@@ -373,15 +392,6 @@ Store the results of a test.
=cut
-sub observe_test {
- my ( $self, $test, $parser ) = @_;
- $self->_record_test(
- $test->[0],
- scalar( $parser->failed ) + ( $parser->has_problems ? 1 : 0 ),
- scalar( $parser->todo ), $parser->start_time, $parser->end_time,
- );
-}
-
# Store:
# last fail time
# last pass time
@@ -391,10 +401,18 @@ sub observe_test {
# total failures
# total passes
# state generation
+# parser
+
+sub observe_test {
-sub _record_test {
- my ( $self, $name, $fail, $todo, $start_time, $end_time ) = @_;
- my $test = $self->results->test($name);
+ my ( $self, $test_info, $parser ) = @_;
+ my $name = $test_info->[0];
+ my $fail = scalar( $parser->failed ) + ( $parser->has_problems ? 1 : 0 );
+ my $todo = scalar( $parser->todo );
+ my $start_time = $parser->start_time;
+ my $end_time = $parser->end_time,
+
+ my $test = $self->results->test($name);
$test->sequence( $self->{seq}++ );
$test->generation( $self->results->generation );
@@ -404,6 +422,8 @@ sub _record_test {
$test->num_todo($todo);
$test->elapsed( $end_time - $start_time );
+ $test->parser($parser);
+
if ($fail) {
$test->total_failures( $test->total_failures + 1 );
$test->last_fail_time($end_time);
@@ -421,13 +441,14 @@ Write the state to a file.
=cut
sub save {
- my ( $self, $name ) = @_;
+ my ($self) = @_;
+ my $store = $self->{store} or return;
$self->results->last_run_time( $self->get_time );
my $writer = TAP::Parser::YAMLish::Writer->new;
local *FH;
- open FH, ">$name" or croak "Can't write $name ($!)";
+ open FH, ">$store" or croak "Can't write $store ($!)";
$writer->write( $self->results->raw, \*FH );
close FH;
}
diff --git a/ext/Test-Harness/lib/App/Prove/State/Result.pm b/ext/Test-Harness/lib/App/Prove/State/Result.pm
index 37337ea258..a087da4d72 100644
--- a/ext/Test-Harness/lib/App/Prove/State/Result.pm
+++ b/ext/Test-Harness/lib/App/Prove/State/Result.pm
@@ -14,11 +14,11 @@ App::Prove::State::Result - Individual test suite results.
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 DESCRIPTION
@@ -63,10 +63,11 @@ sub _initialize {
my ( $self, $tests ) = @_;
my %tests;
while ( my ( $name, $test ) = each %$tests ) {
- $tests{$name} = $self->test_class->new({
- %$test,
- name => $name
- });
+ $tests{$name} = $self->test_class->new(
+ { %$test,
+ name => $name
+ }
+ );
}
$self->tests( \%tests );
return $self;
@@ -170,7 +171,7 @@ sub test {
return $test;
}
else {
- my $test = $self->test_class->new({name => $name});
+ my $test = $self->test_class->new( { name => $name } );
$self->{tests}->{$name} = $test;
return $test;
}
diff --git a/ext/Test-Harness/lib/App/Prove/State/Result/Test.pm b/ext/Test-Harness/lib/App/Prove/State/Result/Test.pm
index 50e209614f..4744086e9e 100644
--- a/ext/Test-Harness/lib/App/Prove/State/Result/Test.pm
+++ b/ext/Test-Harness/lib/App/Prove/State/Result/Test.pm
@@ -10,11 +10,11 @@ App::Prove::State::Result::Test - Individual test results.
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 DESCRIPTION
@@ -42,6 +42,7 @@ my %methods = (
seq => { method => 'sequence', default => 1 },
total_passes => { method => 'total_passes', default => 0 },
total_failures => { method => 'total_failures', default => 0 },
+ parser => { method => 'parser' },
);
while ( my ( $key, $description ) = each %methods ) {
@@ -132,14 +133,20 @@ The number of times the test has passed.
The number of times the test has failed.
+=head3 C<parser>
+
+The underlying parser object. This is useful if you need the full
+information for the test program.
+
=cut
sub raw {
my $self = shift;
my %raw = %$self;
- # this is backwards-compatibility hack and is not gauranteed.
+ # this is backwards-compatibility hack and is not guaranteed.
delete $raw{name};
+ delete $raw{parser};
return \%raw;
}
diff --git a/ext/Test-Harness/lib/TAP/Base.pm b/ext/Test-Harness/lib/TAP/Base.pm
index 25d4ce2e43..762d93daf1 100644
--- a/ext/Test-Harness/lib/TAP/Base.pm
+++ b/ext/Test-Harness/lib/TAP/Base.pm
@@ -9,15 +9,16 @@ use TAP::Object;
=head1 NAME
-TAP::Base - Base class that provides common functionality to L<TAP::Parser> and L<TAP::Harness>
+TAP::Base - Base class that provides common functionality to L<TAP::Parser>
+and L<TAP::Harness>
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
my $GOT_TIME_HIRES;
@@ -51,17 +52,8 @@ C<TAP::Base> provides callback management.
=head2 Class Methods
-=head3 C<new>
-
=cut
-sub new {
- my ( $class, $arg_for ) = @_;
-
- my $self = bless {}, $class;
- return $self->_initialize($arg_for);
-}
-
sub _initialize {
my ( $self, $arg_for, $ok_callback ) = @_;
diff --git a/ext/Test-Harness/lib/TAP/Formatter/Base.pm b/ext/Test-Harness/lib/TAP/Formatter/Base.pm
new file mode 100644
index 0000000000..704cfad33b
--- /dev/null
+++ b/ext/Test-Harness/lib/TAP/Formatter/Base.pm
@@ -0,0 +1,438 @@
+package TAP::Formatter::Base;
+
+use strict;
+use TAP::Base ();
+use POSIX qw(strftime);
+
+use vars qw($VERSION @ISA);
+
+my $MAX_ERRORS = 5;
+my %VALIDATION_FOR;
+
+BEGIN {
+ @ISA = qw(TAP::Base);
+
+ %VALIDATION_FOR = (
+ directives => sub { shift; shift },
+ verbosity => sub { shift; shift },
+ timer => sub { shift; shift },
+ failures => sub { shift; shift },
+ errors => sub { shift; shift },
+ color => sub { shift; shift },
+ jobs => sub { shift; shift },
+ show_count => sub { shift; shift },
+ stdout => sub {
+ my ( $self, $ref ) = @_;
+ $self->_croak("option 'stdout' needs a filehandle")
+ unless ( ref $ref || '' ) eq 'GLOB'
+ or eval { $ref->can('print') };
+ return $ref;
+ },
+ );
+
+ my @getter_setters = qw(
+ _longest
+ _printed_summary_header
+ _colorizer
+ );
+
+ __PACKAGE__->mk_methods( @getter_setters, keys %VALIDATION_FOR );
+}
+
+=head1 NAME
+
+TAP::Formatter::Console - Harness output delegate for default console output
+
+=head1 VERSION
+
+Version 3.16
+
+=cut
+
+$VERSION = '3.16';
+
+=head1 DESCRIPTION
+
+This provides console orientated output formatting for TAP::Harness.
+
+=head1 SYNOPSIS
+
+ use TAP::Formatter::Console;
+ my $harness = TAP::Formatter::Console->new( \%args );
+
+=cut
+
+sub _initialize {
+ my ( $self, $arg_for ) = @_;
+ $arg_for ||= {};
+
+ $self->SUPER::_initialize($arg_for);
+ my %arg_for = %$arg_for; # force a shallow copy
+
+ $self->verbosity(0);
+
+ for my $name ( keys %VALIDATION_FOR ) {
+ my $property = delete $arg_for{$name};
+ if ( defined $property ) {
+ my $validate = $VALIDATION_FOR{$name};
+ $self->$name( $self->$validate($property) );
+ }
+ }
+
+ if ( my @props = keys %arg_for ) {
+ $self->_croak(
+ "Unknown arguments to " . __PACKAGE__ . "::new (@props)" );
+ }
+
+ $self->stdout( \*STDOUT ) unless $self->stdout;
+
+ if ( $self->color ) {
+ require TAP::Formatter::Color;
+ $self->_colorizer( TAP::Formatter::Color->new );
+ }
+
+ return $self;
+}
+
+sub verbose { shift->verbosity >= 1 }
+sub quiet { shift->verbosity <= -1 }
+sub really_quiet { shift->verbosity <= -2 }
+sub silent { shift->verbosity <= -3 }
+
+=head1 METHODS
+
+=head2 Class Methods
+
+=head3 C<new>
+
+ my %args = (
+ verbose => 1,
+ )
+ my $harness = TAP::Formatter::Console->new( \%args );
+
+The constructor returns a new C<TAP::Formatter::Console> object. If
+a L<TAP::Harness> is created with no C<formatter> a
+C<TAP::Formatter::Console> is automatically created. If any of the
+following options were given to TAP::Harness->new they well be passed to
+this constructor which accepts an optional hashref whose allowed keys are:
+
+=over 4
+
+=item * C<verbosity>
+
+Set the verbosity level.
+
+=item * C<verbose>
+
+Printing individual test results to STDOUT.
+
+=item * C<timer>
+
+Append run time for each test to output. Uses L<Time::HiRes> if available.
+
+=item * C<failures>
+
+Only show test failures (this is a no-op if C<verbose> is selected).
+
+=item * C<quiet>
+
+Suppressing some test output (mostly failures while tests are running).
+
+=item * C<really_quiet>
+
+Suppressing everything but the tests summary.
+
+=item * C<silent>
+
+Suppressing all output.
+
+=item * C<errors>
+
+If parse errors are found in the TAP output, a note of this will be made
+in the summary report. To see all of the parse errors, set this argument to
+true:
+
+ errors => 1
+
+=item * C<directives>
+
+If set to a true value, only test results with directives will be displayed.
+This overrides other settings such as C<verbose> or C<failures>.
+
+=item * C<stdout>
+
+A filehandle for catching standard output.
+
+=item * C<color>
+
+If defined specifies whether color output is desired. If C<color> is not
+defined it will default to color output if color support is available on
+the current platform and output is not being redirected.
+
+=item * C<jobs>
+
+The number of concurrent jobs this formatter will handle.
+
+=item * C<show_count>
+
+Boolean value. If false, disables the C<X/Y> test count which shows up while
+tests are running.
+
+=back
+
+Any keys for which the value is C<undef> will be ignored.
+
+=cut
+
+# new supplied by TAP::Base
+
+=head3 C<prepare>
+
+Called by Test::Harness before any test output is generated.
+
+This is an advisory and may not be called in the case where tests are
+being supplied to Test::Harness by an iterator.
+
+=cut
+
+sub prepare {
+ my ( $self, @tests ) = @_;
+
+ my $longest = 0;
+
+ foreach my $test (@tests) {
+ $longest = length $test if length $test > $longest;
+ }
+
+ $self->_longest($longest);
+}
+
+sub _format_now { strftime "[%H:%M:%S]", localtime }
+
+sub _format_name {
+ my ( $self, $test ) = @_;
+ my $name = $test;
+ my $periods = '.' x ( $self->_longest + 2 - length $test );
+ $periods = " $periods ";
+
+ if ( $self->timer ) {
+ my $stamp = $self->_format_now();
+ return "$stamp $name$periods";
+ }
+ else {
+ return "$name$periods";
+ }
+
+}
+
+=head3 C<open_test>
+
+Called to create a new test session. A test session looks like this:
+
+ my $session = $formatter->open_test( $test, $parser );
+ while ( defined( my $result = $parser->next ) ) {
+ $session->result($result);
+ exit 1 if $result->is_bailout;
+ }
+ $session->close_test;
+
+=cut
+
+sub open_test {
+ die "Unimplemented.";
+}
+
+=head3 C<summary>
+
+ $harness->summary( $aggregate );
+
+C<summary> prints the summary report after all tests are run. The argument is
+an aggregate.
+
+=cut
+
+sub summary {
+ my ( $self, $aggregate ) = @_;
+
+ return if $self->silent;
+
+ my @t = $aggregate->descriptions;
+ my $tests = \@t;
+
+ my $runtime = $aggregate->elapsed_timestr;
+
+ my $total = $aggregate->total;
+ my $passed = $aggregate->passed;
+
+ if ( $self->timer ) {
+ $self->_output( $self->_format_now(), "\n" );
+ }
+
+ # TODO: Check this condition still works when all subtests pass but
+ # the exit status is nonzero
+
+ if ( $aggregate->all_passed ) {
+ $self->_output("All tests successful.\n");
+ }
+
+ # ~TODO option where $aggregate->skipped generates reports
+ if ( $total != $passed or $aggregate->has_problems ) {
+ $self->_output("\nTest Summary Report");
+ $self->_output("\n-------------------\n");
+ foreach my $test (@$tests) {
+ $self->_printed_summary_header(0);
+ my ($parser) = $aggregate->parsers($test);
+ $self->_output_summary_failure(
+ 'failed',
+ [ ' Failed test: ', ' Failed tests: ' ],
+ $test, $parser
+ );
+ $self->_output_summary_failure(
+ 'todo_passed',
+ " TODO passed: ", $test, $parser
+ );
+
+ # ~TODO this cannot be the default
+ #$self->_output_summary_failure( 'skipped', " Tests skipped: " );
+
+ if ( my $exit = $parser->exit ) {
+ $self->_summary_test_header( $test, $parser );
+ $self->_failure_output(" Non-zero exit status: $exit\n");
+ }
+ elsif ( my $wait = $parser->wait ) {
+ $self->_summary_test_header( $test, $parser );
+ $self->_failure_output(" Non-zero wait status: $wait\n");
+ }
+
+ if ( my @errors = $parser->parse_errors ) {
+ my $explain;
+ if ( @errors > $MAX_ERRORS && !$self->errors ) {
+ $explain
+ = "Displayed the first $MAX_ERRORS of "
+ . scalar(@errors)
+ . " TAP syntax errors.\n"
+ . "Re-run prove with the -p option to see them all.\n";
+ splice @errors, $MAX_ERRORS;
+ }
+ $self->_summary_test_header( $test, $parser );
+ $self->_failure_output(
+ sprintf " Parse errors: %s\n",
+ shift @errors
+ );
+ foreach my $error (@errors) {
+ my $spaces = ' ' x 16;
+ $self->_failure_output("$spaces$error\n");
+ }
+ $self->_failure_output($explain) if $explain;
+ }
+ }
+ }
+ my $files = @$tests;
+ $self->_output("Files=$files, Tests=$total, $runtime\n");
+ my $status = $aggregate->get_status;
+ $self->_output("Result: $status\n");
+}
+
+sub _output_summary_failure {
+ my ( $self, $method, $name, $test, $parser ) = @_;
+
+ # ugly hack. Must rethink this :(
+ my $output = $method eq 'failed' ? '_failure_output' : '_output';
+
+ if ( my @r = $parser->$method() ) {
+ $self->_summary_test_header( $test, $parser );
+ my ( $singular, $plural )
+ = 'ARRAY' eq ref $name ? @$name : ( $name, $name );
+ $self->$output( @r == 1 ? $singular : $plural );
+ my @results = $self->_balanced_range( 40, @r );
+ $self->$output( sprintf "%s\n" => shift @results );
+ my $spaces = ' ' x 16;
+ while (@results) {
+ $self->$output( sprintf "$spaces%s\n" => shift @results );
+ }
+ }
+}
+
+sub _summary_test_header {
+ my ( $self, $test, $parser ) = @_;
+ return if $self->_printed_summary_header;
+ my $spaces = ' ' x ( $self->_longest - length $test );
+ $spaces = ' ' unless $spaces;
+ my $output = $self->_get_output_method($parser);
+ $self->$output(
+ sprintf "$test$spaces(Wstat: %d Tests: %d Failed: %d)\n",
+ $parser->wait, $parser->tests_run, scalar $parser->failed
+ );
+ $self->_printed_summary_header(1);
+}
+
+sub _output {
+ my $self = shift;
+
+ print { $self->stdout } @_;
+}
+
+sub _failure_output {
+ my $self = shift;
+
+ $self->_output(@_);
+}
+
+sub _balanced_range {
+ my ( $self, $limit, @range ) = @_;
+ @range = $self->_range(@range);
+ my $line = "";
+ my @lines;
+ my $curr = 0;
+ while (@range) {
+ if ( $curr < $limit ) {
+ my $range = ( shift @range ) . ", ";
+ $line .= $range;
+ $curr += length $range;
+ }
+ elsif (@range) {
+ $line =~ s/, $//;
+ push @lines => $line;
+ $line = '';
+ $curr = 0;
+ }
+ }
+ if ($line) {
+ $line =~ s/, $//;
+ push @lines => $line;
+ }
+ return @lines;
+}
+
+sub _range {
+ my ( $self, @numbers ) = @_;
+
+ # shouldn't be needed, but subclasses might call this
+ @numbers = sort { $a <=> $b } @numbers;
+ my ( $min, @range );
+
+ foreach my $i ( 0 .. $#numbers ) {
+ my $num = $numbers[$i];
+ my $next = $numbers[ $i + 1 ];
+ if ( defined $next && $next == $num + 1 ) {
+ if ( !defined $min ) {
+ $min = $num;
+ }
+ }
+ elsif ( defined $min ) {
+ push @range => "$min-$num";
+ undef $min;
+ }
+ else {
+ push @range => $num;
+ }
+ }
+ return @range;
+}
+
+sub _get_output_method {
+ my ( $self, $parser ) = @_;
+ return $parser->has_problems ? '_failure_output' : '_output';
+}
+
+1;
diff --git a/ext/Test-Harness/lib/TAP/Formatter/Color.pm b/ext/Test-Harness/lib/TAP/Formatter/Color.pm
index 8558854d37..36a5b16a6e 100644
--- a/ext/Test-Harness/lib/TAP/Formatter/Color.pm
+++ b/ext/Test-Harness/lib/TAP/Formatter/Color.pm
@@ -71,11 +71,11 @@ TAP::Formatter::Color - Run Perl test scripts with color
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 DESCRIPTION
diff --git a/ext/Test-Harness/lib/TAP/Formatter/Console.pm b/ext/Test-Harness/lib/TAP/Formatter/Console.pm
index beacf9f394..71cad30afa 100644
--- a/ext/Test-Harness/lib/TAP/Formatter/Console.pm
+++ b/ext/Test-Harness/lib/TAP/Formatter/Console.pm
@@ -1,50 +1,12 @@
package TAP::Formatter::Console;
use strict;
-use TAP::Base ();
+use TAP::Formatter::Base ();
use POSIX qw(strftime);
use vars qw($VERSION @ISA);
-@ISA = qw(TAP::Base);
-
-my $MAX_ERRORS = 5;
-my %VALIDATION_FOR;
-
-BEGIN {
- %VALIDATION_FOR = (
- directives => sub { shift; shift },
- verbosity => sub { shift; shift },
- timer => sub { shift; shift },
- failures => sub { shift; shift },
- errors => sub { shift; shift },
- color => sub { shift; shift },
- jobs => sub { shift; shift },
- show_count => sub { shift; shift },
- stdout => sub {
- my ( $self, $ref ) = @_;
- $self->_croak("option 'stdout' needs a filehandle")
- unless ( ref $ref || '' ) eq 'GLOB'
- or eval { $ref->can('print') };
- return $ref;
- },
- );
-
- my @getter_setters = qw(
- _longest
- _printed_summary_header
- _colorizer
- );
-
- for my $method ( @getter_setters, keys %VALIDATION_FOR ) {
- no strict 'refs';
- *$method = sub {
- my $self = shift;
- return $self->{$method} unless @_;
- $self->{$method} = shift;
- };
- }
-}
+@ISA = qw(TAP::Formatter::Base);
=head1 NAME
@@ -52,11 +14,11 @@ TAP::Formatter::Console - Harness output delegate for default console output
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 DESCRIPTION
@@ -67,180 +29,9 @@ This provides console orientated output formatting for TAP::Harness.
use TAP::Formatter::Console;
my $harness = TAP::Formatter::Console->new( \%args );
-=cut
-
-sub _initialize {
- my ( $self, $arg_for ) = @_;
- $arg_for ||= {};
-
- $self->SUPER::_initialize($arg_for);
- my %arg_for = %$arg_for; # force a shallow copy
-
- $self->verbosity(0);
-
- for my $name ( keys %VALIDATION_FOR ) {
- my $property = delete $arg_for{$name};
- if ( defined $property ) {
- my $validate = $VALIDATION_FOR{$name};
- $self->$name( $self->$validate($property) );
- }
- }
-
- if ( my @props = keys %arg_for ) {
- $self->_croak(
- "Unknown arguments to " . __PACKAGE__ . "::new (@props)" );
- }
-
- $self->stdout( \*STDOUT ) unless $self->stdout;
-
- if ( $self->color ) {
- require TAP::Formatter::Color;
- $self->_colorizer( TAP::Formatter::Color->new );
- }
-
- return $self;
-}
-
-sub verbose { shift->verbosity >= 1 }
-sub quiet { shift->verbosity <= -1 }
-sub really_quiet { shift->verbosity <= -2 }
-sub silent { shift->verbosity <= -3 }
-
-=head1 METHODS
-
-=head2 Class Methods
-
-=head3 C<new>
-
- my %args = (
- verbose => 1,
- )
- my $harness = TAP::Formatter::Console->new( \%args );
-
-The constructor returns a new C<TAP::Formatter::Console> object. If
-a L<TAP::Harness> is created with no C<formatter> a
-C<TAP::Formatter::Console> is automatically created. If any of the
-following options were given to TAP::Harness->new they well be passed to
-this constructor which accepts an optional hashref whose allowed keys are:
-
-=over 4
-
-=item * C<verbosity>
-
-Set the verbosity level.
-
-=item * C<verbose>
-
-Printing individual test results to STDOUT.
-
-=item * C<timer>
-
-Append run time for each test to output. Uses L<Time::HiRes> if available.
-
-=item * C<failures>
-
-Only show test failures (this is a no-op if C<verbose> is selected).
-
-=item * C<quiet>
-
-Suppressing some test output (mostly failures while tests are running).
-
-=item * C<really_quiet>
-
-Suppressing everything but the tests summary.
-
-=item * C<silent>
-
-Suppressing all output.
-
-=item * C<errors>
-
-If parse errors are found in the TAP output, a note of this will be made
-in the summary report. To see all of the parse errors, set this argument to
-true:
-
- errors => 1
-
-=item * C<directives>
-
-If set to a true value, only test results with directives will be displayed.
-This overrides other settings such as C<verbose> or C<failures>.
-
-=item * C<stdout>
-
-A filehandle for catching standard output.
-
-=item * C<color>
-
-If defined specifies whether color output is desired. If C<color> is not
-defined it will default to color output if color support is available on
-the current platform and output is not being redirected.
-
-=item * C<jobs>
-
-The number of concurrent jobs this formatter will handle.
-
-=item * C<show_count>
-
-Boolean value. If false, disables the C<X/Y> test count which shows up while
-tests are running.
-
-=back
-
-Any keys for which the value is C<undef> will be ignored.
-
-=cut
-
-# new supplied by TAP::Base
-
-=head3 C<prepare>
-
-Called by Test::Harness before any test output is generated.
-
-This is an advisory and may not be called in the case where tests are
-being supplied to Test::Harness by an iterator.
-
-=cut
-
-sub prepare {
- my ( $self, @tests ) = @_;
-
- my $longest = 0;
+=head2 C<< open_test >>
- foreach my $test (@tests) {
- $longest = length $test if length $test > $longest;
- }
-
- $self->_longest($longest);
-}
-
-sub _format_now { strftime "[%H:%M:%S]", localtime }
-
-sub _format_name {
- my ( $self, $test ) = @_;
- my $name = $test;
- my $periods = '.' x ( $self->_longest + 4 - length $test );
-
- if ( $self->timer ) {
- my $stamp = $self->_format_now();
- return "$stamp $name$periods";
- }
- else {
- return "$name$periods";
- }
-
-}
-
-=head3 C<open_test>
-
-Called to create a new test session. A test session looks like this:
-
- my $session = $formatter->open_test( $test, $parser );
- while ( defined( my $result = $parser->next ) ) {
- $session->result($result);
- exit 1 if $result->is_bailout;
- }
- $session->close_test;
+See L<TAP::Formatter::base>
=cut
@@ -268,132 +59,6 @@ sub open_test {
return $session;
}
-=head3 C<summary>
-
- $harness->summary( $aggregate );
-
-C<summary> prints the summary report after all tests are run. The argument is
-an aggregate.
-
-=cut
-
-sub summary {
- my ( $self, $aggregate ) = @_;
-
- return if $self->silent;
-
- my @t = $aggregate->descriptions;
- my $tests = \@t;
-
- my $runtime = $aggregate->elapsed_timestr;
-
- my $total = $aggregate->total;
- my $passed = $aggregate->passed;
-
- if ( $self->timer ) {
- $self->_output( $self->_format_now(), "\n" );
- }
-
- # TODO: Check this condition still works when all subtests pass but
- # the exit status is nonzero
-
- if ( $aggregate->all_passed ) {
- $self->_output("All tests successful.\n");
- }
-
- # ~TODO option where $aggregate->skipped generates reports
- if ( $total != $passed or $aggregate->has_problems ) {
- $self->_output("\nTest Summary Report");
- $self->_output("\n-------------------\n");
- foreach my $test (@$tests) {
- $self->_printed_summary_header(0);
- my ($parser) = $aggregate->parsers($test);
- $self->_output_summary_failure(
- 'failed',
- [ ' Failed test: ', ' Failed tests: ' ],
- $test, $parser
- );
- $self->_output_summary_failure(
- 'todo_passed',
- " TODO passed: ", $test, $parser
- );
-
- # ~TODO this cannot be the default
- #$self->_output_summary_failure( 'skipped', " Tests skipped: " );
-
- if ( my $exit = $parser->exit ) {
- $self->_summary_test_header( $test, $parser );
- $self->_failure_output(" Non-zero exit status: $exit\n");
- }
-
- if ( my @errors = $parser->parse_errors ) {
- my $explain;
- if ( @errors > $MAX_ERRORS && !$self->errors ) {
- $explain
- = "Displayed the first $MAX_ERRORS of "
- . scalar(@errors)
- . " TAP syntax errors.\n"
- . "Re-run prove with the -p option to see them all.\n";
- splice @errors, $MAX_ERRORS;
- }
- $self->_summary_test_header( $test, $parser );
- $self->_failure_output(
- sprintf " Parse errors: %s\n",
- shift @errors
- );
- foreach my $error (@errors) {
- my $spaces = ' ' x 16;
- $self->_failure_output("$spaces$error\n");
- }
- $self->_failure_output($explain) if $explain;
- }
- }
- }
- my $files = @$tests;
- $self->_output("Files=$files, Tests=$total, $runtime\n");
- my $status = $aggregate->get_status;
- $self->_output("Result: $status\n");
-}
-
-sub _output_summary_failure {
- my ( $self, $method, $name, $test, $parser ) = @_;
-
- # ugly hack. Must rethink this :(
- my $output = $method eq 'failed' ? '_failure_output' : '_output';
-
- if ( my @r = $parser->$method() ) {
- $self->_summary_test_header( $test, $parser );
- my ( $singular, $plural )
- = 'ARRAY' eq ref $name ? @$name : ( $name, $name );
- $self->$output( @r == 1 ? $singular : $plural );
- my @results = $self->_balanced_range( 40, @r );
- $self->$output( sprintf "%s\n" => shift @results );
- my $spaces = ' ' x 16;
- while (@results) {
- $self->$output( sprintf "$spaces%s\n" => shift @results );
- }
- }
-}
-
-sub _summary_test_header {
- my ( $self, $test, $parser ) = @_;
- return if $self->_printed_summary_header;
- my $spaces = ' ' x ( $self->_longest - length $test );
- $spaces = ' ' unless $spaces;
- my $output = $self->_get_output_method($parser);
- $self->$output(
- sprintf "$test$spaces(Wstat: %d Tests: %d Failed: %d)\n",
- $parser->wait, $parser->tests_run, scalar $parser->failed
- );
- $self->_printed_summary_header(1);
-}
-
-sub _output {
- my $self = shift;
-
- print { $self->stdout } @_;
-}
-
# Use _colorizer delegate to set output color. NOP if we have no delegate
sub _set_colors {
my ( $self, @colors ) = @_;
@@ -416,61 +81,4 @@ sub _failure_output {
if $has_newline;
}
-sub _balanced_range {
- my ( $self, $limit, @range ) = @_;
- @range = $self->_range(@range);
- my $line = "";
- my @lines;
- my $curr = 0;
- while (@range) {
- if ( $curr < $limit ) {
- my $range = ( shift @range ) . ", ";
- $line .= $range;
- $curr += length $range;
- }
- elsif (@range) {
- $line =~ s/, $//;
- push @lines => $line;
- $line = '';
- $curr = 0;
- }
- }
- if ($line) {
- $line =~ s/, $//;
- push @lines => $line;
- }
- return @lines;
-}
-
-sub _range {
- my ( $self, @numbers ) = @_;
-
- # shouldn't be needed, but subclasses might call this
- @numbers = sort { $a <=> $b } @numbers;
- my ( $min, @range );
-
- foreach my $i ( 0 .. $#numbers ) {
- my $num = $numbers[$i];
- my $next = $numbers[ $i + 1 ];
- if ( defined $next && $next == $num + 1 ) {
- if ( !defined $min ) {
- $min = $num;
- }
- }
- elsif ( defined $min ) {
- push @range => "$min-$num";
- undef $min;
- }
- else {
- push @range => $num;
- }
- }
- return @range;
-}
-
-sub _get_output_method {
- my ( $self, $parser ) = @_;
- return $parser->has_problems ? '_failure_output' : '_output';
-}
-
1;
diff --git a/ext/Test-Harness/lib/TAP/Formatter/Console/ParallelSession.pm b/ext/Test-Harness/lib/TAP/Formatter/Console/ParallelSession.pm
index eae6598d78..dcee635458 100644
--- a/ext/Test-Harness/lib/TAP/Formatter/Console/ParallelSession.pm
+++ b/ext/Test-Harness/lib/TAP/Formatter/Console/ParallelSession.pm
@@ -42,11 +42,11 @@ TAP::Formatter::Console::ParallelSession - Harness output delegate for parallel
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 DESCRIPTION
@@ -78,11 +78,11 @@ sub _clear_ruler {
my $now = 0;
my $start;
-my $trailer = '... )===';
+my $trailer = '... )===';
my $chop_length = WIDTH - length $trailer;
sub _output_ruler {
- my ($self, $refresh) = @_;
+ my ( $self, $refresh ) = @_;
my $new_now = time;
return if $new_now == $now and !$refresh;
$now = $new_now;
@@ -94,23 +94,23 @@ sub _output_ruler {
my $ruler = sprintf '===( %7d;%d ', $context->{tests}, $now - $start;
- foreach my $active ( @{$context->{active}} ) {
- my $parser = $active->parser;
- my $tests = $parser->tests_run;
- my $planned = $parser->tests_planned || '?';
+ foreach my $active ( @{ $context->{active} } ) {
+ my $parser = $active->parser;
+ my $tests = $parser->tests_run;
+ my $planned = $parser->tests_planned || '?';
- $ruler .= sprintf '%' . length ($planned) . "d/$planned ", $tests;
+ $ruler .= sprintf '%' . length($planned) . "d/$planned ", $tests;
}
- chop $ruler; # Remove a trailing space
+ chop $ruler; # Remove a trailing space
$ruler .= ')===';
if ( length $ruler > WIDTH ) {
- $ruler =~ s/(.{$chop_length}).*/$1$trailer/o;
+ $ruler =~ s/(.{$chop_length}).*/$1$trailer/o;
}
else {
- $ruler .= '=' x ( WIDTH - length( $ruler ) );
+ $ruler .= '=' x ( WIDTH - length($ruler) );
}
- $formatter->_output( "\r$ruler");
+ $formatter->_output("\r$ruler");
}
=head3 C<result>
@@ -130,13 +130,14 @@ sub result {
my $context = $shared{$formatter};
$context->{tests}++;
- my $active = $context->{active};
- if ( @$active == 1 ) {
+ my $active = $context->{active};
+ if ( @$active == 1 ) {
+
# There is only one test, so use the serial output format.
- return $self->SUPER::result( $result );
+ return $self->SUPER::result($result);
}
- $self->_output_ruler( $self->parser->tests_run == 1 );
+ $self->_output_ruler( $self->parser->tests_run == 1 );
}
elsif ( $result->is_bailout ) {
$formatter->_failure_output(
@@ -154,12 +155,12 @@ sub clear_for_close {
my $self = shift;
my $formatter = $self->formatter;
return if $formatter->really_quiet;
- my $context = $shared{$formatter};
+ my $context = $shared{$formatter};
if ( @{ $context->{active} } == 1 ) {
- $self->SUPER::clear_for_close;
+ $self->SUPER::clear_for_close;
}
else {
- $self->_clear_ruler;
+ $self->_clear_ruler;
}
}
@@ -183,14 +184,16 @@ sub close_test {
die "Can't find myself" unless @pos;
splice @$active, $pos[0], 1;
- if (@$active > 1) {
- $self->_output_ruler( 1 );
+ if ( @$active > 1 ) {
+ $self->_output_ruler(1);
}
- elsif (@$active == 1) {
+ elsif ( @$active == 1 ) {
+
# Print out "test/name.t ...."
$active->[0]->SUPER::header;
}
else {
+
# $self->formatter->_output("\n");
delete $shared{$formatter};
}
diff --git a/ext/Test-Harness/lib/TAP/Formatter/Console/Session.pm b/ext/Test-Harness/lib/TAP/Formatter/Console/Session.pm
index 074407b8fc..129f388fae 100644
--- a/ext/Test-Harness/lib/TAP/Formatter/Console/Session.pm
+++ b/ext/Test-Harness/lib/TAP/Formatter/Console/Session.pm
@@ -1,23 +1,15 @@
package TAP::Formatter::Console::Session;
use strict;
-use TAP::Base;
+use TAP::Formatter::Session;
use vars qw($VERSION @ISA);
-@ISA = qw(TAP::Base);
+@ISA = qw(TAP::Formatter::Session);
my @ACCESSOR;
BEGIN {
-
- @ACCESSOR = qw( name formatter parser show_count );
-
- for my $method (@ACCESSOR) {
- no strict 'refs';
- *$method = sub { shift->{$method} };
- }
-
my @CLOSURE_BINDING = qw( header result clear_for_close close_test );
for my $method (@CLOSURE_BINDING) {
@@ -36,89 +28,16 @@ TAP::Formatter::Console::Session - Harness output delegate for default console o
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 DESCRIPTION
This provides console orientated output formatting for TAP::Harness.
-=head1 SYNOPSIS
-
-=cut
-
-=head1 METHODS
-
-=head2 Class Methods
-
-=head3 C<new>
-
- my %args = (
- formatter => $self,
- )
- my $harness = TAP::Formatter::Console::Session->new( \%args );
-
-The constructor returns a new C<TAP::Formatter::Console::Session> object.
-
-=over 4
-
-=item * C<formatter>
-
-=item * C<parser>
-
-=item * C<name>
-
-=item * C<show_count>
-
-=back
-
-=cut
-
-sub _initialize {
- my ( $self, $arg_for ) = @_;
- $arg_for ||= {};
-
- $self->SUPER::_initialize($arg_for);
- my %arg_for = %$arg_for; # force a shallow copy
-
- for my $name (@ACCESSOR) {
- $self->{$name} = delete $arg_for{$name};
- }
-
- if ( !defined $self->show_count ) {
- $self->{show_count} = 1; # defaults to true
- }
- if ( $self->show_count ) { # but may be a damned lie!
- $self->{show_count} = $self->_should_show_count;
- }
-
- if ( my @props = sort keys %arg_for ) {
- $self->_croak("Unknown arguments to TAP::Harness::new (@props)");
- }
-
- return $self;
-}
-
-=head3 C<header>
-
-Output test preamble
-
-=head3 C<result>
-
-Called by the harness for each line of TAP it receives.
-
-=head3 C<close_test>
-
-Called to close a test session.
-
-=head3 C<clear_for_close>
-
-Called by C<close_test> to clear the line showing test progress, or the parallel
-test ruler, prior to printing the final test result.
-
=cut
sub _get_output_result {
@@ -217,9 +136,9 @@ sub _closures {
my $now = CORE::time;
# Print status roughly once per second.
- # We will always get the first number as a side effect of
- # $last_status_printed starting with the value 0, which $now
- # will never be. (Unless someone sets their clock to 1970)
+ # We will always get the first number as a side effect of
+ # $last_status_printed starting with the value 0, which $now
+ # will never be. (Unless someone sets their clock to 1970)
if ( $last_status_printed != $now ) {
$formatter->$output("\r$pretty$number$plan");
$last_status_printed = $now;
@@ -242,13 +161,13 @@ sub _closures {
},
clear_for_close => sub {
- my $spaces = ' ' x
- length( '.' . $pretty . $plan . $parser->tests_run );
+ my $spaces
+ = ' ' x length( '.' . $pretty . $plan . $parser->tests_run );
$formatter->$output("\r$spaces");
},
-
+
close_test => sub {
- if ($show_count && !$really_quiet) {
+ if ( $show_count && !$really_quiet ) {
$self->clear_for_close;
$formatter->$output("\r$pretty");
}
@@ -285,67 +204,14 @@ sub _closures {
};
}
-sub _should_show_count {
+=head2 C<< clear_for_close >>
- # we need this because if someone tries to redirect the output, it can get
- # very garbled from the carriage returns (\r) in the count line.
- return !shift->formatter->verbose && -t STDOUT;
-}
-
-sub _output_test_failure {
- my ( $self, $parser ) = @_;
- my $formatter = $self->formatter;
- return if $formatter->really_quiet;
+=head2 C<< close_test >>
- my $tests_run = $parser->tests_run;
- my $tests_planned = $parser->tests_planned;
+=head2 C<< header >>
- my $total
- = defined $tests_planned
- ? $tests_planned
- : $tests_run;
+=head2 C<< result >>
- my $passed = $parser->passed;
-
- # The total number of fails includes any tests that were planned but
- # didn't run
- my $failed = $parser->failed + $total - $tests_run;
- my $exit = $parser->exit;
-
- if ( my $exit = $parser->exit ) {
- my $wstat = $parser->wait;
- my $status = sprintf( "%d (wstat %d, 0x%x)", $exit, $wstat, $wstat );
- $formatter->_failure_output(" Dubious, test returned $status\n");
- }
-
- if ( $failed == 0 ) {
- $formatter->_failure_output(
- $total
- ? " All $total subtests passed "
- : ' No subtests run '
- );
- }
- else {
- $formatter->_failure_output(" Failed $failed/$total subtests ");
- if ( !$total ) {
- $formatter->_failure_output("\nNo tests run!");
- }
- }
-
- if ( my $skipped = $parser->skipped ) {
- $passed -= $skipped;
- my $test = 'subtest' . ( $skipped != 1 ? 's' : '' );
- $formatter->_output(
- "\n\t(less $skipped skipped $test: $passed okay)");
- }
-
- if ( my $failed = $parser->todo_passed ) {
- my $test = $failed > 1 ? 'tests' : 'test';
- $formatter->_output(
- "\n\t($failed TODO $test unexpectedly succeeded)");
- }
-
- $formatter->_output("\n");
-}
+=cut
1;
diff --git a/ext/Test-Harness/lib/TAP/Formatter/File.pm b/ext/Test-Harness/lib/TAP/Formatter/File.pm
new file mode 100644
index 0000000000..142fbc97d8
--- /dev/null
+++ b/ext/Test-Harness/lib/TAP/Formatter/File.pm
@@ -0,0 +1,58 @@
+package TAP::Formatter::File;
+
+use strict;
+use TAP::Formatter::Base ();
+use TAP::Formatter::File::Session;
+use POSIX qw(strftime);
+
+use vars qw($VERSION @ISA);
+
+@ISA = qw(TAP::Formatter::Base);
+
+=head1 NAME
+
+TAP::Formatter::File - Harness output delegate for file output
+
+=head1 VERSION
+
+Version 3.16
+
+=cut
+
+$VERSION = '3.16';
+
+=head1 DESCRIPTION
+
+This provides file orientated output formatting for TAP::Harness.
+
+=head1 SYNOPSIS
+
+ use TAP::Formatter::File;
+ my $harness = TAP::Formatter::File->new( \%args );
+
+=head2 C<< open_test >>
+
+See L<TAP::Formatter::base>
+
+=cut
+
+sub open_test {
+ my ( $self, $test, $parser ) = @_;
+
+ my $session = TAP::Formatter::File::Session->new(
+ { name => $test,
+ formatter => $self,
+ parser => $parser,
+ }
+ );
+
+ $session->header;
+
+ return $session;
+}
+
+sub _should_show_count {
+ return 0;
+}
+
+1;
diff --git a/ext/Test-Harness/lib/TAP/Formatter/File/Session.pm b/ext/Test-Harness/lib/TAP/Formatter/File/Session.pm
new file mode 100644
index 0000000000..14487704ca
--- /dev/null
+++ b/ext/Test-Harness/lib/TAP/Formatter/File/Session.pm
@@ -0,0 +1,109 @@
+package TAP::Formatter::File::Session;
+
+use strict;
+use TAP::Formatter::Session;
+
+use vars qw($VERSION @ISA);
+
+@ISA = qw(TAP::Formatter::Session);
+
+=head1 NAME
+
+TAP::Formatter::File::Session - Harness output delegate for file output
+
+=head1 VERSION
+
+Version 3.16
+
+=cut
+
+$VERSION = '3.16';
+
+=head1 DESCRIPTION
+
+This provides file orientated output formatting for L<TAP::Harness>.
+It is particularly important when running with parallel tests, as it
+ensures that test results are not interleaved, even when run
+verbosely.
+
+=cut
+
+=head1 METHODS
+
+=head2 result
+
+Stores results for later output, all together.
+
+=cut
+
+sub result {
+ my $self = shift;
+ my $result = shift;
+
+ my $parser = $self->parser;
+ my $formatter = $self->formatter;
+
+ if ( $result->is_bailout ) {
+ $formatter->_failure_output(
+ "Bailout called. Further testing stopped: "
+ . $result->explanation
+ . "\n" );
+ return;
+ }
+
+ if (!$formatter->quiet
+ && ( ( $formatter->verbose && !$formatter->failures )
+ || ( $result->is_test && $formatter->failures && !$result->is_ok )
+ || ( $result->has_directive && $formatter->directives ) )
+ )
+ {
+ $self->{results} .= $result->as_string . "\n";
+ }
+}
+
+=head2 close_test
+
+When the test file finishes, outputs the summary, together.
+
+=cut
+
+sub close_test {
+ my $self = shift;
+
+ # Avoid circular references
+ $self->parser(undef);
+
+ my $parser = $self->parser;
+ my $formatter = $self->formatter;
+ my $pretty = $formatter->_format_name( $self->name );
+
+ return if $formatter->really_quiet;
+ if ( my $skip_all = $parser->skip_all ) {
+ $formatter->_output( $pretty . "skipped: $skip_all\n" );
+ }
+ elsif ( $parser->has_problems ) {
+ $formatter->_output(
+ $pretty . ( $self->{results} ? "\n" . $self->{results} : "\n" ) );
+ $self->_output_test_failure($parser);
+ }
+ else {
+ my $time_report = '';
+ if ( $formatter->timer ) {
+ my $start_time = $parser->start_time;
+ my $end_time = $parser->end_time;
+ if ( defined $start_time and defined $end_time ) {
+ my $elapsed = $end_time - $start_time;
+ $time_report
+ = $self->time_is_hires
+ ? sprintf( ' %8d ms', $elapsed * 1000 )
+ : sprintf( ' %8s s', $elapsed || '<1' );
+ }
+ }
+
+ $formatter->_output( $pretty
+ . ( $self->{results} ? "\n" . $self->{results} : "" )
+ . "ok$time_report\n" );
+ }
+}
+
+1;
diff --git a/ext/Test-Harness/lib/TAP/Formatter/Session.pm b/ext/Test-Harness/lib/TAP/Formatter/Session.pm
new file mode 100644
index 0000000000..a68e2a086e
--- /dev/null
+++ b/ext/Test-Harness/lib/TAP/Formatter/Session.pm
@@ -0,0 +1,175 @@
+package TAP::Formatter::Session;
+
+use strict;
+use TAP::Base;
+
+use vars qw($VERSION @ISA);
+
+@ISA = qw(TAP::Base);
+
+my @ACCESSOR;
+
+BEGIN {
+
+ @ACCESSOR = qw( name formatter parser show_count );
+
+ for my $method (@ACCESSOR) {
+ no strict 'refs';
+ *$method = sub { shift->{$method} };
+ }
+}
+
+=head1 NAME
+
+TAP::Formatter::Session - Abstract base class for harness output delegate
+
+=head1 VERSION
+
+Version 3.16
+
+=cut
+
+$VERSION = '3.16';
+
+=head1 METHODS
+
+=head2 Class Methods
+
+=head3 C<new>
+
+ my %args = (
+ formatter => $self,
+ )
+ my $harness = TAP::Formatter::Console::Session->new( \%args );
+
+The constructor returns a new C<TAP::Formatter::Console::Session> object.
+
+=over 4
+
+=item * C<formatter>
+
+=item * C<parser>
+
+=item * C<name>
+
+=item * C<show_count>
+
+=back
+
+=cut
+
+sub _initialize {
+ my ( $self, $arg_for ) = @_;
+ $arg_for ||= {};
+
+ $self->SUPER::_initialize($arg_for);
+ my %arg_for = %$arg_for; # force a shallow copy
+
+ for my $name (@ACCESSOR) {
+ $self->{$name} = delete $arg_for{$name};
+ }
+
+ if ( !defined $self->show_count ) {
+ $self->{show_count} = 1; # defaults to true
+ }
+ if ( $self->show_count ) { # but may be a damned lie!
+ $self->{show_count} = $self->_should_show_count;
+ }
+
+ if ( my @props = sort keys %arg_for ) {
+ $self->_croak(
+ "Unknown arguments to " . __PACKAGE__ . "::new (@props)" );
+ }
+
+ return $self;
+}
+
+=head3 C<header>
+
+Output test preamble
+
+=head3 C<result>
+
+Called by the harness for each line of TAP it receives.
+
+=head3 C<close_test>
+
+Called to close a test session.
+
+=head3 C<clear_for_close>
+
+Called by C<close_test> to clear the line showing test progress, or the parallel
+test ruler, prior to printing the final test result.
+
+=cut
+
+sub header { }
+
+sub result { }
+
+sub close_test { }
+
+sub clear_for_close { }
+
+sub _should_show_count {
+ my $self = shift;
+ return !$self->formatter->verbose && -t $self->formatter->stdout;
+}
+
+sub _output_test_failure {
+ my ( $self, $parser ) = @_;
+ my $formatter = $self->formatter;
+ return if $formatter->really_quiet;
+
+ my $tests_run = $parser->tests_run;
+ my $tests_planned = $parser->tests_planned;
+
+ my $total
+ = defined $tests_planned
+ ? $tests_planned
+ : $tests_run;
+
+ my $passed = $parser->passed;
+
+ # The total number of fails includes any tests that were planned but
+ # didn't run
+ my $failed = $parser->failed + $total - $tests_run;
+ my $exit = $parser->exit;
+
+ if ( my $exit = $parser->exit ) {
+ my $wstat = $parser->wait;
+ my $status = sprintf( "%d (wstat %d, 0x%x)", $exit, $wstat, $wstat );
+ $formatter->_failure_output("Dubious, test returned $status\n");
+ }
+
+ if ( $failed == 0 ) {
+ $formatter->_failure_output(
+ $total
+ ? "All $total subtests passed "
+ : 'No subtests run '
+ );
+ }
+ else {
+ $formatter->_failure_output("Failed $failed/$total subtests ");
+ if ( !$total ) {
+ $formatter->_failure_output("\nNo tests run!");
+ }
+ }
+
+ if ( my $skipped = $parser->skipped ) {
+ $passed -= $skipped;
+ my $test = 'subtest' . ( $skipped != 1 ? 's' : '' );
+ $formatter->_output(
+ "\n\t(less $skipped skipped $test: $passed okay)");
+ }
+
+ if ( my $failed = $parser->todo_passed ) {
+ my $test = $failed > 1 ? 'tests' : 'test';
+ $formatter->_output(
+ "\n\t($failed TODO $test unexpectedly succeeded)");
+ }
+
+ $formatter->_output("\n");
+}
+
+1;
diff --git a/ext/Test-Harness/lib/TAP/Harness.pm b/ext/Test-Harness/lib/TAP/Harness.pm
index 27961cccd5..1512969a1d 100644
--- a/ext/Test-Harness/lib/TAP/Harness.pm
+++ b/ext/Test-Harness/lib/TAP/Harness.pm
@@ -19,11 +19,11 @@ TAP::Harness - Run test scripts with statistics
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
$ENV{HARNESS_ACTIVE} = 1;
$ENV{HARNESS_VERSION} = $VERSION;
@@ -226,7 +226,8 @@ L<TAP::Parser::Aggregator>.
=item * C<formatter_class>
The name of the class to use to format output. The default is
-L<TAP::Formatter::Console>.
+L<TAP::Formatter::Console>, or L<TAP::Formatter::File> if the output
+isn't a TTY.
=item * C<multiplexer_class>
@@ -347,6 +348,9 @@ Any keys for which the value is C<undef> will be ignored.
$self->jobs(1) unless defined $self->jobs;
+ local $default_class{formatter_class} = 'TAP::Formatter::File'
+ unless -t ( $arg_for{stdout} || \*STDOUT );
+
while ( my ( $attr, $class ) = each %default_class ) {
$self->$attr( $self->$attr() || $class );
}
@@ -462,7 +466,7 @@ sub _aggregate_forked {
my ( $parser, $session ) = $self->make_parser($job);
while ( defined( my $result = $parser->next ) ) {
- exit 1 if $result->is_bailout;
+ $self->_bailout($result) if $result->is_bailout;
}
$self->finish_parser( $parser, $session );
@@ -485,6 +489,13 @@ sub _aggregate_forked {
return;
}
+sub _bailout {
+ my ( $self, $result ) = @_;
+ my $explanation = $result->explanation;
+ die "FAILED--Further testing stopped"
+ . ( $explanation ? ": $explanation\n" : ".\n" );
+}
+
sub _aggregate_parallel {
my ( $self, $aggregate, $scheduler ) = @_;
@@ -509,7 +520,7 @@ sub _aggregate_parallel {
my ( $session, $job ) = @$stash;
if ( defined $result ) {
$session->result($result);
- exit 1 if $result->is_bailout;
+ $self->_bailout($result) if $result->is_bailout;
}
else {
@@ -541,7 +552,7 @@ sub _aggregate_single {
# Keep reading until input is exhausted in the hope
# of allowing any pending diagnostics to show up.
1 while $parser->next;
- exit 1;
+ $self->_bailout($result);
}
}
@@ -635,23 +646,10 @@ sub aggregate_tests {
sub _add_descriptions {
my $self = shift;
- # First transformation: turn scalars into single element arrays
- my @tests = map { 'ARRAY' eq ref $_ ? $_ : [$_] } @_;
-
- # Work out how many different extensions we have
- my %ext;
- for my $test (@tests) {
- $ext{$1}++ if $test->[0] =~ /\.(\w+)$/;
- }
-
- for my $test (@tests) {
- if ( @$test == 1 ) {
- $test->[1] = $test->[0];
- $test->[1] =~ s/\.\w+$//
- if keys %ext <= 1;
- }
- }
- return @tests;
+ # Turn unwrapped scalars into anonymous arrays and copy the name as
+ # the description for tests that have only a name.
+ return map { @$_ == 1 ? [ $_->[0], $_->[0] ] : $_ }
+ map { 'ARRAY' eq ref $_ ? $_ : [$_] } @_;
}
=head3 C<make_scheduler>
@@ -674,10 +672,9 @@ sub make_scheduler {
=head3 C<jobs>
-Gets or sets the number of concurrent test runs the harness is handling.
-For the default harness this value is always 1. A parallel harness such
-as L<TAP::Harness::Parallel> will override this to return the number of
-jobs it is handling.
+Gets or sets the number of concurrent test runs the harness is
+handling. By default, this value is 1 -- for parallel testing, this
+should be set higher.
=head3 C<fork>
diff --git a/ext/Test-Harness/lib/TAP/Object.pm b/ext/Test-Harness/lib/TAP/Object.pm
index bbc7bfdf67..b57d32ead4 100644
--- a/ext/Test-Harness/lib/TAP/Object.pm
+++ b/ext/Test-Harness/lib/TAP/Object.pm
@@ -9,11 +9,11 @@ TAP::Object - Base class that provides common functionality to all C<TAP::*> mod
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 SYNOPSIS
@@ -114,5 +114,26 @@ sub _construct {
return $class->new(@args);
}
+=head3 C<mk_methods>
+
+Create simple getter/setters.
+
+ __PACKAGE__->mk_methods(@method_names);
+
+=cut
+
+sub mk_methods {
+ my ( $class, @methods ) = @_;
+ foreach my $method_name (@methods) {
+ my $method = "${class}::$method_name";
+ no strict 'refs';
+ *$method = sub {
+ my $self = shift;
+ $self->{$method_name} = shift if @_;
+ return $self->{$method_name};
+ };
+ }
+}
+
1;
diff --git a/ext/Test-Harness/lib/TAP/Parser.pm b/ext/Test-Harness/lib/TAP/Parser.pm
index c02f2ac5fb..2393418311 100644
--- a/ext/Test-Harness/lib/TAP/Parser.pm
+++ b/ext/Test-Harness/lib/TAP/Parser.pm
@@ -14,19 +14,17 @@ use TAP::Parser::IteratorFactory ();
use Carp qw( confess );
-@ISA = qw(TAP::Base);
-
=head1 NAME
TAP::Parser - Parse L<TAP|Test::Harness::TAP> output
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
my $DEFAULT_TAP_VERSION = 12;
my $MAX_TAP_VERSION = 13;
@@ -40,37 +38,31 @@ END {
}
BEGIN { # making accessors
- foreach my $method (
+ @ISA = qw(TAP::Base);
+
+ __PACKAGE__->mk_methods(
qw(
- _stream
- _spool
- exec
- exit
- is_good_plan
- plan
- tests_planned
- tests_run
- wait
- version
- in_todo
- start_time
- end_time
- skip_all
- source_class
- perl_source_class
- grammar_class
- iterator_factory_class
- result_factory_class
- )
- )
- {
- no strict 'refs';
- *$method = sub {
- my $self = shift;
- return $self->{$method} unless @_;
- $self->{$method} = shift;
- };
- }
+ _stream
+ _spool
+ exec
+ exit
+ is_good_plan
+ plan
+ tests_planned
+ tests_run
+ wait
+ version
+ in_todo
+ start_time
+ end_time
+ skip_all
+ source_class
+ perl_source_class
+ grammar_class
+ iterator_factory_class
+ result_factory_class
+ )
+ );
} # done making accessors
=head1 SYNOPSIS
diff --git a/ext/Test-Harness/lib/TAP/Parser/Aggregator.pm b/ext/Test-Harness/lib/TAP/Parser/Aggregator.pm
index d6fad64a9c..2adc6e58b5 100644
--- a/ext/Test-Harness/lib/TAP/Parser/Aggregator.pm
+++ b/ext/Test-Harness/lib/TAP/Parser/Aggregator.pm
@@ -14,11 +14,11 @@ TAP::Parser::Aggregator - Aggregate TAP::Parser results
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 SYNOPSIS
@@ -71,7 +71,8 @@ BEGIN { # install summary methods
wait
exit
);
- $SUMMARY_METHOD_FOR{total} = 'tests_run';
+ $SUMMARY_METHOD_FOR{total} = 'tests_run';
+ $SUMMARY_METHOD_FOR{planned} = 'tests_planned';
foreach my $method ( keys %SUMMARY_METHOD_FOR ) {
next if 'total' eq $method;
@@ -184,7 +185,8 @@ sub _get_parsers {
=head3 C<descriptions>
-Get an array of descriptions in the order in which they were added to the aggregator.
+Get an array of descriptions in the order in which they were added to
+the aggregator.
=cut
@@ -298,6 +300,8 @@ for an explanation of description.
=item * passed
+=item * planned
+
=item * skipped
=item * todo
@@ -367,7 +371,7 @@ Returns true if I<any> of the parsers failed. This includes:
=item * Failed tests
-=item * Parse erros
+=item * Parse errors
=item * Bad exit or wait status
diff --git a/ext/Test-Harness/lib/TAP/Parser/Grammar.pm b/ext/Test-Harness/lib/TAP/Parser/Grammar.pm
index a644b07f44..7ea1d0384f 100644
--- a/ext/Test-Harness/lib/TAP/Parser/Grammar.pm
+++ b/ext/Test-Harness/lib/TAP/Parser/Grammar.pm
@@ -15,11 +15,11 @@ TAP::Parser::Grammar - A grammar for the Test Anything Protocol.
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 SYNOPSIS
diff --git a/ext/Test-Harness/lib/TAP/Parser/Iterator.pm b/ext/Test-Harness/lib/TAP/Parser/Iterator.pm
index d33a963083..b66e2e11f0 100644
--- a/ext/Test-Harness/lib/TAP/Parser/Iterator.pm
+++ b/ext/Test-Harness/lib/TAP/Parser/Iterator.pm
@@ -13,11 +13,11 @@ TAP::Parser::Iterator - Internal base class for TAP::Parser Iterators
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 SYNOPSIS
diff --git a/ext/Test-Harness/lib/TAP/Parser/Iterator/Array.pm b/ext/Test-Harness/lib/TAP/Parser/Iterator/Array.pm
index 4495bb85f5..9d7e2c2384 100644
--- a/ext/Test-Harness/lib/TAP/Parser/Iterator/Array.pm
+++ b/ext/Test-Harness/lib/TAP/Parser/Iterator/Array.pm
@@ -13,11 +13,11 @@ TAP::Parser::Iterator::Array - Internal TAP::Parser array Iterator
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 SYNOPSIS
diff --git a/ext/Test-Harness/lib/TAP/Parser/Iterator/Process.pm b/ext/Test-Harness/lib/TAP/Parser/Iterator/Process.pm
index cc9786ce18..027de0ce55 100644
--- a/ext/Test-Harness/lib/TAP/Parser/Iterator/Process.pm
+++ b/ext/Test-Harness/lib/TAP/Parser/Iterator/Process.pm
@@ -17,11 +17,11 @@ TAP::Parser::Iterator::Process - Internal TAP::Parser Iterator
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 SYNOPSIS
diff --git a/ext/Test-Harness/lib/TAP/Parser/Iterator/Stream.pm b/ext/Test-Harness/lib/TAP/Parser/Iterator/Stream.pm
index e71dfc40f7..3ed25348bf 100644
--- a/ext/Test-Harness/lib/TAP/Parser/Iterator/Stream.pm
+++ b/ext/Test-Harness/lib/TAP/Parser/Iterator/Stream.pm
@@ -13,11 +13,11 @@ TAP::Parser::Iterator::Stream - Internal TAP::Parser Iterator
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 SYNOPSIS
diff --git a/ext/Test-Harness/lib/TAP/Parser/IteratorFactory.pm b/ext/Test-Harness/lib/TAP/Parser/IteratorFactory.pm
index 7aa4e4d35f..5186df1649 100644
--- a/ext/Test-Harness/lib/TAP/Parser/IteratorFactory.pm
+++ b/ext/Test-Harness/lib/TAP/Parser/IteratorFactory.pm
@@ -16,11 +16,11 @@ TAP::Parser::IteratorFactory - Internal TAP::Parser Iterator
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 SYNOPSIS
diff --git a/ext/Test-Harness/lib/TAP/Parser/Multiplexer.pm b/ext/Test-Harness/lib/TAP/Parser/Multiplexer.pm
index 2efeb30537..94761bcc63 100644
--- a/ext/Test-Harness/lib/TAP/Parser/Multiplexer.pm
+++ b/ext/Test-Harness/lib/TAP/Parser/Multiplexer.pm
@@ -18,11 +18,11 @@ TAP::Parser::Multiplexer - Multiplex multiple TAP::Parsers
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 SYNOPSIS
diff --git a/ext/Test-Harness/lib/TAP/Parser/Result.pm b/ext/Test-Harness/lib/TAP/Parser/Result.pm
index 486c6ff2e2..8e3497bd98 100644
--- a/ext/Test-Harness/lib/TAP/Parser/Result.pm
+++ b/ext/Test-Harness/lib/TAP/Parser/Result.pm
@@ -26,11 +26,11 @@ TAP::Parser::Result - Base class for TAP::Parser output objects
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 SYNOPSIS
@@ -68,10 +68,10 @@ sub _initialize {
my ( $self, $token ) = @_;
if ($token) {
- # assign to a hash slice to make a shallow copy of the token.
- # I guess we could assign to the hash as (by default) there are not
- # contents, but that seems less helpful if someone wants to subclass us
- @{$self}{keys %$token} = values %$token;
+ # assign to a hash slice to make a shallow copy of the token.
+ # I guess we could assign to the hash as (by default) there are not
+ # contents, but that seems less helpful if someone wants to subclass us
+ @{$self}{ keys %$token } = values %$token;
}
return $self;
}
diff --git a/ext/Test-Harness/lib/TAP/Parser/Result/Bailout.pm b/ext/Test-Harness/lib/TAP/Parser/Result/Bailout.pm
index a4c9bbd788..f80ea290be 100644
--- a/ext/Test-Harness/lib/TAP/Parser/Result/Bailout.pm
+++ b/ext/Test-Harness/lib/TAP/Parser/Result/Bailout.pm
@@ -12,11 +12,11 @@ TAP::Parser::Result::Bailout - Bailout result token.
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 DESCRIPTION
diff --git a/ext/Test-Harness/lib/TAP/Parser/Result/Comment.pm b/ext/Test-Harness/lib/TAP/Parser/Result/Comment.pm
index 04a2ce0b9d..d07e1d26ab 100644
--- a/ext/Test-Harness/lib/TAP/Parser/Result/Comment.pm
+++ b/ext/Test-Harness/lib/TAP/Parser/Result/Comment.pm
@@ -12,11 +12,11 @@ TAP::Parser::Result::Comment - Comment result token.
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 DESCRIPTION
diff --git a/ext/Test-Harness/lib/TAP/Parser/Result/Plan.pm b/ext/Test-Harness/lib/TAP/Parser/Result/Plan.pm
index 3225586dea..a5772124d9 100644
--- a/ext/Test-Harness/lib/TAP/Parser/Result/Plan.pm
+++ b/ext/Test-Harness/lib/TAP/Parser/Result/Plan.pm
@@ -12,11 +12,11 @@ TAP::Parser::Result::Plan - Plan result token.
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 DESCRIPTION
diff --git a/ext/Test-Harness/lib/TAP/Parser/Result/Pragma.pm b/ext/Test-Harness/lib/TAP/Parser/Result/Pragma.pm
index b0ea82a0c2..df7a4fda93 100644
--- a/ext/Test-Harness/lib/TAP/Parser/Result/Pragma.pm
+++ b/ext/Test-Harness/lib/TAP/Parser/Result/Pragma.pm
@@ -12,11 +12,11 @@ TAP::Parser::Result::Pragma - TAP pragma token.
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 DESCRIPTION
diff --git a/ext/Test-Harness/lib/TAP/Parser/Result/Test.pm b/ext/Test-Harness/lib/TAP/Parser/Result/Test.pm
index 4c12f6173a..743176988f 100644
--- a/ext/Test-Harness/lib/TAP/Parser/Result/Test.pm
+++ b/ext/Test-Harness/lib/TAP/Parser/Result/Test.pm
@@ -14,11 +14,11 @@ TAP::Parser::Result::Test - Test result token.
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 DESCRIPTION
diff --git a/ext/Test-Harness/lib/TAP/Parser/Result/Unknown.pm b/ext/Test-Harness/lib/TAP/Parser/Result/Unknown.pm
index 0316fb07c3..f0ed6e3f8e 100644
--- a/ext/Test-Harness/lib/TAP/Parser/Result/Unknown.pm
+++ b/ext/Test-Harness/lib/TAP/Parser/Result/Unknown.pm
@@ -14,11 +14,11 @@ TAP::Parser::Result::Unknown - Unknown result token.
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 DESCRIPTION
diff --git a/ext/Test-Harness/lib/TAP/Parser/Result/Version.pm b/ext/Test-Harness/lib/TAP/Parser/Result/Version.pm
index 3688f2b03e..d666091f2e 100644
--- a/ext/Test-Harness/lib/TAP/Parser/Result/Version.pm
+++ b/ext/Test-Harness/lib/TAP/Parser/Result/Version.pm
@@ -12,11 +12,11 @@ TAP::Parser::Result::Version - TAP syntax version token.
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 DESCRIPTION
diff --git a/ext/Test-Harness/lib/TAP/Parser/Result/YAML.pm b/ext/Test-Harness/lib/TAP/Parser/Result/YAML.pm
index d1e9cf69fb..0dcc95b098 100644
--- a/ext/Test-Harness/lib/TAP/Parser/Result/YAML.pm
+++ b/ext/Test-Harness/lib/TAP/Parser/Result/YAML.pm
@@ -12,11 +12,11 @@ TAP::Parser::Result::YAML - YAML result token.
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 DESCRIPTION
diff --git a/ext/Test-Harness/lib/TAP/Parser/ResultFactory.pm b/ext/Test-Harness/lib/TAP/Parser/ResultFactory.pm
index 5d33935d8a..10deb63717 100644
--- a/ext/Test-Harness/lib/TAP/Parser/ResultFactory.pm
+++ b/ext/Test-Harness/lib/TAP/Parser/ResultFactory.pm
@@ -30,11 +30,11 @@ TAP::Parser::ResultFactory - Factory for creating TAP::Parser output objects
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head2 DESCRIPTION
diff --git a/ext/Test-Harness/lib/TAP/Parser/Scheduler.pm b/ext/Test-Harness/lib/TAP/Parser/Scheduler.pm
index c90432efdc..0320d19368 100644
--- a/ext/Test-Harness/lib/TAP/Parser/Scheduler.pm
+++ b/ext/Test-Harness/lib/TAP/Parser/Scheduler.pm
@@ -12,11 +12,11 @@ TAP::Parser::Scheduler - Schedule tests during parallel testing
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 SYNOPSIS
@@ -193,7 +193,7 @@ Get a list of all remaining tests.
sub get_all {
my $self = shift;
- my @all = $self->_gather( $self->{schedule} );
+ my @all = $self->_gather( $self->{schedule} );
$self->{count} = @all;
@all;
}
@@ -202,7 +202,7 @@ sub _gather {
my ( $self, $rule ) = @_;
return unless defined $rule;
return $rule unless 'ARRAY' eq ref $rule;
- return map { defined () ? $self->_gather($_) : () } map {@$_} @$rule;
+ return map { defined() ? $self->_gather($_) : () } map {@$_} @$rule;
}
=head3 C<get_job>
@@ -218,8 +218,8 @@ sub get_job {
$self->{count} ||= $self->get_all;
my @jobs = $self->_find_next_job( $self->{schedule} );
if (@jobs) {
- --$self->{count};
- return $jobs[0];
+ --$self->{count};
+ return $jobs[0];
}
return TAP::Parser::Scheduler::Spinner->new
@@ -244,11 +244,12 @@ sub _find_next_job {
my @queue = ();
my $index = 0;
- while ($index < @$rule) {
+ while ( $index < @$rule ) {
my $seq = $rule->[$index];
+
# Prune any exhausted items.
shift @$seq while @$seq && _is_empty( $seq->[0] );
- if ( @$seq ) {
+ if (@$seq) {
if ( defined $seq->[0] ) {
if ( 'ARRAY' eq ref $seq->[0] ) {
push @queue, $seq;
@@ -262,6 +263,7 @@ sub _find_next_job {
++$index;
}
else {
+
# Remove the empty sub-array from the array
splice @$rule, $index, 1;
}
diff --git a/ext/Test-Harness/lib/TAP/Parser/Scheduler/Job.pm b/ext/Test-Harness/lib/TAP/Parser/Scheduler/Job.pm
index fe55faf28d..8003fc078b 100644
--- a/ext/Test-Harness/lib/TAP/Parser/Scheduler/Job.pm
+++ b/ext/Test-Harness/lib/TAP/Parser/Scheduler/Job.pm
@@ -10,11 +10,11 @@ TAP::Parser::Scheduler::Job - A single testing job.
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 SYNOPSIS
diff --git a/ext/Test-Harness/lib/TAP/Parser/Scheduler/Spinner.pm b/ext/Test-Harness/lib/TAP/Parser/Scheduler/Spinner.pm
index 25f1b4a074..53cfc924c9 100644
--- a/ext/Test-Harness/lib/TAP/Parser/Scheduler/Spinner.pm
+++ b/ext/Test-Harness/lib/TAP/Parser/Scheduler/Spinner.pm
@@ -10,11 +10,11 @@ TAP::Parser::Scheduler::Spinner - A no-op job.
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 SYNOPSIS
diff --git a/ext/Test-Harness/lib/TAP/Parser/Source.pm b/ext/Test-Harness/lib/TAP/Parser/Source.pm
index 3b10482483..c04adcfa02 100644
--- a/ext/Test-Harness/lib/TAP/Parser/Source.pm
+++ b/ext/Test-Harness/lib/TAP/Parser/Source.pm
@@ -17,11 +17,11 @@ TAP::Parser::Source - Stream output from some source
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 SYNOPSIS
diff --git a/ext/Test-Harness/lib/TAP/Parser/Source/Perl.pm b/ext/Test-Harness/lib/TAP/Parser/Source/Perl.pm
index 444b429c8c..2a2586e4e4 100644
--- a/ext/Test-Harness/lib/TAP/Parser/Source/Perl.pm
+++ b/ext/Test-Harness/lib/TAP/Parser/Source/Perl.pm
@@ -18,11 +18,11 @@ TAP::Parser::Source::Perl - Stream Perl output
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 SYNOPSIS
@@ -106,37 +106,42 @@ this is a TAP::Parser instance.
sub get_stream {
my ( $self, $factory ) = @_;
- my @extra_libs;
-
my @switches = $self->_switches;
my $path_sep = $Config{path_sep};
my $path_pat = qr{$path_sep};
+ # Filter out any -I switches to be handled as libs later.
+ #
# Nasty kludge. It might be nicer if we got the libs separately
# although at least this way we find any -I switches that were
# supplied other then as explicit libs.
+ #
# We filter out any names containing colons because they will break
# PERL5LIB
my @libs;
- for ( grep { $_ !~ $path_pat } @switches ) {
- push @libs, $1 if / ^ ['"]? -I (.*?) ['"]? $ /x;
- }
-
- my $previous = $ENV{PERL5LIB};
- if ($previous) {
- push @libs, split( $path_pat, $previous );
+ my @filtered_switches;
+ for (@switches) {
+ if ( !/$path_pat/ && / ^ ['"]? -I ['"]? (.*?) ['"]? $ /x ) {
+ push @libs, $1;
+ }
+ else {
+ push @filtered_switches, $_;
+ }
}
+ @switches = @filtered_switches;
my $setup = sub {
if (@libs) {
- $ENV{PERL5LIB} = join( $path_sep, @libs );
+ $ENV{PERL5LIB}
+ = join( $path_sep, grep {defined} @libs, $ENV{PERL5LIB} );
}
};
# Cargo culted from comments seen elsewhere about VMS / environment
# variables. I don't know if this is actually necessary.
+ my $previous = $ENV{PERL5LIB};
my $teardown = sub {
- if ($previous) {
+ if ( defined $previous ) {
$ENV{PERL5LIB} = $previous;
}
else {
@@ -148,12 +153,7 @@ sub get_stream {
# PERL5LIB as -I switches and place PERL5OPT on the command line
# in order that it be seen.
if ( grep { $_ eq "-T" || $_ eq "-t" } @switches ) {
- push @switches,
- $self->_libs2switches(
- split $path_pat,
- $ENV{PERL5LIB} || $ENV{PERLLIB} || ''
- );
-
+ push @switches, $self->_libs2switches(@libs);
push @switches, split_shell( $ENV{PERL5OPT} );
}
@@ -262,11 +262,12 @@ sub _switches {
my $taint = $self->get_taint($shebang);
push @switches, "-$taint" if defined $taint;
- # Quote the argument if there's any whitespace in it, or if
- # we're VMS, since VMS requires all parms quoted. Also, don't quote
- # it if it's already quoted.
- for (@switches) {
- $_ = qq["$_"] if ( ( /\s/ || IS_VMS ) && !/^".*"$/ );
+ # Quote the argument if we're VMS, since VMS will downcase anything
+ # not quoted.
+ if (IS_VMS) {
+ for (@switches) {
+ $_ = qq["$_"];
+ }
}
return @switches;
diff --git a/ext/Test-Harness/lib/TAP/Parser/Utils.pm b/ext/Test-Harness/lib/TAP/Parser/Utils.pm
index 85174c07fb..8aabd214dd 100644
--- a/ext/Test-Harness/lib/TAP/Parser/Utils.pm
+++ b/ext/Test-Harness/lib/TAP/Parser/Utils.pm
@@ -13,11 +13,11 @@ TAP::Parser::Utils - Internal TAP::Parser utilities
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
=head1 SYNOPSIS
diff --git a/ext/Test-Harness/lib/TAP/Parser/YAMLish/Reader.pm b/ext/Test-Harness/lib/TAP/Parser/YAMLish/Reader.pm
index cc3935094c..9eba0c3768 100644
--- a/ext/Test-Harness/lib/TAP/Parser/YAMLish/Reader.pm
+++ b/ext/Test-Harness/lib/TAP/Parser/YAMLish/Reader.pm
@@ -6,7 +6,7 @@ use vars qw($VERSION @ISA);
use TAP::Object ();
@ISA = 'TAP::Object';
-$VERSION = '3.14';
+$VERSION = '3.16';
# TODO:
# Handle blessed object syntax
@@ -270,7 +270,7 @@ TAP::Parser::YAMLish::Reader - Read YAMLish data from iterator
=head1 VERSION
-Version 3.14
+Version 3.16
=head1 SYNOPSIS
diff --git a/ext/Test-Harness/lib/TAP/Parser/YAMLish/Writer.pm b/ext/Test-Harness/lib/TAP/Parser/YAMLish/Writer.pm
index 98301a338b..6c2e636d3b 100644
--- a/ext/Test-Harness/lib/TAP/Parser/YAMLish/Writer.pm
+++ b/ext/Test-Harness/lib/TAP/Parser/YAMLish/Writer.pm
@@ -6,7 +6,7 @@ use vars qw($VERSION @ISA);
use TAP::Object ();
@ISA = 'TAP::Object';
-$VERSION = '3.14';
+$VERSION = '3.16';
my $ESCAPE_CHAR = qr{ [ \x00-\x1f \" ] }x;
my $ESCAPE_KEY = qr{ (?: ^\W ) | $ESCAPE_CHAR }x;
@@ -147,7 +147,7 @@ TAP::Parser::YAMLish::Writer - Write YAMLish data
=head1 VERSION
-Version 3.14
+Version 3.16
=head1 SYNOPSIS
diff --git a/ext/Test-Harness/lib/Test/Harness.pm b/ext/Test-Harness/lib/Test/Harness.pm
index 24566bad46..5a7a5eae2f 100644
--- a/ext/Test-Harness/lib/Test/Harness.pm
+++ b/ext/Test-Harness/lib/Test/Harness.pm
@@ -44,11 +44,11 @@ Test::Harness - Run Perl standard test scripts with statistics
=head1 VERSION
-Version 3.14
+Version 3.16
=cut
-$VERSION = '3.14';
+$VERSION = '3.16';
# Backwards compatibility for exportable variable names.
*verbose = *Verbose;
@@ -128,40 +128,20 @@ sub _aggregate {
# Don't propagate to our children
local $ENV{HARNESS_OPTIONS};
- if (IS_VMS) {
-
- # Jiggery pokery doesn't appear to work on VMS - so disable it
- # pending investigation.
- _aggregate_tests( $harness, $aggregate, @tests );
- }
- else {
- my $path_sep = $Config{path_sep};
- my $path_pat = qr{$path_sep};
- my @extra_inc = _filtered_inc();
-
- # Supply -I switches in taint mode
- $harness->callback(
- parser_args => sub {
- my ( $args, $test ) = @_;
- if ( _has_taint( $test->[0] ) ) {
- push @{ $args->{switches} }, map {"-I$_"} _filtered_inc();
- }
- }
- );
-
- my $previous = $ENV{PERL5LIB};
- local $ENV{PERL5LIB};
+ _apply_extra_INC($harness);
+ _aggregate_tests( $harness, $aggregate, @tests );
+}
- if ($previous) {
- push @extra_inc, split( $path_pat, $previous );
- }
+# Make sure the child seens all the extra junk in @INC
+sub _apply_extra_INC {
+ my $harness = shift;
- if (@extra_inc) {
- $ENV{PERL5LIB} = join( $path_sep, @extra_inc );
+ $harness->callback(
+ parser_args => sub {
+ my ( $args, $test ) = @_;
+ push @{ $args->{switches} }, map {"-I$_"} _filtered_inc();
}
-
- _aggregate_tests( $harness, $aggregate, @tests );
- }
+ );
}
sub _aggregate_tests {
@@ -320,8 +300,14 @@ sub _filtered_inc {
sub _default_inc {
return @inc if @inc;
+
+ local $ENV{PERL5LIB};
+ local $ENV{PERLLIB};
+
my $perl = $ENV{HARNESS_PERL} || $^X;
- chomp( @inc = `$perl -le "print join qq[\\n], \@INC"` );
+
+ # Avoid using -l for the benefit of Perl 6
+ chomp( @inc = `$perl -e "print join qq[\\n], \@INC, q[]"` );
return @inc;
}
}
diff --git a/ext/Test-Harness/t/aggregator.t b/ext/Test-Harness/t/aggregator.t
index b3aff2a21f..c8e32a1c93 100644
--- a/ext/Test-Harness/t/aggregator.t
+++ b/ext/Test-Harness/t/aggregator.t
@@ -3,7 +3,7 @@
use strict;
use lib 't/lib';
-use Test::More tests => 79;
+use Test::More tests => 81;
use TAP::Parser;
use TAP::Parser::IteratorFactory;
@@ -105,6 +105,10 @@ can_ok $agg, 'total';
is $agg->total, $agg->passed + $agg->failed,
'... and we should have the correct number of total tests';
+can_ok $agg, 'planned';
+is $agg->planned, $agg->passed + $agg->failed,
+ '... and we should have the correct number of planned tests';
+
can_ok $agg, 'has_problems';
ok $agg->has_problems, '... and it should report true if there are problems';
diff --git a/ext/Test-Harness/t/compat/failure.t b/ext/Test-Harness/t/compat/failure.t
index b442567c14..d199b7b67f 100644
--- a/ext/Test-Harness/t/compat/failure.t
+++ b/ext/Test-Harness/t/compat/failure.t
@@ -22,9 +22,10 @@ use Test::Harness;
my $sample_tests;
if ( $ENV{PERL_CORE} ) {
my $updir = File::Spec->updir;
- $sample_tests
- = File::Spec->catdir( $updir, 'ext', 'Test-Harness', 't',
- 'sample-tests' );
+ $sample_tests = File::Spec->catdir(
+ $updir, 'ext', 'Test-Harness', 't',
+ 'sample-tests'
+ );
}
else {
my $curdir = File::Spec->curdir;
diff --git a/ext/Test-Harness/t/compat/inc-propagation.t b/ext/Test-Harness/t/compat/inc-propagation.t
index ffa53700a1..c0d62b0407 100644
--- a/ext/Test-Harness/t/compat/inc-propagation.t
+++ b/ext/Test-Harness/t/compat/inc-propagation.t
@@ -5,6 +5,10 @@
use strict;
use lib 't/lib';
+use Config;
+
+local
+ $ENV{PERL5OPT}; # avoid any user-provided PERL5OPT from contaminating @INC
sub has_crazy_patch {
my $sentinel = 'blirpzoffle';
@@ -32,9 +36,8 @@ my $test_template = <<'END';
use Test::More tests => 2;
-# Make sure we did something sensible with PERL5LIB
+is $INC[0], "wibble", 'basic order of @INC preserved' or diag "\@INC: @INC";
like $ENV{PERL5LIB}, qr{wibble};
-ok grep { $_ eq 'wibble' } @INC;
END
diff --git a/ext/Test-Harness/t/file.t b/ext/Test-Harness/t/file.t
new file mode 100644
index 0000000000..68ad0459a1
--- /dev/null
+++ b/ext/Test-Harness/t/file.t
@@ -0,0 +1,402 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+ if ( $ENV{PERL_CORE} ) {
+ chdir 't';
+ @INC = ( '../lib', '../ext/Test-Harness/t/lib' );
+ }
+ else {
+ unshift @INC, 't/lib';
+ }
+}
+
+use strict;
+
+use Test::More;
+
+use TAP::Harness;
+
+my $HARNESS = 'TAP::Harness';
+
+my $source_tests
+ = $ENV{PERL_CORE} ? '../ext/Test-Harness/t/source_tests' : 't/source_tests';
+my $sample_tests
+ = $ENV{PERL_CORE} ? '../ext/Test-Harness/t/sample-tests' : 't/sample-tests';
+
+plan tests => 41;
+
+# note that this test will always pass when run through 'prove'
+ok $ENV{HARNESS_ACTIVE}, 'HARNESS_ACTIVE env variable should be set';
+ok $ENV{HARNESS_VERSION}, 'HARNESS_VERSION env variable should be set';
+
+{
+ my @output;
+ local $^W;
+ require TAP::Formatter::Base;
+ local *TAP::Formatter::Base::_output = sub {
+ my $self = shift;
+ push @output => grep { $_ ne '' }
+ map {
+ local $_ = $_;
+ chomp;
+ trim($_)
+ } map { split /\n/ } @_;
+ };
+ my $harness = TAP::Harness->new( { verbosity => 1 } );
+ my $harness_whisper = TAP::Harness->new( { verbosity => -1 } );
+ my $harness_mute = TAP::Harness->new( { verbosity => -2 } );
+ my $harness_directives = TAP::Harness->new( { directives => 1 } );
+ my $harness_failures = TAP::Harness->new( { failures => 1 } );
+
+ can_ok $harness, 'runtests';
+
+ # normal tests in verbose mode
+
+ ok my $aggregate = _runtests( $harness, "$source_tests/harness" ),
+ '... runtests returns the aggregate';
+
+ isa_ok $aggregate, 'TAP::Parser::Aggregator';
+
+ chomp(@output);
+
+ my @expected = (
+ "$source_tests/harness ..",
+ '1..1',
+ 'ok 1 - this is a test',
+ 'ok',
+ 'All tests successful.',
+ );
+ my $status = pop @output;
+ my $expected_status = qr{^Result: PASS$};
+ my $summary = pop @output;
+ my $expected_summary = qr{^Files=1, Tests=1, \d+ wallclock secs};
+
+ is_deeply \@output, \@expected, '... and the output should be correct';
+ like $status, $expected_status,
+ '... and the status line should be correct';
+ like $summary, $expected_summary,
+ '... and the report summary should look correct';
+
+ # use an alias for test name
+
+ @output = ();
+ ok $aggregate
+ = _runtests( $harness, [ "$source_tests/harness", 'My Nice Test' ] ),
+ '... runtests returns the aggregate';
+
+ isa_ok $aggregate, 'TAP::Parser::Aggregator';
+
+ chomp(@output);
+
+ @expected = (
+ 'My Nice Test ..',
+ '1..1',
+ 'ok 1 - this is a test',
+ 'ok',
+ 'All tests successful.',
+ );
+ $status = pop @output;
+ $expected_status = qr{^Result: PASS$};
+ $summary = pop @output;
+ $expected_summary = qr{^Files=1, Tests=1, \d+ wallclock secs};
+
+ is_deeply \@output, \@expected, '... and the output should be correct';
+ like $status, $expected_status,
+ '... and the status line should be correct';
+ like $summary, $expected_summary,
+ '... and the report summary should look correct';
+
+ # run same test twice
+
+ @output = ();
+ ok $aggregate = _runtests(
+ $harness, [ "$source_tests/harness", 'My Nice Test' ],
+ [ "$source_tests/harness", 'My Nice Test Again' ]
+ ),
+ '... runtests returns the aggregate';
+
+ isa_ok $aggregate, 'TAP::Parser::Aggregator';
+
+ chomp(@output);
+
+ @expected = (
+ 'My Nice Test ........',
+ '1..1',
+ 'ok 1 - this is a test',
+ 'ok',
+ 'My Nice Test Again ..',
+ '1..1',
+ 'ok 1 - this is a test',
+ 'ok',
+ 'All tests successful.',
+ );
+ $status = pop @output;
+ $expected_status = qr{^Result: PASS$};
+ $summary = pop @output;
+ $expected_summary = qr{^Files=2, Tests=2, \d+ wallclock secs};
+
+ is_deeply \@output, \@expected, '... and the output should be correct';
+ like $status, $expected_status,
+ '... and the status line should be correct';
+ like $summary, $expected_summary,
+ '... and the report summary should look correct';
+
+ # normal tests in quiet mode
+
+ @output = ();
+ _runtests( $harness_whisper, "$source_tests/harness" );
+
+ chomp(@output);
+ @expected = (
+ "$source_tests/harness .. ok",
+ 'All tests successful.',
+ );
+
+ $status = pop @output;
+ $expected_status = qr{^Result: PASS$};
+ $summary = pop @output;
+ $expected_summary = qr/^Files=1, Tests=1, \d+ wallclock secs/;
+
+ is_deeply \@output, \@expected, '... and the output should be correct';
+ like $status, $expected_status,
+ '... and the status line should be correct';
+ like $summary, $expected_summary,
+ '... and the report summary should look correct';
+
+ # normal tests in really_quiet mode
+
+ @output = ();
+ _runtests( $harness_mute, "$source_tests/harness" );
+
+ chomp(@output);
+ @expected = (
+ 'All tests successful.',
+ );
+
+ $status = pop @output;
+ $expected_status = qr{^Result: PASS$};
+ $summary = pop @output;
+ $expected_summary = qr/^Files=1, Tests=1, \d+ wallclock secs/;
+
+ is_deeply \@output, \@expected, '... and the output should be correct';
+ like $status, $expected_status,
+ '... and the status line should be correct';
+ like $summary, $expected_summary,
+ '... and the report summary should look correct';
+
+ # normal tests with failures
+
+ @output = ();
+ _runtests( $harness, "$source_tests/harness_failure" );
+
+ $status = pop @output;
+ $summary = pop @output;
+
+ like $status, qr{^Result: FAIL$},
+ '... and the status line should be correct';
+
+ my @summary = @output[ 5 .. $#output ];
+ @output = @output[ 0 .. 4 ];
+
+ @expected = (
+ "$source_tests/harness_failure ..",
+ '1..2',
+ 'ok 1 - this is a test',
+ 'not ok 2 - this is another test',
+ 'Failed 1/2 subtests',
+ );
+
+ is_deeply \@output, \@expected,
+ '... and failing test output should be correct';
+
+ my @expected_summary = (
+ 'Test Summary Report',
+ '-------------------',
+ "$source_tests/harness_failure (Wstat: 0 Tests: 2 Failed: 1)",
+ 'Failed test:',
+ '2',
+ );
+
+ is_deeply \@summary, \@expected_summary,
+ '... and the failure summary should also be correct';
+
+ # quiet tests with failures
+
+ @output = ();
+ _runtests( $harness_whisper, "$source_tests/harness_failure" );
+
+ $status = pop @output;
+ $summary = pop @output;
+ @expected = (
+ "$source_tests/harness_failure ..",
+ 'Failed 1/2 subtests',
+ 'Test Summary Report',
+ '-------------------',
+ "$source_tests/harness_failure (Wstat: 0 Tests: 2 Failed: 1)",
+ 'Failed test:',
+ '2',
+ );
+
+ like $status, qr{^Result: FAIL$},
+ '... and the status line should be correct';
+
+ is_deeply \@output, \@expected,
+ '... and failing test output should be correct';
+
+ # really quiet tests with failures
+
+ @output = ();
+ _runtests( $harness_mute, "$source_tests/harness_failure" );
+
+ $status = pop @output;
+ $summary = pop @output;
+ @expected = (
+ 'Test Summary Report',
+ '-------------------',
+ "$source_tests/harness_failure (Wstat: 0 Tests: 2 Failed: 1)",
+ 'Failed test:',
+ '2',
+ );
+
+ like $status, qr{^Result: FAIL$},
+ '... and the status line should be correct';
+
+ is_deeply \@output, \@expected,
+ '... and failing test output should be correct';
+
+ # only show directives
+
+ @output = ();
+ _runtests(
+ $harness_directives,
+ "$source_tests/harness_directives"
+ );
+
+ chomp(@output);
+
+ @expected = (
+ "$source_tests/harness_directives ..",
+ 'not ok 2 - we have a something # TODO some output',
+ "ok 3 houston, we don't have liftoff # SKIP no funding",
+ 'ok',
+ 'All tests successful.',
+
+ # ~TODO {{{ this should be an option
+ #'Test Summary Report',
+ #'-------------------',
+ #"$source_tests/harness_directives (Wstat: 0 Tests: 3 Failed: 0)",
+ #'Tests skipped:',
+ #'3',
+ # }}}
+ );
+
+ $status = pop @output;
+ $summary = pop @output;
+ $expected_summary = qr/^Files=1, Tests=3, \d+ wallclock secs/;
+
+ is_deeply \@output, \@expected, '... and the output should be correct';
+ like $summary, $expected_summary,
+ '... and the report summary should look correct';
+
+ like $status, qr{^Result: PASS$},
+ '... and the status line should be correct';
+
+ # normal tests with bad tap
+
+ @output = ();
+ _runtests( $harness, "$source_tests/harness_badtap" );
+ chomp(@output);
+
+ @output = map { trim($_) } @output;
+ $status = pop @output;
+ @summary = @output[ 6 .. ( $#output - 1 ) ];
+ @output = @output[ 0 .. 5 ];
+ @expected = (
+ "$source_tests/harness_badtap ..",
+ '1..2',
+ 'ok 1 - this is a test',
+ 'not ok 2 - this is another test',
+ '1..2',
+ 'Failed 1/2 subtests',
+ );
+ is_deeply \@output, \@expected,
+ '... and failing test output should be correct';
+ like $status, qr{^Result: FAIL$},
+ '... and the status line should be correct';
+ @expected_summary = (
+ 'Test Summary Report',
+ '-------------------',
+ "$source_tests/harness_badtap (Wstat: 0 Tests: 2 Failed: 1)",
+ 'Failed test:',
+ '2',
+ 'Parse errors: More than one plan found in TAP output',
+ );
+ is_deeply \@summary, \@expected_summary,
+ '... and the badtap summary should also be correct';
+
+ # coverage testing for _should_show_failures
+ # only show failures
+
+ @output = ();
+ _runtests( $harness_failures, "$source_tests/harness_failure" );
+
+ chomp(@output);
+
+ @expected = (
+ "$source_tests/harness_failure ..",
+ 'not ok 2 - this is another test',
+ 'Failed 1/2 subtests',
+ 'Test Summary Report',
+ '-------------------',
+ "$source_tests/harness_failure (Wstat: 0 Tests: 2 Failed: 1)",
+ 'Failed test:',
+ '2',
+ );
+
+ $status = pop @output;
+ $summary = pop @output;
+
+ like $status, qr{^Result: FAIL$},
+ '... and the status line should be correct';
+ $expected_summary = qr/^Files=1, Tests=2, \d+ wallclock secs/;
+ is_deeply \@output, \@expected, '... and the output should be correct';
+
+ # check the status output for no tests
+
+ @output = ();
+ _runtests( $harness_failures, "$sample_tests/no_output" );
+
+ chomp(@output);
+
+ @expected = (
+ "$sample_tests/no_output ..",
+ 'No subtests run',
+ 'Test Summary Report',
+ '-------------------',
+ "$sample_tests/no_output (Wstat: 0 Tests: 0 Failed: 0)",
+ 'Parse errors: No plan found in TAP output',
+ );
+
+ $status = pop @output;
+ $summary = pop @output;
+
+ like $status, qr{^Result: FAIL$},
+ '... and the status line should be correct';
+ $expected_summary = qr/^Files=1, Tests=2, \d+ wallclock secs/;
+ is_deeply \@output, \@expected, '... and the output should be correct';
+
+ #XXXX
+}
+
+sub trim {
+ $_[0] =~ s/^\s+|\s+$//g;
+ return $_[0];
+}
+
+sub _runtests {
+ my ( $harness, @tests ) = @_;
+ local $ENV{PERL_TEST_HARNESS_DUMP_TAP} = 0;
+ my $aggregate = $harness->runtests(@tests);
+ return $aggregate;
+}
+
diff --git a/ext/Test-Harness/t/harness-bailout.t b/ext/Test-Harness/t/harness-bailout.t
new file mode 100644
index 0000000000..0ee8a793d6
--- /dev/null
+++ b/ext/Test-Harness/t/harness-bailout.t
@@ -0,0 +1,58 @@
+#!perl
+
+use strict;
+use File::Spec;
+
+BEGIN {
+ *CORE::GLOBAL::exit = sub { die '!exit called!' };
+}
+
+use TAP::Harness;
+use Test::More;
+
+my @jobs = (
+ { name => 'sequential',
+ args => { verbosity => -9 },
+ },
+ { name => 'parallel',
+ args => { verbosity => -9, jobs => 2 },
+ },
+);
+
+plan tests => @jobs * 2;
+
+for my $test (@jobs) {
+ my $name = $test->{name};
+ my $args = $test->{args};
+ my $harness = TAP::Harness->new($args);
+ eval {
+ local ( *OLDERR, *OLDOUT );
+ open OLDERR, '>&STDERR' or die $!;
+ open OLDOUT, '>&STDOUT' or die $!;
+ my $devnull = File::Spec->devnull;
+ open STDERR, ">$devnull" or die $!;
+ open STDOUT, ">$devnull" or die $!;
+
+ $harness->runtests(
+ File::Spec->catfile(
+ ( $ENV{PERL_CORE}
+ ? ( File::Spec->updir, 'ext', 'Test-Harness' )
+ : ()
+ ),
+ 't',
+ 'sample-tests',
+ 'bailout'
+ )
+ );
+
+ open STDERR, '>&OLDERR' or die $!;
+ open STDOUT, '>&OLDOUT' or die $!;
+ };
+ my $err = $@;
+ unlike $err, qr{!exit called!}, "$name: didn't exit";
+ like $err, qr{FAILED--Further testing stopped: GERONIMMMOOOOOO!!!},
+ "$name: bailout message";
+}
+
+# vim:ts=2:sw=2:et:ft=perl
+
diff --git a/ext/Test-Harness/t/harness.t b/ext/Test-Harness/t/harness.t
index aa236dfc59..c9f835a0a7 100644
--- a/ext/Test-Harness/t/harness.t
+++ b/ext/Test-Harness/t/harness.t
@@ -83,8 +83,7 @@ foreach my $test_args ( get_arg_sets() ) {
{
my @output;
local $^W;
- local *TAP::Formatter::Console::_should_show_count = sub {0};
- local *TAP::Formatter::Console::_output = sub {
+ local *TAP::Formatter::Base::_output = sub {
my $self = shift;
push @output => grep { $_ ne '' }
map {
@@ -93,11 +92,16 @@ foreach my $test_args ( get_arg_sets() ) {
trim($_)
} @_;
};
- my $harness = TAP::Harness->new( { verbosity => 1 } );
- my $harness_whisper = TAP::Harness->new( { verbosity => -1 } );
- my $harness_mute = TAP::Harness->new( { verbosity => -2 } );
- my $harness_directives = TAP::Harness->new( { directives => 1 } );
- my $harness_failures = TAP::Harness->new( { failures => 1 } );
+ my $harness = TAP::Harness->new(
+ { verbosity => 1, formatter_class => "TAP::Formatter::Console" } );
+ my $harness_whisper = TAP::Harness->new(
+ { verbosity => -1, formatter_class => "TAP::Formatter::Console" } );
+ my $harness_mute = TAP::Harness->new(
+ { verbosity => -2, formatter_class => "TAP::Formatter::Console" } );
+ my $harness_directives = TAP::Harness->new(
+ { directives => 1, formatter_class => "TAP::Formatter::Console" } );
+ my $harness_failures = TAP::Harness->new(
+ { failures => 1, formatter_class => "TAP::Formatter::Console" } );
colorize($harness);
@@ -113,7 +117,7 @@ foreach my $test_args ( get_arg_sets() ) {
chomp(@output);
my @expected = (
- "$source_tests/harness....",
+ "$source_tests/harness ..",
'1..1',
'[[reset]]',
'ok 1 - this is a test',
@@ -144,7 +148,7 @@ foreach my $test_args ( get_arg_sets() ) {
chomp(@output);
@expected = (
- 'My Nice Test....',
+ 'My Nice Test ..',
'1..1',
'[[reset]]',
'ok 1 - this is a test',
@@ -177,13 +181,13 @@ foreach my $test_args ( get_arg_sets() ) {
chomp(@output);
@expected = (
- 'My Nice Test..........',
+ 'My Nice Test ........',
'1..1',
'[[reset]]',
'ok 1 - this is a test',
'[[reset]]',
'ok',
- 'My Nice Test Again....',
+ 'My Nice Test Again ..',
'1..1',
'[[reset]]',
'ok 1 - this is a test',
@@ -209,7 +213,7 @@ foreach my $test_args ( get_arg_sets() ) {
chomp(@output);
@expected = (
- "$source_tests/harness....",
+ "$source_tests/harness ..",
'ok',
'All tests successful.',
);
@@ -261,7 +265,7 @@ foreach my $test_args ( get_arg_sets() ) {
@output = @output[ 0 .. 9 ];
@expected = (
- "$source_tests/harness_failure....",
+ "$source_tests/harness_failure ..",
'1..2',
'[[reset]]',
'ok 1 - this is a test',
@@ -302,7 +306,7 @@ foreach my $test_args ( get_arg_sets() ) {
$status = pop @output;
$summary = pop @output;
@expected = (
- "$source_tests/harness_failure....",
+ "$source_tests/harness_failure ..",
'Failed 1/2 subtests',
'Test Summary Report',
'-------------------',
@@ -349,7 +353,7 @@ foreach my $test_args ( get_arg_sets() ) {
chomp(@output);
@expected = (
- "$source_tests/harness_directives....",
+ "$source_tests/harness_directives ..",
'not ok 2 - we have a something # TODO some output',
"ok 3 houston, we don't have liftoff # SKIP no funding",
'ok',
@@ -407,7 +411,7 @@ foreach my $test_args ( get_arg_sets() ) {
@summary = @output[ 12 .. ( $#output - 1 ) ];
@output = @output[ 0 .. 11 ];
@expected = (
- "$source_tests/harness_badtap....",
+ "$source_tests/harness_badtap ..",
'1..2',
'[[reset]]',
'ok 1 - this is a test',
@@ -461,7 +465,7 @@ foreach my $test_args ( get_arg_sets() ) {
chomp(@output);
@expected = (
- "$source_tests/harness_failure....",
+ "$source_tests/harness_failure ..",
'not ok 2 - this is another test',
'Failed 1/2 subtests',
'Test Summary Report',
@@ -487,7 +491,7 @@ foreach my $test_args ( get_arg_sets() ) {
chomp(@output);
@expected = (
- "$sample_tests/no_output....",
+ "$sample_tests/no_output ..",
'No subtests run',
'Test Summary Report',
'-------------------',
@@ -859,15 +863,15 @@ sub _runtests {
{ name => 'all the same',
input => [ 'foo.t', 'bar.t', 'fletz.t' ],
output => [
- [ 'foo.t', 'foo' ], [ 'bar.t', 'bar' ],
- [ 'fletz.t', 'fletz' ]
+ [ 'foo.t', 'foo.t' ], [ 'bar.t', 'bar.t' ],
+ [ 'fletz.t', 'fletz.t' ]
],
},
{ name => 'all the same, already cooked',
input => [ 'foo.t', [ 'bar.t', 'brip' ], 'fletz.t' ],
output => [
- [ 'foo.t', 'foo' ], [ 'bar.t', 'brip' ],
- [ 'fletz.t', 'fletz' ]
+ [ 'foo.t', 'foo.t' ], [ 'bar.t', 'brip' ],
+ [ 'fletz.t', 'fletz.t' ]
],
},
{ name => 'different exts',
diff --git a/ext/Test-Harness/t/iterators.t b/ext/Test-Harness/t/iterators.t
index b24fc372a4..c82387bd7c 100644
--- a/ext/Test-Harness/t/iterators.t
+++ b/ext/Test-Harness/t/iterators.t
@@ -83,7 +83,7 @@ my @schedule = (
);
sub _can_open3 {
- return $^O eq 'MSWin32' || $Config{d_fork};
+ return $Config{d_fork};
}
my $factory = TAP::Parser::IteratorFactory->new;
diff --git a/ext/Test-Harness/t/lib/App/Prove/Plugin/Dummy.pm b/ext/Test-Harness/t/lib/App/Prove/Plugin/Dummy.pm
index 7e285bdc7f..81f79ea042 100644
--- a/ext/Test-Harness/t/lib/App/Prove/Plugin/Dummy.pm
+++ b/ext/Test-Harness/t/lib/App/Prove/Plugin/Dummy.pm
@@ -1,5 +1,7 @@
package App::Prove::Plugin::Dummy;
+use strict;
+
sub import {
main::test_log_import(@_);
}
diff --git a/ext/Test-Harness/t/lib/App/Prove/Plugin/Dummy2.pm b/ext/Test-Harness/t/lib/App/Prove/Plugin/Dummy2.pm
new file mode 100644
index 0000000000..ae80003e62
--- /dev/null
+++ b/ext/Test-Harness/t/lib/App/Prove/Plugin/Dummy2.pm
@@ -0,0 +1,13 @@
+package App::Prove::Plugin::Dummy2;
+
+use strict;
+
+sub import {
+ main::test_log_import(@_);
+}
+
+sub load {
+ main::test_log_plugin_load(@_);
+}
+
+1;
diff --git a/ext/Test-Harness/t/parse.t b/ext/Test-Harness/t/parse.t
index 31648da225..4bcaba37d3 100755
--- a/ext/Test-Harness/t/parse.t
+++ b/ext/Test-Harness/t/parse.t
@@ -951,7 +951,10 @@ END_TAP
like pop @die, qr/Can't use/, '...and the message is as we expect';
}
-{
+SKIP: {
+
+ # http://markmail.org/message/rkxbo6ft7yorgnzb
+ skip "Crashes on older Perls", 2 if $] <= 5.008004 || $] == 5.009;
# coverage testing of TAP::Parser::_finish
diff --git a/ext/Test-Harness/t/perl5lib.t b/ext/Test-Harness/t/perl5lib.t
new file mode 100644
index 0000000000..6ee3db2001
--- /dev/null
+++ b/ext/Test-Harness/t/perl5lib.t
@@ -0,0 +1,49 @@
+#!/usr/bin/perl -w
+
+# Test that PERL5LIB is propogated from the harness process to the test
+# process.
+
+use strict;
+use lib 't/lib';
+use Config;
+
+my $path_sep = $Config{path_sep};
+
+sub has_crazy_patch {
+ my $sentinel = 'blirpzoffle';
+ local $ENV{PERL5LIB} = $sentinel;
+ my $command = join ' ',
+ map {qq{"$_"}} ( $^X, '-e', 'print join q(:), @INC' );
+ my $path = `$command`;
+ my @got = ( $path =~ /($sentinel)/g );
+ return @got > 1;
+}
+
+use Test::More (
+ $^O eq 'VMS' ? ( skip_all => 'VMS' )
+ : has_crazy_patch() ? ( skip_all => 'Incompatible @INC patch' )
+ : ( tests => 1 )
+);
+
+use Test::Harness;
+use App::Prove;
+
+# Change PERL5LIB so we ensure it's preserved.
+$ENV{PERL5LIB} = join( $path_sep, 'wibble',
+ ($ENV{PERL_CORE} ? '../lib' : ()), $ENV{PERL5LIB} || '' );
+
+open TEST, ">perl5lib_check.t.tmp";
+print TEST <<"END";
+#!/usr/bin/perl
+use strict;
+use Test::More tests => 1;
+like \$ENV{PERL5LIB}, qr/(^|${path_sep})wibble${path_sep}/;
+END
+close TEST;
+
+END { 1 while unlink 'perl5lib_check.t.tmp'; }
+
+my $h = TAP::Harness->new( { lib => ['something'], verbosity => -3 } );
+ok( !$h->runtests('perl5lib_check.t.tmp')->has_errors );
+
+1;
diff --git a/ext/Test-Harness/t/prove.t b/ext/Test-Harness/t/prove.t
index 20e540d039..f8ce128f4a 100644
--- a/ext/Test-Harness/t/prove.t
+++ b/ext/Test-Harness/t/prove.t
@@ -57,7 +57,6 @@ sub mabs {
{
my @import_log = ();
-
sub test_log_import { push @import_log, [@_] }
sub get_import_log {
@@ -65,6 +64,15 @@ sub mabs {
@import_log = ();
return @log;
}
+
+ my @plugin_load_log = ();
+ sub test_log_plugin_load { push @plugin_load_log, [@_] }
+
+ sub get_plugin_load_log {
+ my @log = @plugin_load_log;
+ @plugin_load_log = ();
+ return @log;
+ }
}
my ( @ATTR, %DEFAULT_ASSERTION, @SCHEDULE );
@@ -1138,6 +1146,47 @@ BEGIN { # START PLAN
],
},
+ { name => 'Load plugin (args + call load method)',
+ switches => [ '-P', 'Dummy2=fou,du,fafa', $dummy_test ],
+ args => {
+ argv => [qw( one two three )],
+ },
+ expect => {
+ plugins => ['Dummy2'],
+ },
+ extra => sub {
+ my @import = get_import_log();
+ is_deeply \@import,
+ [ [ 'App::Prove::Plugin::Dummy2', 'fou', 'du', 'fafa' ] ],
+ "Plugin loaded OK";
+
+ my @loaded = get_plugin_load_log();
+ is( scalar @loaded, 1, 'Plugin->load called OK' );
+ my ( $plugin_class, $args ) = @{ shift @loaded };
+ is( $plugin_class, 'App::Prove::Plugin::Dummy2',
+ 'plugin_class passed'
+ );
+ isa_ok(
+ $args->{app_prove}, 'App::Prove',
+ 'app_prove object passed'
+ );
+ is_deeply(
+ $args->{args}, [qw( fou du fafa )],
+ 'expected args passed'
+ );
+ },
+ plan => 5,
+ runlog => [
+ [ '_runtests',
+ { verbosity => 0,
+ show_count => 1,
+ },
+ 'TAP::Harness',
+ $dummy_test
+ ]
+ ],
+ },
+
{ name => 'Load module',
switches => [ '-M', 'App::Prove::Plugin::Dummy', $dummy_test ],
args => {
diff --git a/ext/Test-Harness/t/proverun.t b/ext/Test-Harness/t/proverun.t
index f0e9ae22a4..0971684535 100644
--- a/ext/Test-Harness/t/proverun.t
+++ b/ext/Test-Harness/t/proverun.t
@@ -31,7 +31,7 @@ BEGIN {
},
);
foreach my $test (@tests) {
-
+
# let's fully expand that filename
$test->{file} = File::Spec->catfile(
( $ENV{PERL_CORE}
diff --git a/ext/Test-Harness/t/regression.t b/ext/Test-Harness/t/regression.t
index 8fc312de0a..28baee42c8 100644
--- a/ext/Test-Harness/t/regression.t
+++ b/ext/Test-Harness/t/regression.t
@@ -2562,97 +2562,102 @@ my %samples = (
version => 12,
},
- stdout_stderr => {
- results => [
- { is_comment => TRUE,
- passed => TRUE,
- is_ok => TRUE,
- comment => 'comments',
- },
- { actual_passed => TRUE,
- is_actual_ok => TRUE,
- passed => TRUE,
- is_ok => TRUE,
- is_test => TRUE,
- has_skip => FALSE,
- has_todo => FALSE,
- number => 1,
- description => '',
- explanation => '',
- },
- { actual_passed => TRUE,
- is_actual_ok => TRUE,
- passed => TRUE,
- is_ok => TRUE,
- is_test => TRUE,
- has_skip => FALSE,
- has_todo => FALSE,
- number => 2,
- description => '',
- explanation => '',
- },
- { actual_passed => TRUE,
- is_actual_ok => TRUE,
- passed => TRUE,
- is_ok => TRUE,
- is_test => TRUE,
- has_skip => FALSE,
- has_todo => FALSE,
- number => 3,
- description => '',
- explanation => '',
- },
- { is_comment => TRUE,
- passed => TRUE,
- is_ok => TRUE,
- comment => 'comment',
- },
- { actual_passed => TRUE,
- is_actual_ok => TRUE,
- passed => TRUE,
- is_ok => TRUE,
- is_test => TRUE,
- has_skip => FALSE,
- has_todo => FALSE,
- number => 4,
- description => '',
- explanation => '',
- },
- { is_comment => TRUE,
- passed => TRUE,
- is_ok => TRUE,
- comment => 'more ignored stuff',
- },
- { is_comment => TRUE,
- passed => TRUE,
- is_ok => TRUE,
- comment => 'and yet more',
- },
- { is_plan => TRUE,
- passed => TRUE,
- is_ok => TRUE,
- raw => '1..4',
+ # For some reason mixing stdout with stderr is unreliable on Windows
+ ( $IsWin32
+ ? ()
+ : ( stdout_stderr => {
+ results => [
+ { is_comment => TRUE,
+ passed => TRUE,
+ is_ok => TRUE,
+ comment => 'comments',
+ },
+ { actual_passed => TRUE,
+ is_actual_ok => TRUE,
+ passed => TRUE,
+ is_ok => TRUE,
+ is_test => TRUE,
+ has_skip => FALSE,
+ has_todo => FALSE,
+ number => 1,
+ description => '',
+ explanation => '',
+ },
+ { actual_passed => TRUE,
+ is_actual_ok => TRUE,
+ passed => TRUE,
+ is_ok => TRUE,
+ is_test => TRUE,
+ has_skip => FALSE,
+ has_todo => FALSE,
+ number => 2,
+ description => '',
+ explanation => '',
+ },
+ { actual_passed => TRUE,
+ is_actual_ok => TRUE,
+ passed => TRUE,
+ is_ok => TRUE,
+ is_test => TRUE,
+ has_skip => FALSE,
+ has_todo => FALSE,
+ number => 3,
+ description => '',
+ explanation => '',
+ },
+ { is_comment => TRUE,
+ passed => TRUE,
+ is_ok => TRUE,
+ comment => 'comment',
+ },
+ { actual_passed => TRUE,
+ is_actual_ok => TRUE,
+ passed => TRUE,
+ is_ok => TRUE,
+ is_test => TRUE,
+ has_skip => FALSE,
+ has_todo => FALSE,
+ number => 4,
+ description => '',
+ explanation => '',
+ },
+ { is_comment => TRUE,
+ passed => TRUE,
+ is_ok => TRUE,
+ comment => 'more ignored stuff',
+ },
+ { is_comment => TRUE,
+ passed => TRUE,
+ is_ok => TRUE,
+ comment => 'and yet more',
+ },
+ { is_plan => TRUE,
+ passed => TRUE,
+ is_ok => TRUE,
+ raw => '1..4',
+ tests_planned => 4,
+ },
+ ],
+ plan => '1..4',
+ passed => [ 1 .. 4 ],
+ actual_passed => [ 1 .. 4 ],
+ failed => [],
+ actual_failed => [],
+ todo => [],
+ todo_passed => [],
+ skipped => [],
+ good_plan => TRUE,
+ is_good_plan => TRUE,
tests_planned => 4,
- },
- ],
- plan => '1..4',
- passed => [ 1 .. 4 ],
- actual_passed => [ 1 .. 4 ],
- failed => [],
- actual_failed => [],
- todo => [],
- todo_passed => [],
- skipped => [],
- good_plan => TRUE,
- is_good_plan => TRUE,
- tests_planned => 4,
- tests_run => 4,
- parse_errors => [],
- 'exit' => 0,
- wait => 0,
- version => 12,
- need_open3 => 1,
- },
+ tests_run => 4,
+ parse_errors => [],
+ 'exit' => 0,
+ wait => 0,
+ version => 12,
+ need_open3 => 1,
+ }
+ )
+ ),
junk_before_plan => {
results => [
diff --git a/ext/Test-Harness/t/taint.t b/ext/Test-Harness/t/taint.t
index 91335ac170..80acec8fb1 100644
--- a/ext/Test-Harness/t/taint.t
+++ b/ext/Test-Harness/t/taint.t
@@ -10,11 +10,10 @@ BEGIN {
}
}
-# Test that options in PERL5LIB and PERL5OPT are propogated to tainted
-# tests
+# Test that options in PERL5OPT are propogated to tainted tests
use strict;
-use Test::More ( $^O eq 'VMS' ? ( skip_all => 'VMS' ) : ( tests => 3 ) );
+use Test::More ( $^O eq 'VMS' ? ( skip_all => 'VMS' ) : ( tests => 1 ) );
use Config;
use TAP::Parser;
@@ -30,7 +29,13 @@ sub run_test_file {
printf TEST $test_template, @args;
close TEST;
- my $p = TAP::Parser->new( { source => $test_file } );
+ my $p = TAP::Parser->new(
+ { source => $test_file,
+
+ # Test taint when there's spaces in a -I path
+ switches => [q["-Ifoo bar"]],
+ }
+ );
1 while $p->next;
ok !$p->has_problems;
@@ -38,36 +43,7 @@ sub run_test_file {
}
{
- local $ENV{PERL5LIB} = join $Config{path_sep}, grep defined, 'wibble',
- $ENV{PERL5LIB};
- run_test_file( <<'END', $lib_path );
-#!/usr/bin/perl -T
-
-BEGIN { unshift @INC, ( %s ); }
-use Test::More tests => 1;
-
-ok grep(/^wibble$/, @INC) or diag join "\n", @INC;
-END
-}
-
-{
- my $perl5lib = $ENV{PERL5LIB};
- local $ENV{PERL5LIB};
- local $ENV{PERLLIB} = join $Config{path_sep}, grep defined, 'wibble',
- $perl5lib;
- run_test_file( <<'END', $lib_path );
-#!/usr/bin/perl -T
-
-BEGIN { unshift @INC, ( %s ); }
-use Test::More tests => 1;
-
-ok grep(/^wibble$/, @INC) or diag join "\n", @INC;
-END
-}
-
-{
- local $ENV{PERL5LIB} = join $Config{path_sep}, @INC;
- local $ENV{PERL5OPT} = '-Mstrict';
+ local $ENV{PERL5OPT} = $ENV{PERL_CORE} ? '-I../lib -Mstrict' : '-Mstrict';
run_test_file(<<'END');
#!/usr/bin/perl -T
diff --git a/ext/Text-Soundex/Makefile.PL b/ext/Text-Soundex/Makefile.PL
deleted file mode 100644
index ea757f175f..0000000000
--- a/ext/Text-Soundex/Makefile.PL
+++ /dev/null
@@ -1,11 +0,0 @@
-use ExtUtils::MakeMaker;
-WriteMakefile(
- NAME => "Text::Soundex",
- VERSION_FROM => 'Soundex.pm',
- 'dist' => {
- COMPRESS => 'gzip -9f',
- SUFFIX => 'gz',
- DIST_DEFAULT => 'all tardist',
- },
- MAN3PODS => {},
-);
diff --git a/ext/Time-Piece/Makefile.PL b/ext/Time-Piece/Makefile.PL
index 57e9ec2cb1..a69cf550c9 100644
--- a/ext/Time-Piece/Makefile.PL
+++ b/ext/Time-Piece/Makefile.PL
@@ -7,5 +7,4 @@ WriteMakefile(
'VERSION_FROM' => 'Piece.pm', # finds $VERSION
'AUTHOR' => 'Matt Sergeant',
'ABSTRACT_FROM' => 'Piece.pm',
- 'MAN3PODS' => {}, # Pods will be built by installman.
);
diff --git a/ext/Time-Piece/Piece.pm b/ext/Time-Piece/Piece.pm
index a739c39ea4..d49d72baad 100644
--- a/ext/Time-Piece/Piece.pm
+++ b/ext/Time-Piece/Piece.pm
@@ -22,7 +22,7 @@ our %EXPORT_TAGS = (
':override' => 'internal',
);
-our $VERSION = '1.13_02';
+our $VERSION = '1.13_03';
bootstrap Time::Piece $VERSION;
diff --git a/ext/Time-Piece/Piece.xs b/ext/Time-Piece/Piece.xs
index e20b6d41b4..fe9aba6baf 100644
--- a/ext/Time-Piece/Piece.xs
+++ b/ext/Time-Piece/Piece.xs
@@ -10,7 +10,7 @@ extern "C" {
#endif
/* XXX struct tm on some systems (SunOS4/BSD) contains extra (non POSIX)
- * fields for which we don't have Configure support yet:
+ * fields for which we don't have Configure support prior to Perl 5.8.0:
* char *tm_zone; -- abbreviation of timezone name
* long tm_gmtoff; -- offset from GMT in seconds
* To workaround core dumps from the uninitialised tm_zone we get the
@@ -19,11 +19,12 @@ extern "C" {
* localtime(time()). That should give the desired result most of the
* time. But probably not always!
*
- * This is a temporary workaround to be removed once Configure
- * support is added and NETaa14816 is considered in full.
- * It does not address tzname aspects of NETaa14816.
+ * This is a vestigial workaround for Perls prior to 5.8.0. We now
+ * rely on the initialization (still likely a workaround) in util.c.
*/
-#if !defined(HAS_GNULIBC)
+#if !defined(PERL_VERSION) || PERL_VERSION < 8
+
+#if defined(HAS_GNULIBC)
# ifndef STRUCT_TM_HASZONE
# define STRUCT_TM_HASZONE
# else
@@ -31,6 +32,8 @@ extern "C" {
# endif
#endif
+#endif /* end of pre-5.8 */
+
#define DAYS_PER_YEAR 365
#define DAYS_PER_QYEAR (4*DAYS_PER_YEAR+1)
#define DAYS_PER_CENT (25*DAYS_PER_QYEAR-1)
@@ -45,6 +48,8 @@ extern "C" {
/* as used here, the algorithm leaves Sunday as day 1 unless we adjust it */
#define WEEKDAY_BIAS 6 /* (1+6)%7 makes Sunday 0 again */
+#if !defined(PERL_VERSION) || PERL_VERSION < 8
+
#ifdef STRUCT_TM_HASZONE
static void
my_init_tm(struct tm *ptm) /* see mktime, strftime and asctime */
@@ -58,6 +63,85 @@ my_init_tm(struct tm *ptm) /* see mktime, strftime and asctime */
# define my_init_tm(ptm)
#endif
+#else
+/* use core version from util.c in 5.8.0 and later */
+# define my_init_tm init_tm
+#endif
+
+#ifdef WIN32
+
+/*
+ * (1) The CRT maintains its own copy of the environment, separate from
+ * the Win32API copy.
+ *
+ * (2) CRT getenv() retrieves from this copy. CRT putenv() updates this
+ * copy, and then calls SetEnvironmentVariableA() to update the Win32API
+ * copy.
+ *
+ * (3) win32_getenv() and win32_putenv() call GetEnvironmentVariableA() and
+ * SetEnvironmentVariableA() directly, bypassing the CRT copy of the
+ * environment.
+ *
+ * (4) The CRT strftime() "%Z" implementation calls __tzset(). That
+ * calls CRT tzset(), but only the first time it is called, and in turn
+ * that uses CRT getenv("TZ") to retrieve the timezone info from the CRT
+ * local copy of the environment and hence gets the original setting as
+ * perl never updates the CRT copy when assigning to $ENV{TZ}.
+ *
+ * Therefore, we need to retrieve the value of $ENV{TZ} and call CRT
+ * putenv() to update the CRT copy of the environment whenever we're about
+ * to call tzset().
+ */
+
+static const char*
+win32_crt_getenv(const char* name)
+{
+#undef getenv
+ const char* value = getenv(name);
+#define getenv win32_getenv
+ return value;
+}
+
+static void
+win32_crt_putenv(const char* name, const char* value)
+{
+ char* envstr =
+ (char*)malloc((strlen(name) + strlen(value) + 2) * sizeof(char));
+ if (envstr != NULL) {
+ sprintf(envstr, "%s=%s", name, value);
+#undef putenv
+ putenv(envstr);
+#define putenv win32_putenv
+ free(envstr);
+ }
+}
+
+static void
+fix_win32_tzenv(void)
+{
+ const char* perl_tz_env = getenv("TZ");
+ const char* crt_tz_env = win32_crt_getenv("TZ");
+ if (perl_tz_env != NULL && crt_tz_env != NULL) {
+ if (strcmp(perl_tz_env, crt_tz_env) != 0)
+ win32_crt_putenv("TZ", perl_tz_env);
+ }
+ else if (perl_tz_env != NULL && crt_tz_env == NULL)
+ win32_crt_putenv("TZ", perl_tz_env);
+ else if (perl_tz_env == NULL && crt_tz_env != NULL)
+ win32_crt_putenv("TZ", "");
+}
+
+#endif
+
+static void
+my_tzset(void)
+{
+#ifdef WIN32
+ fix_win32_tzenv();
+#endif
+ tzset();
+}
+
/*
* my_mini_mktime - normalise struct tm values without the localtime()
* semantics (and overhead) of mktime(). Stolen shamelessly from Perl's
@@ -750,7 +834,7 @@ label:
zonestr = (char *)alloca(cp - buf + 1);
strncpy(zonestr, buf, cp - buf);
zonestr[cp - buf] = '\0';
- tzset();
+ my_tzset();
if (0 == strcmp(zonestr, "GMT")) {
got_GMT = 1;
} else {
@@ -870,7 +954,7 @@ _strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1
void
_tzset()
PPCODE:
- tzset();
+ my_tzset();
void
diff --git a/ext/Time-Piece/t/02core.t b/ext/Time-Piece/t/02core.t
index d02055833d..7ca22a9bb1 100644
--- a/ext/Time-Piece/t/02core.t
+++ b/ext/Time-Piece/t/02core.t
@@ -1,4 +1,4 @@
-use Test::More tests => 93;
+use Test::More tests => 95;
my $is_win32 = ($^O =~ /Win32/);
my $is_qnx = ($^O eq 'qnx');
@@ -47,6 +47,14 @@ cmp_ok($t->datetime, 'eq','2000-02-29T12:34:56');
cmp_ok($t->daylight_savings, '==', 0);
# ->tzoffset?
+{
+ local $ENV{TZ} = "EST5";
+ Time::Piece::_tzset(); # register the environment change
+ my $lt = localtime;
+ cmp_ok(scalar($lt->tzoffset), 'eq', '-18000');
+ cmp_ok($lt->strftime("%Z"), 'eq', 'EST');
+}
+
cmp_ok(($t->julian_day / 2451604.0243 ) - 1, '<', 0.001);
cmp_ok(($t->mjd / 51603.52426) - 1, '<', 0.001);
cmp_ok($t->week, '==', 9);
diff --git a/ext/Unicode-Normalize/Changes b/ext/Unicode-Normalize/Changes
index 1f1a693d0f..e9cb3918a5 100644
--- a/ext/Unicode-Normalize/Changes
+++ b/ext/Unicode-Normalize/Changes
@@ -1,5 +1,9 @@
Revision history for Perl extension Unicode::Normalize.
+1.03 Sun Mar 29 12:56:23 2009
+ - mkheader: check if no composition needs growing the string.
+ - Makefile.PL: a tweak
+
1.02 Tue Jun 5 22:46:45 2007
- XSUB: mkheader, _U_stringify() - avoid unpack('C*') on unicode.
- test: short.t removed - pure perl is not inapprotiate for test of
diff --git a/ext/Unicode-Normalize/Makefile.PL b/ext/Unicode-Normalize/Makefile.PL
index ab4bd038b8..a04ca62b8f 100644
--- a/ext/Unicode-Normalize/Makefile.PL
+++ b/ext/Unicode-Normalize/Makefile.PL
@@ -17,6 +17,7 @@ WriteMakefile(
'VERSION_FROM' => 'Normalize.pm', # finds $VERSION
'clean' => $clean,
'PREREQ_PM' => {
+ bytes => 0,
Carp => 0,
constant => 0,
DynaLoader => 0,
@@ -27,5 +28,4 @@ WriteMakefile(
Test => 0,
warnings => 0,
},
- 'MAN3PODS' => {},
);
diff --git a/ext/Unicode-Normalize/Normalize.pm b/ext/Unicode-Normalize/Normalize.pm
index cb63fbf53e..ad5ff82a83 100644
--- a/ext/Unicode-Normalize/Normalize.pm
+++ b/ext/Unicode-Normalize/Normalize.pm
@@ -13,7 +13,7 @@ use Carp;
no warnings 'utf8';
-our $VERSION = '1.02';
+our $VERSION = '1.03';
our $PACKAGE = __PACKAGE__;
require Exporter;
@@ -453,6 +453,8 @@ normalization implemented by this module depends on your perl's version.
5.8.1-5.8.3 4.0.0
5.8.4-5.8.6 4.0.1 (normalization is same as 4.0.0)
5.8.7-5.8.8 4.1.0
+ 5.10.0 5.0.0
+ 5.8.9 5.1.0
=item Correction of decomposition mapping
diff --git a/ext/Unicode-Normalize/Normalize.xs b/ext/Unicode-Normalize/Normalize.xs
index 792f4a39e4..f4bbca7907 100644
--- a/ext/Unicode-Normalize/Normalize.xs
+++ b/ext/Unicode-Normalize/Normalize.xs
@@ -33,9 +33,11 @@
/* utf8_hop() hops back before start. Maybe broken UTF-8 */
#define ErrHopBeforeStart "panic (Unicode::Normalize): hopping before start"
-/* It should never happen as there is no instance in UTF-8 and UTF-EBCDIC;
- according to Versioning and Stability in UAX#15, no new composition
- should come in future. */
+/* It should never happen as there is no instance in UTF-8 and UTF-EBCDIC.
+ If Unicode would add a new composition of A + B to C
+ where bytes::length(A) + bytes::length(B) < bytes::length(C),
+ this code should be fixed.
+ In this case, mkheader will prevent Unicode::Normalize from building. */
#define ErrLongerThanSrc "panic (Unicode::Normalize %s): longer than source"
/* uvuni_to_utf8 wants UTF8_MAXBYTES free bytes available */
diff --git a/ext/Unicode-Normalize/README b/ext/Unicode-Normalize/README
index d7d163578f..8a5390cc78 100644
--- a/ext/Unicode-Normalize/README
+++ b/ext/Unicode-Normalize/README
@@ -1,4 +1,4 @@
-Unicode/Normalize version 1.02
+Unicode/Normalize version 1.03
===================================
Unicode::Normalize - Unicode Normalization Forms
diff --git a/ext/Unicode-Normalize/mkheader b/ext/Unicode-Normalize/mkheader
index f3ab5e272d..b3e3c3153c 100644
--- a/ext/Unicode-Normalize/mkheader
+++ b/ext/Unicode-Normalize/mkheader
@@ -83,6 +83,30 @@ sub decomposeHangul {
return @ret;
}
+########## length of a character ##########
+
+sub utf8len {
+ my $uv = shift;
+ return $uv < 0x80 ? 1 :
+ $uv < 0x800 ? 2 :
+ $uv < 0x10000 ? 3 :
+ $uv < 0x110000 ? 4 :
+ croak "$PACKAGE: illegal char in the composite. codepoint max is 0x10ffff.";
+}
+
+sub utfelen {
+ my $uv = shift;
+ return $uv < 0xA0 ? 1 :
+ $uv < 0x400 ? 2 :
+ $uv < 0x4000 ? 3 :
+ $uv < 0x40000 ? 4 :
+ $uv < 0x110000 ? 5 :
+ croak "$PACKAGE: illegal char in the composite. codepoint max is 0x10ffff.";
+}
+
+my $errExpand = "$PACKAGE: Composition to U+%04X (from U+%04X and U+%04X) " .
+ "needs growing the string in %s! Quit. Please inform the author...";
+
########## getting full decomposion ##########
{
my($f, $fh);
@@ -113,9 +137,9 @@ while ($Combin =~ /(.+)/g) {
my @tab = split /\t/, $1;
my $ini = hex $tab[0];
if ($tab[1] eq '') {
- $Combin{ $ini } = $tab[2];
+ $Combin{$ini} = $tab[2];
} else {
- $Combin{ $_ } = $tab[2] foreach $ini .. hex($tab[1]);
+ $Combin{$_} = $tab[2] foreach $ini .. hex($tab[1]);
}
}
@@ -123,54 +147,43 @@ while ($Decomp =~ /(.+)/g) {
my @tab = split /\t/, $1;
my $compat = $tab[2] =~ s/<[^>]+>//;
my $dec = [ _getHexArray($tab[2]) ]; # decomposition
- my $ini = hex($tab[0]); # initial decomposable character
+ my $ini = hex($tab[0]);
+ my $end = $tab[1] eq '' ? $ini : hex($tab[1]);
+ # ($ini .. $end) is the range of decomposable characters.
my $listname =
@$dec == 2 ? sprintf("${structname}_%06x", $dec->[0]) : 'USELESS';
# %04x is bad since it'd place _3046 after _1d157.
- if ($tab[1] eq '') {
- $Compat{ $ini } = $dec;
+ foreach my $u ($ini .. $end) {
+ $Compat{$u} = $dec;
if (! $compat) {
- $Canon{ $ini } = $dec;
+ $Canon{$u} = $dec;
if (@$dec == 2) {
+ if (utf8len($dec->[0]) + utf8len($dec->[1]) < utf8len($u)) {
+ croak sprintf $errExpand, $u, $dec->[0], $dec->[1],
+ "utf-8";
+ }
+ if (utfelen($dec->[0]) + utfelen($dec->[1]) < utfelen($u)) {
+ croak sprintf $errExpand, $u, $dec->[0], $dec->[1],
+ "utf-ebcdic";
+ }
+
if ($Combin{ $dec->[0] }) {
- $NonStD{ $ini } = 1;
+ $NonStD{$u} = 1;
} else {
- $CompList{ $listname }{ $dec->[1] } = $ini;
+ $CompList{ $listname }{ $dec->[1] } = $u;
$Comp1st{ $dec->[0] } = $listname;
- $Comp2nd{ $dec->[1] } = 1 if ! $Exclus{$ini};
+ $Comp2nd{ $dec->[1] } = 1 if ! $Exclus{$u};
}
} elsif (@$dec == 1) {
- $Single{ $ini } = 1;
+ $Single{$u} = 1;
} else {
croak("Weird Canonical Decomposition of U+$tab[0]");
}
}
- } else {
- foreach my $u ($ini .. hex($tab[1])) {
- $Compat{ $u } = $dec;
-
- if (! $compat) {
- $Canon{ $u } = $dec;
-
- if (@$dec == 2) {
- if ($Combin{ $dec->[0] }) {
- $NonStD{ $u } = 1;
- } else {
- $CompList{ $listname }{ $dec->[1] } = $u;
- $Comp1st{ $dec->[0] } = $listname;
- $Comp2nd{ $dec->[1] } = 1 if ! $Exclus{$u};
- }
- } elsif (@$dec == 1) {
- $Single{ $u } = 1;
- } else {
- croak("Weird Canonical Decomposition of U+$tab[0]");
- }
- }
- }
}
}
diff --git a/ext/XS-APItest/Makefile.PL b/ext/XS-APItest/Makefile.PL
index 59d35c937b..10ce8774ad 100644
--- a/ext/XS-APItest/Makefile.PL
+++ b/ext/XS-APItest/Makefile.PL
@@ -17,7 +17,6 @@ WriteMakefile(
'INC' => '-I.', # e.g., '-I. -I/usr/include/other'
# Un-comment this if you add C files to link with later:
# 'OBJECT' => '$(O_FILES)', # link all the C files too
- MAN3PODS => {}, # Pods will be built by installman.
realclean => {FILES => 'const-c.inc const-xs.inc'},
);
diff --git a/ext/XS-Typemap/Makefile.PL b/ext/XS-Typemap/Makefile.PL
index ad02b78b49..3b1ff51bf7 100644
--- a/ext/XS-Typemap/Makefile.PL
+++ b/ext/XS-Typemap/Makefile.PL
@@ -2,7 +2,6 @@ use ExtUtils::MakeMaker;
WriteMakefile(
'NAME' => 'XS::Typemap',
- MAN3PODS => {}, # Pods will be built by installman.
'VERSION_FROM' => 'Typemap.pm',
'dist' => { COMPRESS => "gzip -9f"},
OBJECT => 'stdio.o Typemap.o',
diff --git a/ext/XS-Typemap/stdio.c b/ext/XS-Typemap/stdio.c
index fc4bf45c2f..da4fe570ac 100644
--- a/ext/XS-Typemap/stdio.c
+++ b/ext/XS-Typemap/stdio.c
@@ -23,6 +23,6 @@ int xsfclose ( FILE * stream ) {
int xsfprintf ( FILE * stream, const char * text ) {
- return fprintf( stream, text );
+ return fprintf( stream, "%s", text );
}
diff --git a/lib/attributes.pm b/ext/attributes/attributes.pm
index aa532c2fac..c117bef200 100644
--- a/lib/attributes.pm
+++ b/ext/attributes/attributes.pm
@@ -1,6 +1,6 @@
package attributes;
-our $VERSION = 0.09;
+our $VERSION = 0.12;
@EXPORT_OK = qw(get reftype);
@EXPORT = ();
@@ -18,15 +18,25 @@ sub carp {
goto &Carp::carp;
}
-## forward declaration(s) rather than wrapping the bootstrap call in BEGIN{}
-#sub reftype ($) ;
-#sub _fetch_attrs ($) ;
-#sub _guess_stash ($) ;
-#sub _modify_attrs ;
-#
-# The extra trips through newATTRSUB in the interpreter wipe out any savings
-# from avoiding the BEGIN block. Just do the bootstrap now.
-BEGIN { bootstrap attributes }
+my %deprecated;
+$deprecated{CODE} = qr/\A-?(locked)\z/;
+$deprecated{ARRAY} = $deprecated{HASH} = $deprecated{SCALAR}
+ = qr/\A-?(unique)\z/;
+
+sub _modify_attrs_and_deprecate {
+ my $svtype = shift;
+ # Now that we've removed handling of locked from the XS code, we need to
+ # remove it here, else it ends up in @badattrs. (If we do the deprecation in
+ # XS, we can't control the warning based on *our* caller's lexical settings,
+ # and the warned line is in this package)
+ grep {
+ $deprecated{$svtype} && /$deprecated{$svtype}/ ? do {
+ require warnings;
+ warnings::warnif('deprecated', "Attribute \"$1\" is deprecated");
+ 0;
+ } : 1
+ } _modify_attrs(@_);
+}
sub import {
@_ > 2 && ref $_[2] or do {
@@ -41,7 +51,7 @@ sub import {
if defined $home_stash && $home_stash ne '';
my @badattrs;
if ($pkgmeth) {
- my @pkgattrs = _modify_attrs($svref, @attrs);
+ my @pkgattrs = _modify_attrs_and_deprecate($svtype, $svref, @attrs);
@badattrs = $pkgmeth->($home_stash, $svref, @pkgattrs);
if (!@badattrs && @pkgattrs) {
require warnings;
@@ -59,7 +69,7 @@ sub import {
}
}
else {
- @badattrs = _modify_attrs($svref, @attrs);
+ @badattrs = _modify_attrs_and_deprecate($svtype, $svref, @attrs);
}
if (@badattrs) {
croak "Invalid $svtype attribute" .
@@ -73,8 +83,8 @@ sub get ($) {
@_ == 1 && ref $_[0] or
croak 'Usage: '.__PACKAGE__.'::get $ref';
my $svref = shift;
- my $svtype = uc reftype $svref;
- my $stash = _guess_stash $svref;
+ my $svtype = uc reftype($svref);
+ my $stash = _guess_stash($svref);
$stash = caller unless defined $stash;
my $pkgmeth;
$pkgmeth = UNIVERSAL::can($stash, "FETCH_${svtype}_ATTRIBUTES")
@@ -87,6 +97,9 @@ sub get ($) {
sub require_version { goto &UNIVERSAL::VERSION }
+require XSLoader;
+XSLoader::load('attributes', $VERSION);
+
1;
__END__
#The POD goes here
@@ -194,39 +207,24 @@ The following are the built-in attributes for subroutines:
=over 4
-=item locked
-
-B<5.005 threads only! The use of the "locked" attribute currently
-only makes sense if you are using the deprecated "Perl 5.005 threads"
-implementation of threads.>
+=item lvalue
-Setting this attribute is only meaningful when the subroutine or
-method is to be called by multiple threads. When set on a method
-subroutine (i.e., one marked with the B<method> attribute below),
-Perl ensures that any invocation of it implicitly locks its first
-argument before execution. When set on a non-method subroutine,
-Perl ensures that a lock is taken on the subroutine itself before
-execution. The semantics of the lock are exactly those of one
-explicitly taken with the C<lock> operator immediately after the
-subroutine is entered.
+Indicates that the referenced subroutine is a valid lvalue and can
+be assigned to. The subroutine must return a modifiable value such
+as a scalar variable, as described in L<perlsub>.
=item method
-Indicates that the referenced subroutine is a method.
-This has a meaning when taken together with the B<locked> attribute,
-as described there. It also means that a subroutine so marked
+Indicates that the referenced subroutine is a method. A subroutine so marked
will not trigger the "Ambiguous call resolved as CORE::%s" warning.
-=item lvalue
+=item locked
-Indicates that the referenced subroutine is a valid lvalue and can
-be assigned to. The subroutine must return a modifiable value such
-as a scalar variable, as described in L<perlsub>.
+The "locked" attribute has no effect in 5.10.0 and later. It was used as part
+of the now-removed "Perl 5.005 threads".
=back
-For global variables there is C<unique> attribute: see L<perlfunc/our>.
-
=head2 Available Subroutines
The following subroutines are available for general use once this module
@@ -333,7 +331,7 @@ Some examples of syntactically valid attribute lists:
switch(10,foo(7,3)) : expensive
Ugly('\(") :Bad
_5x5
- locked method
+ lvalue method
Some examples of syntactically invalid attribute lists (with annotation):
@@ -397,22 +395,22 @@ Effect:
Code:
package X;
- sub foo : locked ;
+ sub foo : lvalue ;
Effect:
- use attributes X => \&foo, "locked";
+ use attributes X => \&foo, "lvalue";
=item 4.
Code:
package X;
- sub Y::x : locked { 1 }
+ sub Y::x : lvalue { 1 }
Effect:
- use attributes Y => \&Y::x, "locked";
+ use attributes Y => \&Y::x, "lvalue";
=item 5.
@@ -425,11 +423,11 @@ Code:
BEGIN { *bar = \&X::foo; }
package Z;
- sub Y::bar : locked ;
+ sub Y::bar : lvalue ;
Effect:
- use attributes X => \&X::foo, "locked";
+ use attributes X => \&X::foo, "lvalue";
=back
@@ -487,9 +485,6 @@ element ('Test').
L<perlsub/"Private Variables via my()"> and
L<perlsub/"Subroutine Attributes"> for details on the basic declarations;
-L<attrs> for the obsolescent form of subroutine attribute specification
-which this module replaces;
L<perlfunc/use> for details on the normal invocation mechanism.
=cut
-
diff --git a/xsutils.c b/ext/attributes/attributes.xs
index 3bc1f9349b..a199af6206 100644
--- a/xsutils.c
+++ b/ext/attributes/attributes.xs
@@ -17,43 +17,13 @@
#include "EXTERN.h"
-#define PERL_IN_XSUTILS_C
#include "perl.h"
+#include "XSUB.h"
/*
* Contributed by Spider Boardman (spider.boardman@orb.nashua.nh.us).
*/
-/* package attributes; */
-PERL_XS_EXPORT_C void XS_attributes_reftype(pTHX_ CV *cv);
-PERL_XS_EXPORT_C void XS_attributes__modify_attrs(pTHX_ CV *cv);
-PERL_XS_EXPORT_C void XS_attributes__guess_stash(pTHX_ CV *cv);
-PERL_XS_EXPORT_C void XS_attributes__fetch_attrs(pTHX_ CV *cv);
-PERL_XS_EXPORT_C void XS_attributes_bootstrap(pTHX_ CV *cv);
-
-
-/*
- * Note that only ${pkg}::bootstrap definitions should go here.
- * This helps keep down the start-up time, which is especially
- * relevant for users who don't invoke any features which are
- * (partially) implemented here.
- *
- * The various bootstrap definitions can take care of doing
- * package-specific newXS() calls. Since the layout of the
- * bundled *.pm files is in a version-specific directory,
- * version checks in these bootstrap calls are optional.
- */
-
-static const char file[] = __FILE__;
-
-void
-Perl_boot_core_xsutils(pTHX)
-{
- newXS("attributes::bootstrap", XS_attributes_bootstrap, file);
-}
-
-#include "XSUB.h"
-
static int
modify_SV_attributes(pTHX_ SV *sv, SV **retlist, SV **attrlist, int numattrs)
{
@@ -75,7 +45,6 @@ modify_SV_attributes(pTHX_ SV *sv, SV **retlist, SV **attrlist, int numattrs)
switch ((int)len) {
case 6:
switch (name[3]) {
-#ifdef CVf_LVALUE
case 'l':
if (memEQ(name, "lvalue", 6)) {
if (negated)
@@ -85,16 +54,6 @@ modify_SV_attributes(pTHX_ SV *sv, SV **retlist, SV **attrlist, int numattrs)
continue;
}
break;
-#endif
- case 'k':
- if (memEQ(name, "locked", 6)) {
- if (negated)
- CvFLAGS(MUTABLE_CV(sv)) &= ~CVf_LOCKED;
- else
- CvFLAGS(MUTABLE_CV(sv)) |= CVf_LOCKED;
- continue;
- }
- break;
case 'h':
if (memEQ(name, "method", 6)) {
if (negated)
@@ -109,31 +68,12 @@ modify_SV_attributes(pTHX_ SV *sv, SV **retlist, SV **attrlist, int numattrs)
}
break;
default:
- switch ((int)len) {
- case 6:
- switch (name[5]) {
- case 'd':
- if (memEQ(name, "share", 5)) {
+ if (memEQs(name, 6, "shared")) {
if (negated)
Perl_croak(aTHX_ "A variable may not be unshared");
SvSHARE(sv);
continue;
- }
- break;
- case 'e':
- if (memEQ(name, "uniqu", 5)) {
- if (isGV_with_GP(sv)) {
- if (negated) {
- GvUNIQUE_off(sv);
- } else {
- GvUNIQUE_on(sv);
- }
- }
- /* Hope this came from toke.c if not a GV. */
- continue;
- }
- }
- }
+ }
break;
}
/* anything recognized had a 'continue' above */
@@ -144,31 +84,13 @@ modify_SV_attributes(pTHX_ SV *sv, SV **retlist, SV **attrlist, int numattrs)
return nret;
}
+MODULE = attributes PACKAGE = attributes
-
-/* package attributes; */
-
-XS(XS_attributes_bootstrap)
-{
- dVAR;
- dXSARGS;
-
- if( items > 1 )
- croak_xs_usage(cv, "$module");
-
- newXS("attributes::_modify_attrs", XS_attributes__modify_attrs, file);
- newXSproto("attributes::_guess_stash", XS_attributes__guess_stash, file, "$");
- newXSproto("attributes::_fetch_attrs", XS_attributes__fetch_attrs, file, "$");
- newXSproto("attributes::reftype", XS_attributes_reftype, file, "$");
-
- XSRETURN(0);
-}
-
-XS(XS_attributes__modify_attrs)
-{
- dVAR;
- dXSARGS;
+void
+_modify_attrs(...)
+ PREINIT:
SV *rv, *sv;
+ PPCODE:
if (items < 1) {
usage:
@@ -183,22 +105,20 @@ usage:
XSRETURN(modify_SV_attributes(aTHX_ sv, &ST(0), &ST(1), items-1));
XSRETURN(0);
-}
-XS(XS_attributes__fetch_attrs)
-{
- dVAR;
- dXSARGS;
+void
+_fetch_attrs(...)
+ PROTOTYPE: $
+ PREINIT:
SV *rv, *sv;
cv_flags_t cvflags;
-
+ PPCODE:
if (items != 1) {
usage:
croak_xs_usage(cv, "$reference");
}
rv = ST(0);
- SP -= items;
if (!(SvOK(rv) && SvROK(rv)))
goto usage;
sv = SvRV(rv);
@@ -206,35 +126,24 @@ usage:
switch (SvTYPE(sv)) {
case SVt_PVCV:
cvflags = CvFLAGS((const CV *)sv);
- if (cvflags & CVf_LOCKED)
- XPUSHs(newSVpvs_flags("locked", SVs_TEMP));
-#ifdef CVf_LVALUE
if (cvflags & CVf_LVALUE)
XPUSHs(newSVpvs_flags("lvalue", SVs_TEMP));
-#endif
if (cvflags & CVf_METHOD)
XPUSHs(newSVpvs_flags("method", SVs_TEMP));
- if (GvUNIQUE(CvGV((const CV *)sv)))
- XPUSHs(newSVpvs_flags("unique", SVs_TEMP));
- break;
- case SVt_PVGV:
- if (isGV_with_GP(sv) && GvUNIQUE(sv))
- XPUSHs(newSVpvs_flags("unique", SVs_TEMP));
break;
default:
break;
}
PUTBACK;
-}
-XS(XS_attributes__guess_stash)
-{
- dVAR;
- dXSARGS;
+void
+_guess_stash(...)
+ PROTOTYPE: $
+ PREINIT:
SV *rv, *sv;
dXSTARG;
-
+ PPCODE:
if (items != 1) {
usage:
croak_xs_usage(cv, "$reference");
@@ -274,15 +183,14 @@ usage:
SvSETMAGIC(TARG);
XSRETURN(1);
-}
-XS(XS_attributes_reftype)
-{
- dVAR;
- dXSARGS;
+void
+reftype(...)
+ PROTOTYPE: $
+ PREINIT:
SV *rv, *sv;
dXSTARG;
-
+ PPCODE:
if (items != 1) {
usage:
croak_xs_usage(cv, "$reference");
@@ -298,8 +206,6 @@ usage:
SvSETMAGIC(TARG);
XSRETURN(1);
-}
-
/*
* Local variables:
* c-indentation-style: bsd
diff --git a/ext/attrs/Makefile.PL b/ext/attrs/Makefile.PL
deleted file mode 100644
index 86ed3f3935..0000000000
--- a/ext/attrs/Makefile.PL
+++ /dev/null
@@ -1,7 +0,0 @@
-use ExtUtils::MakeMaker;
-WriteMakefile(
- NAME => 'attrs',
- VERSION_FROM => 'attrs.pm',
- MAN3PODS => {}, # Pods will be built by installman.
- XSPROTOARG => '-noprototypes'
-);
diff --git a/ext/attrs/attrs.pm b/ext/attrs/attrs.pm
deleted file mode 100644
index c483cd3455..0000000000
--- a/ext/attrs/attrs.pm
+++ /dev/null
@@ -1,58 +0,0 @@
-package attrs;
-use XSLoader ();
-
-$VERSION = "1.02";
-
-=head1 NAME
-
-attrs - set/get attributes of a subroutine (deprecated)
-
-=head1 SYNOPSIS
-
- sub foo {
- use attrs qw(locked method);
- ...
- }
-
- @a = attrs::get(\&foo);
-
-=head1 DESCRIPTION
-
-NOTE: Use of this pragma is deprecated. Use the syntax
-
- sub foo : locked method { }
-
-to declare attributes instead. See also L<attributes>.
-
-This pragma lets you set and get attributes for subroutines.
-Setting attributes takes place at compile time; trying to set
-invalid attribute names causes a compile-time error. Calling
-C<attrs::get> on a subroutine reference or name returns its list
-of attribute names. Notice that C<attrs::get> is not exported.
-Valid attributes are as follows.
-
-=over 4
-
-=item method
-
-Indicates that the invoking subroutine is a method.
-
-=item locked
-
-Setting this attribute is only meaningful when the subroutine or
-method is to be called by multiple threads. When set on a method
-subroutine (i.e. one marked with the B<method> attribute above),
-perl ensures that any invocation of it implicitly locks its first
-argument before execution. When set on a non-method subroutine,
-perl ensures that a lock is taken on the subroutine itself before
-execution. The semantics of the lock are exactly those of one
-explicitly taken with the C<lock> operator immediately after the
-subroutine is entered.
-
-=back
-
-=cut
-
-XSLoader::load 'attrs', $VERSION;
-
-1;
diff --git a/ext/attrs/attrs.xs b/ext/attrs/attrs.xs
deleted file mode 100644
index c7fce1921a..0000000000
--- a/ext/attrs/attrs.xs
+++ /dev/null
@@ -1,65 +0,0 @@
-#define PERL_NO_GET_CONTEXT
-#include "EXTERN.h"
-#include "perl.h"
-#include "XSUB.h"
-
-static cv_flags_t
-get_flag(const char *attr)
-{
- if (strnEQ(attr, "method", 6))
- return CVf_METHOD;
- else if (strnEQ(attr, "locked", 6))
- return CVf_LOCKED;
- else
- return 0;
-}
-
-MODULE = attrs PACKAGE = attrs
-
-void
-import(...)
- ALIAS:
- unimport = 1
- PREINIT:
- int i;
- PPCODE:
- if (items < 1)
- Perl_croak(aTHX_ "Usage: %s(Class, ...)", GvNAME(CvGV(cv)));
- if (!PL_compcv || !(cv = CvOUTSIDE(PL_compcv)))
- croak("can't set attributes outside a subroutine scope");
- if (ckWARN(WARN_DEPRECATED))
- Perl_warner(aTHX_ packWARN(WARN_DEPRECATED),
- "pragma \"attrs\" is deprecated, "
- "use \"sub NAME : ATTRS\" instead");
- for (i = 1; i < items; i++) {
- const char * const attr = SvPV_nolen(ST(i));
- const cv_flags_t flag = get_flag(attr);
- if (!flag)
- croak("invalid attribute name %s", attr);
- if (ix)
- CvFLAGS(cv) &= ~flag;
- else
- CvFLAGS(cv) |= flag;
- }
-
-void
-get(sub)
-SV * sub
- PPCODE:
- if (SvROK(sub)) {
- sub = SvRV(sub);
- if (SvTYPE(sub) != SVt_PVCV)
- sub = Nullsv;
- }
- else {
- STRLEN len;
- const char * const name = SvPV(sub, len);
- sub = (SV*)get_cvn_flags(name, len, SvUTF8(sub));
- }
- if (!sub)
- croak("invalid subroutine reference or name");
- if (CvFLAGS(sub) & CVf_METHOD)
- XPUSHs(sv_2mortal(newSVpvn("method", 6)));
- if (CvFLAGS(sub) & CVf_LOCKED)
- XPUSHs(sv_2mortal(newSVpvn("locked", 6)));
-
diff --git a/ext/attrs/t/attrs.t b/ext/attrs/t/attrs.t
deleted file mode 100644
index 18a02aba84..0000000000
--- a/ext/attrs/t/attrs.t
+++ /dev/null
@@ -1,141 +0,0 @@
-#!./perl
-
-# Regression tests for attrs.pm and the C<sub x : attrs> syntax.
-
-BEGIN {
- chdir 't' if -d 't';
- @INC = '../lib';
- eval 'require attrs; 1' or do {
- print "1..0\n";
- exit 0;
- }
-}
-
-use warnings;
-no warnings qw(deprecated); # else attrs cries.
-
-sub NTESTS () ;
-
-my ($test, $ntests);
-BEGIN {$ntests=0}
-$test=0;
-my $failed = 0;
-
-print "1..".NTESTS."\n";
-
-eval 'sub t1 ($) { use attrs "locked"; $_[0]++ }';
-(print "not "), $failed=1 if $@;
-print "ok ",++$test,"\n";
-BEGIN {++$ntests}
-
-eval 'sub t2 { use attrs "locked"; $_[0]++ }';
-(print "not "), $failed=1 if $@;
-print "ok ",++$test,"\n";
-BEGIN {++$ntests}
-
-eval 'sub t3 ($) : locked ;';
-(print "not "), $failed=1 if $@;
-print "ok ",++$test,"\n";
-BEGIN {++$ntests}
-
-eval 'sub t4 : locked ;';
-(print "not "), $failed=1 if $@;
-print "ok ",++$test,"\n";
-BEGIN {++$ntests}
-
-my $anon1;
-eval '$anon1 = sub ($) { use attrs qw(locked method); $_[0]++ }';
-(print "not "), $failed=1 if $@;
-print "ok ",++$test,"\n";
-BEGIN {++$ntests}
-
-my $anon2;
-eval '$anon2 = sub { use attrs qw(locked method); $_[0]++ }';
-(print "not "), $failed=1 if $@;
-print "ok ",++$test,"\n";
-BEGIN {++$ntests}
-
-my $anon3;
-eval '$anon3 = sub { use attrs "method"; $_[0]->[1] }';
-(print "not "), $failed=1 if $@;
-print "ok ",++$test,"\n";
-BEGIN {++$ntests}
-
-my @attrs = attrs::get($anon3 ? $anon3 : \&ns);
-(print "not "), $failed=1 unless "@attrs" eq "method";
-print "ok ",++$test,"\n";
-BEGIN {++$ntests}
-
-@attrs = sort +attrs::get($anon2 ? $anon2 : \&ns);
-(print "not "), $failed=1 unless "@attrs" eq "locked method";
-print "ok ",++$test,"\n";
-BEGIN {++$ntests}
-
-@attrs = sort +attrs::get($anon1 ? $anon1 : \&ns);
-(print "not "), $failed=1 unless "@attrs" eq "locked method";
-print "ok ",++$test,"\n";
-BEGIN {++$ntests}
-
-eval 'sub e1 ($) : plugh ;';
-unless ($@ && $@ =~ m/^Invalid CODE attribute: ["']?plugh["']? at/) {
- my $x = $@;
- $x =~ s/\n.*\z//s;
- print "# $x\n";
- print "not ";
- $failed = 1;
-}
-print "ok ",++$test,"\n";
-BEGIN {++$ntests}
-
-eval 'sub e2 ($) : plugh(0,0) xyzzy ;';
-unless ($@ && $@ =~ m/^Invalid CODE attributes: ["']?plugh\(0,0\)["']? /) {
- my $x = $@;
- $x =~ s/\n.*\z//s;
- print "# $x\n";
- print "not ";
- $failed = 1;
-}
-print "ok ",++$test,"\n";
-BEGIN {++$ntests}
-
-eval 'sub e3 ($) : plugh(0,0 xyzzy ;';
-unless ($@ && $@ =~ m/Unterminated attribute parameter in attribute list at/) {
- my $x = $@;
- $x =~ s/\n.*\z//s;
- print "# $x\n";
- print "not ";
- $failed = 1;
-}
-print "ok ",++$test,"\n";
-BEGIN {++$ntests}
-
-eval 'sub e4 ($) : plugh + xyzzy ;';
-unless ($@ && $@ =~ m/Invalid separator character '[+]' in attribute list at/) {
- my $x = $@;
- $x =~ s/\n.*\z//s;
- print "# $x\n";
- print "not ";
- $failed = 1;
-}
-print "ok ",++$test,"\n";
-BEGIN {++$ntests}
-
-{
- my $w = "" ;
- local $SIG{__WARN__} = sub {$w = shift} ;
- eval 'sub w1 ($) { use warnings "deprecated"; use attrs "locked"; $_[0]++ }';
- (print "not "), $failed=1 if $@;
- print "ok ",++$test,"\n";
- BEGIN {++$ntests}
- (print "not "), $failed=1
- if $w !~ /^pragma "attrs" is deprecated, use "sub NAME : ATTRS" instead at/;
- print "ok ",++$test,"\n";
- BEGIN {++$ntests}
-}
-
-
-# Other tests should be added above this line
-
-sub NTESTS () { $ntests }
-
-exit $failed;
diff --git a/ext/mro/Makefile.PL b/ext/mro/Makefile.PL
deleted file mode 100644
index 8ccd8873fb..0000000000
--- a/ext/mro/Makefile.PL
+++ /dev/null
@@ -1,10 +0,0 @@
-use 5.010000;
-use ExtUtils::MakeMaker;
-# See lib/ExtUtils/MakeMaker.pm for details of how to influence
-# the contents of the Makefile that is written.
-WriteMakefile(
- NAME => 'mro',
- VERSION_FROM => 'mro.pm', # finds $VERSION
- ABSTRACT_FROM => 'mro.pm', # retrieve abstract from module
- MAN3PODS => {},
- AUTHOR => 'Brandon L. Black <blblack@gmail.com>');
diff --git a/ext/mro/mro.xs b/ext/mro/mro.xs
index 3d343d4830..1208c6ca05 100644
--- a/ext/mro/mro.xs
+++ b/ext/mro/mro.xs
@@ -202,13 +202,23 @@ S_mro_get_linear_isa_c3(pTHX_ HV* stash, U32 level)
/* If we had candidates, but nobody won, then the @ISA
hierarchy is not C3-incompatible */
if(!winner) {
+ SV *errmsg;
+ I32 i;
+
+ errmsg = newSVpvf("Inconsistent hierarchy during C3 merge of class '%s':\n\t"
+ "current merge results [\n", HEK_KEY(stashhek));
+ for (i = 0; i <= av_len(retval); i++) {
+ SV **elem = av_fetch(retval, i, 0);
+ sv_catpvf(errmsg, "\t\t%"SVf",\n", SVfARG(*elem));
+ }
+ sv_catpvf(errmsg, "\t]\n\tmerging failed on '%"SVf"'", SVfARG(cand));
+
/* we have to do some cleanup before we croak */
SvREFCNT_dec(retval);
Safefree(heads);
- Perl_croak(aTHX_ "Inconsistent hierarchy during C3 merge of class '%s': "
- "merging failed on parent '%"SVf"'", HEK_KEY(stashhek), SVfARG(cand));
+ Perl_croak(aTHX_ "%"SVf, SVfARG(errmsg));
}
}
}
diff --git a/ext/re/Makefile.PL b/ext/re/Makefile.PL
index f00f4122dd..dbc414243f 100644
--- a/ext/re/Makefile.PL
+++ b/ext/re/Makefile.PL
@@ -9,7 +9,6 @@ my $defines = '-DPERL_EXT_RE_BUILD -DPERL_EXT_RE_DEBUG -DPERL_EXT';
WriteMakefile(
NAME => 're',
VERSION_FROM => 're.pm',
- MAN3PODS => {}, # Pods will be built by installman.
XSPROTOARG => '-noprototypes',
OBJECT => $object,
DEFINE => $defines,
diff --git a/ext/threads-shared/Makefile.PL b/ext/threads-shared/Makefile.PL
index 2626ad6525..78566171db 100755
--- a/ext/threads-shared/Makefile.PL
+++ b/ext/threads-shared/Makefile.PL
@@ -46,11 +46,7 @@ sub have_cc
# Build options for different environments
my @conditional_params;
-if (grep { $_ eq 'PERL_CORE=1' } @ARGV) {
- # Core
- push(@conditional_params, 'MAN3PODS' => {});
-
-} else {
+if (not grep { $_ eq 'PERL_CORE=1' } @ARGV) {
# CPAN
# Verify that a 'C' compiler is available
diff --git a/ext/threads/Makefile.PL b/ext/threads/Makefile.PL
index 908a4145d3..b251797a42 100755
--- a/ext/threads/Makefile.PL
+++ b/ext/threads/Makefile.PL
@@ -46,11 +46,7 @@ sub have_cc
# Build options for different environments
my @conditional_params;
-if (grep { $_ eq 'PERL_CORE=1' } @ARGV) {
- # Core
- push(@conditional_params, 'MAN3PODS' => {},
- 'NORECURS' => 1);
-} else {
+if (not grep { $_ eq 'PERL_CORE=1' } @ARGV) {
# CPAN
# Verify that a 'C' compiler is available
diff --git a/gv.c b/gv.c
index 65419bdfef..c22f73aa65 100644
--- a/gv.c
+++ b/gv.c
@@ -103,11 +103,6 @@ Perl_gv_IOadd(pTHX_ register GV *gv)
}
if (!GvIOp(gv)) {
-#ifdef GV_UNIQUE_CHECK
- if (GvUNIQUE(gv)) {
- Perl_croak(aTHX_ "Bad symbol for filehandle (GV is unique)");
- }
-#endif
GvIOp(gv) = newIO();
}
return gv;
@@ -1983,6 +1978,7 @@ Perl_amagic_call(pTHX_ SV *left, SV *right, int method, int flags)
break;
case int_amg:
case iter_amg: /* XXXX Eventually should do to_gv. */
+ case ftest_amg: /* XXXX Eventually should do to_gv. */
/* FAIL safe */
return NULL; /* Delegate operation to standard mechanisms. */
break;
diff --git a/gv.h b/gv.h
index 85b03800f5..b58d235711 100644
--- a/gv.h
+++ b/gv.h
@@ -166,16 +166,6 @@ Return the SV from the GV.
#define GvIN_PAD_on(gv) (GvFLAGS(gv) |= GVf_IN_PAD)
#define GvIN_PAD_off(gv) (GvFLAGS(gv) &= ~GVf_IN_PAD)
-#define GvUNIQUE(gv) 0
-#define GvUNIQUE_on(gv) NOOP
-#define GvUNIQUE_off(gv) NOOP
-
-#ifdef USE_ITHREADS
-#define GV_UNIQUE_CHECK
-#else
-#undef GV_UNIQUE_CHECK
-#endif
-
#ifndef PERL_CORE
# define Nullgv Null(GV*)
#endif
diff --git a/handy.h b/handy.h
index 75080cb641..9e8f50a30b 100644
--- a/handy.h
+++ b/handy.h
@@ -48,6 +48,15 @@ Null SV pointer. (No longer available when C<PERL_CORE> is defined.)
#define TRUE (1)
#define FALSE (0)
+/* The MUTABLE_*() macros cast pointers to the types shown, in such a way
+ * (compiler permitting) that casting away const-ness will give a warning;
+ * e.g.:
+ *
+ * const SV *sv = ...;
+ * AV *av1 = (AV*)sv; <== BAD: the const has been silently cast away
+ * AV *av2 = MUTABLE_AV(sv); <== GOOD: it may warn
+ */
+
#if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
# define MUTABLE_PTR(p) ({ void *_p = (p); _p; })
#else
@@ -188,18 +197,15 @@ typedef U64TYPE U64;
# endif
#endif
-/* HMB H.Merijn Brand - a placeholder for preparing Configure patches */
-#if defined(HAS_PSEUDOFORK) && defined(USE_DTRACE)
-#if defined(LOCALTIME_R_NEEDS_TZSET) && defined(HAS_TIMEGM)
-#if defined(GMTIME_MAX) && defined(GMTIME_MIN) && defined(LOCALTIME_MAX) && defined(LOCALTIME_MIN)
-#if defined(HAS_CTIME64) && defined(HAS_LOCALTIME64) && defined(HAS_GMTIME64)
-#if defined(HAS_MKTIME64) && defined(HAS_DIFFTIME64) && defined(HAS_ASCTIME64)
-/* Not (yet) used at top level, but mention them for metaconfig */
-#endif
-#endif
-#endif
-#endif
-#endif
+/* HMB H.Merijn Brand - a placeholder for preparing Configure patches:
+ *
+ * USE_DTRACE HAS_PSEUDOFORK HAS_TIMEGM LOCALTIME_R_NEEDS_TZSET
+ * GMTIME_MAX GMTIME_MIN LOCALTIME_MAX LOCALTIME_MIN
+ * HAS_CTIME64 HAS_LOCALTIME64 HAS_GMTIME64 HAS_DIFFTIME64
+ * HAS_MKTIME64 HAS_ASCTIME64 HAS_GETADDRINFO HAS_GETNAMEINFO
+ * HAS_INETNTOP HAS_INETPTON
+ * Not (yet) used at top level, but mention them for metaconfig
+ */
/* Mention I8SIZE, U8SIZE, I16SIZE, U16SIZE, I32SIZE, U32SIZE,
I64SIZE, and U64SIZE here so that metaconfig pulls them in. */
diff --git a/hints/aix.sh b/hints/aix.sh
index 20c353c79d..26737fe7be 100644
--- a/hints/aix.sh
+++ b/hints/aix.sh
@@ -533,4 +533,9 @@ EOF
;;
esac
+# remove libbsd.a from wanted libraries
+libswanted=`echo " $libswanted " | sed -e 's/ bsd / /'`
+libswanted=`echo " $libswanted " | sed -e 's/ BSD / /'`
+d_flock='undef'
+
# EOF
diff --git a/hints/cygwin.sh b/hints/cygwin.sh
index f411c6dcab..3d6ea8d4f8 100644
--- a/hints/cygwin.sh
+++ b/hints/cygwin.sh
@@ -73,3 +73,7 @@ lddlflags="$lddlflags $ldflags"
#ldflags="$ldflags -s"
#ccdlflags="$ccdlflags -s"
#lddlflags="$lddlflags -s"
+
+# IPv6 not fully implemented under Cygwin
+d_inetntop='undef'
+d_inetpton='undef'
diff --git a/hints/qnx.sh b/hints/qnx.sh
index 3ef2f32afe..473815cae5 100644
--- a/hints/qnx.sh
+++ b/hints/qnx.sh
@@ -242,7 +242,7 @@ if [ "$osname" = "qnx" ]; then
else
# $^O eq nto
- ccflags='-DDLOPEN_WONT_DO_RELATIVE_PATHS'
+ ccflags='-U__STRICT_ANSI__'
# Options required to get dynamic linking to work
lddlflags='-shared'
@@ -259,7 +259,10 @@ else
# If we use perl's malloc, it dies with an invalid sbrk.
# This is probably worth tracking down someday.
usemymalloc='false'
+
+ libswanted=`echo " $libswanted "| sed 's/ malloc / /'`
- # crypt isn't detected in the C library even though it's there.
- d_crypt='define'
+ # Some routines are only in our static libc.
+ # eg crypt() getlogin() getlogin_r()
+ usenm=false
fi
diff --git a/hints/uwin.sh b/hints/uwin.sh
index a0d3556581..5e50179e9f 100644
--- a/hints/uwin.sh
+++ b/hints/uwin.sh
@@ -32,7 +32,7 @@
#b # compile/link flags
#b ldflags=-g
#b optimize=-g
-#b static_ext="B Data/Dumper Digest/MD5 Errno Fcntl Filter::Util::Call IO IPC/SysV MIME::Base64 Opcode PerlIO::scalar POSIX SDBM_File Socket Storable Unicode::Normalize attrs re"
+#b static_ext="B Data/Dumper Digest/MD5 Errno Fcntl Filter::Util::Call IO IPC/SysV MIME::Base64 Opcode PerlIO::scalar POSIX SDBM_File Socket Storable Unicode::Normalize attributes re"
#b #static_ext=none
#b # dynamic loading needs work
#b usedl=undef
@@ -109,7 +109,7 @@ optimize=-g
# Original, with :: separators, cause make to choke.
# No longer seems to be necessary at all.
-# static_ext="B Data/Dumper Digest/MD5 Errno Fcntl Filter/Util/Call IO IPC/SysV MIME/Base64 Opcode PerlIO/scalar POSIX SDBM_File Socket Storable Unicode/Normalize attrs re"
+# static_ext="B Data/Dumper Digest/MD5 Errno Fcntl Filter/Util/Call IO IPC/SysV MIME/Base64 Opcode PerlIO/scalar POSIX SDBM_File Socket Storable Unicode/Normalize attributes re"
# perl malloc will not work
usemymalloc=n
diff --git a/hints/vmesa.sh b/hints/vmesa.sh
index faebd457ff..430ded9c48 100644
--- a/hints/vmesa.sh
+++ b/hints/vmesa.sh
@@ -322,7 +322,7 @@ sig_num_init='0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,2
sizetype='size_t'
so='.a'
ssizetype='ssize_t'
-static_ext='Data/Dumper Digest/MD5 Fcntl Filter/Util/Call GDBM_File IO IPC/SysV List/Util MIME/Base64 NDBM_File Opcode PerlIO/scalar POSIX Socket Storable Time/HiRes Time/Piece attrs re'
+static_ext='Data/Dumper Digest/MD5 Fcntl Filter/Util/Call GDBM_File IO IPC/SysV List/Util MIME/Base64 NDBM_File Opcode PerlIO/scalar POSIX Socket Storable Time/HiRes Time/Piece attributes re'
stdchar='char'
stdio_cnt='(fp)->__countIn'
stdio_ptr='(fp)->__bufPtr'
diff --git a/hv.c b/hv.c
index 79f59730a9..e3dee46de1 100644
--- a/hv.c
+++ b/hv.c
@@ -134,11 +134,15 @@ Perl_free_tied_hv_pool(pTHX)
HEK *
Perl_hek_dup(pTHX_ HEK *source, CLONE_PARAMS* param)
{
- HEK *shared = (HEK*)ptr_table_fetch(PL_ptr_table, source);
+ HEK *shared;
PERL_ARGS_ASSERT_HEK_DUP;
PERL_UNUSED_ARG(param);
+ if (!source)
+ return NULL;
+
+ shared = (HEK*)ptr_table_fetch(PL_ptr_table, source);
if (shared) {
/* We already shared this hash key. */
(void)share_hek_hek(shared);
diff --git a/installperl b/installperl
index a3657efa63..06121e0f3b 100755
--- a/installperl
+++ b/installperl
@@ -746,7 +746,7 @@ sub installlib {
return if $name eq 'ExtUtils/XSSymSet.pm' and !$Is_VMS;
my $installlib = $installprivlib;
- if ($dir =~ /^auto/ ||
+ if ($dir =~ /^auto\// ||
($name =~ /^(.*)\.(?:pm|pod)$/ && $archpms{$1}) ||
($name =~ /^(.*)\.(?:h|lib)$/i && ($Is_W32 || $Is_NetWare)) ||
$name=~/^Config_(heavy\|git)\.pl\z/
diff --git a/lib/.gitignore b/lib/.gitignore
index cfe8ea1a68..2eec343346 100644
--- a/lib/.gitignore
+++ b/lib/.gitignore
@@ -74,7 +74,7 @@
/Unicode/Normalize.pm
/XS
/XSLoader.pm
-/attrs.pm
+/attributes.pm
/auto
/encoding.pm
/lib.pm
diff --git a/lib/Archive/Extract.pm b/lib/Archive/Extract.pm
index c83f581629..b4b40f1dd2 100644
--- a/lib/Archive/Extract.pm
+++ b/lib/Archive/Extract.pm
@@ -41,7 +41,7 @@ use vars qw[$VERSION $PREFER_BIN $PROGRAMS $WARN $DEBUG
$_ALLOW_BIN $_ALLOW_PURE_PERL
];
-$VERSION = '0.31_02';
+$VERSION = '0.31_03';
$PREFER_BIN = 0;
$WARN = 1;
$DEBUG = 0;
@@ -637,12 +637,19 @@ sub have_old_bunzip2 {
$self->bin_tar, '-tf', '-'] :
[$self->bin_tar, @ExtraTarFlags, '-tf', $self->archive];
- ### run the command ###
- my $buffer = '';
- unless( scalar run( command => $cmd,
+ ### run the command
+ ### newer versions of 'tar' (1.21 and up) now print record size
+ ### to STDERR as well if v OR t is given (used to be both). This
+ ### is a 'feature' according to the changelog, so we must now only
+ ### inspect STDOUT, otherwise, failures like these occur:
+ ### nntp.perl.org/group/perl.cpan.testers/2009/02/msg3230366.html
+ my $buffer = '';
+ my @out = run( command => $cmd,
buffer => \$buffer,
- verbose => $DEBUG )
- ) {
+ verbose => $DEBUG );
+
+ ### command was unsuccessful
+ unless( $out[0] ) {
return $self->_error(loc(
"Error listing contents of archive '%1': %2",
$self->archive, $buffer ));
@@ -665,7 +672,8 @@ sub have_old_bunzip2 {
\s+ [\d,.]+ \s tape \s blocks
|x ? $1 : $_);
- } split $/, $buffer;
+ ### only STDOUT, see above
+ } map { split $/, $_ } @{$out[3]};
### store the files that are in the archive ###
$self->files(\@files);
diff --git a/lib/Archive/Tar.pm b/lib/Archive/Tar.pm
index db46367476..b504881ea0 100644
--- a/lib/Archive/Tar.pm
+++ b/lib/Archive/Tar.pm
@@ -27,11 +27,11 @@ use vars qw[$DEBUG $error $VERSION $WARN $FOLLOW_SYMLINK $CHOWN $CHMOD
];
@ISA = qw[Exporter];
-@EXPORT = ( COMPRESS_GZIP, COMPRESS_BZIP );
+@EXPORT = qw[ COMPRESS_GZIP COMPRESS_BZIP ];
$DEBUG = 0;
$WARN = 1;
$FOLLOW_SYMLINK = 0;
-$VERSION = "1.44";
+$VERSION = "1.48";
$CHOWN = 1;
$CHMOD = 1;
$DO_NOT_USE_PREFIX = 0;
@@ -68,8 +68,8 @@ Archive::Tar - module for manipulations of tar archives
$tar->rename('oldname', 'new/file/name');
$tar->write('files.tar'); # plain tar
- $tar->write('files.tgz', COMPRESSED_GZIP); # gzip compressed
- $tar->write('files.tbz', COMPRESSED_BZIP); # bzip2 compressed
+ $tar->write('files.tgz', COMPRESS_GZIP); # gzip compressed
+ $tar->write('files.tbz', COMPRESS_BZIP); # bzip2 compressed
=head1 DESCRIPTION
@@ -323,6 +323,13 @@ sub _read_tar {
$self->_error( qq[Cannot read compressed format in tar-mode] );
return;
}
+
+ ### size is < HEAD, which means a corrupted file, as the minimum
+ ### length is _at least_ HEAD
+ if (length $chunk != HEAD) {
+ $self->_error( qq[Cannot read enough bytes from the tarfile] );
+ return;
+ }
}
### if we can't read in all bytes... ###
@@ -1073,10 +1080,10 @@ to be the C<gzip> compression level (between 1 and 9), but the use of
constants is prefered:
# write a gzip compressed file
- $tar->write( 'out.tgz', COMPRESSION_GZIP );
+ $tar->write( 'out.tgz', COMPRESS_GZIP );
# write a bzip compressed file
- $tar->write( 'out.tbz', COMPRESSION_BZIP );
+ $tar->write( 'out.tbz', COMPRESS_BZIP );
Note that when you pass in a filehandle, the compression argument
is ignored, as all files are printed verbatim to your filehandle.
@@ -1503,10 +1510,10 @@ to be the C<gzip> compression level (between 1 and 9), but the use of
constants is prefered:
# write a gzip compressed file
- Archive::Tar->create_archive( 'out.tgz', COMPRESSION_GZIP, @filelist );
+ Archive::Tar->create_archive( 'out.tgz', COMPRESS_GZIP, @filelist );
# write a bzip compressed file
- Archive::Tar->create_archive( 'out.tbz', COMPRESSION_BZIP, @filelist );
+ Archive::Tar->create_archive( 'out.tbz', COMPRESS_BZIP, @filelist );
Note that when you pass in a filehandle, the compression argument
is ignored, as all files are printed verbatim to your filehandle.
diff --git a/lib/Archive/Tar/File.pm b/lib/Archive/Tar/File.pm
index ead236fdee..ee5e120be4 100644
--- a/lib/Archive/Tar/File.pm
+++ b/lib/Archive/Tar/File.pm
@@ -492,7 +492,14 @@ sub validate {
### don't know why this one is different from the one we /write/ ###
substr ($raw, 148, 8) = " ";
- return unpack ("%16C*", $raw) == $self->chksum ? 1 : 0;
+
+ ### bug #43513: [PATCH] Accept wrong checksums from SunOS and HP-UX tar
+ ### like GNU tar does. See here for details:
+ ### http://www.gnu.org/software/tar/manual/tar.html#SEC139
+ ### so we do both a signed AND unsigned validate. if one succeeds, that's
+ ### good enough
+ return ( (unpack ("%16C*", $raw) == $self->chksum)
+ or (unpack ("%16c*", $raw) == $self->chksum)) ? 1 : 0;
}
=head2 $bool = $file->has_content
diff --git a/lib/Archive/Tar/t/04_resolved_issues.t b/lib/Archive/Tar/t/04_resolved_issues.t
index eba271f8d2..9bb3d33f03 100644
--- a/lib/Archive/Tar/t/04_resolved_issues.t
+++ b/lib/Archive/Tar/t/04_resolved_issues.t
@@ -149,6 +149,45 @@ use_ok( $FileClass );
### and clean up
unless( $NO_UNLINK ) { 1 while unlink $out_file };
}
+}
+
+### bug #43513: [PATCH] Accept wrong checksums from SunOS and HP-UX tar
+### like GNU tar does. See here for details:
+### http://www.gnu.org/software/tar/manual/tar.html#SEC139
+{ ok( 1, "Testing bug 43513" );
+
+ my $src = File::Spec->catfile( qw[src header signed.tar] );
+ my $tar = $Class->new;
+ isa_ok( $tar, $Class, " Object" );
+ ok( $tar->read( $src ), " Read non-Posix file with signed Checksum" );
+
+ for my $file ( $tar->get_files ) {
+ ok( $file, " File object retrieved" );
+ ok( $file->validate, " File validates" );
+ }
+}
+### return error properly on corrupted archives
+### Addresses RT #44680: Improve error reporting on short corrupted archives
+{ ok( 1, "Testing bug 44680" );
+
+ { ### XXX whitebox test -- resetting the error string
+ no warnings 'once';
+ $Archive::Tar::error = "";
+ }
+
+ my $src = File::Spec->catfile( qw[src short b] );
+ my $tar = $Class->new;
+
+ isa_ok( $tar, $Class, " Object" );
+
+
+ ### we quell the error on STDERR
+ local $Archive::Tar::WARN = 0;
+
+ ok( !$tar->read( $src ), " No files in the corrupted archive" );
+ like( $tar->error, qr/enough bytes/,
+ " Expected error reported" );
}
+
diff --git a/lib/Archive/Tar/t/src/header/signed.tar.packed b/lib/Archive/Tar/t/src/header/signed.tar.packed
new file mode 100644
index 0000000000..1fa99b3088
--- /dev/null
+++ b/lib/Archive/Tar/t/src/header/signed.tar.packed
@@ -0,0 +1,243 @@
+#########################################################################
+This is a binary file that was packed with the 'uupacktool.pl' which
+is included in the Perl distribution.
+
+To unpack this file use the following command:
+
+ uupacktool.pl -u lib/Archive/Tar/t/src/header/signed.tar.packed lib/Archive/Tar/t/src/header/signed.tar
+
+To recreate it use the following command:
+
+ uupacktool.pl -p lib/Archive/Tar/t/src/header/signed.tar lib/Archive/Tar/t/src/header/signed.tar.packed
+
+Created at Tue Apr 21 11:50:41 2009
+#########################################################################
+__UU__
+MPZ3#I,.D````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````#`P,#8P,"``,3,S-#8W(``P,C,T,C`@`#`P,#`P,#`P,#`U
+M(#$Q,34P,S(V-#(R(#`Q,#0V,2``,```````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````!U<W1A<@`P,&YT>6YI
+M````````````````````````````````````871K;W,`````````````````
+M```````````````````P,#`P,#`@`#`P,#`P,"``````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````!T97-T"@``````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+9````````````````````````````````````
diff --git a/lib/Archive/Tar/t/src/linktest/linktest_missing_dir.tar.packed b/lib/Archive/Tar/t/src/linktest/linktest_missing_dir.tar.packed
index afaba77c6a..897641e440 100644
--- a/lib/Archive/Tar/t/src/linktest/linktest_missing_dir.tar.packed
+++ b/lib/Archive/Tar/t/src/linktest/linktest_missing_dir.tar.packed
@@ -10,7 +10,7 @@ To recreate it use the following command:
uupacktool.pl -p lib/Archive/Tar/t/src/linktest/linktest_missing_dir.tar lib/Archive/Tar/t/src/linktest/linktest_missing_dir.tar.packed
-Created at Tue Jan 20 14:58:16 2009
+Created at Tue Apr 21 11:50:42 2009
#########################################################################
__UU__
M;&EN:W1E<W0O;&EN:P``````````````````````````````````````````
diff --git a/lib/Archive/Tar/t/src/linktest/linktest_with_dir.tar.packed b/lib/Archive/Tar/t/src/linktest/linktest_with_dir.tar.packed
index 30cbed8986..a3dd09877a 100644
--- a/lib/Archive/Tar/t/src/linktest/linktest_with_dir.tar.packed
+++ b/lib/Archive/Tar/t/src/linktest/linktest_with_dir.tar.packed
@@ -10,7 +10,7 @@ To recreate it use the following command:
uupacktool.pl -p lib/Archive/Tar/t/src/linktest/linktest_with_dir.tar lib/Archive/Tar/t/src/linktest/linktest_with_dir.tar.packed
-Created at Tue Jan 20 14:58:16 2009
+Created at Tue Apr 21 11:50:42 2009
#########################################################################
__UU__
M;&EN:W1E<W0O;W)I9R\`````````````````````````````````````````
diff --git a/lib/Archive/Tar/t/src/long/bar.tar.packed b/lib/Archive/Tar/t/src/long/bar.tar.packed
index 7eed4f8196..c06973e83d 100644
--- a/lib/Archive/Tar/t/src/long/bar.tar.packed
+++ b/lib/Archive/Tar/t/src/long/bar.tar.packed
@@ -10,7 +10,7 @@ To recreate it use the following command:
uupacktool.pl -p lib/Archive/Tar/t/src/long/bar.tar lib/Archive/Tar/t/src/long/bar.tar.packed
-Created at Tue Jan 20 14:58:17 2009
+Created at Tue Apr 21 11:50:42 2009
#########################################################################
__UU__
M8P``````````````````````````````````````````````````````````
diff --git a/lib/Archive/Tar/t/src/long/foo.tbz.packed b/lib/Archive/Tar/t/src/long/foo.tbz.packed
index 418c0bc986..8ca9f69217 100644
--- a/lib/Archive/Tar/t/src/long/foo.tbz.packed
+++ b/lib/Archive/Tar/t/src/long/foo.tbz.packed
@@ -10,7 +10,7 @@ To recreate it use the following command:
uupacktool.pl -p lib/Archive/Tar/t/src/long/foo.tbz lib/Archive/Tar/t/src/long/foo.tbz.packed
-Created at Tue Jan 20 14:58:17 2009
+Created at Tue Apr 21 11:50:42 2009
#########################################################################
__UU__
M0EIH.3%!62936=873NT``9C_A._0`DA``_^`0`0)`._OGJ```40(,`%X9`8`
diff --git a/lib/Archive/Tar/t/src/long/foo.tgz.packed b/lib/Archive/Tar/t/src/long/foo.tgz.packed
index 05088ae47a..e481ec5794 100644
--- a/lib/Archive/Tar/t/src/long/foo.tgz.packed
+++ b/lib/Archive/Tar/t/src/long/foo.tgz.packed
@@ -10,7 +10,7 @@ To recreate it use the following command:
uupacktool.pl -p lib/Archive/Tar/t/src/long/foo.tgz lib/Archive/Tar/t/src/long/foo.tgz.packed
-Created at Tue Jan 20 14:58:17 2009
+Created at Tue Apr 21 11:50:42 2009
#########################################################################
__UU__
M'XL(`````````^W72VZ#,!`&8*]S"BY`F,$/MCT`ET")25`<D"A1Q.UKR*M1
diff --git a/lib/Archive/Tar/t/src/short/bar.tar.packed b/lib/Archive/Tar/t/src/short/bar.tar.packed
index 5cad23543e..f507bbb1f8 100644
--- a/lib/Archive/Tar/t/src/short/bar.tar.packed
+++ b/lib/Archive/Tar/t/src/short/bar.tar.packed
@@ -10,7 +10,7 @@ To recreate it use the following command:
uupacktool.pl -p lib/Archive/Tar/t/src/short/bar.tar lib/Archive/Tar/t/src/short/bar.tar.packed
-Created at Tue Jan 20 14:58:17 2009
+Created at Tue Apr 21 11:50:42 2009
#########################################################################
__UU__
M8P``````````````````````````````````````````````````````````
diff --git a/lib/Archive/Tar/t/src/short/foo.tbz.packed b/lib/Archive/Tar/t/src/short/foo.tbz.packed
index 3443d12935..7fcb8ec301 100644
--- a/lib/Archive/Tar/t/src/short/foo.tbz.packed
+++ b/lib/Archive/Tar/t/src/short/foo.tbz.packed
@@ -10,7 +10,7 @@ To recreate it use the following command:
uupacktool.pl -p lib/Archive/Tar/t/src/short/foo.tbz lib/Archive/Tar/t/src/short/foo.tbz.packed
-Created at Tue Jan 20 14:58:17 2009
+Created at Tue Apr 21 11:50:42 2009
#########################################################################
__UU__
M0EIH.3%!62936>GH,8X``)O[A.90`D!``'^```#O*1X```%`""``E(*JGDA#
diff --git a/lib/Archive/Tar/t/src/short/foo.tgz.packed b/lib/Archive/Tar/t/src/short/foo.tgz.packed
index ae190a779c..61827fe4ba 100644
--- a/lib/Archive/Tar/t/src/short/foo.tgz.packed
+++ b/lib/Archive/Tar/t/src/short/foo.tgz.packed
@@ -10,7 +10,7 @@ To recreate it use the following command:
uupacktool.pl -p lib/Archive/Tar/t/src/short/foo.tgz lib/Archive/Tar/t/src/short/foo.tgz.packed
-Created at Tue Jan 20 14:58:17 2009
+Created at Tue Apr 21 11:50:42 2009
#########################################################################
__UU__
M'XL(`````````^W300K",!"%X5GW%#G"3-JFYREJ080NJKU_A^A"$.RJ(\+_
diff --git a/lib/CGI.pm b/lib/CGI.pm
index 21d74c0eed..61118bdd87 100644
--- a/lib/CGI.pm
+++ b/lib/CGI.pm
@@ -18,8 +18,8 @@ use Carp 'croak';
# The most recent version and complete docs are available at:
# http://stein.cshl.org/WWW/software/CGI/
-$CGI::revision = '$Id: CGI.pm,v 1.260 2008/09/08 14:13:23 lstein Exp $';
-$CGI::VERSION='3.42';
+$CGI::revision = '$Id: CGI.pm,v 1.263 2009/02/11 16:56:37 lstein Exp $';
+$CGI::VERSION='3.43';
# HARD-CODED LOCATION FOR FILE UPLOAD TEMPORARY FILES.
# UNCOMMENT THIS ONLY IF YOU KNOW WHAT YOU'RE DOING.
@@ -294,10 +294,10 @@ sub import {
# To allow overriding, search through the packages
# Till we find one in which the correct subroutine is defined.
my @packages = ($self,@{"$self\:\:ISA"});
- foreach $sym (keys %EXPORT) {
+ for $sym (keys %EXPORT) {
my $pck;
my $def = ${"$self\:\:AutoloadClass"} || $DefaultClass;
- foreach $pck (@packages) {
+ for $pck (@packages) {
if (defined(&{"$pck\:\:$sym"})) {
$def = $pck;
last;
@@ -317,7 +317,7 @@ sub expand_tags {
return ("start_$1","end_$1") if $tag=~/^(?:\*|start_|end_)(.+)/;
my(@r);
return ($tag) unless $EXPORT_TAGS{$tag};
- foreach (@{$EXPORT_TAGS{$tag}}) {
+ for (@{$EXPORT_TAGS{$tag}}) {
push(@r,&expand_tags($_));
}
return @r;
@@ -381,7 +381,7 @@ sub new {
sub DESTROY {
my $self = shift;
if ($OS eq 'WINDOWS') {
- foreach my $href (values %{$self->{'.tmpfiles'}}) {
+ for my $href (values %{$self->{'.tmpfiles'}}) {
$href->{hndl}->DESTROY if defined $href->{hndl};
$href->{name}->DESTROY if defined $href->{name};
}
@@ -433,7 +433,7 @@ sub param {
if (substr($p[0],0,1) eq '-') {
@values = defined($value) ? (ref($value) && ref($value) eq 'ARRAY' ? @{$value} : $value) : ();
} else {
- foreach ($value,@other) {
+ for ($value,@other) {
push(@values,$_) if defined($_);
}
}
@@ -488,7 +488,7 @@ sub self_or_CGI {
# Initialize the query object from the environment.
# If a parameter list is found, this object will be set
-# to an associative array in which parameter names are keys
+# to a hash in which parameter names are keys
# and the values are stored as lists
# If a keyword list is found, this method creates a bogus
# parameter list with the single parameter 'keywords'.
@@ -603,7 +603,7 @@ sub init {
last METHOD;
}
if (ref($initializer) && ref($initializer) eq 'HASH') {
- foreach (keys %$initializer) {
+ for (keys %$initializer) {
$self->param('-name'=>$_,'-value'=>$initializer->{$_});
}
last METHOD;
@@ -697,9 +697,9 @@ sub init {
$self->delete_all();
}
- # Associative array containing our defined fieldnames
+ # hash containing our defined fieldnames
$self->{'.fieldnames'} = {};
- foreach ($self->param('.cgifields')) {
+ for ($self->param('.cgifields')) {
$self->{'.fieldnames'}->{$_}++;
}
@@ -752,7 +752,7 @@ sub save_request {
# again, we initialize ourselves in exactly the same way. This allows
# us to have several of these objects.
@QUERY_PARAM = $self->param; # save list of parameters
- foreach (@QUERY_PARAM) {
+ for (@QUERY_PARAM) {
next unless defined $_;
$QUERY_PARAM{$_}=$self->{param}{$_};
}
@@ -765,7 +765,7 @@ sub parse_params {
my($self,$tosplit) = @_;
my(@pairs) = split(/[&;]/,$tosplit);
my($param,$value);
- foreach (@pairs) {
+ for (@pairs) {
($param,$value) = split('=',$_,2);
next unless defined $param;
next if $NO_UNDEF_PARAMS and not defined $value;
@@ -899,7 +899,7 @@ sub _setup_symbols {
# to avoid reexporting unwanted variables
undef %EXPORT;
- foreach (@_) {
+ for (@_) {
$HEADERS_ONCE++, next if /^[:-]unique_headers$/;
$NPH++, next if /^[:-]nph$/;
$NOSTICKY++, next if /^[:-]nosticky$/;
@@ -928,7 +928,7 @@ sub _setup_symbols {
next;
}
- foreach (&expand_tags($_)) {
+ for (&expand_tags($_)) {
tr/a-zA-Z0-9_//cd; # don't allow weird function names
$EXPORT{$_}++;
}
@@ -1006,7 +1006,7 @@ sub delete {
my(@names) = rearrange([NAME],@p);
my @to_delete = ref($names[0]) eq 'ARRAY' ? @$names[0] : @names;
my %to_delete;
- foreach my $name (@to_delete)
+ for my $name (@to_delete)
{
CORE::delete $self->{param}{$name};
CORE::delete $self->{'.fieldnames'}->{$name};
@@ -1028,7 +1028,7 @@ sub import_names {
die "Can't import names into \"main\"\n" if \%{"${namespace}::"} == \%::;
if ($delete || $MOD_PERL || exists $ENV{'FCGI_ROLE'}) {
# can anyone find an easier way to do this?
- foreach (keys %{"${namespace}::"}) {
+ for (keys %{"${namespace}::"}) {
local *symbol = "${namespace}::${_}";
undef $symbol;
undef @symbol;
@@ -1036,7 +1036,7 @@ sub import_names {
}
}
my($param,@value,$var);
- foreach $param ($self->param) {
+ for $param ($self->param) {
# protect against silly names
($var = $param)=~tr/a-zA-Z0-9_/_/c;
$var =~ s/^(?=\d)/_/;
@@ -1270,7 +1270,7 @@ sub url_param {
if ($ENV{QUERY_STRING} =~ /=/) {
my(@pairs) = split(/[&;]/,$ENV{QUERY_STRING});
my($param,$value);
- foreach (@pairs) {
+ for (@pairs) {
($param,$value) = split('=',$_,2);
$param = unescape($param);
$value = unescape($value);
@@ -1298,11 +1298,11 @@ sub Dump {
my($param,$value,@result);
return '<ul></ul>' unless $self->param;
push(@result,"<ul>");
- foreach $param ($self->param) {
+ for $param ($self->param) {
my($name)=$self->escapeHTML($param);
push(@result,"<li><strong>$param</strong></li>");
push(@result,"<ul>");
- foreach $value ($self->param($param)) {
+ for $value ($self->param($param)) {
$value = $self->escapeHTML($value);
$value =~ s/\n/<br \/>\n/g;
push(@result,"<li>$value</li>");
@@ -1335,14 +1335,14 @@ sub save {
my($param);
local($,) = ''; # set print field separator back to a sane value
local($\) = ''; # set output line separator to a sane value
- foreach $param ($self->param) {
+ for $param ($self->param) {
my($escaped_param) = escape($param);
my($value);
- foreach $value ($self->param($param)) {
+ for $value ($self->param($param)) {
print $filehandle "$escaped_param=",escape("$value"),"\n";
}
}
- foreach (keys %{$self->{'.fieldnames'}}) {
+ for (keys %{$self->{'.fieldnames'}}) {
print $filehandle ".cgifields=",escape("$_"),"\n";
}
print $filehandle "=\n"; # end of record
@@ -1411,7 +1411,7 @@ sub multipart_start {
# rearrange() was designed for the HTML portion, so we
# need to fix it up a little.
- foreach (@other) {
+ for (@other) {
# Don't use \s because of perl bug 21951
next unless my($header,$value) = /([^ \r\n\t=]+)=\"?(.+?)\"?$/;
($_ = $header) =~ s/^(\w)(.*)/$1 . lc ($2) . ': '.$self->unescapeHTML($value)/e;
@@ -1480,7 +1480,7 @@ sub header {
# rearrange() was designed for the HTML portion, so we
# need to fix it up a little.
- foreach (@other) {
+ for (@other) {
# Don't use \s because of perl bug 21951
next unless my($header,$value) = /([^ \r\n\t=]+)=\"?(.+?)\"?$/;
($_ = $header) =~ s/^(\w)(.*)/"\u$1\L$2" . ': '.$self->unescapeHTML($value)/e;
@@ -1506,7 +1506,7 @@ sub header {
# push all the cookies -- there may be several
if ($cookie) {
my(@cookie) = ref($cookie) && ref($cookie) eq 'ARRAY' ? @{$cookie} : $cookie;
- foreach (@cookie) {
+ for (@cookie) {
my $cs = UNIVERSAL::isa($_,'CGI::Cookie') ? $_->as_string : $_;
push(@header,"Set-Cookie: $cs") if $cs ne '';
}
@@ -1559,7 +1559,7 @@ sub redirect {
$status = '302 Found' unless defined $status;
$url ||= $self->self_url;
my(@o);
- foreach (@other) { tr/\"//d; push(@o,split("=",$_,2)); }
+ for (@other) { tr/\"//d; push(@o,split("=",$_,2)); }
unshift(@o,
'-Status' => $status,
'-Location'=> $url,
@@ -1662,7 +1662,7 @@ sub start_html {
}
if ($meta && ref($meta) && (ref($meta) eq 'HASH')) {
- foreach (keys %$meta) { push(@result,$XHTML ? qq(<meta name="$_" content="$meta->{$_}" />)
+ for (keys %$meta) { push(@result,$XHTML ? qq(<meta name="$_" content="$meta->{$_}" />)
: qq(<meta name="$_" content="$meta->{$_}">)); }
}
@@ -1726,7 +1726,7 @@ sub _style {
if (ref($src) eq "ARRAY") # Check to see if the $src variable is an array reference
{ # If it is, push a LINK tag for each one
- foreach $src (@$src)
+ for $src (@$src)
{
push(@result,$XHTML ? qq(<link rel="$rel" type="$type" href="$src" $other/>)
: qq(<link rel="$rel" type="$type" href="$src"$other>)) if $src;
@@ -1740,10 +1740,10 @@ sub _style {
}
if ($verbatim) {
my @v = ref($verbatim) eq 'ARRAY' ? @$verbatim : $verbatim;
- push(@result, "<style type=\"text/css\">\n$_\n</style>") foreach @v;
+ push(@result, "<style type=\"text/css\">\n$_\n</style>") for @v;
}
my @c = ref($code) eq 'ARRAY' ? @$code : $code if $code;
- push(@result,style({'type'=>$type},"$cdata_start\n$_\n$cdata_end")) foreach @c;
+ push(@result,style({'type'=>$type},"$cdata_start\n$_\n$cdata_end")) for @c;
} else {
my $src = $s;
@@ -1761,7 +1761,7 @@ sub _script {
my (@result);
my (@scripts) = ref($script) eq 'ARRAY' ? @$script : ($script);
- foreach $script (@scripts) {
+ for $script (@scripts) {
my($src,$code,$language);
if (ref($script)) { # script is a hash
($src,$code,$type) =
@@ -2269,7 +2269,7 @@ sub _tableize {
my($row,$column);
unshift(@colheaders,'') if @colheaders && @rowheaders;
$result .= "<tr>" if @colheaders;
- foreach (@colheaders) {
+ for (@colheaders) {
$result .= "<th>$_</th>";
}
for ($row=0;$row<$rows;$row++) {
@@ -2298,7 +2298,7 @@ END_OF_FUNC
# $linebreak -> (optional) Set to true to place linebreaks
# between the buttons.
# $labels -> (optional)
-# A pointer to an associative array of labels to print next to each checkbox
+# A pointer to a hash of labels to print next to each checkbox
# in the form $label{'value'}="Long explanatory label".
# Otherwise the provided values are used as the labels.
# Returns:
@@ -2326,7 +2326,7 @@ END_OF_FUNC
# $linebreak -> (optional) Set to true to place linebreaks
# between the buttons.
# $labels -> (optional)
-# A pointer to an associative array of labels to print next to each checkbox
+# A pointer to a hash of labels to print next to each checkbox
# in the form $label{'value'}="Long explanatory label".
# Otherwise the provided values are used as the labels.
# Returns:
@@ -2380,11 +2380,11 @@ sub _box_group {
# for disabling groups of radio/checkbox buttons
my %disabled;
- foreach (@{$disabled}) {
+ for (@{$disabled}) {
$disabled{$_}=1;
}
- foreach (@values) {
+ for (@values) {
my $disable="";
if ($disabled{$_}) {
$disable="disabled='1'";
@@ -2434,7 +2434,7 @@ END_OF_FUNC
# text of each menu item.
# $default -> (optional) Default item to display
# $labels -> (optional)
-# A pointer to an associative array of labels to print next to each checkbox
+# A pointer to a hash of labels to print next to each checkbox
# in the form $label{'value'}="Long explanatory label".
# Otherwise the provided values are used as the labels.
# Returns:
@@ -2463,7 +2463,7 @@ sub popup_menu {
@values = $self->_set_values_and_labels($values,\$labels,$name);
$tabindex = $self->element_tab($tabindex);
$result = qq/<select name="$name" $tabindex$other>\n/;
- foreach (@values) {
+ for (@values) {
if (/<optgroup/) {
for my $v (split(/\n/)) {
my $selectit = $XHTML ? 'selected="selected"' : 'selected';
@@ -2497,7 +2497,7 @@ END_OF_FUNC
# $values -> A pointer to a regular array containing the
# values for each option line in the group.
# $labels -> (optional)
-# A pointer to an associative array of labels to print next to each item
+# A pointer to a hash of labels to print next to each item
# in the form $label{'value'}="Long explanatory label".
# Otherwise the provided values are used as the labels.
# $labeled -> (optional)
@@ -2524,9 +2524,9 @@ sub optgroup {
$name=$self->escapeHTML($name);
$result = qq/<optgroup label="$name"$other>\n/;
- foreach (@values) {
+ for (@values) {
if (/<optgroup/) {
- foreach (split(/\n/)) {
+ for (split(/\n/)) {
my $selectit = $XHTML ? 'selected="selected"' : 'selected';
s/(value="$selected")/$selectit $1/ if defined $selected;
$result .= "$_\n";
@@ -2564,7 +2564,7 @@ END_OF_FUNC
# $size -> (optional) Size of the list.
# $multiple -> (optional) If set, allow multiple selections.
# $labels -> (optional)
-# A pointer to an associative array of labels to print next to each checkbox
+# A pointer to a hash of labels to print next to each checkbox
# in the form $label{'value'}="Long explanatory label".
# Otherwise the provided values are used as the labels.
# Returns:
@@ -2591,7 +2591,7 @@ sub scrolling_list {
$name=$self->escapeHTML($name);
$tabindex = $self->element_tab($tabindex);
$result = qq/<select name="$name" $tabindex$has_size$is_multiple$other>\n/;
- foreach (@values) {
+ for (@values) {
my($selectit) = $self->_selected($selected{$_});
my($label) = $_;
$label = $labels->{$_} if defined($labels) && defined($labels->{$_});
@@ -2631,7 +2631,7 @@ sub hidden {
@value = ref($default) ? @{$default} : $default;
$do_override = $override;
} else {
- foreach ($default,$override,@other) {
+ for ($default,$override,@other) {
push(@value,$_) if defined($_);
}
}
@@ -2641,7 +2641,7 @@ sub hidden {
@value = @prev if !$do_override && @prev;
$name=$self->escapeHTML($name);
- foreach (@value) {
+ for (@value) {
$_ = defined($_) ? $self->escapeHTML($_,1) : '';
push @result,$XHTML ? qq(<input type="hidden" name="$name" value="$_" @other />)
: qq(<input type="hidden" name="$name" value="$_" @other>);
@@ -2953,15 +2953,15 @@ END_OF_FUNC
sub query_string {
my($self) = self_or_default(@_);
my($param,$value,@pairs);
- foreach $param ($self->param) {
+ for $param ($self->param) {
my($eparam) = escape($param);
- foreach $value ($self->param($param)) {
+ for $value ($self->param($param)) {
$value = escape($value);
next unless defined $value;
push(@pairs,"$eparam=$value");
}
}
- foreach (keys %{$self->{'.fieldnames'}}) {
+ for (keys %{$self->{'.fieldnames'}}) {
push(@pairs,".cgifields=".escape("$_"));
}
return join($USE_PARAM_SEMICOLONS ? ';' : '&',@pairs);
@@ -2989,7 +2989,7 @@ sub Accept {
? split(',',$self->http('accept'))
: ();
- foreach (@accept) {
+ for (@accept) {
($pref) = /q=(\d\.\d+|\d+)/;
($type) = m#(\S+/[^;]+)#;
next unless $type;
@@ -3008,7 +3008,7 @@ sub Accept {
return $prefs{$search} if $prefs{$search};
# Didn't get it, so try pattern matching.
- foreach (keys %prefs) {
+ for (keys %prefs) {
next unless /\*/; # not a pattern match
($pat = $_) =~ s/([^\w*])/\\$1/g; # escape meta characters
$pat =~ s/\*/.*/g; # turn it into a pattern
@@ -3189,7 +3189,7 @@ sub http {
$parameter =~ tr/-/_/;
return $ENV{"HTTP_\U$parameter\E"} if $parameter;
my(@p);
- foreach (keys %ENV) {
+ for (keys %ENV) {
push(@p,$_) if /^HTTP/;
}
return @p;
@@ -3208,7 +3208,7 @@ sub https {
$parameter =~ tr/-/_/;
return $ENV{"HTTPS_\U$parameter\E"} if $parameter;
my(@p);
- foreach (keys %ENV) {
+ for (keys %ENV) {
push(@p,$_) if /^HTTPS/;
}
return @p;
@@ -3382,7 +3382,7 @@ sub read_from_cmdline {
$input = join(" ",@lines);
@words = &shellwords($input);
}
- foreach (@words) {
+ for (@words) {
s/\\=/%3D/g;
s/\\&/%26/g;
}
@@ -3488,7 +3488,7 @@ sub read_multipart {
# together with the body for later parsing with an external
# MIME parser module
if ( $multipart ) {
- foreach ( keys %header ) {
+ for ( keys %header ) {
print $filehandle "$_: $header{$_}${CRLF}";
}
print $filehandle "${CRLF}";
@@ -3681,7 +3681,7 @@ sub _set_attributes {
my($element, $attributes) = @_;
return '' unless defined($attributes->{$element});
$attribs = ' ';
- foreach my $attrib (keys %{$attributes->{$element}}) {
+ for my $attrib (keys %{$attributes->{$element}}) {
(my $clean_attrib = $attrib) =~ s/^-//;
$attribs .= "@{[lc($clean_attrib)]}=\"$attributes->{$element}{$attrib}\" ";
}
@@ -3692,7 +3692,7 @@ END_OF_FUNC
'_compile_all' => <<'END_OF_FUNC',
sub _compile_all {
- foreach (@_) {
+ for (@_) {
next if defined(&$_);
$AUTOLOAD = "CGI::$_";
_compile();
@@ -4079,7 +4079,7 @@ sub find_tempdir {
# : Refer to getpwuid() only at run-time if we're fortunate and have UNIX.
# unshift(@TEMP,(eval {(getpwuid($>))[7]}).'/tmp') if $CGI::OS eq 'UNIX' and $> != 0;
- foreach (@TEMP) {
+ for (@TEMP) {
do {$TMPDIRECTORY = $_; last} if -d $_ && -w _;
}
}
@@ -4157,66 +4157,52 @@ __END__
=head1 NAME
-CGI - Simple Common Gateway Interface Class
+CGI - Handle Common Gateway Interface requests and responses
=head1 SYNOPSIS
- # CGI script that creates a fill-out form
- # and echoes back its values.
-
- use CGI qw/:standard/;
- print header,
- start_html('A Simple Example'),
- h1('A Simple Example'),
- start_form,
- "What's your name? ",textfield('name'),p,
- "What's the combination?", p,
- checkbox_group(-name=>'words',
- -values=>['eenie','meenie','minie','moe'],
- -defaults=>['eenie','minie']), p,
- "What's your favorite color? ",
- popup_menu(-name=>'color',
- -values=>['red','green','blue','chartreuse']),p,
- submit,
- end_form,
- hr;
-
- if (param()) {
- my $name = param('name');
- my $keywords = join ', ',param('words');
- my $color = param('color');
- print "Your name is",em(escapeHTML($name)),p,
- "The keywords are: ",em(escapeHTML($keywords)),p,
- "Your favorite color is ",em(escapeHTML($color)),
- hr;
- }
+ use CGI;
- print end_html;
+ my $q = CGI->new;
-=head1 ABSTRACT
+ # Process an HTTP request
+ @values = $q->param('form_field');
-This perl library uses perl5 objects to make it easy to create Web
-fill-out forms and parse their contents. This package defines CGI
-objects, entities that contain the values of the current query string
-and other state variables. Using a CGI object's methods, you can
-examine keywords and parameters passed to your script, and create
-forms whose initial values are taken from the current query (thereby
-preserving state information). The module provides shortcut functions
-that produce boilerplate HTML, reducing typing and coding errors. It
-also provides functionality for some of the more advanced features of
-CGI scripting, including support for file uploads, cookies, cascading
-style sheets, server push, and frames.
+ $fh = $q->upload('file_field');
-CGI.pm also provides a simple function-oriented programming style for
-those who don't need its object-oriented features.
+ $riddle = $query->cookie('riddle_name');
+ %answers = $query->cookie('answers');
-The current version of CGI.pm is available at
+ # Prepare various HTTP responses
+ print $q->header();
+ print $q->header('application/json');
- http://www.genome.wi.mit.edu/ftp/pub/software/WWW/cgi_docs.html
- ftp://ftp-genome.wi.mit.edu/pub/software/WWW/
+ $cookie1 = $q->cookie(-name=>'riddle_name', -value=>"The Sphynx's Question");
+ $cookie2 = $q->cookie(-name=>'answers', -value=>\%answers);
+ print $q->header(
+ -type => 'image/gif',
+ -expires => '+3d',
+ -cookie => [$cookie1,$cookie2]
+ );
+
+ print $q->redirect('http://somewhere.else/in/movie/land');
=head1 DESCRIPTION
+CGI.pm is a stable, complete and mature solution for processing and preparing
+HTTP requests and responses. Major features including processing form
+submissions, file uploads, reading and writing cookies, query string generation
+and manipulation, and processing and preparing HTTP headers. Some HTML
+generation utilities are included as well.
+
+CGI.pm performs very well in in a vanilla CGI.pm environment and also comes
+with built-in support for mod_perl and mod_perl2 as well as FastCGI.
+
+It has the benefit of having developed and refined over 10 years with input
+from dozens of contributors and being deployed on thousands of websites.
+CGI.pm has been included in the Perl distribution since Perl 5.4, and has
+become a de-facto standard.
+
=head2 PROGRAMMING STYLE
There are two styles of programming with CGI.pm, an object-oriented
@@ -4411,7 +4397,7 @@ default CGI object from the indicated file handle.
restore_parameters(IN);
close IN;
-You can also initialize the query object from an associative array
+You can also initialize the query object from a hash
reference:
$query = new CGI( {'dinosaur'=>'barney',
@@ -4641,7 +4627,7 @@ a short example of creating multiple session records:
open (OUT,">>test.out") || die;
$records = 5;
- foreach (0..$records) {
+ for (0..$records) {
my $q = new CGI;
$q->param(-name=>'counter',-value=>$_);
$q->save(\*OUT);
@@ -5226,7 +5212,7 @@ manipulate this.
All relative links will be interpreted relative to this tag.
You add arbitrary meta information to the header with the B<-meta>
-argument. This argument expects a reference to an associative array
+argument. This argument expects a reference to a hash
containing name/value pairs of meta information. These will be turned
into a series of header <meta> tags that look something like this:
@@ -5565,8 +5551,8 @@ together with spaces and placed between opening and closing tags:
print h1("Chapter","1"); # <h1>Chapter 1</h1>"
-If the first argument is an associative array reference, then the keys
-and values of the associative array become the HTML tag's attributes:
+If the first argument is a hash reference, then the keys
+and values of the hash become the HTML tag's attributes:
print a({-href=>'fred.html',-target=>'_new'},
"Open a new frame");
@@ -6111,7 +6097,7 @@ information along with it in the format of headers. The information
usually includes the MIME content type. Future browsers may send
other information as well (such as modification date and size). To
retrieve this information, call uploadInfo(). It returns a reference to
-an associative array containing all the document headers.
+a hash containing all the document headers.
$filename = param('uploaded_file');
$type = uploadInfo($filename)->{'Content-Type'};
@@ -6233,7 +6219,7 @@ queries. Pass an array reference to select multiple defaults.
The optional fourth parameter (-labels) is provided for people who
want to use different values for the user-visible label inside the
popup menu and the value returned to your script. It's a pointer to an
-associative array relating menu values to user-visible labels. If you
+hash relating menu values to user-visible labels. If you
leave this parameter blank, the menu values will be displayed by
default. (You can also leave a label undefined if you want to).
@@ -6241,8 +6227,8 @@ default. (You can also leave a label undefined if you want to).
The optional fifth parameter (-attributes) is provided to assign
any of the common HTML attributes to an individual menu item. It's
-a pointer to an associative array relating menu values to another
-associative array with the attribute's name as the key and the
+a pointer to a hash relating menu values to another
+hash with the attribute's name as the key and the
attribute's value as the value.
=back
@@ -6294,7 +6280,7 @@ used for the menu labels (see -labels below).
=item 3.
The optional third parameter (B<-labels>) allows you to pass a reference
-to an associative array containing user-visible labels for one or more
+to a hash containing user-visible labels for one or more
of the menu items. You can use this when you want the user to see one
menu string, but have the browser return your program a different one.
If you don't specify this, the value string will be used instead
@@ -6321,8 +6307,8 @@ for details.
An optional sixth parameter (-attributes) is provided to assign
any of the common HTML attributes to an individual menu item. It's
-a pointer to an associative array relating menu values to another
-associative array with the attribute's name as the key and the
+a pointer to a hash relating menu values to another
+hash with the attribute's name as the key and the
attribute's value as the value.
=back
@@ -6382,7 +6368,7 @@ will be allowed at a time.
=item 5.
-The optional sixth argument is a pointer to an associative array
+The optional sixth argument is a pointer to a hash
containing long user-visible labels for the list items (-labels).
If not provided, the values will be displayed.
@@ -6390,8 +6376,8 @@ If not provided, the values will be displayed.
The optional sixth parameter (-attributes) is provided to assign
any of the common HTML attributes to an individual menu item. It's
-a pointer to an associative array relating menu values to another
-associative array with the attribute's name as the key and the
+a pointer to a hash relating menu values to another
+hash with the attribute's name as the key and the
attribute's value as the value.
When this form is processed, all selected list items will be returned as
@@ -6455,7 +6441,7 @@ list. Otherwise, they will be strung together on a horizontal line.
=back
-The optional B<-labels> argument is a pointer to an associative array
+The optional B<-labels> argument is a pointer to a hash
relating the checkbox values to the user-visible labels that will be
printed next to them. If not provided, the values will be used as the
default.
@@ -6472,7 +6458,7 @@ them by greying them out (this may not be supported by all browsers).
The optional B<-attributes> argument is provided to assign any of the
common HTML attributes to an individual menu item. It's a pointer to
-an associative array relating menu values to another associative array
+a hash relating menu values to another hash
with the attribute's name as the key and the attribute's value as the
value.
@@ -6646,7 +6632,7 @@ are the tab indexes of each button. Examples:
The optional B<-attributes> argument is provided to assign any of the
common HTML attributes to an individual menu item. It's a pointer to
-an associative array relating menu values to another associative array
+a hash relating menu values to another hash
with the attribute's name as the key and the attribute's value as the
value.
@@ -6816,16 +6802,13 @@ Fetch the value of the button this way:
button() produces a button that is compatible with Netscape 2.0's
JavaScript. When it's pressed the fragment of JavaScript code
-pointed to by the B<-onClick> parameter will be executed. On
-non-Netscape browsers this form element will probably not even
-display.
+pointed to by the B<-onClick> parameter will be executed.
=head1 HTTP COOKIES
-Netscape browsers versions 1.1 and higher, and all versions of
-Internet Explorer, support a so-called "cookie" designed to help
-maintain state within a browser session. CGI.pm has several methods
-that support cookies.
+Browsers support a so-called "cookie" designed to help maintain state
+within a browser session. CGI.pm has several methods that support
+cookies.
A cookie is a name=value pair much like the named parameters in a CGI
query string. CGI scripts create one or more cookies and send
@@ -6900,8 +6883,8 @@ and unescaping cookies behind the scenes.
=item B<-value>
The value of the cookie. This can be any scalar value,
-array reference, or even associative array reference. For example,
-you can store an entire associative array into a cookie this way:
+array reference, or even hash reference. For example,
+you can store an entire hash into a cookie this way:
$cookie=cookie(-name=>'family information',
-value=>\%childrens_ages);
@@ -7028,19 +7011,6 @@ side-by-side frames.
=head1 SUPPORT FOR JAVASCRIPT
-Netscape versions 2.0 and higher incorporate an interpreted language
-called JavaScript. Internet Explorer, 3.0 and higher, supports a
-closely-related dialect called JScript. JavaScript isn't the same as
-Java, and certainly isn't at all the same as Perl, which is a great
-pity. JavaScript allows you to programmatically change the contents of
-fill-out forms, create new windows, and pop up dialog box from within
-Netscape itself. From the point of view of CGI scripting, JavaScript
-is quite useful for validating fill-out forms prior to submitting
-them.
-
-You'll need to know JavaScript in order to use it. There are many good
-sources in bookstores and on the web.
-
The usual way to use JavaScript is to define a set of functions in a
<SCRIPT> block inside the HTML header and then to register event
handlers in the various elements of the page. Events include such
@@ -7382,11 +7352,9 @@ order to avoid conflict with Perl's accept() function.
=item B<raw_cookie()>
-Returns the HTTP_COOKIE variable, an HTTP extension implemented by
-Netscape browsers version 1.1 and higher, and all versions of Internet
-Explorer. Cookies have a special format, and this method call just
-returns the raw form (?cookie dough). See cookie() for ways of
-setting and retrieving cooked cookies.
+Returns the HTTP_COOKIE variable. Cookies have a special format, and
+this method call just returns the raw form (?cookie dough). See
+cookie() for ways of setting and retrieving cooked cookies.
Called with no parameters, raw_cookie() returns the packed cookie
structure. You can separate it into individual cookies by splitting
@@ -7400,7 +7368,7 @@ method from the CGI::Cookie module.
Returns the HTTP_USER_AGENT variable. If you give
this method a single argument, it will attempt to
pattern match on it, allowing you to do something
-like user_agent(netscape);
+like user_agent(Mozilla);
=item B<path_info()>
@@ -7583,7 +7551,7 @@ Here is a simple script that demonstrates server push:
use CGI qw/:push -nph/;
$| = 1;
print multipart_init(-boundary=>'----here we go!');
- foreach (0 .. 4) {
+ for (0 .. 4) {
print multipart_start(-type=>'text/plain'),
"The current time is ",scalar(localtime),"\n";
if ($_ < 4) {
@@ -7639,9 +7607,6 @@ multipart_end() at the end of the last part of the multipart document.
Users interested in server push applications should also have a look
at the CGI::Push module.
-Only Netscape Navigator supports server push. Internet Explorer
-browsers do not.
-
=head1 Avoiding Denial of Service Attacks
A potential problem with CGI.pm is that, by default, it attempts to
@@ -7893,7 +7858,7 @@ for suggestions and bug fixes.
print "<h2>Here are the current settings in this form</h2>";
- foreach $key (param) {
+ for $key (param) {
print "<strong>$key</strong> -> ";
@values = param($key);
print join(", ",@values),"<br>\n";
diff --git a/lib/CGI/Util.pm b/lib/CGI/Util.pm
index 5f49792fa3..8ac17642fc 100644
--- a/lib/CGI/Util.pm
+++ b/lib/CGI/Util.pm
@@ -210,7 +210,6 @@ sub unescape {
my $todecode = shift;
return undef unless defined($todecode);
$todecode =~ tr/+/ /; # pluses become spaces
- $EBCDIC = "\t" ne "\011";
if ($EBCDIC) {
$todecode =~ s/%([0-9a-fA-F]{2})/chr $A2E[hex($1)]/ge;
} else {
@@ -232,16 +231,24 @@ sub unescape {
}
# URL-encode data
+#
+# We cannot use the %u escapes, they were rejected by W3C, so the official
+# way is %XX-escaped utf-8 encoding.
+# Naturally, Unicode strings have to be converted to their utf-8 byte
+# representation. (No action is required on 5.6.)
+# Byte strings were traditionally used directly as a sequence of octets.
+# This worked if they actually represented binary data (i.e. in CGI::Compress).
+# This also worked if these byte strings were actually utf-8 encoded; e.g.,
+# when the source file used utf-8 without the apropriate "use utf8;".
+# This fails if the byte string is actually a Latin 1 encoded string, but it
+# was always so and cannot be fixed without breaking the binary data case.
+# -- Stepan Kasal <skasal@redhat.com>
+#
sub escape {
shift() if @_ > 1 and ( ref($_[0]) || (defined $_[1] && $_[0] eq $CGI::DefaultClass));
my $toencode = shift;
return undef unless defined($toencode);
- $toencode = eval { pack("C*", unpack("U0C*", $toencode))} || pack("C*", unpack("C*", $toencode));
-
- # force bytes while preserving backward compatibility -- dankogai
- # but commented out because it was breaking CGI::Compress -- lstein
- # $toencode = eval { pack("U*", unpack("U0C*", $toencode))} || pack("C*", unpack("C*", $toencode));
-
+ utf8::encode($toencode) if ($] > 5.007 && utf8::is_utf8($toencode));
if ($EBCDIC) {
$toencode=~s/([^a-zA-Z0-9_.~-])/uc sprintf("%%%02x",$E2A[ord($1)])/eg;
} else {
diff --git a/lib/CGI/t/util-58.t b/lib/CGI/t/util-58.t
index 4751b4cb2e..75c0ea9723 100644
--- a/lib/CGI/t/util-58.t
+++ b/lib/CGI/t/util-58.t
@@ -1,21 +1,29 @@
+# test CGI::Util::escape
+use Test::More tests => 4;
+use_ok("CGI::Util");
+
+# Byte strings should be escaped byte by byte:
+# 1) not a valid utf-8 sequence:
+my $uri = "pe\x{f8}\x{ed}\x{e8}ko.ogg";
+is(CGI::Util::escape($uri), "pe%F8%ED%E8ko.ogg", "Escape a Latin-2 string");
+
+# 2) is a valid utf-8 sequence, but not an UTF-8-flagged string
+# This happens often: people write utf-8 strings to source, but forget
+# to tell perl about it by "use utf8;"--this is obviously wrong, but we
+# have to handle it gracefully, for compatibility with GCI.pm under
+# perl-5.8.x
#
-# This tests CGI::Util::escape() when fed with UTF-8-flagged string
-# -- dankogai
-BEGIN {
- if ($] < 5.008) {
- print "1..0 # \$] == $] < 5.008\n";
- exit(0);
- }
-}
+$uri = "pe\x{c5}\x{99}\x{c3}\x{ad}\x{c4}\x{8d}ko.ogg";
+is(CGI::Util::escape($uri), "pe%C5%99%C3%AD%C4%8Dko.ogg",
+ "Escape an utf-8 byte string");
-use Test::More tests => 2;
-use_ok("CGI::Util");
-my $uri = "\x{5c0f}\x{98fc} \x{5f3e}.txt"; # KOGAI, Dan, in Kanji
-if (ord('A') == 193) { # EBCDIC.
- is(CGI::Util::escape($uri), "%FC%C3%A0%EE%F9%E5%E7%F8%20%FC%C3%C7%CA.txt",
- "# Escape string with UTF-8 (UTF-EBCDIC) flag");
-} else {
- is(CGI::Util::escape($uri), "%E5%B0%8F%E9%A3%BC%20%E5%BC%BE.txt",
- "# Escape string with UTF-8 flag");
+SKIP:
+{
+ # This tests CGI::Util::escape() when fed with UTF-8-flagged string
+ # -- dankogai
+ skip("Unicode strings not available in $]", 1) if ($] < 5.008);
+ $uri = "\x{5c0f}\x{98fc} \x{5f3e}.txt"; # KOGAI, Dan, in Kanji
+ is(CGI::Util::escape($uri), "%E5%B0%8F%E9%A3%BC%20%E5%BC%BE.txt",
+ "Escape string with UTF-8 flag");
}
__END__
diff --git a/lib/CPAN.pm b/lib/CPAN.pm
index 9b5e0b3d52..14243a8172 100644
--- a/lib/CPAN.pm
+++ b/lib/CPAN.pm
@@ -2,7 +2,7 @@
# vim: ts=4 sts=4 sw=4:
use strict;
package CPAN;
-$CPAN::VERSION = '1.93_51';
+$CPAN::VERSION = '1.93_53';
$CPAN::VERSION =~ s/_//;
# we need to run chdir all over and we would get at wrong libraries
@@ -25,7 +25,7 @@ use CPAN::Debug;
use CPAN::Distribution;
use CPAN::Distrostatus;
use CPAN::FTP;
-use CPAN::Index;
+use CPAN::Index 1.93; # https://rt.cpan.org/Ticket/Display.html?id=43349
use CPAN::InfoObj;
use CPAN::Module;
use CPAN::Prompt;
@@ -248,7 +248,7 @@ sub soft_chdir_with_alternatives ($);
sub _uniq {
my(@list) = @_;
my %seen;
- return map { !$seen{$_} } @list;
+ return grep { !$seen{$_}++ } @list;
}
#-> sub CPAN::shell ;
@@ -351,7 +351,8 @@ ReadLine support %s
} elsif (/^\!/) {
s/^\!//;
my($eval) = $_;
- package CPAN::Eval;
+ package
+ CPAN::Eval; # hide from the indexer
use strict;
use vars qw($import_done);
CPAN->import(':DEFAULT') unless $import_done++;
@@ -374,13 +375,20 @@ ReadLine support %s
CPAN::Shell->$command(@line)
};
_unredirect;
+ my $reported_error;
if ($@) {
- my $err = "$@";
- if ($err =~ /\S/) {
- require Carp;
- require Dumpvalue;
- my $dv = Dumpvalue->new(tick => '"');
- Carp::cluck(sprintf "Catching error: %s", $dv->stringify($err));
+ my $err = $@;
+ if (ref $err and $err->isa('CPAN::Exception::blocked_urllist')) {
+ $CPAN::Frontend->mywarn("Client not fully configured, please proceed with configuring.$err");
+ $reported_error = ref $err;
+ } else {
+ # I'd prefer never to arrive here and make all errors exception objects
+ if ($err =~ /\S/) {
+ require Carp;
+ require Dumpvalue;
+ my $dv = Dumpvalue->new(tick => '"');
+ Carp::cluck(sprintf "Catching error: %s", $dv->stringify($err));
+ }
}
}
if ($command =~ /^(
@@ -400,7 +408,13 @@ ReadLine support %s
|upgrade
)$/x) {
# only commands that tell us something about failed distros
- CPAN::Shell->failed($CPAN::CurrentCommandId,1);
+ # eval necessary for people without an urllist
+ eval {CPAN::Shell->failed($CPAN::CurrentCommandId,1);};
+ if (my $err = $@) {
+ unless (ref $err and $reported_error eq ref $err) {
+ die $@;
+ }
+ }
}
soft_chdir_with_alternatives(\@cwd);
$CPAN::Frontend->myprint("\n");
@@ -3441,8 +3455,7 @@ You will most probably also want to configure something like this:
INSTALLSCRIPT=~/myperl/bin \
INSTALLBIN=~/myperl/bin"
-and then (oh joy) the equivalent command for Module::Build. That would
-be
+and then the equivalent command for Module::Build, which is
o conf mbuildpl_arg "--lib=~/myperl/lib \
--installman1dir=~/myperl/man/man1 \
diff --git a/lib/CPAN/Author.pm b/lib/CPAN/Author.pm
index 3e7dd97ebf..14ef2ef633 100644
--- a/lib/CPAN/Author.pm
+++ b/lib/CPAN/Author.pm
@@ -82,16 +82,37 @@ sub ls {
@dl = $self->dir_listing([@csf,"CHECKSUMS"], 1, 1);
if ($glob) {
if ($CPAN::META->has_inst("Text::Glob")) {
+ $glob =~ s|/$|/*|;
my $rglob = Text::Glob::glob_to_regex($glob);
- @dl = grep { $_->[2] =~ /$rglob/ } @dl;
+ CPAN->debug("glob[$glob]rglob[$rglob]dl[@dl]") if $CPAN::DEBUG;
+ my @tmpdl = grep { $_->[2] =~ /$rglob/ } @dl;
+ if (1==@tmpdl && $tmpdl[0][0]==0) {
+ $rglob = Text::Glob::glob_to_regex("$glob/*");
+ @dl = grep { $_->[2] =~ /$rglob/ } @dl;
+ } else {
+ @dl = @tmpdl;
+ }
+ CPAN->debug("rglob[$rglob]dl[@dl]") if $CPAN::DEBUG;
} else {
$CPAN::Frontend->mydie("Text::Glob not installed, cannot proceed");
}
}
unless ($silent >= 2) {
- $CPAN::Frontend->myprint(join "", map {
- sprintf("%8d %10s %s/%s\n", $_->[0], $_->[1], $id, $_->[2])
- } sort { $a->[2] cmp $b->[2] } @dl);
+ $CPAN::Frontend->myprint
+ (
+ join "",
+ map {
+ sprintf
+ (
+ "%8d %10s %s/%s%s\n",
+ $_->[0],
+ $_->[1],
+ $id,
+ $_->[2],
+ 0==$_->[0]?"/":"",
+ )
+ } sort { $a->[2] cmp $b->[2] } @dl
+ );
}
@dl;
}
@@ -110,6 +131,7 @@ sub dir_listing {
my $fh;
+ CPAN->debug("chksumfile[@$chksumfile]recursive[$recursive]may_ftp[$may_ftp]") if $CPAN::DEBUG;
# Purge and refetch old (pre-PGP) CHECKSUMS; they are a security
# hazard. (Without GPG installed they are not that much better,
# though.)
@@ -179,6 +201,7 @@ sub dir_listing {
my(@dir) = @$chksumfile;
pop @dir;
push @dir, $f, "CHECKSUMS";
+ push @result, [ 0, "-", $f ];
push @result, map {
[$_->[0], $_->[1], "$f/$_->[2]"]
} $self->dir_listing(\@dir,1,$may_ftp);
diff --git a/lib/CPAN/Complete.pm b/lib/CPAN/Complete.pm
index f8e02d2a21..e1fe896d4a 100644
--- a/lib/CPAN/Complete.pm
+++ b/lib/CPAN/Complete.pm
@@ -84,8 +84,14 @@ sub cpl {
@return = grep /^\Q$word\E/, @CPAN::Complete::COMMANDS;
} elsif ( $line !~ /^[\!abcdghimorutl]/ ) {
@return = ();
- } elsif ($line =~ /^(a|ls)\s/) {
+ } elsif ($line =~ /^a\s/) {
@return = cplx('CPAN::Author',uc($word));
+ } elsif ($line =~ /^ls\s/) {
+ my($author,$rest) = $word =~ m|([^/]+)/?(.*)|;
+ @return = $rest ? () : map {"$_/"} cplx('CPAN::Author',uc($author||""));
+ if (0 && 1==@return) { # XXX too slow and even wrong when there is a * already
+ @return = grep /^\Q$word\E/, map {"$author/$_->[2]"} CPAN::Shell->expand("Author",$author)->ls("$rest*","2");
+ }
} elsif ($line =~ /^b\s/) {
CPAN::Shell->local_bundles;
@return = cplx('CPAN::Bundle',$word);
@@ -119,7 +125,9 @@ sub cplx {
if (CPAN::_sqlite_running()) {
$CPAN::SQLite->search($class, "^\Q$word\E");
}
- sort grep /^\Q$word\E/, map { $_->id } $CPAN::META->all_objects($class);
+ my $method = "id";
+ $method = "pretty_id" if $class eq "CPAN::Distribution";
+ sort grep /^\Q$word\E/, map { $_->$method() } $CPAN::META->all_objects($class);
}
#-> sub CPAN::Complete::cpl_any ;
diff --git a/lib/CPAN/DeferedCode.pm b/lib/CPAN/DeferedCode.pm
deleted file mode 100644
index c57669b177..0000000000
--- a/lib/CPAN/DeferedCode.pm
+++ /dev/null
@@ -1,16 +0,0 @@
-package CPAN::DeferedCode;
-
-use strict;
-use vars qw/$VERSION/;
-
-use overload fallback => 1, map { ($_ => 'run') } qw/
- bool "" 0+
-/;
-
-$VERSION = "5.50";
-
-sub run {
- $_[0]->();
-}
-
-1;
diff --git a/lib/CPAN/Distribution.pm b/lib/CPAN/Distribution.pm
index ef89f6fe69..0433e33dd1 100644
--- a/lib/CPAN/Distribution.pm
+++ b/lib/CPAN/Distribution.pm
@@ -843,6 +843,7 @@ sub try_download {
delete $self->{build_dir};
return;
}
+ binmode($writefh);
while (my $x = $readfh->READLINE) {
print $writefh $x;
}
@@ -2515,6 +2516,10 @@ sub unsat_prereq {
$available_version = $];
$available_file = CPAN::find_perl();
} else {
+ if (CPAN::_sqlite_running()) {
+ CPAN::Index->reload;
+ $CPAN::SQLite->search("CPAN::Module",$need_module);
+ }
$nmo = $CPAN::META->instance("CPAN::Module",$need_module);
next if $nmo->uptodate;
$available_file = $nmo->available_file;
@@ -2694,7 +2699,10 @@ sub read_yaml {
$CPAN::Frontend->mywarn("Warning: cannot determine META.yml without a build_dir.\n");
return;
}
- my $yaml = File::Spec->catfile($build_dir,"META.yml");
+ # if MYMETA.yml exists, that takes precedence over META.yml
+ my $meta = File::Spec->catfile($build_dir,"META.yml");
+ my $mymeta = File::Spec->catfile($build_dir,"MYMETA.yml");
+ my $yaml = -f $mymeta ? $mymeta : $meta;
$self->debug("yaml[$yaml]") if $CPAN::DEBUG;
return unless -f $yaml;
eval { $self->{yaml_content} = CPAN->_yaml_loadfile($yaml)->[0]; };
@@ -2713,8 +2721,11 @@ sub read_yaml {
$self->{yaml_content} = +{};
}
}
- if (not exists $self->{yaml_content}{dynamic_config}
- or $self->{yaml_content}{dynamic_config}
+ # MYMETA.yml is not dynamic by definition
+ if ( $yaml ne $mymeta &&
+ ( not exists $self->{yaml_content}{dynamic_config}
+ or $self->{yaml_content}{dynamic_config}
+ )
) {
$self->{yaml_content} = undef;
}
@@ -3369,7 +3380,7 @@ sub install {
$want_install =
CPAN::Shell::colorable_makemaker_prompt
("$id is just needed temporarily during building or testing. ".
- "Do you want to install it permanently? (Y/n)",
+ "Do you want to install it permanently?",
$default);
}
}
diff --git a/lib/CPAN/Distroprefs.pm b/lib/CPAN/Distroprefs.pm
index 38135995ce..e1be9cdf74 100644
--- a/lib/CPAN/Distroprefs.pm
+++ b/lib/CPAN/Distroprefs.pm
@@ -214,7 +214,12 @@ sub has_valid_subkeys {
sub _pattern {
my $re = shift;
- return eval sprintf 'qr{%s}', $re;
+ my $p = eval sprintf 'qr{%s}', $re;
+ if ($@) {
+ $@ =~ s/\n$//;
+ die "Error in Distroprefs pattern qr{$re}\n$@";
+ }
+ return $p;
}
sub _match_scalar {
@@ -321,7 +326,7 @@ CPAN::Distroprefs -- read and match distroprefs
die $result->as_string if $result->is_fatal;
- warn $result->as_string, next if $result->is_warning;
+ warn($result->as_string), next if $result->is_warning;
for my $pref (@{ $result->prefs }) {
if ($pref->matches(\%info)) {
diff --git a/lib/CPAN/Exception/RecursiveDependency.pm b/lib/CPAN/Exception/RecursiveDependency.pm
index 61dfb50be8..b928ad74e3 100644
--- a/lib/CPAN/Exception/RecursiveDependency.pm
+++ b/lib/CPAN/Exception/RecursiveDependency.pm
@@ -15,9 +15,9 @@ $VERSION = "5.5";
sub new {
my($class) = shift;
- my($deps) = shift;
+ my($deps_arg) = shift;
my (@deps,%seen,$loop_starts_with);
- DCHAIN: for my $dep (@$deps) {
+ DCHAIN: for my $dep (@$deps_arg) {
push @deps, {name => $dep, display_as => $dep};
if ($seen{$dep}++) {
$loop_starts_with = $dep;
@@ -27,7 +27,7 @@ sub new {
my $in_loop = 0;
for my $i (0..$#deps) {
my $x = $deps[$i]{name};
- $in_loop ||= $x eq $loop_starts_with;
+ $in_loop ||= $loop_starts_with && $x eq $loop_starts_with;
my $xo = CPAN::Shell->expandany($x) or next;
if ($xo->isa("CPAN::Module")) {
my $have = $xo->inst_version || "N/A";
@@ -66,13 +66,18 @@ sub new {
# the next session
}
}
- bless { deps => \@deps }, $class;
+ bless { deps => \@deps, loop_starts_with => $loop_starts_with }, $class;
}
sub as_string {
my($self) = shift;
+ my $deps = $self->{deps};
+ my $loop_starts_with = $self->{loop_starts_with};
+ unless ($loop_starts_with) {
+ return "--not a recursive/circular dependency--";
+ }
my $ret = "\nRecursive dependency detected:\n ";
- $ret .= join("\n => ", map {$_->{display_as}} @{$self->{deps}});
+ $ret .= join("\n => ", map {$_->{display_as}} @$deps);
$ret .= ".\nCannot resolve.\n";
$ret;
}
diff --git a/lib/CPAN/Exception/blocked_urllist.pm b/lib/CPAN/Exception/blocked_urllist.pm
new file mode 100644
index 0000000000..0df385b7d3
--- /dev/null
+++ b/lib/CPAN/Exception/blocked_urllist.pm
@@ -0,0 +1,40 @@
+# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*-
+# vim: ts=4 sts=4 sw=4:
+package CPAN::Exception::blocked_urllist;
+use strict;
+use overload '""' => "as_string";
+
+use vars qw(
+ $VERSION
+);
+$VERSION = "1.0";
+
+
+sub new {
+ my($class) = @_;
+ bless {}, $class;
+}
+
+sub as_string {
+ my($self) = shift;
+ if ($CPAN::Config->{connect_to_internet_ok}) {
+ return qq{
+
+You have not configured a urllist. Please consider to set it with
+
+ o conf init urllist
+
+};
+ } else {
+ return qq{
+
+You have not configured a urllist and did not allow to connect to the
+internet. Please consider to call
+
+ o conf init connect_to_internet_ok urllist
+
+};
+ }
+}
+
+1;
diff --git a/lib/CPAN/FTP.pm b/lib/CPAN/FTP.pm
index a848b27c0e..98391ead9a 100644
--- a/lib/CPAN/FTP.pm
+++ b/lib/CPAN/FTP.pm
@@ -4,6 +4,8 @@ package CPAN::FTP;
use strict;
use Fcntl qw(:flock);
+use File::Basename qw(dirname);
+use File::Path qw(mkpath);
use CPAN::FTP::netrc;
use vars qw($connect_to_internet_ok $Ua $Thesite $ThesiteURL $Themethod);
@CPAN::FTP::ISA = qw(CPAN::Debug);
@@ -20,6 +22,7 @@ sub _ftp_statistics {
my $locktype = $fh ? LOCK_EX : LOCK_SH;
$fh ||= FileHandle->new;
my $file = File::Spec->catfile($CPAN::Config->{cpan_home},"FTPstats.yml");
+ mkpath dirname $file;
open $fh, "+>>$file" or $CPAN::Frontend->mydie("Could not open '$file': $!");
my $sleep = 1;
my $waitstart;
@@ -164,7 +167,7 @@ sub _recommend_url_for {
while (my $last = pop @$history) {
last if $last->{end} - time > 3600; # only young results are interesting
next unless $last->{file}; # dirname of nothing dies!
- next unless $file eq File::Basename::dirname($last->{file});
+ next unless $file eq dirname($last->{file});
return $last->{thesiteurl};
}
}
@@ -269,9 +272,11 @@ sub localize {
$force ||= 0;
Carp::croak( "Usage: ->localize(cpan_file,as_local_file[,$force])" )
unless defined $aslocal;
- $self->debug("file[$file] aslocal[$aslocal] force[$force]")
- if $CPAN::DEBUG;
-
+ if ($CPAN::DEBUG){
+ require Carp;
+ my $longmess = Carp::longmess();
+ $self->debug("file[$file] aslocal[$aslocal] force[$force] carplongmess[$longmess]");
+ }
if ($^O eq 'MacOS') {
# Comment by AK on 2000-09-03: Uniq short filenames would be
# available in CHECKSUMS file
@@ -314,8 +319,7 @@ sub localize {
$maybe_restore++;
}
- my($aslocal_dir) = File::Basename::dirname($aslocal);
- $self->mymkpath($aslocal_dir); # too early for file URLs / RT #28438
+ my($aslocal_dir) = dirname($aslocal);
# Inheritance is not easier to manage than a few if/else branches
if ($CPAN::META->has_usable('LWP::UserAgent')) {
unless ($Ua) {
@@ -393,6 +397,7 @@ sub localize {
LEVEL: for $levelno (0..$#levels) {
my $level_tuple = $levels[$levelno];
my($level,$scheme,$sitetag) = @$level_tuple;
+ $self->mymkpath($aslocal_dir) unless $scheme && "file" eq $scheme;
my $defaultsites = $sitetag && $sitetag eq "defaultsites";
my @urllist;
if ($defaultsites) {
@@ -415,21 +420,12 @@ I would like to connect to one of the following sites to get '%s':
if ($connect_to_internet_ok) {
@urllist = @CPAN::Defaultsites;
} else {
- my $sleep = 5;
- $CPAN::Frontend->mywarn(sprintf qq{
-
-You have not configured a urllist and did not allow to connect to the
-internet. I will continue but it is very likely that we will face
-problems. If this happens, please consider to call either
-
- o conf init connect_to_internet_ok
-or
- o conf init urllist
-
-Sleeping $sleep seconds now.
-});
- $CPAN::Frontend->mysleep($sleep);
- @urllist = ();
+ my $sleep = 2;
+ # the tricky thing about dying here is that everybody
+ # believes that calls to exists() or all_objects() are
+ # safe.
+ require CPAN::Exception::blocked_urllist;
+ die CPAN::Exception::blocked_urllist->new;
}
} else {
my @host_seq = $level =~ /dleasy/ ?
@@ -503,7 +499,7 @@ Sleeping $sleep seconds now.
sub mymkpath {
my($self, $aslocal_dir) = @_;
- File::Path::mkpath($aslocal_dir);
+ mkpath($aslocal_dir);
$CPAN::Frontend->mywarn(qq{Warning: You are not allowed to write into }.
qq{directory "$aslocal_dir".
I\'ll continue, but if you encounter problems, they may be due
@@ -684,8 +680,8 @@ sub hostdlhard {
my($ro_url);
my($devnull) = $CPAN::Config->{devnull} || "";
# < /dev/null ";
- my($aslocal_dir) = File::Basename::dirname($aslocal);
- File::Path::mkpath($aslocal_dir);
+ my($aslocal_dir) = dirname($aslocal);
+ mkpath($aslocal_dir);
HOSTHARD: for $ro_url (@$host_seq) {
$self->_set_attempt($stats,"dlhard",$ro_url);
my $url = "$ro_url$file";
@@ -867,8 +863,8 @@ sub hostdlhardest {
return unless @$host_seq;
my($ro_url);
- my($aslocal_dir) = File::Basename::dirname($aslocal);
- File::Path::mkpath($aslocal_dir);
+ my($aslocal_dir) = dirname($aslocal);
+ mkpath($aslocal_dir);
my $ftpbin = $CPAN::Config->{ftp};
unless ($ftpbin && length $ftpbin && MM->maybe_command($ftpbin)) {
$CPAN::Frontend->myprint("No external ftp command available\n\n");
diff --git a/lib/CPAN/FTP/netrc.pm b/lib/CPAN/FTP/netrc.pm
index 1f106aef08..c05405e7ef 100644
--- a/lib/CPAN/FTP/netrc.pm
+++ b/lib/CPAN/FTP/netrc.pm
@@ -1,6 +1,8 @@
package CPAN::FTP::netrc;
use strict;
+$CPAN::FTP::netrc::VERSION = $CPAN::FTP::netrc::VERSION = "1.00";
+
# package CPAN::FTP::netrc;
sub new {
my($class) = @_;
diff --git a/lib/CPAN/FirstTime.pm b/lib/CPAN/FirstTime.pm
index 766c797bdb..8b5f6bac8e 100644
--- a/lib/CPAN/FirstTime.pm
+++ b/lib/CPAN/FirstTime.pm
@@ -551,11 +551,12 @@ Do you want to enable code deserialisation (yes/no)?
=item yaml_module
-At the time of this writing there are two competing YAML modules,
-YAML.pm and YAML::Syck. The latter is faster but needs a C compiler
-installed on your system. There may be more alternative YAML
-conforming modules but at the time of writing a potential third
-player, YAML::Tiny, seemed not powerful enough to work with CPAN.pm.
+At the time of this writing (2009-03) there are three YAML
+implementations working: YAML, YAML::Syck, and YAML::XS. The latter
+two are faster but need a C compiler installed on your system. There
+may be more alternative YAML conforming modules. When I tried two
+other players, YAML::Tiny and YAML::Perl, they seemed not powerful
+enough to work with CPAN.pm. This may have changed in the meantime.
Which YAML implementation would you prefer?
@@ -1379,49 +1380,91 @@ sub my_prompt_loop {
sub conf_sites {
my $m = 'MIRRORED.BY';
+ my $use_mby;
my $mby = File::Spec->catfile($CPAN::Config->{keep_source_where},$m);
File::Path::mkpath(File::Basename::dirname($mby));
if (-f $mby && -f $m && -M $m < -M $mby) {
+ $use_mby = 1;
require File::Copy;
File::Copy::copy($m,$mby) or die "Could not update $mby: $!";
}
- my $loopcount = 0;
local $^T = time;
my $overwrite_local = 0;
if ($mby && -f $mby && -M _ <= 60 && -s _ > 0) {
+ $use_mby = 1;
my $mtime = localtime((stat _)[9]);
my $prompt = qq{Found $mby as of $mtime
-I\'d use that as a database of CPAN sites. If that is OK for you,
-please answer 'y', but if you want me to get a new database now,
-please answer 'n' to the following question.
+I'd use that as a database of CPAN sites. If that is OK for you,
+please answer 'y', but if you want me to get a new database from the
+internet now, please answer 'n' to the following question.
Shall I use the local database in $mby?};
my $ans = prompt($prompt,"y");
- $overwrite_local = 1 unless $ans =~ /^y/i;
+ if ($ans =~ /^y/i) {
+ $CPAN::Config->{connect_to_internet_ok} = 1;
+ } else {
+ $overwrite_local = 1;
+ }
}
- while ($mby) {
- if ($overwrite_local) {
- $CPAN::Frontend->myprint(qq{Trying to overwrite $mby\n});
- $mby = CPAN::FTP->localize($m,$mby,3);
- $overwrite_local = 0;
- } elsif ( ! -f $mby ) {
- $CPAN::Frontend->myprint(qq{You have no $mby\n I\'m trying to fetch one\n});
- $mby = CPAN::FTP->localize($m,$mby,3);
- } elsif (-M $mby > 60 && $loopcount == 0) {
- $CPAN::Frontend->myprint(qq{Your $mby is older than 60 days,\n I\'m trying }.
- qq{to fetch one\n});
- $mby = CPAN::FTP->localize($m,$mby,3);
- $loopcount++;
- } elsif (-s $mby == 0) {
- $CPAN::Frontend->myprint(qq{You have an empty $mby,\n I\'m trying to fetch one\n});
- $mby = CPAN::FTP->localize($m,$mby,3);
+ local $urllist = $CPAN::Config->{urllist};
+ my $better_mby;
+ LOOP: while () { # multiple errors possible
+ if ($use_mby
+ or (defined $CPAN::Config->{connect_to_internet_ok}
+ and $CPAN::Config->{connect_to_internet_ok})){
+ if ($overwrite_local) {
+ $CPAN::Frontend->myprint(qq{Trying to overwrite $mby\n});
+ $better_mby = CPAN::FTP->localize($m,$mby,3);
+ $overwrite_local = 0;
+ $use_mby=1 if $mby;
+ } elsif ( ! -f $mby ) {
+ $CPAN::Frontend->myprint(qq{You have no $mby\n I'm trying to fetch one\n});
+ $better_mby = CPAN::FTP->localize($m,$mby,3);
+ $use_mby=1 if $mby;
+ } elsif ( -M $mby > 60 ) {
+ $CPAN::Frontend->myprint(qq{Your $mby is older than 60 days,\n I'm trying }.
+ qq{to fetch a new one\n});
+ $better_mby = CPAN::FTP->localize($m,$mby,3);
+ $use_mby=1 if $mby;
+ } elsif (-s $mby == 0) {
+ $CPAN::Frontend->myprint(qq{You have an empty $mby,\n I'm trying to fetch a better one\n});
+ $better_mby = CPAN::FTP->localize($m,$mby,3);
+ $use_mby=1 if $mby;
+ } else {
+ last LOOP;
+ }
+ if ($better_mby) {
+ $mby = $better_mby;
+ }
+ } elsif (not @{$urllist||[]}
+ and (not defined $CPAN::Config->{connect_to_internet_ok}
+ or not $CPAN::Config->{connect_to_internet_ok})) {
+ $CPAN::Frontend->myprint(qq{CPAN needs access to at least one CPAN mirror.
+
+As you did not allow me to connect to the internet you need to supply
+a valid CPAN URL now.\n\n});
+
+ my @default = map {"file://$_"} grep {-e} "/home/ftp/pub/CPAN", "/home/ftp/pub/PAUSE";
+ my $ans = prompt("Please enter the URL of your CPAN mirror",shift @default);
+ if ($ans) {
+ push @$urllist, $ans;
+ next LOOP;
+ }
} else {
- last;
+ last LOOP;
}
}
- local $urllist = [];
- read_mirrored_by($mby);
+ if ($use_mby){
+ read_mirrored_by($mby);
+ } else {
+ if (not defined $CPAN::Config->{connect_to_internet_ok}
+ or not $CPAN::Config->{connect_to_internet_ok}) {
+ $CPAN::Frontend->myprint("Configuration does not allow connecting to the internet.\n");
+ }
+ $CPAN::Frontend->myprint("Current set of CPAN URLs:\n");
+ map { $CPAN::Frontend->myprint(" $_\n") } @$urllist;
+ }
bring_your_own();
$CPAN::Config->{urllist} = $urllist;
}
@@ -1646,10 +1689,11 @@ later if you\'re sure it\'s right.\n},
}
} while $ans || !%seen;
- push @$urllist, @urls;
+ @$urllist = CPAN::_uniq(@$urllist, @urls);
+ $CPAN::Config->{urllist} = $urllist;
# xxx delete or comment these out when you're happy that it works
$CPAN::Frontend->myprint("New set of picks:\n");
- map { $CPAN::Frontend->myprint(" $_\n") } @$urllist;
+ for ( @$urllist ) { $CPAN::Frontend->myprint(" $_\n") };
}
diff --git a/lib/CPAN/HandleConfig.pm b/lib/CPAN/HandleConfig.pm
index 21cc92f359..7842472989 100644
--- a/lib/CPAN/HandleConfig.pm
+++ b/lib/CPAN/HandleConfig.pm
@@ -524,6 +524,7 @@ sub load {
use Carp;
require_myconfig_or_config;
my @miss = $self->missing_config_data;
+ CPAN->debug("doit[$doit]loading[$loading]miss[@miss]") if $CPAN::DEBUG;
return unless $doit || @miss;
return if $loading;
$loading++;
diff --git a/lib/CPAN/Index.pm b/lib/CPAN/Index.pm
index 1a10a1bcd0..e3ee232c9a 100644
--- a/lib/CPAN/Index.pm
+++ b/lib/CPAN/Index.pm
@@ -15,6 +15,28 @@ sub force_reload {
$class->reload(1);
}
+my @indexbundle =
+ (
+ {
+ reader => "rd_authindex",
+ dir => "authors",
+ remotefile => '01mailrc.txt.gz',
+ shortlocalfile => '01mailrc.gz',
+ },
+ {
+ reader => "rd_modpacks",
+ dir => "modules",
+ remotefile => '02packages.details.txt.gz',
+ shortlocalfile => '02packag.gz',
+ },
+ {
+ reader => "rd_modlist",
+ dir => "modules",
+ remotefile => '03modlist.data.gz',
+ shortlocalfile => '03mlist.gz',
+ },
+ );
+
#-> sub CPAN::Index::reload ;
sub reload {
my($self,$force) = @_;
@@ -54,39 +76,26 @@ sub reload {
my $needshort = $^O eq "dos";
- $self->rd_authindex($self
- ->reload_x(
- "authors/01mailrc.txt.gz",
- $needshort ?
- File::Spec->catfile('authors', '01mailrc.gz') :
- File::Spec->catfile('authors', '01mailrc.txt.gz'),
- $force));
- $t2 = time;
- $debug = "timing reading 01[".($t2 - $time)."]";
- $time = $t2;
- return if $CPAN::Signal; # this is sometimes lengthy
- $self->rd_modpacks($self
- ->reload_x(
- "modules/02packages.details.txt.gz",
- $needshort ?
- File::Spec->catfile('modules', '02packag.gz') :
- File::Spec->catfile('modules', '02packages.details.txt.gz'),
- $force));
- $t2 = time;
- $debug .= "02[".($t2 - $time)."]";
- $time = $t2;
- return if $CPAN::Signal; # this is sometimes lengthy
- $self->rd_modlist($self
- ->reload_x(
- "modules/03modlist.data.gz",
- $needshort ?
- File::Spec->catfile('modules', '03mlist.gz') :
- File::Spec->catfile('modules', '03modlist.data.gz'),
- $force));
+ INX: for my $indexbundle (@indexbundle) {
+ my $reader = $indexbundle->{reader};
+ my $localfile = $needshort ? $indexbundle->{shortlocalfile} : $indexbundle->{remotefile};
+ my $localpath = File::Spec->catfile($indexbundle->{dir}, $localfile);
+ my $remote = join "/", $indexbundle->{dir}, $indexbundle->{remotefile};
+ my $localized = $self->reload_x($remote, $localpath, $force);
+ $self->$reader($localized); # may die but we let the shell catch it
+ if ($CPAN::DEBUG){
+ $t2 = time;
+ $debug = "timing reading 01[".($t2 - $time)."]";
+ $time = $t2;
+ }
+ return if $CPAN::Signal; # this is sometimes lengthy
+ }
$self->write_metadata_cache;
- $t2 = time;
- $debug .= "03[".($t2 - $time)."]";
- $time = $t2;
+ if ($CPAN::DEBUG){
+ $t2 = time;
+ $debug .= "03[".($t2 - $time)."]";
+ $time = $t2;
+ }
CPAN->debug($debug) if $CPAN::DEBUG;
}
if ($CPAN::Config->{build_dir_reuse}) {
diff --git a/lib/CPAN/LWP/UserAgent.pm b/lib/CPAN/LWP/UserAgent.pm
index 44f70e6a96..8a5d8447e6 100644
--- a/lib/CPAN/LWP/UserAgent.pm
+++ b/lib/CPAN/LWP/UserAgent.pm
@@ -5,6 +5,8 @@ use strict;
use vars qw(@ISA $USER $PASSWD $SETUPDONE);
# we delay requiring LWP::UserAgent and setting up inheritance until we need it
+$CPAN::LWP::UserAgent::VERSION = $CPAN::LWP::UserAgent::VERSION = "1.00";
+
sub config {
return if $SETUPDONE;
if ($CPAN::META->has_usable('LWP::UserAgent')) {
diff --git a/lib/CPAN/Module.pm b/lib/CPAN/Module.pm
index 64b2e092ff..eae5a73aaa 100644
--- a/lib/CPAN/Module.pm
+++ b/lib/CPAN/Module.pm
@@ -511,13 +511,45 @@ sub uptodate {
my $cpan = $self->cpan_version;
local ($^W) = 0;
CPAN::Version->vgt($cpan,$inst) and return 0;
- CPAN->debug(join("",
- "returning uptodate. inst_file[",
- $self->inst_file,
- "cpan[$cpan] inst[$inst]")) if $CPAN::DEBUG;
+ my $inst_file = $self->inst_file;
+ # trying to support deprecated.pm by Nicholas 2009-02
+ my $in_priv_or_arch = "";
+ my $isa_perl = "";
+ if ($] >= 5.011) { # probably harmful when distros say INSTALLDIRS=perl?
+ if (0 == CPAN::Version->vcmp($cpan,$inst)) {
+ if ($in_priv_or_arch = $self->_in_priv_or_arch($inst_file)) {
+ if (my $distribution = $self->distribution) {
+ unless ($isa_perl = $distribution->isa_perl) {
+ return 0;
+ }
+ }
+ }
+ }
+ }
+ CPAN->debug
+ (join
+ ("",
+ "returning uptodate. ",
+ "inst_file[$inst_file]",
+ "cpan[$cpan]inst[$inst]",
+ "in_priv_or_arch[$in_priv_or_arch]",
+ "isa_perl[$isa_perl]",
+ )) if $CPAN::DEBUG;
return 1;
}
+# returns true if installed in privlib or archlib
+sub _in_priv_or_arch {
+ my($self,$inst_file) = @_;
+ for my $confdirname (qw(archlibexp privlibexp)) {
+ my $confdir = $Config::Config{$confdirname};
+ if ($confdir eq substr($inst_file,0,length($confdir))) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
#-> sub CPAN::Module::install ;
sub install {
my($self) = @_;
@@ -620,10 +652,15 @@ sub available_version {
#-> sub CPAN::Module::parse_version ;
sub parse_version {
my($self,$parsefile) = @_;
- my $have = eval { MM->parse_version($parsefile); };
+ alarm(10);
+ my $have = eval {
+ local $SIG{ALRM} = sub { die "alarm\n" };
+ MM->parse_version($parsefile);
+ };
if ($@) {
$CPAN::Frontend->mywarn("Error while parsing version number in file '$parsefile'\n");
}
+ alarm(0);
my $leastsanity = eval { defined $have && length $have; };
$have = "undef" unless $leastsanity;
$have =~ s/^ //; # since the %vd hack these two lines here are needed
diff --git a/lib/CPAN/Shell.pm b/lib/CPAN/Shell.pm
index 28175fa08e..84f67ffafb 100644
--- a/lib/CPAN/Shell.pm
+++ b/lib/CPAN/Shell.pm
@@ -17,16 +17,32 @@ use vars qw(
);
@relo = (
"CPAN.pm",
+ "CPAN/Author.pm",
+ "CPAN/CacheMgr.pm",
+ "CPAN/Complete.pm",
"CPAN/Debug.pm",
+ "CPAN/DeferredCode.pm",
+ "CPAN/Distribution.pm",
"CPAN/Distroprefs.pm",
+ "CPAN/Distrostatus.pm",
+ "CPAN/Exception/RecursiveDependency.pm",
+ "CPAN/Exception/yaml_not_installed.pm",
"CPAN/FirstTime.pm",
+ "CPAN/FTP.pm",
+ "CPAN/FTP/netrc.pm",
"CPAN/HandleConfig.pm",
+ "CPAN/Index.pm",
+ "CPAN/InfoObj.pm",
"CPAN/Kwalify.pm",
+ "CPAN/LWP/UserAgent.pm",
+ "CPAN/Module.pm",
+ "CPAN/Prompt.pm",
"CPAN/Queue.pm",
"CPAN/Reporter/Config.pm",
"CPAN/Reporter/History.pm",
"CPAN/Reporter/PrereqCheck.pm",
"CPAN/Reporter.pm",
+ "CPAN/Shell.pm",
"CPAN/SQLite.pm",
"CPAN/Tarzip.pm",
"CPAN/Version.pm",
@@ -255,6 +271,7 @@ sub globls {
$author->$pragma();
}
}
+ CPAN->debug("author[$author]pathglob[$pathglob]silent[$silent]") if $CPAN::DEBUG;
push @results, $author->ls($pathglob,$silent); # silent if
# more than one
# author
diff --git a/lib/CPANPLUS.pm b/lib/CPANPLUS.pm
index 906cbe05e3..a4b95693a6 100644
--- a/lib/CPANPLUS.pm
+++ b/lib/CPANPLUS.pm
@@ -13,7 +13,7 @@ BEGIN {
use vars qw( @EXPORT @ISA $VERSION );
@EXPORT = qw( shell fetch get install );
@ISA = qw( Exporter );
- $VERSION = "0.86_06"; #have to hardcode or cpan.org gets unhappy
+ $VERSION = "0.8601"; #have to hardcode or cpan.org gets unhappy
}
### purely for backward compatibility, so we can call it from the commandline:
diff --git a/lib/CPANPLUS/Dist/Build.pm b/lib/CPANPLUS/Dist/Build.pm
index ac6c389140..714ef79ae2 100644
--- a/lib/CPANPLUS/Dist/Build.pm
+++ b/lib/CPANPLUS/Dist/Build.pm
@@ -5,7 +5,6 @@ use warnings;
use vars qw[@ISA $STATUS $VERSION];
@ISA = qw[CPANPLUS::Dist];
-use CPANPLUS::inc;
use CPANPLUS::Internals::Constants;
### these constants were exported by CPANPLUS::Internals::Constants
@@ -31,7 +30,7 @@ use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext';
local $Params::Check::VERBOSE = 1;
-$VERSION = '0.12';
+$VERSION = '0.24';
=pod
@@ -222,7 +221,8 @@ sub prepare {
}
my $args;
- my( $force, $verbose, $buildflags, $perl);
+ my( $force, $verbose, $buildflags, $perl, $prereq_target, $prereq_format,
+ $prereq_build );
{ local $Params::Check::ALLOW_UNKNOWN = 1;
my $tmpl = {
force => { default => $conf->get_conf('force'),
@@ -232,6 +232,10 @@ sub prepare {
perl => { default => $^X, store => \$perl },
buildflags => { default => $conf->get_conf('buildflags'),
store => \$buildflags },
+ prereq_target => { default => '', store => \$prereq_target },
+ prereq_format => { default => '',
+ store => \$prereq_format },
+ prereq_build => { default => 0, store => \$prereq_build },
};
$args = check( $tmpl, \%hash ) or return;
@@ -259,14 +263,47 @@ sub prepare {
### to reset the @INC
#local $ENV{PERL5OPT} = CPANPLUS::inc->original_perl5opt;
#local $ENV{PERL5LIB} = CPANPLUS::inc->original_perl5lib;
- local @INC = CPANPLUS::inc->original_inc;
+ #local @INC = CPANPLUS::inc->original_inc;
### this will generate warnings under anything lower than M::B 0.2606
- my %buildflags = $dist->_buildflags_as_hash( $buildflags );
+ my @buildflags = $dist->_buildflags_as_list( $buildflags );
$dist->status->_buildflags( $buildflags );
my $fail;
RUN: {
+ # 0.85_01
+ ### we resolve 'configure requires' here, so we can run the 'perl
+ ### Makefile.PL' command
+ ### XXX for tests: mock f_c_r to something that *can* resolve and
+ ### something that *doesnt* resolve. Check the error log for ok
+ ### on this step or failure
+ ### XXX make a seperate tarball to test for this scenario: simply
+ ### containing a makefile.pl/build.pl for test purposes?
+ my $safe_ver = version->new('0.85_01');
+ if ( version->new($CPANPLUS::Internals::VERSION) >= $safe_ver )
+ { my $configure_requires = $dist->find_configure_requires;
+ my $ok = $dist->_resolve_prereqs(
+ format => $prereq_format,
+ verbose => $verbose,
+ prereqs => $configure_requires,
+ target => $prereq_target,
+ force => $force,
+ prereq_build => $prereq_build,
+ );
+
+ unless( $ok ) {
+
+ #### use $dist->flush to reset the cache ###
+ error( loc( "Unable to satisfy '%1' for '%2' " .
+ "-- aborting install",
+ 'configure_requires', $self->module ) );
+ $dist->status->prepared(0);
+ $fail++;
+ last RUN;
+ }
+ ### end of prereq resolving ###
+ }
+
# Wrap the exception that may be thrown here (should likely be
# done at a much higher level).
my $prep_output;
@@ -274,7 +311,7 @@ sub prepare {
my $env = 'ENV_CPANPLUS_IS_EXECUTING';
local $ENV{$env} = BUILD_PL->( $dir );
- unless ( scalar run( command => [$perl, BUILD_PL->($dir), $buildflags],
+ unless ( scalar run( command => [$perl, BUILD_PL->($dir), @buildflags],
buffer => \$prep_output,
verbose => $verbose )
) {
@@ -284,10 +321,12 @@ sub prepare {
msg( $prep_output, 0 );
- $self->status->prereqs( $dist->_find_prereqs( verbose => $verbose,
- dir => $dir,
- perl => $perl,
- buildflags => $buildflags ) );
+ my $prereqs = $self->status->prereqs;
+
+ $prereqs ||= $dist->_find_prereqs( verbose => $verbose,
+ dir => $dir,
+ perl => $perl,
+ buildflags => $buildflags );
}
@@ -338,10 +377,12 @@ sub _find_prereqs {
my $content;
- if ( version->new( $Module::Build::VERSION ) >= $safe_ver ) {
+ if ( version->new( $Module::Build::VERSION ) >= $safe_ver and ! ON_WIN32 ) {
+ my @buildflags = $dist->_buildflags_as_list( $buildflags );
+
# Use the new Build action 'prereq_data'
- unless ( scalar run( command => [$perl, BUILD->($dir), 'prereq_data', $buildflags],
+ unless ( scalar run( command => [$perl, BUILD->($dir), 'prereq_data', @buildflags],
buffer => \$content,
verbose => 0 )
) {
@@ -364,6 +405,7 @@ sub _find_prereqs {
$content = do { local $/; <$fh> };
}
+ return unless $content;
my $bphash = eval $content;
return unless $bphash and ref $bphash eq 'HASH';
foreach my $type ('requires', 'build_requires') {
@@ -458,7 +500,12 @@ sub create {
$args = check( $tmpl, \%hash ) or return;
}
- return 1 if $dist->status->created && !$force;
+ # restore the state as we have created this already.
+ if ( $dist->status->created && !$force ) {
+ ### add this directory to your lib ###
+ $self->add_to_includepath();
+ return 1;
+ }
$dist->status->_create_args( $args );
@@ -487,7 +534,7 @@ sub create {
### to reset the @INC
#local $ENV{PERL5OPT} = CPANPLUS::inc->original_perl5opt;
#local $ENV{PERL5LIB} = CPANPLUS::inc->original_perl5lib;
- local @INC = CPANPLUS::inc->original_inc;
+ #local @INC = CPANPLUS::inc->original_inc;
### but do it *before* the new_from_context, as M::B seems
### to be actually running the file...
@@ -499,7 +546,7 @@ sub create {
if $self->best_path_to_module_build;
### this will generate warnings under anything lower than M::B 0.2606
- my %buildflags = $dist->_buildflags_as_hash( $buildflags );
+ my @buildflags = $dist->_buildflags_as_list( $buildflags );
$dist->status->_buildflags( $buildflags );
my $fail; my $prereq_fail; my $test_fail;
@@ -532,7 +579,7 @@ sub create {
my $captured;
- unless ( scalar run( command => [$perl, BUILD->($dir), $buildflags],
+ unless ( scalar run( command => [$perl, BUILD->($dir), @buildflags],
buffer => \$captured,
verbose => $verbose )
) {
@@ -554,7 +601,7 @@ sub create {
unless( $skiptest ) {
my $test_output;
my $flag = ON_VMS ? '"test"' : 'test';
- my $cmd = [$perl, BUILD->($dir), $flag, $buildflags];
+ my $cmd = [$perl, BUILD->($dir), $flag, @buildflags];
unless ( scalar run( command => $cmd,
buffer => \$test_output,
verbose => $verbose )
@@ -663,7 +710,8 @@ sub install {
}
my $fail;
- my $buildflags = $dist->status->_buildflags;
+ my @buildflags = $dist->_buildflags_as_list( $dist->status->_buildflags );
+
### hmm, how is this going to deal with sudo?
### for now, check effective uid, if it's not root,
### shell out, otherwise use the method
@@ -674,7 +722,7 @@ sub install {
### M::B at the top of the build.pl
### On VMS, flags need to be quoted
my $flag = ON_VMS ? '"install"' : 'install';
- my $cmd = [$perl, BUILD->($dir), $flag, $buildflags];
+ my $cmd = [$perl, BUILD->($dir), $flag, @buildflags];
my $sudo = $conf->get_program('sudo');
unshift @$cmd, $sudo if $sudo;
@@ -688,11 +736,9 @@ sub install {
$fail++;
}
} else {
- my %buildflags = $dist->_buildflags_as_hash($buildflags);
-
my $install_output;
my $flag = ON_VMS ? '"install"' : 'install';
- my $cmd = [$perl, BUILD->($dir), $flag, $buildflags];
+ my $cmd = [$perl, BUILD->($dir), $flag, @buildflags];
unless( scalar run( command => $cmd,
buffer => \$install_output,
verbose => $verbose )
@@ -713,15 +759,13 @@ sub install {
return $dist->status->installed( $fail ? 0 : 1 );
}
-### returns the string 'foo=bar zot=quux' as (foo => bar, zot => quux)
-sub _buildflags_as_hash {
+### returns the string 'foo=bar --zot quux'
+### as the list 'foo=bar', '--zot', 'qux'
+sub _buildflags_as_list {
my $self = shift;
my $flags = shift or return;
- my @argv = Module::Build->split_like_shell($flags);
- my ($argv) = Module::Build->read_args(@argv);
-
- return %$argv;
+ return Module::Build->split_like_shell($flags);
}
=head1 AUTHOR
diff --git a/lib/CPANPLUS/Dist/Build/Constants.pm b/lib/CPANPLUS/Dist/Build/Constants.pm
index cfce20b4e7..2a60438a09 100644
--- a/lib/CPANPLUS/Dist/Build/Constants.pm
+++ b/lib/CPANPLUS/Dist/Build/Constants.pm
@@ -9,7 +9,7 @@ BEGIN {
require Exporter;
use vars qw[$VERSION @ISA @EXPORT];
- $VERSION = '0.12';
+ $VERSION = '0.24';
@ISA = qw[Exporter];
@EXPORT = qw[ BUILD_DIR BUILD ];
}
diff --git a/lib/CPANPLUS/Dist/Build/t/02_CPANPLUS-Dist-Build.t b/lib/CPANPLUS/Dist/Build/t/02_CPANPLUS-Dist-Build.t
index 791413639a..f92d86282a 100644
--- a/lib/CPANPLUS/Dist/Build/t/02_CPANPLUS-Dist-Build.t
+++ b/lib/CPANPLUS/Dist/Build/t/02_CPANPLUS-Dist-Build.t
@@ -195,7 +195,8 @@ while( my($path,$need_cc) = each %Map ) {
}
### test ENV setting while running Build.PL code
-{ ### use print() not die() -- we're redirecting STDERR in tests!
+SKIP: { ### use print() not die() -- we're redirecting STDERR in tests!
+ skip("Known issues due to capturing with this test and MSWin32") if ON_WIN32;
my $env = 'ENV_CPANPLUS_IS_EXECUTING';
my $clone = $Mod->clone;
diff --git a/lib/CPANPLUS/Dist/MM.pm b/lib/CPANPLUS/Dist/MM.pm
index 2fa1f0c3c4..e8fe3cd511 100644
--- a/lib/CPANPLUS/Dist/MM.pm
+++ b/lib/CPANPLUS/Dist/MM.pm
@@ -222,7 +222,7 @@ sub prepare {
my $tmpl = {
perl => { default => $^X, store => \$perl },
makemakerflags => { default =>
- $conf->get_conf('makemakerflags'),
+ $conf->get_conf('makemakerflags') || '',
store => \$mmflags },
force => { default => $conf->get_conf('force'),
store => \$force },
@@ -565,9 +565,14 @@ sub create {
$args = check( $tmpl, \%hash ) or return;
}
- ### maybe we already ran a create on this object? ###
- return 1 if $dist->status->created && !$force;
-
+ ### maybe we already ran a create on this object?
+ ### make sure we add to include path again, just in case we came from
+ ### ->save_state, at which point we need to restore @INC/$PERL5LIB
+ if( $dist->status->created && !$force ) {
+ $self->add_to_includepath;
+ return 1;
+ }
+
### store the arguments, so ->install can use them in recursive loops ###
$dist->status->_create_args( $args );
diff --git a/lib/CPANPLUS/Internals.pm b/lib/CPANPLUS/Internals.pm
index 17b48c172f..f5d961b518 100644
--- a/lib/CPANPLUS/Internals.pm
+++ b/lib/CPANPLUS/Internals.pm
@@ -42,7 +42,7 @@ use vars qw[@ISA $VERSION];
CPANPLUS::Internals::Report
];
-$VERSION = "0.86_06";
+$VERSION = "0.8601";
=pod
@@ -422,13 +422,16 @@ sub _add_to_includepath {
check( $tmpl, \%hash ) or return;
+ my $s = $Config{'path_sep'};
+
+ ### only add if it's not added yet
for my $lib (@$dirs) {
push @INC, $lib unless grep { $_ eq $lib } @INC;
- }
-
- { local $^W; ### it will be complaining if $ENV{PERL5LIB]
- ### is not defined (yet).
- $ENV{'PERL5LIB'} .= join '', map { $Config{'path_sep'} . $_ } @$dirs;
+ #
+ ### it will be complaining if $ENV{PERL5LIB] is not defined (yet).
+ local $^W;
+ $ENV{'PERL5LIB'} .= $s . $lib
+ unless $ENV{'PERL5LIB'} =~ qr|\Q$s$lib\E|;
}
return 1;
diff --git a/lib/CPANPLUS/Module.pm b/lib/CPANPLUS/Module.pm
index b8949feccf..b5602e1c85 100644
--- a/lib/CPANPLUS/Module.pm
+++ b/lib/CPANPLUS/Module.pm
@@ -436,19 +436,24 @@ L<Module::ThirdParty> for more details.
sub package_is_perl_core {
my $self = shift;
+ my $cb = $self->parent;
### check if the package looks like a perl core package
return 1 if $self->package_name eq PERL_CORE;
+ ### address #44562: ::Module->package_is_perl_code : problem comparing
+ ### version strings -- use $cb->_vcmp to avoid warnings when version
+ ### have _ in them
+
my $core = $self->module_is_supplied_with_perl_core;
### ok, so it's found in the core, BUT it could be dual-lifed
if ($core) {
### if the package is newer than installed, then it's dual-lifed
- return if $self->version > $self->installed_version;
-
+ return if $cb->_vcmp($self->version, $self->installed_version) > 0;
+
### if the package is newer or equal to the corelist,
### then it's dual-lifed
- return if $self->version >= $core;
+ return if $cb->_vcmp( $self->version, $core ) >= 0;
### otherwise, it's older than corelist, thus unsuitable.
return 1;
@@ -671,15 +676,19 @@ sub get_installer_type {
}
### ok, so it's a 'build' installer, but you don't /have/ module build
- if( $type eq INSTALLER_BUILD and
+ ### XXX duplicated from CPANPLUS::Selfupdate. fix somehow?
+ if( $type eq INSTALLER_BUILD and (
not CPANPLUS::Dist->has_dist_type( INSTALLER_BUILD )
- ) {
+ or not $cb->module_tree( INSTALLER_BUILD )
+ ->is_uptodate( version => '0.24' )
+ ) ) {
### XXX this is for recording purposes only. We *have* to install
### these before even creating a dist object, or we'll get an error
### saying 'no such dist type';
+ ### XXX duplicated from CPANPLUS::Selfupdate. fix somehow?
my $href = $self->status->configure_requires || {};
- my $deps = { INSTALLER_BUILD, 0, %$href };
+ my $deps = { INSTALLER_BUILD, '0.24', %$href };
$self->status->configure_requires( $deps );
@@ -777,15 +786,26 @@ sub dist {
}
}
- my $dist = $type->new( module => $self ) or return;
-
- my $dist_cpan = $type eq $self->status->installer_type
- ? $dist
+ ### make sure we don't overwrite it, just in case we came
+ ### back from a ->save_state. This allows restoration to
+ ### work correctly
+ my( $dist, $dist_cpan );
+
+ unless( $dist = $self->status->dist ) {
+ $dist = $type->new( module => $self ) or return;
+ $self->status->dist( $dist );
+ }
+
+ unless( $dist_cpan = $self->status->dist_cpan ) {
+
+ $dist_cpan = $type eq $self->status->installer_type
+ ? $self->status->dist
: $self->status->installer_type->new( module => $self );
- ### store the dists
- $self->status->dist_cpan( $dist_cpan );
- $self->status->dist( $dist );
+
+ $self->status->dist_cpan( $dist_cpan );
+ }
+
DIST: {
### first prepare the dist
@@ -992,6 +1012,7 @@ sub install {
### do SIGNATURE checks? ###
+ ### XXX check status and not recheck EVERY time?
if( $conf->get_conf('signature') ) {
unless( $self->check_signature( verbose => $args->{verbose} ) ) {
error( loc( "Signature check failed for module '%1' ".
@@ -1504,38 +1525,14 @@ sub distributions {
Returns a list of files used by this module, if it is installed.
-=cut
-
-sub files {
- return shift->_extutils_installed( @_, method => 'files' );
-}
-
-=pod
-
=head2 @list = $self->directory_tree ()
Returns a list of directories used by this module.
-=cut
-
-sub directory_tree {
- return shift->_extutils_installed( @_, method => 'directory_tree' );
-}
-
-=pod
-
=head2 @list = $self->packlist ()
Returns the C<ExtUtils::Packlist> object for this module.
-=cut
-
-sub packlist {
- return shift->_extutils_installed( @_, method => 'packlist' );
-}
-
-=pod
-
=head2 @list = $self->validate ()
Returns a list of files that are missing for this modules, but
@@ -1543,14 +1540,19 @@ are present in the .packlist file.
=cut
-sub validate {
- return shift->_extutils_installed( method => 'validate' );
+for my $sub (qw[files directory_tree packlist validate]) {
+ no strict 'refs';
+ *$sub = sub {
+ return shift->_extutils_installed( @_, method => $sub );
+ }
}
### generic method to call an ExtUtils::Installed method ###
sub _extutils_installed {
my $self = shift;
- my $conf = $self->parent->configure_object();
+ my $cb = $self->parent;
+ my $conf = $cb->configure_object;
+ my $home = $cb->_home_dir; # may be needed to fix up prefixes
my %hash = @_;
my ($verbose,$type,$method);
@@ -1580,6 +1582,24 @@ sub _extutils_installed {
verbose => $verbose,
);
+ my @config_names = (
+ ### lib
+ { lib => 'privlib', # perl-only
+ arch => 'archlib', # compiled code
+ prefix => 'prefix', # prefix to both
+ },
+ ### site
+ { lib => 'sitelib',
+ arch => 'sitearch',
+ prefix => 'siteprefix',
+ },
+ ### vendor
+ { lib => 'vendorlib',
+ arch => 'vendorarch',
+ prefix => 'vendorprefix',
+ },
+ );
+
### search in your regular @INC, and anything you added to your config.
### this lets EU::Installed find .packlists that are *not* in the standard
### compiled in @INC path. Requires EU::I 1.42 or up. this addresses #33438
@@ -1588,30 +1608,46 @@ sub _extutils_installed {
my @libs;
for my $lib ( @{ $conf->get_conf('lib') } ) {
require Config;
-
+
+ ### and just the standard dir
+ push @libs, $lib;
+
### figure out what an MM prefix expands to. Basically, it's the
### site install target from %Config, ie: /opt/lib/perl5/site_perl/5.8.8
### minus the site wide prefix, ie: /opt
### this lets users add the dir they have set as their EU::MM PREFIX
### to our 'lib' config and it Just Works
+ ### the arch specific dir, ie:
+ ### /opt/lib/perl5/site_perl/5.8.8/darwin-2level
### XXX is this the right thing to do?
- push @libs, do {
- my $site = $Config::Config{sitelib};
- my $prefix = quotemeta $Config::Config{prefix};
- ### strip the prefix from the site dir
- $site =~ s/^$prefix//;
+ ### we add all 6 dir combos for prefixes:
+ ### /foo/lib
+ ### /foo/lib/arch
+ ### /foo/site/lib
+ ### /foo/site/lib/arch
+ ### /foo/vendor/lib
+ ### /foo/vendor/lib/arch
+ for my $href ( @config_names ) {
+ for my $key ( qw[lib arch] ) {
- File::Spec->catdir( $lib, $site ),
- File::Spec->catdir( $lib, $site, $Config::Config{'archname'} );
- };
-
- ### the arch specific dir, ie:
- ### /opt/lib/perl5/site_perl/5.8.8/darwin-2level
- push @libs, File::Spec->catdir( $lib, $Config::Config{'archname'} );
-
- ### and just the standard dir
- push @libs, $lib;
+ ### look up the config value -- use EXP for the EXPANDED
+ ### version, so no ~ etc are found in there
+ my $dir = $Config::Config{ $href->{ $key } .'exp' } or next;
+ my $prefix = $Config::Config{ $href->{prefix} };
+
+ ### prefix may be relative to home, and contain a ~
+ ### if so, fix it up.
+ $prefix =~ s/^~/$home/;
+
+ ### remove the prefix from it, so we can append to our $lib
+ $dir =~ s/^\Q$prefix\E//;
+
+ ### do the appending
+ push @libs, File::Spec->catdir( $lib, $dir );
+
+ }
+ }
}
my $inst;
diff --git a/lib/CPANPLUS/Selfupdate.pm b/lib/CPANPLUS/Selfupdate.pm
index b8b40edc70..1346de8cbb 100644
--- a/lib/CPANPLUS/Selfupdate.pm
+++ b/lib/CPANPLUS/Selfupdate.pm
@@ -79,7 +79,7 @@ CPANPLUS::Selfupdate
my $cb = shift;
$cb->configure_object->get_conf('prefer_makefile')
? { }
- : { 'CPANPLUS::Dist::Build' => '0.04' };
+ : { 'CPANPLUS::Dist::Build' => '0.24' };
},
sub { return 1 }, # always enabled
],
diff --git a/lib/CPANPLUS/Shell/Classic.pm b/lib/CPANPLUS/Shell/Classic.pm
index 176548c4f3..08c03bcf38 100644
--- a/lib/CPANPLUS/Shell/Classic.pm
+++ b/lib/CPANPLUS/Shell/Classic.pm
@@ -314,7 +314,7 @@ sub _shell {
$cb->_chdir( dir => $obj->status->extract ) or next;
- local $ENV{PERL5OPT} = CPANPLUS::inc->original_perl5opt;
+ #local $ENV{PERL5OPT} = CPANPLUS::inc->original_perl5opt;
if( system($shell) and $! ) {
print "Error executing your subshell '$shell': $!\n";
next;
diff --git a/lib/CPANPLUS/Shell/Default.pm b/lib/CPANPLUS/Shell/Default.pm
index 668fbc7df0..8e059f7b17 100644
--- a/lib/CPANPLUS/Shell/Default.pm
+++ b/lib/CPANPLUS/Shell/Default.pm
@@ -26,7 +26,7 @@ local $Data::Dumper::Indent = 1; # for dumpering from !
BEGIN {
use vars qw[ $VERSION @ISA ];
@ISA = qw[ CPANPLUS::Shell::_Base::ReadLine ];
- $VERSION = "0.86_06";
+ $VERSION = "0.8601";
}
load CPANPLUS::Shell;
diff --git a/lib/CPANPLUS/inc.pm b/lib/CPANPLUS/inc.pm
deleted file mode 100644
index 2bcdc7ccc5..0000000000
--- a/lib/CPANPLUS/inc.pm
+++ /dev/null
@@ -1,522 +0,0 @@
-package CPANPLUS::inc;
-
-=head1 NAME
-
-CPANPLUS::inc
-
-=head1 DESCRIPTION
-
-OBSOLETE
-
-=cut
-
-sub original_perl5opt { $ENV{PERL5OPT} };
-sub original_perl5lib { $ENV{PERL5LIB} };
-sub original_inc { @INC };
-
-1;
-
-__END__
-
-use strict;
-use vars qw[$DEBUG $VERSION $ENABLE_INC_HOOK %LIMIT $QUIET];
-use File::Spec ();
-use Config ();
-
-### 5.6.1. nags about require + bareword otherwise ###
-use lib ();
-
-$QUIET = 0;
-$DEBUG = 0;
-%LIMIT = ();
-
-=pod
-
-=head1 NAME
-
-CPANPLUS::inc - runtime inclusion of privately bundled modules
-
-=head1 SYNOPSIS
-
- ### set up CPANPLUS::inc to do its thing ###
- BEGIN { use CPANPLUS::inc };
-
- ### enable debugging ###
- use CPANPLUS::inc qw[DEBUG];
-
-=head1 DESCRIPTION
-
-This module enables the use of the bundled modules in the
-C<CPANPLUS/inc> directory of this package. These modules are bundled
-to make sure C<CPANPLUS> is able to bootstrap itself. It will do the
-following things:
-
-=over 4
-
-=item Put a coderef at the beginning of C<@INC>
-
-This allows us to decide which module to load, and where to find it.
-For details on what we do, see the C<INTERESTING MODULES> section below.
-Also see the C<CAVEATS> section.
-
-=item Add the full path to the C<CPANPLUS/inc> directory to C<$ENV{PERL5LIB>.
-
-This allows us to find our bundled modules even if we spawn off a new
-process. Although it's not able to do the selective loading as the
-coderef in C<@INC> could, it's a good fallback.
-
-=back
-
-=head1 METHODS
-
-=head2 CPANPLUS::inc->inc_path()
-
-Returns the full path to the C<CPANPLUS/inc> directory.
-
-=head2 CPANPLUS::inc->my_path()
-
-Returns the full path to be added to C<@INC> to load
-C<CPANPLUS::inc> from.
-
-=head2 CPANPLUS::inc->installer_path()
-
-Returns the full path to the C<CPANPLUS/inc/installers> directory.
-
-=cut
-
-{ my $ext = '.pm';
- my $file = (join '/', split '::', __PACKAGE__) . $ext;
-
- ### os specific file path, if you're not on unix
- my $osfile = File::Spec->catfile( split('::', __PACKAGE__) ) . $ext;
-
- ### this returns a unixy path, compensate if you're on non-unix
- my $path = File::Spec->rel2abs(
- File::Spec->catfile( split '/', $INC{$file} )
- );
-
- ### don't forget to quotemeta; win32 paths are special
- my $qm_osfile = quotemeta $osfile;
- my $path_to_me = $path; $path_to_me =~ s/$qm_osfile$//i;
- my $path_to_inc = $path; $path_to_inc =~ s/$ext$//i;
- my $path_to_installers = File::Spec->catdir( $path_to_inc, 'installers' );
-
- sub inc_path { return $path_to_inc }
- sub my_path { return $path_to_me }
- sub installer_path { return $path_to_installers }
-}
-
-=head2 CPANPLUS::inc->original_perl5lib
-
-Returns the value of $ENV{PERL5LIB} the way it was when C<CPANPLUS::inc>
-got loaded.
-
-=head2 CPANPLUS::inc->original_perl5opt
-
-Returns the value of $ENV{PERL5OPT} the way it was when C<CPANPLUS::inc>
-got loaded.
-
-=head2 CPANPLUS::inc->original_inc
-
-Returns the value of @INC the way it was when C<CPANPLUS::inc> got
-loaded.
-
-=head2 CPANPLUS::inc->limited_perl5opt(@modules);
-
-Returns a string you can assign to C<$ENV{PERL5OPT}> to have a limited
-include facility from C<CPANPLUS::inc>. It will roughly look like:
-
- -I/path/to/cpanplus/inc -MCPANPLUS::inc=module1,module2
-
-=cut
-
-{ my $org_opt = $ENV{PERL5OPT};
- my $org_lib = $ENV{PERL5LIB};
- my @org_inc = @INC;
-
- sub original_perl5opt { $org_opt || ''};
- sub original_perl5lib { $org_lib || ''};
- sub original_inc { @org_inc, __PACKAGE__->my_path };
-
- sub limited_perl5opt {
- my $pkg = shift;
- my $lim = join ',', @_ or return;
-
- ### -Icp::inc -Mcp::inc=mod1,mod2,mod3
- my $opt = '-I' . __PACKAGE__->my_path . ' ' .
- '-M' . __PACKAGE__ . "=$lim";
-
- $opt .= $Config::Config{'path_sep'} .
- CPANPLUS::inc->original_perl5opt
- if CPANPLUS::inc->original_perl5opt;
-
- return $opt;
- }
-}
-
-=head2 CPANPLUS::inc->interesting_modules()
-
-Returns a hashref with modules we're interested in, and the minimum
-version we need to find.
-
-It would looks something like this:
-
- { File::Fetch => 0.06,
- IPC::Cmd => 0.22,
- ....
- }
-
-=cut
-
-{
- my $map = {
- ### used to have 0.80, but not it was never released by coral
- ### 0.79 *should* be good enough for now... asked coral to
- ### release 0.80 on 10/3/2006
- 'IPC::Run' => '0.79',
- 'File::Fetch' => '0.07',
- #'File::Spec' => '0.82', # can't, need it ourselves...
- 'IPC::Cmd' => '0.24',
- 'Locale::Maketext::Simple' => 0,
- 'Log::Message' => 0,
- 'Module::Load' => '0.10',
- 'Module::Load::Conditional' => '0.07',
- 'Params::Check' => '0.22',
- 'Term::UI' => '0.05',
- 'Archive::Extract' => '0.07',
- 'Archive::Tar' => '1.23',
- 'IO::Zlib' => '1.04',
- 'Object::Accessor' => '0.03',
- 'Module::CoreList' => '1.97',
- 'Module::Pluggable' => '2.4',
- 'Module::Loaded' => 0,
- #'Config::Auto' => 0, # not yet, not using it yet
- };
-
- sub interesting_modules { return $map; }
-}
-
-
-=head1 INTERESTING MODULES
-
-C<CPANPLUS::inc> doesn't even bother to try find and find a module
-it's not interested in. A list of I<interesting modules> can be
-obtained using the C<interesting_modules> method described above.
-
-Note that all subclassed modules of an C<interesting module> will
-also be attempted to be loaded, but a version will not be checked.
-
-When it however does encounter a module it is interested in, it will
-do the following things:
-
-=over 4
-
-=item Loop over your @INC
-
-And for every directory it finds there (skipping all non directories
--- see the C<CAVEATS> section), see if the module requested can be
-found there.
-
-=item Check the version on every suitable module found in @INC
-
-After a list of modules has been gathered, the version of each of them
-is checked to find the one with the highest version, and return that as
-the module to C<use>.
-
-This enables us to use a recent enough version from our own bundled
-modules, but also to use a I<newer> module found in your path instead,
-if it is present. Thus having access to bugfixed versions as they are
-released.
-
-If for some reason no satisfactory version could be found, a warning
-will be emitted. See the C<DEBUG> section for more details on how to
-find out exactly what C<CPANPLUS::inc> is doing.
-
-=back
-
-=cut
-
-{ my $Loaded;
- my %Cache;
-
-
- ### returns the path to a certain module we found
- sub path_to {
- my $self = shift;
- my $mod = shift or return;
-
- ### find the directory
- my $path = $Cache{$mod}->[0][2] or return;
-
- ### probe them explicitly for a special file, because the
- ### dir we found the file in vs our own paths may point to the
- ### same location, but might not pass an 'eq' test.
-
- ### it's our inc-path
- return __PACKAGE__->inc_path
- if -e File::Spec->catfile( $path, '.inc' );
-
- ### it's our installer path
- return __PACKAGE__->installer_path
- if -e File::Spec->catfile( $path, '.installers' );
-
- ### it's just some dir...
- return $path;
- }
-
- ### just a debug method
- sub _show_cache { return \%Cache };
-
- sub import {
- my $pkg = shift;
-
- ### filter DEBUG, and toggle the global
- map { $LIMIT{$_} = 1 }
- grep { /DEBUG/ ? ++$DEBUG && 0 :
- /QUIET/ ? ++$QUIET && 0 :
- 1
- } @_;
-
- ### only load once ###
- return 1 if $Loaded++;
-
- ### first, add our own private dir to the end of @INC:
- {
- push @INC, __PACKAGE__->my_path, __PACKAGE__->inc_path,
- __PACKAGE__->installer_path;
-
- ### XXX stop doing this, there's no need for it anymore;
- ### none of the shell outs need to have this set anymore
-# ### add the path to this module to PERL5OPT in case
-# ### we spawn off some programs...
-# ### then add this module to be loaded in PERL5OPT...
-# { local $^W;
-# $ENV{'PERL5LIB'} .= $Config::Config{'path_sep'}
-# . __PACKAGE__->my_path
-# . $Config::Config{'path_sep'}
-# . __PACKAGE__->inc_path;
-#
-# $ENV{'PERL5OPT'} = '-M'. __PACKAGE__ . ' '
-# . ($ENV{'PERL5OPT'} || '');
-# }
- }
-
- ### next, find the highest version of a module that
- ### we care about. very basic check, but will
- ### have to do for now.
- lib->import( sub {
- my $path = pop(); # path to the pm
- my $module = $path or return; # copy of the path, to munge
- my @parts = split qr!\\|/!, $path; # dirs + file name; could be
- # win32 paths =/
- my $file = pop @parts; # just the file name
- my $map = __PACKAGE__->interesting_modules;
-
- ### translate file name to module name
- ### could contain win32 paths delimiters
- $module =~ s!/|\\!::!g; $module =~ s/\.pm//i;
-
- my $check_version; my $try;
- ### does it look like a module we care about?
- my ($interesting) = grep { $module =~ /^$_/ } keys %$map;
- ++$try if $interesting;
-
- ### do we need to check the version too?
- ++$check_version if exists $map->{$module};
-
- ### we don't care ###
- unless( $try ) {
- warn __PACKAGE__ .": Not interested in '$module'\n" if $DEBUG;
- return;
-
- ### we're not allowed
- } elsif ( $try and keys %LIMIT ) {
- unless( grep { $module =~ /^$_/ } keys %LIMIT ) {
- warn __PACKAGE__ .": Limits active, '$module' not allowed ".
- "to be loaded" if $DEBUG;
- return;
- }
- }
-
- ### found filehandles + versions ###
- my @found;
- DIR: for my $dir (@INC) {
- next DIR unless -d $dir;
-
- ### get the full path to the module ###
- my $pm = File::Spec->catfile( $dir, @parts, $file );
-
- ### open the file if it exists ###
- if( -e $pm ) {
- my $fh;
- unless( open $fh, "$pm" ) {
- warn __PACKAGE__ .": Could not open '$pm': $!\n"
- if $DEBUG;
- next DIR;
- }
-
- my $found;
- ### XXX stolen from module::load::conditional ###
- while (local $_ = <$fh> ) {
-
- ### the following regexp comes from the
- ### ExtUtils::MakeMaker documentation.
- if ( /([\$*])(([\w\:\']*)\bVERSION)\b.*\=/ ) {
-
- ### this will eval the version in to $VERSION if it
- ### was declared as $VERSION in the module.
- ### else the result will be in $res.
- ### this is a fix on skud's Module::InstalledVersion
-
- local $VERSION;
- my $res = eval $_;
-
- ### default to '0.0' if there REALLY is no version
- ### all to satisfy warnings
- $found = $VERSION || $res || '0.0';
-
- ### found what we came for
- last if $found;
- }
- }
-
- ### no version defined at all? ###
- $found ||= '0.0';
-
- warn __PACKAGE__ .": Found match for '$module' in '$dir' "
- ."with version '$found'\n" if $DEBUG;
-
- ### reset the position of the filehandle ###
- seek $fh, 0, 0;
-
- ### store the found version + filehandle it came from ###
- push @found, [ $found, $fh, $dir, $pm ];
- }
-
- } # done looping over all the dirs
-
- ### nothing found? ###
- unless (@found) {
- warn __PACKAGE__ .": Unable to find any module named "
- . "'$module'\n" if $DEBUG;
- return;
- }
-
- ### find highest version
- ### or the one in the same dir as a base module already loaded
- ### or otherwise, the one not bundled
- ### or otherwise the newest
- my @sorted = sort {
- _vcmp($b->[0], $a->[0]) ||
- ($Cache{$interesting}
- ?($b->[2] eq $Cache{$interesting}->[0][2]) <=>
- ($a->[2] eq $Cache{$interesting}->[0][2])
- : 0 ) ||
- (($a->[2] eq __PACKAGE__->inc_path) <=>
- ($b->[2] eq __PACKAGE__->inc_path)) ||
- (-M $a->[3] <=> -M $b->[3])
- } @found;
-
- warn __PACKAGE__ .": Best match for '$module' is found in "
- ."'$sorted[0][2]' with version '$sorted[0][0]'\n"
- if $DEBUG;
-
- if( $check_version and
- not (_vcmp($sorted[0][0], $map->{$module}) >= 0)
- ) {
- warn __PACKAGE__ .": Cannot find high enough version for "
- ."'$module' -- need '$map->{$module}' but "
- ."only found '$sorted[0][0]'. Returning "
- ."highest found version but this may cause "
- ."problems\n" unless $QUIET;
- };
-
- ### right, so that damn )#$(*@#)(*@#@ Module::Build makes
- ### assumptions about the environment (especially its own tests)
- ### and blows up badly if it's loaded via CP::inc :(
- ### so, if we find a newer version on disk (which would happen when
- ### upgrading or having upgraded, just pretend we didn't find it,
- ### let it be loaded via the 'normal' way.
- ### can't even load the *proper* one via our CP::inc, as it will
- ### get upset just over the fact it's loaded via a non-standard way
- if( $module =~ /^Module::Build/ and
- $sorted[0][2] ne __PACKAGE__->inc_path and
- $sorted[0][2] ne __PACKAGE__->installer_path
- ) {
- warn __PACKAGE__ .": Found newer version of 'Module::Build::*' "
- ."elsewhere in your path. Pretending to not "
- ."have found it\n" if $DEBUG;
- return;
- }
-
- ### store what we found for this module
- $Cache{$module} = \@sorted;
-
- ### best matching filehandle ###
- return $sorted[0][1];
- } );
- }
-}
-
-### XXX copied from C::I::Utils, so there's no circular require here!
-sub _vcmp {
- my ($x, $y) = @_;
- s/_//g foreach $x, $y;
- return $x <=> $y;
-}
-
-=pod
-
-=head1 DEBUG
-
-Since this module does C<Clever Things> to your search path, it might
-be nice sometimes to figure out what it's doing, if things don't work
-as expected. You can enable a debug trace by calling the module like
-this:
-
- use CPANPLUS::inc 'DEBUG';
-
-This will show you what C<CPANPLUS::inc> is doing, which might look
-something like this:
-
- CPANPLUS::inc: Found match for 'Params::Check' in
- '/opt/lib/perl5/site_perl/5.8.3' with version '0.07'
- CPANPLUS::inc: Found match for 'Params::Check' in
- '/my/private/lib/CPANPLUS/inc' with version '0.21'
- CPANPLUS::inc: Best match for 'Params::Check' is found in
- '/my/private/lib/CPANPLUS/inc' with version '0.21'
-
-=head1 CAVEATS
-
-This module has 2 major caveats, that could lead to unexpected
-behaviour. But currently I don't know how to fix them, Suggestions
-are much welcomed.
-
-=over 4
-
-=item On multiple C<use lib> calls, our coderef may not be the first in @INC
-
-If this happens, although unlikely in most situations and not happening
-when calling the shell directly, this could mean that a lower (too low)
-versioned module is loaded, which might cause failures in the
-application.
-
-=item Non-directories in @INC
-
-Non-directories are right now skipped by CPANPLUS::inc. They could of
-course lead us to newer versions of a module, but it's too tricky to
-verify if they would. Therefor they are skipped. In the worst case
-scenario we'll find the sufficing version bundled with CPANPLUS.
-
-
-=cut
-
-1;
-
-# Local variables:
-# c-indentation-style: bsd
-# c-basic-offset: 4
-# indent-tabs-mode: nil
-# End:
-# vim: expandtab shiftwidth=4:
-
diff --git a/lib/CPANPLUS/t/00_CPANPLUS-Inc.t b/lib/CPANPLUS/t/00_CPANPLUS-Inc.t
deleted file mode 100644
index cf78d61f59..0000000000
--- a/lib/CPANPLUS/t/00_CPANPLUS-Inc.t
+++ /dev/null
@@ -1,190 +0,0 @@
-### make sure we can find our conf.pl file
-BEGIN {
- use FindBin;
- require "$FindBin::Bin/inc/conf.pl";
-}
-
-use strict;
-use Test::More 'no_plan';
-
-my $Class = 'CPANPLUS::inc';
-use_ok( $Class );
-can_ok( $Class, qw[original_perl5opt original_perl5lib original_inc] );
-
-__END__
-
-# XXX CPANPLUS::inc functionality is obsolete, so it is removed
-
-my $Module = 'Params::Check';
-my $File = File::Spec->catfile(qw|Params Check.pm|);
-my $Ufile = 'Params/Check.pm';
-my $Boring = 'IO::File';
-my $Bfile = 'IO/File.pm';
-
-
-
-### now, first element should be a coderef ###
-my $code = $INC[0];
-is( ref $code, 'CODE', 'Coderef loaded in @INC' );
-
-### check interesting modules ###
-{ my $mods = CPANPLUS::inc->interesting_modules();
- ok( $mods, "Retrieved interesting modules list" );
- is( ref $mods, 'HASH', " It's a hashref" );
- ok( scalar(keys %$mods), " With some keys in it" );
- ok( $mods->{$Module}, " Found a module we care about" );
-}
-
-### checking include path ###
-SKIP: {
- my $path = CPANPLUS::inc->inc_path();
- ok( $path, "Retrieved include path" );
- ok( -d $path, " Include path is an actual directory" );
-
- ### XXX no more files are bundled this way, it's obsolete
- #skip "No files actually bundled in perl core", 1 if $ENV{PERL_CORE};
- #ok( -s File::Spec->catfile( $path, $File ),
- # " Found '$File' in include path" );
-
- ### we don't do this anymore
- #my $out = join '', `$^X -V`; my $qm_path = quotemeta $path;
- #like( $out, qr/$qm_path/s, " Path found in perl -V output" );
-}
-
-### back to the coderef ###
-### try a boring module ###
-{ local $CPANPLUS::inc::DEBUG = 1;
- my $warnings; local $SIG{__WARN__} = sub { $warnings .= "@_" };
-
- my $rv = $code->($code, $Bfile);
- ok( !$rv, "Ignoring boring module" );
- ok( !$INC{$Bfile}, " Boring file not loaded" );
- like( $warnings, qr/CPANPLUS::inc: Not interested in '$Boring'/s,
- " Warned about boringness" );
-}
-
-### try to load a module with windows paths in it (bug [#11177])
-{ local $CPANPLUS::inc::DEBUG = 1;
- my $warnings; local $SIG{__WARN__} = sub { $warnings .= "@_" };
-
- my $wfile = 'IO\File.pm';
- my $wmod = 'IO::File';
-
- my $rv = $code->($code, $wfile);
- ok( !$rv, "Ignoring boring win32 module" );
- ok( !$INC{$wfile}, " Boring win32 file not loaded" );
- like( $warnings, qr/CPANPLUS::inc: Not interested in '$wmod'/s,
- " Warned about boringness" );
-}
-
-### try an interesting module ###
-{ local $CPANPLUS::inc::DEBUG = 1;
- my $warnings; local $SIG{__WARN__} = sub { $warnings .= "@_" };
-
- my $rv = $code->($code, $Ufile);
- ok( $rv, "Found interesting module" );
- ok( !$INC{$Ufile}, " Interesting file not loaded" );
- like( $warnings, qr/CPANPLUS::inc: Found match for '$Module'/,
- " Match noted in warnings" );
- like( $warnings, qr/CPANPLUS::inc: Best match for '$Module'/,
- " Best match noted in warnings" );
-
- my $contents = do { local $/; <$rv> };
- ok( $contents, " Read contents from filehandle" );
- like( $contents, qr/$Module/s,
- " Contents is from '$Module'" );
-}
-
-### now do some real loading ###
-{ use_ok($Module);
- ok( $INC{$Ufile}, " Regular use of '$Module'" );
-
- use_ok($Boring);
- ok( $INC{$Bfile}, " Regular use of '$Boring'" );
-}
-
-### check we didn't load our coderef anymore than needed ###
-{ my $amount = 5;
- for( 0..$amount ) { CPANPLUS::inc->import; };
-
- my $flag;
- map { $flag++ if ref $_ eq 'CODE' } @INC[0..$amount];
-
- my $ok = $amount + 1 == $flag ? 0 : 1;
- ok( $ok, "Only loaded coderef into \@INC $flag times");
-}
-
-### check limit funcionality
-{ local $CPANPLUS::inc::DEBUG = 1;
- my $warnings; local $SIG{__WARN__} = sub { $warnings .= "@_" };
-
- ### so we can reload it
- delete $INC{$Ufile};
- delete $INC{$Bfile};
-
- ### limit to the loading of $Boring;
- CPANPLUS::inc->import( $Boring );
-
- ok( $CPANPLUS::inc::LIMIT{$Boring},
- "Limit to '$Boring' recorded" );
-
- ### try a boring file first
- { my $rv = $code->($code, $Bfile);
- ok( !$rv, " '$Boring' still not being loaded" );
- ok( !$INC{$Bfile}, ' Is not in %INC either' );
- }
-
- ### try an interesting one now
- { my $rv = $code->( $code, $Ufile );
- ok( !$rv, " '$Module' is not being loaded" );
- ok( !$INC{$Ufile}, ' Is not in %INC either' );
- like( $warnings, qr/CPANPLUS::inc: Limits active, '$Module'/s,
- " Warned about limits" );
- }
-
- ### reset limits, try again
- { local %CPANPLUS::inc::LIMIT;
- ok( !keys(%CPANPLUS::inc::LIMIT),
- " Limits removed" );
-
-
- my $rv = $code->( $code, $Ufile );
- ok( $rv, " '$Module' is being loaded" );
-
- use_ok( $Module );
- ok( $INC{$Ufile}, ' Present in %INC' );
- }
-}
-
-### test limited perl5opt, to include just a few modules
-{ my $dash_m = quotemeta '-MCPANPLUS::inc';
- my $dash_i = quotemeta '-I' . CPANPLUS::inc->my_path;
- my $orgopt = quotemeta CPANPLUS::inc->original_perl5opt;
-
- ### first try an empty string;
- { my $str = CPANPLUS::inc->limited_perl5opt;
- ok( !$str, "limited_perl5opt without args is empty" );
- }
-
- ### try with one 'modules'
- { my $str = CPANPLUS::inc->limited_perl5opt(qw[A]);
- ok( $str, "limted perl5opt set for 1 module" );
- like( $str, qr/$dash_m=A\b/,
- " -M set properly" );
- like( $str, qr/$dash_i/," -I set properly" );
- like( $str, qr/$orgopt/," Original opts preserved" );
- }
-
- ### try with more 'modules'
- { my $str = CPANPLUS::inc->limited_perl5opt(qw[A B C]);
- ok( $str, "limted perl5opt set for 3 modules" );
- like( $str, qr/$dash_m=A,B,C\b/,
- " -M set properly" );
- like( $str, qr/$dash_i/," -I set properly" );
- like( $str, qr/$orgopt/," Original opts preserved" );
- }
-}
-
-
-
-
diff --git a/lib/CPANPLUS/t/02_CPANPLUS-Internals.t b/lib/CPANPLUS/t/02_CPANPLUS-Internals.t
index f5761741fd..84b78f3ade 100644
--- a/lib/CPANPLUS/t/02_CPANPLUS-Internals.t
+++ b/lib/CPANPLUS/t/02_CPANPLUS-Internals.t
@@ -73,6 +73,30 @@ is($cb->_id, $cb->_last_id, "Comparing ID's");
" '$mod' loaded" );
}
+### add to inc path tests
+{ my $meth = '_add_to_includepath';
+ can_ok( $cb, $meth );
+
+ my $p5lib = $ENV{PERL5LIB} || '';
+ my $inc = "@INC";
+ ok( $cb->$meth( directories => [$$] ),
+ " CB->$meth( $$ )" );
+
+ my $new_p5lib = $ENV{PERL5LIB};
+ my $new_inc = "@INC";
+ isnt( $p5lib, $new_p5lib, " PERL5LIB is now: $new_p5lib" );
+ like( $new_p5lib, qr/$$/, " Matches $$" );
+
+ isnt( $inc, $new_inc, ' @INC is expanded with: ' . $$ );
+ like( $new_inc, qr/$$/, " Matches $$" );
+
+ ok( $cb->$meth( directories => [$$] ),
+ " CB->$meth( $$ ) again" );
+ is( "@INC", $new_inc, ' @INC unchanged' );
+ is( $new_p5lib, $ENV{PERL5LIB},
+ " PERL5LIB unchanged" );
+}
+
### callback registering tests ###
{ my $callback_map = {
### name default value
diff --git a/lib/CPANPLUS/t/20_CPANPLUS-Dist-MM.t b/lib/CPANPLUS/t/20_CPANPLUS-Dist-MM.t
index d3eb525fa1..b4fd78ddf1 100644
--- a/lib/CPANPLUS/t/20_CPANPLUS-Dist-MM.t
+++ b/lib/CPANPLUS/t/20_CPANPLUS-Dist-MM.t
@@ -22,7 +22,6 @@ use File::Spec ();
my $conf = gimme_conf();
my $cb = CPANPLUS::Backend->new( $conf );
my $File = 'Bar.pm';
-my $Verbose = @ARGV ? 1 : 0;
### if we need sudo that's no guarantee we can actually run it
### so set $noperms if sudo is required, as that may mean tests
@@ -45,14 +44,13 @@ $cb->_callbacks->send_test_report( sub { 0 } );
$conf->set_conf( cpantest => 0 );
### Redirect errors to file ###
-*STDERR = output_handle() unless $Verbose;
+*STDERR = output_handle() unless $conf->get_conf('verbose');
### dont uncomment this, it screws up where STDOUT goes and makes
### test::harness create test counter mismatches
#*STDOUT = output_handle() unless @ARGV;
### for the same test-output counter mismatch, we disable verbose
### mode
-$conf->set_conf( verbose => $Verbose );
$conf->set_conf( allow_build_interactivity => 0 );
### start with fresh sources ###
diff --git a/lib/CPANPLUS/t/21_CPANPLUS-Dist-No-Build.t b/lib/CPANPLUS/t/21_CPANPLUS-Dist-No-Build.t
index 6ac77f6aad..55007ba566 100644
--- a/lib/CPANPLUS/t/21_CPANPLUS-Dist-No-Build.t
+++ b/lib/CPANPLUS/t/21_CPANPLUS-Dist-No-Build.t
@@ -49,6 +49,8 @@ ok( not grep { $_ eq $Inst } CPANPLUS::Dist->dist_types,
ok( scalar(keys(%$href)), " Dependencies recorded" );
ok( defined $href->{$Inst}, " Dependency on $Inst" );
+ cmp_ok( $href->{$Inst}, '>', 0,
+ " Minimum version: $href->{$Inst}" );
my $err = CPANPLUS::Error->stack_as_string;
like( $err, qr/$Inst/, " Message mentions $Inst" );
diff --git a/lib/CPANPLUS/t/40_CPANPLUS-Internals-Report.t b/lib/CPANPLUS/t/40_CPANPLUS-Internals-Report.t
index 4e91baeba5..d7c2bd81cd 100644
--- a/lib/CPANPLUS/t/40_CPANPLUS-Internals-Report.t
+++ b/lib/CPANPLUS/t/40_CPANPLUS-Internals-Report.t
@@ -25,9 +25,12 @@ my $CB = CPANPLUS::Backend->new( $conf );
my $ModName = TEST_CONF_MODULE;
my $ModPrereq = TEST_CONF_PREREQ;
-### divide by many -- possibly ~0 is unsigned, and we cause an overflow,
-### as happens to version.pm 0.7203 among others.
-my $HighVersion = ~0/1000;
+### pick a high number, but not ~0 as possibly ~0 is unsigned, and we cause
+### an overflow, as happens to version.pm 0.7203 among others.
+### ANOTHER bug in version.pm, this time for 64bit:
+### https://rt.cpan.org/Ticket/Display.html?id=45241
+### so just use a 'big number'(tm) and go from there.
+my $HighVersion = 1234567890;
my $Mod = $CB->module_tree($ModName);
my $int_ver = $CPANPLUS::Internals::VERSION;
diff --git a/lib/CPANPLUS/t/dummy-CPAN/authors/01mailrc.txt.gz.packed b/lib/CPANPLUS/t/dummy-CPAN/authors/01mailrc.txt.gz.packed
index c25653f9d8..0bcb0fa40e 100644
--- a/lib/CPANPLUS/t/dummy-CPAN/authors/01mailrc.txt.gz.packed
+++ b/lib/CPANPLUS/t/dummy-CPAN/authors/01mailrc.txt.gz.packed
@@ -10,7 +10,7 @@ To recreate it use the following command:
uupacktool.pl -p lib/CPANPLUS/t/dummy-CPAN/authors/01mailrc.txt.gz lib/CPANPLUS/t/dummy-CPAN/authors/01mailrc.txt.gz.packed
-Created at Tue Feb 24 22:22:00 2009
+Created at Sun Apr 26 20:33:20 2009
#########################################################################
__UU__
M'XL("%_EO$4``S`Q;6%I;')C+G1X=`!+S,E,+%9P#8T(5@`#)=>*DM"2S)QB
diff --git a/lib/CPANPLUS/t/dummy-CPAN/authors/id/EUNOXS/Bundle-Foo-Bar-0.01.tar.gz.packed b/lib/CPANPLUS/t/dummy-CPAN/authors/id/EUNOXS/Bundle-Foo-Bar-0.01.tar.gz.packed
index 0272e71550..bd58326951 100644
--- a/lib/CPANPLUS/t/dummy-CPAN/authors/id/EUNOXS/Bundle-Foo-Bar-0.01.tar.gz.packed
+++ b/lib/CPANPLUS/t/dummy-CPAN/authors/id/EUNOXS/Bundle-Foo-Bar-0.01.tar.gz.packed
@@ -10,7 +10,7 @@ To recreate it use the following command:
uupacktool.pl -p lib/CPANPLUS/t/dummy-CPAN/authors/id/EUNOXS/Bundle-Foo-Bar-0.01.tar.gz lib/CPANPLUS/t/dummy-CPAN/authors/id/EUNOXS/Bundle-Foo-Bar-0.01.tar.gz.packed
-Created at Tue Feb 24 22:22:00 2009
+Created at Sun Apr 26 20:33:20 2009
#########################################################################
__UU__
M'XL("!1%OT4"`T)U;F1L92U&;V\M0F%R+3`N,#$N=&%R`.V7:V_:,!2&^8I_
diff --git a/lib/CPANPLUS/t/dummy-CPAN/authors/id/EUNOXS/Foo-Bar-0.01.tar.gz.packed b/lib/CPANPLUS/t/dummy-CPAN/authors/id/EUNOXS/Foo-Bar-0.01.tar.gz.packed
index 57be5f3c58..553cbd3639 100644
--- a/lib/CPANPLUS/t/dummy-CPAN/authors/id/EUNOXS/Foo-Bar-0.01.tar.gz.packed
+++ b/lib/CPANPLUS/t/dummy-CPAN/authors/id/EUNOXS/Foo-Bar-0.01.tar.gz.packed
@@ -10,7 +10,7 @@ To recreate it use the following command:
uupacktool.pl -p lib/CPANPLUS/t/dummy-CPAN/authors/id/EUNOXS/Foo-Bar-0.01.tar.gz lib/CPANPLUS/t/dummy-CPAN/authors/id/EUNOXS/Foo-Bar-0.01.tar.gz.packed
-Created at Tue Feb 24 22:22:00 2009
+Created at Sun Apr 26 20:33:20 2009
#########################################################################
__UU__
M'XL(`#P*BD<``^V:;6_B1A"`\WE_Q214(I$.QQ@;)*<YE;M"$^E(JB37GG0]
diff --git a/lib/CPANPLUS/t/dummy-CPAN/authors/id/EUNOXS/perl5.005_03.tar.gz.packed b/lib/CPANPLUS/t/dummy-CPAN/authors/id/EUNOXS/perl5.005_03.tar.gz.packed
index 7eb2d53ff5..ce9b8c796d 100644
--- a/lib/CPANPLUS/t/dummy-CPAN/authors/id/EUNOXS/perl5.005_03.tar.gz.packed
+++ b/lib/CPANPLUS/t/dummy-CPAN/authors/id/EUNOXS/perl5.005_03.tar.gz.packed
@@ -10,7 +10,7 @@ To recreate it use the following command:
uupacktool.pl -p lib/CPANPLUS/t/dummy-CPAN/authors/id/EUNOXS/perl5.005_03.tar.gz lib/CPANPLUS/t/dummy-CPAN/authors/id/EUNOXS/perl5.005_03.tar.gz.packed
-Created at Tue Feb 24 22:22:00 2009
+Created at Sun Apr 26 20:33:20 2009
#########################################################################
__UU__
M'XL(`'3DO44``^W/,0J`,`Q`T1RE)Y"T-O4XXN"DB%2]OR(*NNC4[;_E#\F0
diff --git a/lib/CPANPLUS/t/dummy-CPAN/authors/id/EUXS/Foo-Bar-0.01.tar.gz.packed b/lib/CPANPLUS/t/dummy-CPAN/authors/id/EUXS/Foo-Bar-0.01.tar.gz.packed
index f5e69640b7..a677995fd1 100644
--- a/lib/CPANPLUS/t/dummy-CPAN/authors/id/EUXS/Foo-Bar-0.01.tar.gz.packed
+++ b/lib/CPANPLUS/t/dummy-CPAN/authors/id/EUXS/Foo-Bar-0.01.tar.gz.packed
@@ -10,7 +10,7 @@ To recreate it use the following command:
uupacktool.pl -p lib/CPANPLUS/t/dummy-CPAN/authors/id/EUXS/Foo-Bar-0.01.tar.gz lib/CPANPLUS/t/dummy-CPAN/authors/id/EUXS/Foo-Bar-0.01.tar.gz.packed
-Created at Tue Feb 24 22:22:00 2009
+Created at Sun Apr 26 20:33:20 2009
#########################################################################
__UU__
M'XL("`DY34("`T9O;RU"87(M,"XP,2YT87(`[5IK3]M(%,U7YE=<H%5``A.;
diff --git a/lib/CPANPLUS/t/dummy-CPAN/authors/id/MBNOXS/Foo-Bar-0.01.tar.gz.packed b/lib/CPANPLUS/t/dummy-CPAN/authors/id/MBNOXS/Foo-Bar-0.01.tar.gz.packed
index d5e0881ba4..73d05ba95c 100644
--- a/lib/CPANPLUS/t/dummy-CPAN/authors/id/MBNOXS/Foo-Bar-0.01.tar.gz.packed
+++ b/lib/CPANPLUS/t/dummy-CPAN/authors/id/MBNOXS/Foo-Bar-0.01.tar.gz.packed
@@ -10,7 +10,7 @@ To recreate it use the following command:
uupacktool.pl -p lib/CPANPLUS/t/dummy-CPAN/authors/id/MBNOXS/Foo-Bar-0.01.tar.gz lib/CPANPLUS/t/dummy-CPAN/authors/id/MBNOXS/Foo-Bar-0.01.tar.gz.packed
-Created at Tue Feb 24 22:22:00 2009
+Created at Sun Apr 26 20:33:20 2009
#########################################################################
__UU__
M'XL("-<X34(``T9O;RU"87(M,"XP,2YT87(`[9E;;]HP%,=Y]J<X+9722@-R
diff --git a/lib/CPANPLUS/t/dummy-CPAN/authors/id/MBXS/Foo-Bar-0.01.tar.gz.packed b/lib/CPANPLUS/t/dummy-CPAN/authors/id/MBXS/Foo-Bar-0.01.tar.gz.packed
index ec64af77ca..33855e3d98 100644
--- a/lib/CPANPLUS/t/dummy-CPAN/authors/id/MBXS/Foo-Bar-0.01.tar.gz.packed
+++ b/lib/CPANPLUS/t/dummy-CPAN/authors/id/MBXS/Foo-Bar-0.01.tar.gz.packed
@@ -10,7 +10,7 @@ To recreate it use the following command:
uupacktool.pl -p lib/CPANPLUS/t/dummy-CPAN/authors/id/MBXS/Foo-Bar-0.01.tar.gz lib/CPANPLUS/t/dummy-CPAN/authors/id/MBXS/Foo-Bar-0.01.tar.gz.packed
-Created at Tue Feb 24 22:22:00 2009
+Created at Sun Apr 26 20:33:21 2009
#########################################################################
__UU__
M'XL("-\X34(``T9O;RU"87(M,"XP,2YT87(`[5K_3QI)%/=7YZ]XU39H(BN[
diff --git a/lib/CPANPLUS/t/dummy-CPAN/modules/02packages.details.txt.gz.packed b/lib/CPANPLUS/t/dummy-CPAN/modules/02packages.details.txt.gz.packed
index c692c809fd..e209dc1d4a 100644
--- a/lib/CPANPLUS/t/dummy-CPAN/modules/02packages.details.txt.gz.packed
+++ b/lib/CPANPLUS/t/dummy-CPAN/modules/02packages.details.txt.gz.packed
@@ -10,7 +10,7 @@ To recreate it use the following command:
uupacktool.pl -p lib/CPANPLUS/t/dummy-CPAN/modules/02packages.details.txt.gz lib/CPANPLUS/t/dummy-CPAN/modules/02packages.details.txt.gz.packed
-Created at Tue Feb 24 22:22:00 2009
+Created at Sun Apr 26 20:33:21 2009
#########################################################################
__UU__
M'XL("-"H)4<``S`R<&%C:V%G97,N9&5T86EL<RYT>'0`G=-1;],P$`#@=_^*
diff --git a/lib/CPANPLUS/t/dummy-CPAN/modules/03modlist.data.gz.packed b/lib/CPANPLUS/t/dummy-CPAN/modules/03modlist.data.gz.packed
index 82ae9acf27..df1d60019f 100644
--- a/lib/CPANPLUS/t/dummy-CPAN/modules/03modlist.data.gz.packed
+++ b/lib/CPANPLUS/t/dummy-CPAN/modules/03modlist.data.gz.packed
@@ -10,7 +10,7 @@ To recreate it use the following command:
uupacktool.pl -p lib/CPANPLUS/t/dummy-CPAN/modules/03modlist.data.gz lib/CPANPLUS/t/dummy-CPAN/modules/03modlist.data.gz.packed
-Created at Tue Feb 24 22:22:00 2009
+Created at Sun Apr 26 20:33:21 2009
#########################################################################
__UU__
M'XL("#'FO$4``S`S;6]D;&ES="YD871A`%U3_6O;,!#].?HKCBXC"20A=<@&
diff --git a/lib/CPANPLUS/t/inc/conf.pl b/lib/CPANPLUS/t/inc/conf.pl
index c884fd886b..1287ec9df9 100644
--- a/lib/CPANPLUS/t/inc/conf.pl
+++ b/lib/CPANPLUS/t/inc/conf.pl
@@ -102,41 +102,7 @@ use constant TEST_CONF_INSTALL_DIR => File::Spec->rel2abs(
TEST_CONF_CPANPLUS_DIR,
'install'
)
- );
-
-### we might need this Some Day when we're installing into
-### our own sandbox. see t/20.t for details
-# use constant TEST_INSTALL_DIR => do {
-# my $dir = File::Spec->rel2abs( 'dummy-perl' );
-#
-# ### clean up paths if we are on win32
-# ### dirs with spaces will be.. bad :(
-# $^O eq 'MSWin32'
-# ? Win32::GetShortPathName( $dir )
-# : $dir;
-# };
-
-# use constant TEST_INSTALL_DIR_LIB
-# => File::Spec->catdir( TEST_INSTALL_DIR, 'lib' );
-# use constant TEST_INSTALL_DIR_BIN
-# => File::Spec->catdir( TEST_INSTALL_DIR, 'bin' );
-# use constant TEST_INSTALL_DIR_MAN1
-# => File::Spec->catdir( TEST_INSTALL_DIR, 'man', 'man1' );
-# use constant TEST_INSTALL_DIR_MAN3
-# => File::Spec->catdir( TEST_INSTALL_DIR, 'man', 'man3' );
-# use constant TEST_INSTALL_DIR_ARCH
-# => File::Spec->catdir( TEST_INSTALL_DIR, 'arch' );
-#
-# use constant TEST_INSTALL_EU_MM_FLAGS =>
-# ' INSTALLDIRS=site' .
-# ' INSTALLSITELIB=' . TEST_INSTALL_DIR_LIB .
-# ' INSTALLSITEARCH=' . TEST_INSTALL_DIR_ARCH . # .packlist
-# ' INSTALLARCHLIB=' . TEST_INSTALL_DIR_ARCH . # perllocal.pod
-# ' INSTALLSITEBIN=' . TEST_INSTALL_DIR_BIN .
-# ' INSTALLSCRIPT=' . TEST_INSTALL_DIR_BIN .
-# ' INSTALLSITEMAN1DIR=' . TEST_INSTALL_DIR_MAN1 .
-# ' INSTALLSITEMAN3DIR=' . TEST_INSTALL_DIR_MAN3;
-
+ );
sub dummy_cpan_dir {
### VMS needs this in directory format for rel2abs
diff --git a/lib/Cwd.pm b/lib/Cwd.pm
index 83239bf16a..8121231639 100644
--- a/lib/Cwd.pm
+++ b/lib/Cwd.pm
@@ -289,6 +289,7 @@ my %METHOD_MAP =
abs_path => 'fast_abs_path',
},
+ # QNX4. QNX6 has a $os of 'nto'.
qnx =>
{
cwd => '_qnx_cwd',
@@ -327,7 +328,6 @@ my %METHOD_MAP =
);
$METHOD_MAP{NT} = $METHOD_MAP{MSWin32};
-$METHOD_MAP{nto} = $METHOD_MAP{qnx};
# Find the pwd command in the expected locations. We assume these
diff --git a/lib/ExtUtils/Command/MM.pm b/lib/ExtUtils/Command/MM.pm
index 4f7b73a6bf..c9c43ecb17 100644
--- a/lib/ExtUtils/Command/MM.pm
+++ b/lib/ExtUtils/Command/MM.pm
@@ -10,7 +10,7 @@ our @ISA = qw(Exporter);
our @EXPORT = qw(test_harness pod2man perllocal_install uninstall
warn_if_old_packlist);
-our $VERSION = '6.49_01';
+our $VERSION = '6.50';
my $Is_VMS = $^O eq 'VMS';
diff --git a/lib/ExtUtils/Liblist.pm b/lib/ExtUtils/Liblist.pm
index 4ff8a24f3b..b74306c702 100644
--- a/lib/ExtUtils/Liblist.pm
+++ b/lib/ExtUtils/Liblist.pm
@@ -2,7 +2,7 @@ package ExtUtils::Liblist;
use strict;
-our $VERSION = '6.49_01';
+our $VERSION = '6.50';
use File::Spec;
require ExtUtils::Liblist::Kid;
diff --git a/lib/ExtUtils/Liblist/Kid.pm b/lib/ExtUtils/Liblist/Kid.pm
index 6c3ebe9e62..113667e295 100644
--- a/lib/ExtUtils/Liblist/Kid.pm
+++ b/lib/ExtUtils/Liblist/Kid.pm
@@ -9,7 +9,7 @@ use 5.006;
# Broken out of MakeMaker from version 4.11
use strict;
-our $VERSION = 6.49_01;
+our $VERSION = 6.50;
use Config;
use Cwd 'cwd';
diff --git a/lib/ExtUtils/MM.pm b/lib/ExtUtils/MM.pm
index 6d800ee723..e0ae615bbb 100644
--- a/lib/ExtUtils/MM.pm
+++ b/lib/ExtUtils/MM.pm
@@ -3,7 +3,7 @@ package ExtUtils::MM;
use strict;
use ExtUtils::MakeMaker::Config;
-our $VERSION = '6.49_01';
+our $VERSION = '6.50';
require ExtUtils::Liblist;
require ExtUtils::MakeMaker;
diff --git a/lib/ExtUtils/MM_AIX.pm b/lib/ExtUtils/MM_AIX.pm
index 7e5a44aed0..36a6f6281a 100644
--- a/lib/ExtUtils/MM_AIX.pm
+++ b/lib/ExtUtils/MM_AIX.pm
@@ -1,7 +1,7 @@
package ExtUtils::MM_AIX;
use strict;
-our $VERSION = '6.49_01';
+our $VERSION = '6.50';
require ExtUtils::MM_Unix;
our @ISA = qw(ExtUtils::MM_Unix);
diff --git a/lib/ExtUtils/MM_Any.pm b/lib/ExtUtils/MM_Any.pm
index 69b63a53d1..0882a14402 100644
--- a/lib/ExtUtils/MM_Any.pm
+++ b/lib/ExtUtils/MM_Any.pm
@@ -1,7 +1,7 @@
package ExtUtils::MM_Any;
use strict;
-our $VERSION = '6.49_01';
+our $VERSION = '6.50';
use Carp;
use File::Spec;
diff --git a/lib/ExtUtils/MM_BeOS.pm b/lib/ExtUtils/MM_BeOS.pm
index 8c0e55042a..4a0d25b778 100644
--- a/lib/ExtUtils/MM_BeOS.pm
+++ b/lib/ExtUtils/MM_BeOS.pm
@@ -26,7 +26,7 @@ require ExtUtils::MM_Any;
require ExtUtils::MM_Unix;
our @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
-our $VERSION = '6.49_01';
+our $VERSION = '6.50';
=item os_flavor
diff --git a/lib/ExtUtils/MM_Cygwin.pm b/lib/ExtUtils/MM_Cygwin.pm
index 8bcecf7114..1eaf00e1fd 100644
--- a/lib/ExtUtils/MM_Cygwin.pm
+++ b/lib/ExtUtils/MM_Cygwin.pm
@@ -9,7 +9,7 @@ require ExtUtils::MM_Any;
require ExtUtils::MM_Unix;
our @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
-our $VERSION = '6.49_01';
+our $VERSION = '6.50';
=head1 NAME
diff --git a/lib/ExtUtils/MM_DOS.pm b/lib/ExtUtils/MM_DOS.pm
index 3d4ed66050..1238fe6439 100644
--- a/lib/ExtUtils/MM_DOS.pm
+++ b/lib/ExtUtils/MM_DOS.pm
@@ -2,7 +2,7 @@ package ExtUtils::MM_DOS;
use strict;
-our $VERSION = 6.49_01;
+our $VERSION = 6.50;
require ExtUtils::MM_Any;
require ExtUtils::MM_Unix;
diff --git a/lib/ExtUtils/MM_Darwin.pm b/lib/ExtUtils/MM_Darwin.pm
index 3632753e06..e3d6dbf950 100644
--- a/lib/ExtUtils/MM_Darwin.pm
+++ b/lib/ExtUtils/MM_Darwin.pm
@@ -7,7 +7,7 @@ BEGIN {
our @ISA = qw( ExtUtils::MM_Unix );
}
-our $VERSION = '6.49_01';
+our $VERSION = '6.50';
=head1 NAME
diff --git a/lib/ExtUtils/MM_Haiku.pm b/lib/ExtUtils/MM_Haiku.pm
deleted file mode 100644
index 08835fa6d3..0000000000
--- a/lib/ExtUtils/MM_Haiku.pm
+++ /dev/null
@@ -1,63 +0,0 @@
-
-package ExtUtils::MM_Haiku;
-
-use strict;
-
-=head1 NAME
-
-ExtUtils::MM_Haiku - methods to override UN*X behaviour in ExtUtils::MakeMaker
-
-=head1 SYNOPSIS
-
- use ExtUtils::MM_Haiku; # Done internally by ExtUtils::MakeMaker if needed
-
-=head1 DESCRIPTION
-
-See ExtUtils::MM_Unix for a documentation of the methods provided
-there. This package overrides the implementation of these methods, not
-the semantics.
-
-=over 4
-
-=cut
-
-use ExtUtils::MakeMaker::Config;
-use File::Spec;
-require ExtUtils::MM_Any;
-require ExtUtils::MM_Unix;
-
-use vars qw(@ISA $VERSION);
-@ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
-$VERSION = '6.42';
-
-
-=item os_flavor
-
-Haiku is Haiku.
-
-=cut
-
-sub os_flavor {
- return('Haiku');
-}
-
-=item init_linker
-
-libperl.a equivalent to be linked to dynamic extensions.
-
-=cut
-
-sub init_linker {
- my($self) = shift;
-
- $self->{PERL_ARCHIVE} ||=
- File::Spec->catdir('$(PERL_INC)',$Config{libperl});
- $self->{PERL_ARCHIVE_AFTER} ||= '';
- $self->{EXPORT_LIST} ||= '';
-}
-
-=back
-
-1;
-__END__
-
diff --git a/lib/ExtUtils/MM_MacOS.pm b/lib/ExtUtils/MM_MacOS.pm
index cce12f5942..47a0aef9ce 100644
--- a/lib/ExtUtils/MM_MacOS.pm
+++ b/lib/ExtUtils/MM_MacOS.pm
@@ -2,7 +2,7 @@ package ExtUtils::MM_MacOS;
use strict;
-our $VERSION = 6.49_01;
+our $VERSION = 6.50;
sub new {
die <<'UNSUPPORTED';
diff --git a/lib/ExtUtils/MM_NW5.pm b/lib/ExtUtils/MM_NW5.pm
index b116825fcd..285a04d7c7 100644
--- a/lib/ExtUtils/MM_NW5.pm
+++ b/lib/ExtUtils/MM_NW5.pm
@@ -22,7 +22,7 @@ use strict;
use ExtUtils::MakeMaker::Config;
use File::Basename;
-our $VERSION = '6.49_01';
+our $VERSION = '6.50';
require ExtUtils::MM_Win32;
our @ISA = qw(ExtUtils::MM_Win32);
diff --git a/lib/ExtUtils/MM_OS2.pm b/lib/ExtUtils/MM_OS2.pm
index dfdf58dc07..0a57a57594 100644
--- a/lib/ExtUtils/MM_OS2.pm
+++ b/lib/ExtUtils/MM_OS2.pm
@@ -5,7 +5,7 @@ use strict;
use ExtUtils::MakeMaker qw(neatvalue);
use File::Spec;
-our $VERSION = '6.49_01';
+our $VERSION = '6.50';
require ExtUtils::MM_Any;
require ExtUtils::MM_Unix;
diff --git a/lib/ExtUtils/MM_QNX.pm b/lib/ExtUtils/MM_QNX.pm
index bdac3474fa..653078f511 100644
--- a/lib/ExtUtils/MM_QNX.pm
+++ b/lib/ExtUtils/MM_QNX.pm
@@ -1,7 +1,7 @@
package ExtUtils::MM_QNX;
use strict;
-our $VERSION = '6.49_01';
+our $VERSION = '6.50';
require ExtUtils::MM_Unix;
our @ISA = qw(ExtUtils::MM_Unix);
diff --git a/lib/ExtUtils/MM_UWIN.pm b/lib/ExtUtils/MM_UWIN.pm
index a73f81eddc..b1f7d7d4b2 100644
--- a/lib/ExtUtils/MM_UWIN.pm
+++ b/lib/ExtUtils/MM_UWIN.pm
@@ -1,7 +1,7 @@
package ExtUtils::MM_UWIN;
use strict;
-our $VERSION = 6.49_01;
+our $VERSION = 6.50;
require ExtUtils::MM_Unix;
our @ISA = qw(ExtUtils::MM_Unix);
diff --git a/lib/ExtUtils/MM_Unix.pm b/lib/ExtUtils/MM_Unix.pm
index 1eca13ae95..a997b1f79c 100644
--- a/lib/ExtUtils/MM_Unix.pm
+++ b/lib/ExtUtils/MM_Unix.pm
@@ -15,7 +15,7 @@ use ExtUtils::MakeMaker qw($Verbose neatvalue);
# If we make $VERSION an our variable parse_version() breaks
use vars qw($VERSION);
-$VERSION = '6.49_01';
+$VERSION = '6.50';
require ExtUtils::MM_Any;
our @ISA = qw(ExtUtils::MM_Any);
diff --git a/lib/ExtUtils/MM_VMS.pm b/lib/ExtUtils/MM_VMS.pm
index e76f19c8b0..b6f8486203 100644
--- a/lib/ExtUtils/MM_VMS.pm
+++ b/lib/ExtUtils/MM_VMS.pm
@@ -15,7 +15,7 @@ BEGIN {
use File::Basename;
-our $VERSION = '6.49_01';
+our $VERSION = '6.50';
require ExtUtils::MM_Any;
require ExtUtils::MM_Unix;
diff --git a/lib/ExtUtils/MM_VOS.pm b/lib/ExtUtils/MM_VOS.pm
index 16d30fb3ed..aea8597308 100644
--- a/lib/ExtUtils/MM_VOS.pm
+++ b/lib/ExtUtils/MM_VOS.pm
@@ -1,7 +1,7 @@
package ExtUtils::MM_VOS;
use strict;
-our $VERSION = '6.49_01';
+our $VERSION = '6.50';
require ExtUtils::MM_Unix;
our @ISA = qw(ExtUtils::MM_Unix);
diff --git a/lib/ExtUtils/MM_Win32.pm b/lib/ExtUtils/MM_Win32.pm
index c0078a412f..7813ddf6e8 100644
--- a/lib/ExtUtils/MM_Win32.pm
+++ b/lib/ExtUtils/MM_Win32.pm
@@ -27,7 +27,7 @@ use ExtUtils::MakeMaker qw( neatvalue );
require ExtUtils::MM_Any;
require ExtUtils::MM_Unix;
our @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
-our $VERSION = '6.49_02';
+our $VERSION = '6.50';
$ENV{EMXSHELL} = 'sh'; # to run `commands`
diff --git a/lib/ExtUtils/MM_Win95.pm b/lib/ExtUtils/MM_Win95.pm
index 27c71a87a7..9a9a653d05 100644
--- a/lib/ExtUtils/MM_Win95.pm
+++ b/lib/ExtUtils/MM_Win95.pm
@@ -2,7 +2,7 @@ package ExtUtils::MM_Win95;
use strict;
-our $VERSION = '6.49_01';
+our $VERSION = '6.50';
require ExtUtils::MM_Win32;
our @ISA = qw(ExtUtils::MM_Win32);
diff --git a/lib/ExtUtils/MY.pm b/lib/ExtUtils/MY.pm
index 935524a2c5..6cf3499fb8 100644
--- a/lib/ExtUtils/MY.pm
+++ b/lib/ExtUtils/MY.pm
@@ -3,7 +3,7 @@ package ExtUtils::MY;
use strict;
require ExtUtils::MM;
-our $VERSION = 6.49_01;
+our $VERSION = 6.50;
our @ISA = qw(ExtUtils::MM);
{
diff --git a/lib/ExtUtils/MakeMaker.pm b/lib/ExtUtils/MakeMaker.pm
index 8a6065f087..fabc3673d2 100644
--- a/lib/ExtUtils/MakeMaker.pm
+++ b/lib/ExtUtils/MakeMaker.pm
@@ -18,7 +18,7 @@ our @Overridable;
my @Prepend_parent;
my %Recognized_Att_Keys;
-our $VERSION = '6.49_01';
+our $VERSION = '6.50';
# Emulate something resembling CVS $Revision$
(our $Revision = $VERSION) =~ s{_}{};
diff --git a/lib/ExtUtils/MakeMaker/Config.pm b/lib/ExtUtils/MakeMaker/Config.pm
index c9f8fee19b..ff21b5b49a 100644
--- a/lib/ExtUtils/MakeMaker/Config.pm
+++ b/lib/ExtUtils/MakeMaker/Config.pm
@@ -2,7 +2,7 @@ package ExtUtils::MakeMaker::Config;
use strict;
-our $VERSION = '6.49_01';
+our $VERSION = '6.50';
use Config ();
diff --git a/lib/ExtUtils/MakeMaker/bytes.pm b/lib/ExtUtils/MakeMaker/bytes.pm
index 6f177919d2..b24b71a4d2 100644
--- a/lib/ExtUtils/MakeMaker/bytes.pm
+++ b/lib/ExtUtils/MakeMaker/bytes.pm
@@ -2,7 +2,7 @@ package ExtUtils::MakeMaker::bytes;
use strict;
-our $VERSION = 6.49_01;
+our $VERSION = 6.50;
my $Have_Bytes = eval { require bytes; 1; };
diff --git a/lib/ExtUtils/MakeMaker/vmsish.pm b/lib/ExtUtils/MakeMaker/vmsish.pm
index 666047aec7..13b7da2d1f 100644
--- a/lib/ExtUtils/MakeMaker/vmsish.pm
+++ b/lib/ExtUtils/MakeMaker/vmsish.pm
@@ -2,7 +2,7 @@ package ExtUtils::MakeMaker::vmsish;
use strict;
-our $VERSION = 6.49_01;
+our $VERSION = 6.50;
my $IsVMS = $^O eq 'VMS';
diff --git a/lib/ExtUtils/Mkbootstrap.pm b/lib/ExtUtils/Mkbootstrap.pm
index 66274b0154..d1b64e56da 100644
--- a/lib/ExtUtils/Mkbootstrap.pm
+++ b/lib/ExtUtils/Mkbootstrap.pm
@@ -3,7 +3,7 @@ package ExtUtils::Mkbootstrap;
# There's just too much Dynaloader incest here to turn on strict vars.
use strict 'refs';
-our $VERSION = '6.49_01';
+our $VERSION = '6.50';
require Exporter;
our @ISA = ('Exporter');
diff --git a/lib/ExtUtils/Mksymlists.pm b/lib/ExtUtils/Mksymlists.pm
index da25100426..0f0841e974 100644
--- a/lib/ExtUtils/Mksymlists.pm
+++ b/lib/ExtUtils/Mksymlists.pm
@@ -10,7 +10,7 @@ use Config;
our @ISA = qw(Exporter);
our @EXPORT = qw(&Mksymlists);
-our $VERSION = '6.49_01';
+our $VERSION = '6.50';
sub Mksymlists {
my(%spec) = @_;
diff --git a/lib/ExtUtils/testlib.pm b/lib/ExtUtils/testlib.pm
index 44a8e9abab..268db0b686 100644
--- a/lib/ExtUtils/testlib.pm
+++ b/lib/ExtUtils/testlib.pm
@@ -3,7 +3,7 @@ package ExtUtils::testlib;
use strict;
use warnings;
-our $VERSION = 6.49_01;
+our $VERSION = 6.50;
use Cwd;
use File::Spec;
diff --git a/lib/Fatal.pm b/lib/Fatal.pm
index bc926305fb..9acf4e23e9 100644
--- a/lib/Fatal.pm
+++ b/lib/Fatal.pm
@@ -31,7 +31,7 @@ use constant ERROR_FATAL_CONFLICT => q{"use Fatal '%s'" is not allowed while "no
use constant MIN_IPC_SYS_SIMPLE_VER => 0.12;
# All the Fatal/autodie modules share the same version number.
-our $VERSION = '1.998';
+our $VERSION = '1.999';
our $Debug ||= 0;
@@ -84,6 +84,7 @@ my %TAGS = (
':1.996' => [qw(:default)],
':1.997' => [qw(:default)],
':1.998' => [qw(:default)],
+ ':1.999' => [qw(:default)],
);
@@ -759,6 +760,7 @@ sub _make_fatal {
$call = 'CORE::system';
$name = 'system';
+ $core = 1;
} elsif ($name eq 'exec') {
# Exec doesn't have a prototype. We don't care. This
@@ -861,9 +863,19 @@ sub _make_fatal {
sub$real_proto {
+ # If we're inside a string eval, we can end up with a
+ # whacky filename. The following code allows autodie
+ # to propagate correctly into string evals.
+
+ my \$caller_level = 0;
+
+ while ( (caller \$caller_level)[1] =~ m{^\\(eval \\d+\\)\$} ) {
+ \$caller_level++;
+ }
+
# If we're called from the correct file, then use the
# autodying code.
- goto &\$code if ((caller)[1] eq \$filename);
+ goto &\$code if ((caller \$caller_level)[1] eq \$filename);
# Oh bother, we've leaked into another file. Call the
# original code. Note that \$sref may actually be a
diff --git a/lib/File/Copy.pm b/lib/File/Copy.pm
index 620a2ea773..cfa74ba29f 100644
--- a/lib/File/Copy.pm
+++ b/lib/File/Copy.pm
@@ -22,7 +22,7 @@ sub syscopy;
sub cp;
sub mv;
-$VERSION = '2.15';
+$VERSION = '2.16';
require Exporter;
@ISA = qw(Exporter);
@@ -213,7 +213,7 @@ sub copy {
}
}
- return syscopy($from, $copy_to);
+ return syscopy($from, $copy_to) || 0;
}
my $closefrom = 0;
@@ -520,7 +520,7 @@ upon the file, but will generally be the whole file (up to 2MB), or
You may use the syntax C<use File::Copy "cp"> to get at the C<cp>
alias for this function. The syntax is I<exactly> the same. The
-behavior is nearly the same as well: as of version 2.14, <cp> will
+behavior is nearly the same as well: as of version 2.15, <cp> will
preserve the source file's permission bits like the shell utility
C<cp(1)> would do, while C<copy> uses the default permissions for the
target file (which may depend on the process' C<umask>, file
diff --git a/lib/File/Copy.t b/lib/File/Copy.t
index 45bc6124a1..cf5b2d9e74 100755
--- a/lib/File/Copy.t
+++ b/lib/File/Copy.t
@@ -14,7 +14,7 @@ use Test::More;
my $TB = Test::More->builder;
-plan tests => 451;
+plan tests => 459;
# We're going to override rename() later on but Perl has to see an override
# at compile time to honor it.
@@ -396,6 +396,43 @@ SKIP: {
}
}
+# On Unix systems, File::Copy always returns 0 to signal failure,
+# even when in list context! On Windows, it always returns "" to signal
+# failure.
+#
+# While returning a list containing a false value is arguably a bad
+# API design, at the very least we can make sure it always returns
+# the same false value.
+
+my $NO_SUCH_FILE = "this_file_had_better_not_exist";
+my $NO_SUCH_OTHER_FILE = "my_goodness_im_sick_of_airports";
+
+use constant EXPECTED_SCALAR => 0;
+use constant EXPECTED_LIST => [ EXPECTED_SCALAR ];
+
+my %subs = (
+ copy => \&File::Copy::copy,
+ cp => \&File::Copy::cp,
+ move => \&File::Copy::move,
+ mv => \&File::Copy::mv,
+);
+
+SKIP: {
+ skip( "Test can't run with $NO_SUCH_FILE existing", 2 * keys %subs)
+ if (-e $NO_SUCH_FILE);
+
+ foreach my $name (keys %subs) {
+
+ my $sub = $subs{$name};
+
+ my $scalar = $sub->( $NO_SUCH_FILE, $NO_SUCH_OTHER_FILE );
+ is( $scalar, EXPECTED_SCALAR, "$name in scalar context");
+
+ my @array = $sub->( $NO_SUCH_FILE, $NO_SUCH_OTHER_FILE );
+ is_deeply( \@array, EXPECTED_LIST, "$name in list context");
+ }
+}
+
END {
1 while unlink "file-$$";
1 while unlink "lib/file-$$";
diff --git a/lib/File/Find.pm b/lib/File/Find.pm
index 641e420776..eddedbd354 100644
--- a/lib/File/Find.pm
+++ b/lib/File/Find.pm
@@ -411,6 +411,10 @@ File::Find used to produce incorrect results if called recursively.
During the development of perl 5.8 this bug was fixed.
The first fixed version of File::Find was 1.01.
+=head1 SEE ALSO
+
+find, find2perl.
+
=cut
our @ISA = qw(Exporter);
diff --git a/lib/File/stat.pm b/lib/File/stat.pm
index d84500c1ac..bdf3aad52a 100644
--- a/lib/File/stat.pm
+++ b/lib/File/stat.pm
@@ -3,23 +3,170 @@ use 5.006;
use strict;
use warnings;
+use warnings::register;
+use Carp;
+
+BEGIN { *warnif = \&warnings::warnif }
our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS);
-our $VERSION = '1.01';
+our $VERSION = '1.02';
+my @fields;
BEGIN {
use Exporter ();
@EXPORT = qw(stat lstat);
- @EXPORT_OK = qw( $st_dev $st_ino $st_mode
+ @fields = qw( $st_dev $st_ino $st_mode
$st_nlink $st_uid $st_gid
$st_rdev $st_size
$st_atime $st_mtime $st_ctime
$st_blksize $st_blocks
);
- %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
+ @EXPORT_OK = ( @fields, "stat_cando" );
+ %EXPORT_TAGS = ( FIELDS => [ @fields, @EXPORT ] );
+}
+use vars @fields;
+
+use Fcntl qw(S_IRUSR S_IWUSR S_IXUSR);
+
+BEGIN {
+ # These constants will croak on use if the platform doesn't define
+ # them. It's important to avoid inflicting that on the user.
+ no strict 'refs';
+ for (qw(suid sgid svtx)) {
+ my $val = eval { &{"Fcntl::S_I\U$_"} };
+ *{"_$_"} = defined $val ? sub { $_[0] & $val ? 1 : "" } : sub { "" };
+ }
+ for (qw(SOCK CHR BLK REG DIR FIFO LNK)) {
+ *{"S_IS$_"} = defined eval { &{"Fcntl::S_IF$_"} }
+ ? \&{"Fcntl::S_IS$_"} : sub { "" };
+ }
+}
+
+# from doio.c
+sub _ingroup {
+
+ $^O eq "MacOS" and return 1;
+
+ my ($gid, $eff) = @_;
+
+ # I am assuming that since VMS doesn't have getgroups(2), $) will
+ # always only contain a single entry.
+ $^O eq "VMS" and return $_[0] == $);
+
+ my ($egid, @supp) = split " ", $);
+ my ($rgid) = split " ", $(;
+
+ $gid == ($eff ? $egid : $rgid) and return 1;
+ grep $gid == $_, @supp and return 1;
+
+ return "";
+}
+
+# VMS uses the Unix version of the routine, even though this is very
+# suboptimal. VMS has a permissions structure that doesn't really fit
+# into struct stat, and unlike on Win32 the normal -X operators respect
+# that, but unfortunately by the time we get here we've already lost the
+# information we need. It looks to me as though if we were to preserve
+# the st_devnam entry of vmsish.h's fake struct stat (which actually
+# holds the filename) it might be possible to do this right, but both
+# getting that value out of the struct (perl's stat doesn't return it)
+# and interpreting it later would require this module to have an XS
+# component (at which point we might as well just call Perl_cando and
+# have done with it).
+
+if (grep $^O eq $_, qw/os2 MSWin32 dos/) {
+
+ # from doio.c
+ *cando = sub { ($_[0][2] & $_[1]) ? 1 : "" };
}
-use vars @EXPORT_OK;
+else {
+
+ # from doio.c
+ *cando = sub {
+ my ($s, $mode, $eff) = @_;
+ my $uid = $eff ? $> : $<;
+
+ $^O ne "VMS" and $uid == 0 and return 1;
+
+ my ($stmode, $stuid, $stgid) = @$s[2,4,5];
+
+ # This code basically assumes that the rwx bits of the mode are
+ # the 0777 bits, but so does Perl_cando.
+ if ($stuid == $uid) {
+ $stmode & $mode and return 1;
+ }
+ elsif (_ingroup($stgid, $eff)) {
+ $stmode & ($mode >> 3) and return 1;
+ }
+ else {
+ $stmode & ($mode >> 6) and return 1;
+ }
+ return "";
+ };
+}
+
+# alias for those who don't like objects
+*stat_cando = \&cando;
+
+my %op = (
+ r => sub { cando($_[0], S_IRUSR, 1) },
+ w => sub { cando($_[0], S_IWUSR, 1) },
+ x => sub { cando($_[0], S_IXUSR, 1) },
+ o => sub { $_[0][4] == $> },
+
+ R => sub { cando($_[0], S_IRUSR, 0) },
+ W => sub { cando($_[0], S_IWUSR, 0) },
+ X => sub { cando($_[0], S_IXUSR, 0) },
+ O => sub { $_[0][4] == $< },
+
+ e => sub { 1 },
+ z => sub { $_[0][7] == 0 },
+ s => sub { $_[0][7] },
+
+ f => sub { S_ISREG ($_[0][2]) },
+ d => sub { S_ISDIR ($_[0][2]) },
+ l => sub { S_ISLNK ($_[0][2]) },
+ p => sub { S_ISFIFO($_[0][2]) },
+ S => sub { S_ISSOCK($_[0][2]) },
+ b => sub { S_ISBLK ($_[0][2]) },
+ c => sub { S_ISCHR ($_[0][2]) },
+
+ u => sub { _suid($_[0][2]) },
+ g => sub { _sgid($_[0][2]) },
+ k => sub { _svtx($_[0][2]) },
+
+ M => sub { ($^T - $_[0][9] ) / 86400 },
+ C => sub { ($^T - $_[0][10]) / 86400 },
+ A => sub { ($^T - $_[0][8] ) / 86400 },
+);
+
+use constant HINT_FILETEST_ACCESS => 0x00400000;
+
+# we need fallback=>1 or stringifying breaks
+use overload
+ fallback => 1,
+ -X => sub {
+ my ($s, $op) = @_;
+
+ if (index "rwxRWX", $op) {
+ (caller 0)[8] & HINT_FILETEST_ACCESS
+ and warnif("File::stat ignores use filetest 'access'");
+
+ $^O eq "VMS" and warnif("File::stat ignores VMS ACLs");
+
+ # It would be nice to have a warning about using -l on a
+ # non-lstat, but that would require an extra member in the
+ # object.
+ }
+
+ if ($op{$op}) {
+ return $op{$op}->($_[0]);
+ }
+ else {
+ croak "-$op is not implemented on a File::stat object";
+ }
+ };
# Class::Struct forbids use of @ISA
sub import { goto &Exporter::import }
@@ -47,7 +194,7 @@ sub lstat ($) { populate(CORE::lstat(shift)) }
sub stat ($) {
my $arg = shift;
my $st = populate(CORE::stat $arg);
- return $st if $st;
+ return $st if defined $st;
my $fh;
{
local $!;
@@ -74,6 +221,15 @@ File::stat - by-name interface to Perl's built-in stat() functions
print "$file is executable with lotsa links\n";
}
+ if ( -x $st ) {
+ print "$file is executable\n";
+ }
+
+ use Fcntl "S_IRUSR";
+ if ( $st->cando(S_IRUSR, 1) ) {
+ print "My effective uid can read $file\n";
+ }
+
use File::stat qw(:FIELDS);
stat($file) or die "No $file: $!";
if ( ($st_mode & 0111) && ($st_nlink > 1) ) {
@@ -102,6 +258,23 @@ blksize,
and
blocks.
+As of version 1.02 (provided with perl 5.12) the object provides C<"-X">
+overloading, so you can call filetest operators (C<-f>, C<-x>, and so
+on) on it. It also provides a C<< ->cando >> method, called like
+
+ $st->cando( ACCESS, EFFECTIVE )
+
+where I<ACCESS> is one of C<S_IRUSR>, C<S_IWUSR> or C<S_IXUSR> from the
+L<Fcntl|Fcntl> module, and I<EFFECTIVE> indicates whether to use
+effective (true) or real (false) ids. The method interprets the C<mode>,
+C<uid> and C<gid> fields, and returns whether or not the current process
+would be allowed the specified access.
+
+If you don't want to use the objects, you may import the C<< ->cando >>
+method into your namespace as a regular function called C<stat_cando>.
+This takes an arrayref containing the return values of C<stat> or
+C<lstat> as its first argument, and interprets it for you.
+
You may also import all the structure fields directly into your namespace
as regular variables using the :FIELDS import tag. (Note that this still
overrides your stat() and lstat() functions.) Access these fields as
@@ -129,6 +302,40 @@ and undocumented populate() function with CORE::stat():
my $stat_obj = File::stat::populate(CORE::stat(_));
+=head1 ERRORS
+
+=over 4
+
+=item -%s is not implemented on a File::stat object
+
+The filetest operators C<-t>, C<-T> and C<-B> are not implemented, as
+they require more information than just a stat buffer.
+
+=back
+
+=head1 WARNINGS
+
+These can all be disabled with
+
+ no warnings "File::stat";
+
+=over 4
+
+=item File::stat ignores use filetest 'access'
+
+You have tried to use one of the C<-rwxRWX> filetests with C<use
+filetest 'access'> in effect. C<File::stat> will ignore the pragma, and
+just use the information in the C<mode> member as usual.
+
+=item File::stat ignores VMS ACLs
+
+VMS systems have a permissions structure that cannot be completely
+represented in a stat buffer, and unlike on other systems the builtin
+filetest operators respect this. The C<File::stat> overloads, however,
+do not, since the information required is not available.
+
+=back
+
=head1 NOTE
While this class is currently implemented using the Class::Struct
diff --git a/lib/File/stat.t b/lib/File/stat.t
index 23594539d0..b53c9e9a4d 100644
--- a/lib/File/stat.t
+++ b/lib/File/stat.t
@@ -19,7 +19,7 @@ BEGIN {
unless (@stat) { plan skip_all => "1..0 # Skip: no file TEST"; exit 0 }
}
-plan tests => 19;
+plan tests => 19 + 24*2 + 3;
use_ok( 'File::stat' );
@@ -56,6 +56,23 @@ is( $stat->blksize, $stat[11], "IO block size in position 11" );
is( $stat->blocks, $stat[12], "number of blocks in position 12" );
+for (split //, "rwxoRWXOezsfdlpSbcugkMCA") {
+ SKIP: {
+ $^O eq "VMS" and index("rwxRWX", $_) >= 0
+ and skip "File::stat ignores VMS ACLs", 2;
+
+ my $rv = eval "-$_ \$stat";
+ ok( !$@, "-$_ overload succeeds" )
+ or diag( $@ );
+ is( $rv, eval "-$_ 'TEST'", "correct -$_ overload" );
+ }
+}
+
+for (split //, "tTB") {
+ eval "-$_ \$stat";
+ like( $@, qr/\Q-$_ is not implemented/, "-$_ overload fails" );
+}
+
SKIP: {
local *STAT;
skip("Could not open file: $!", 2) unless open(STAT, 'TEST');
@@ -81,8 +98,9 @@ SKIP: {
main::is( "@$stat", "@$stat3", '... and must match normal stat' );
}
+
local $!;
$stat = stat '/notafile';
-isn't( $!, '', 'should populate $!, given invalid file' );
+isnt( $!, '', 'should populate $!, given invalid file' );
# Testing pretty much anything else is unportable.
diff --git a/lib/Getopt/Long.pm b/lib/Getopt/Long.pm
index f44e615a5b..c827d3c39b 100644
--- a/lib/Getopt/Long.pm
+++ b/lib/Getopt/Long.pm
@@ -2,32 +2,14 @@
package Getopt::Long;
-# RCS Status : $Id: Long.pm,v 2.74 2007/09/29 13:40:13 jv Exp $
+# RCS Status : $Id: Long.pm,v 2.76 2009/03/30 20:54:30 jv Exp $
# Author : Johan Vromans
# Created On : Tue Sep 11 15:00:12 1990
# Last Modified By: Johan Vromans
-# Last Modified On: Sat Sep 29 15:38:55 2007
-# Update Count : 1571
+# Last Modified On: Mon Mar 30 22:51:17 2009
+# Update Count : 1601
# Status : Released
-################ Copyright ################
-
-# This program is Copyright 1990,2007 by Johan Vromans.
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the Perl Artistic License or the
-# GNU General Public License as published by the Free Software
-# Foundation; either version 2 of the License, or (at your option) any
-# later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# If you do not have a copy of the GNU General Public License write to
-# the Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
-# MA 02139, USA.
-
################ Module Preamble ################
use 5.004;
@@ -35,10 +17,10 @@ use 5.004;
use strict;
use vars qw($VERSION);
-$VERSION = 2.37;
+$VERSION = 2.38;
# For testing versions only.
-use vars qw($VERSION_STRING);
-$VERSION_STRING = "2.37";
+#use vars qw($VERSION_STRING);
+#$VERSION_STRING = "2.38";
use Exporter;
use vars qw(@ISA @EXPORT @EXPORT_OK);
@@ -46,8 +28,8 @@ use vars qw(@ISA @EXPORT @EXPORT_OK);
# Exported subroutines.
sub GetOptions(@); # always
-sub GetOptionsFromArray($@); # on demand
-sub GetOptionsFromString($@); # on demand
+sub GetOptionsFromArray(@); # on demand
+sub GetOptionsFromString(@); # on demand
sub Configure(@); # on demand
sub HelpMessage(@); # on demand
sub VersionMessage(@); # in demand
@@ -205,7 +187,7 @@ sub getoptions {
# Locally set exception handler to default, otherwise it will
# be called implicitly here, and again explicitly when we try
# to deliver the messages.
- local ($SIG{__DIE__}) = '__DEFAULT__';
+ local ($SIG{__DIE__}) = 'DEFAULT';
$ret = Getopt::Long::GetOptions (@_);
};
@@ -271,7 +253,7 @@ sub GetOptions(@) {
goto &GetOptionsFromArray;
}
-sub GetOptionsFromString($@) {
+sub GetOptionsFromString(@) {
my ($string) = shift;
require Text::ParseWords;
my $args = [ Text::ParseWords::shellwords($string) ];
@@ -285,7 +267,7 @@ sub GetOptionsFromString($@) {
$ret;
}
-sub GetOptionsFromArray($@) {
+sub GetOptionsFromArray(@) {
my ($argv, @optionlist) = @_; # local copy of the option descriptions
my $argend = '--'; # option list terminator
@@ -305,7 +287,7 @@ sub GetOptionsFromArray($@) {
local ($^W) = 0;
print STDERR
("Getopt::Long $Getopt::Long::VERSION (",
- '$Revision: 2.74 $', ") ",
+ '$Revision: 2.76 $', ") ",
"called from package \"$pkg\".",
"\n ",
"argv: (@$argv)",
@@ -460,6 +442,14 @@ sub GetOptionsFromArray($@) {
eval ("\$linkage{\$orig} = \\\$".$pkg."::opt_$ov;");
}
}
+
+ if ( $opctl{$name}[CTL_TYPE] eq 'I'
+ && ( $opctl{$name}[CTL_DEST] == CTL_DEST_ARRAY
+ || $opctl{$name}[CTL_DEST] == CTL_DEST_HASH )
+ ) {
+ $error .= "Invalid option linkage for \"$opt\"\n";
+ }
+
}
# Bail out if errors found.
@@ -588,7 +578,7 @@ sub GetOptionsFromArray($@) {
if $debug;
my $eval_error = do {
local $@;
- local $SIG{__DIE__} = '__DEFAULT__';
+ local $SIG{__DIE__} = 'DEFAULT';
eval {
&{$linkage{$opt}}
(Getopt::Long::CallBack->new
@@ -706,8 +696,17 @@ sub GetOptionsFromArray($@) {
if $debug;
my $eval_error = do {
local $@;
- local $SIG{__DIE__} = '__DEFAULT__';
- eval { &$cb ($tryopt) };
+ local $SIG{__DIE__} = 'DEFAULT';
+ eval {
+ &$cb
+ (Getopt::Long::CallBack->new
+ (name => $tryopt,
+ ctl => $ctl,
+ opctl => \%opctl,
+ linkage => \%linkage,
+ prefix => $prefix,
+ ));
+ };
$@;
};
print STDERR ("=> die($eval_error)\n")
@@ -777,7 +776,7 @@ sub ParseOptionSpec ($$) {
# Option name
(?: \w+[-\w]* )
# Alias names, or "?"
- (?: \| (?: \? | \w[-\w]* )? )*
+ (?: \| (?: \? | \w[-\w]* ) )*
)?
(
# Either modifiers ...
@@ -950,7 +949,7 @@ sub FindOption ($$$$$) {
}
# Try auto-abbreviation.
- elsif ( $autoabbrev ) {
+ elsif ( $autoabbrev && $opt ne "" ) {
# Sort the possible long option names.
my @names = sort(keys (%$opctl));
# Downcase if allowed.
@@ -1016,7 +1015,12 @@ sub FindOption ($$$$$) {
$opt = substr($opt,0,1);
unshift (@$argv, $starter.$rest) if defined $rest;
}
- warn ("Unknown option: ", $opt, "\n");
+ if ( $opt eq "" ) {
+ warn ("Missing option after ", $starter, "\n");
+ }
+ else {
+ warn ("Unknown option: ", $opt, "\n");
+ }
$error++;
return (1, undef);
}
@@ -1481,9 +1485,8 @@ sub name {
}
use overload
- # Treat this object as an oridinary string for legacy API.
+ # Treat this object as an ordinary string for legacy API.
'""' => \&name,
- '0+' => sub { 0 },
fallback => 1;
1;
@@ -1749,7 +1752,7 @@ When used with command line options:
--define os=linux --define vendor=redhat
the hash C<%defines> (or C<%$defines>) will contain two keys, C<"os">
-with value C<"linux> and C<"vendor"> with value C<"redhat">. It is
+with value C<"linux"> and C<"vendor"> with value C<"redhat">. It is
also possible to specify that only integer or floating point numbers
are acceptable values. The keys are always taken to be strings.
@@ -1760,7 +1763,8 @@ an option is encountered on the command line can be achieved by
designating a reference to a subroutine (or an anonymous subroutine)
as the option destination. When GetOptions() encounters the option, it
will call the subroutine with two or three arguments. The first
-argument is the name of the option. For a scalar or array destination,
+argument is the name of the option. (Actually, it is an object that
+stringifies to the name of the option.) For a scalar or array destination,
the second argument is the value to be stored. For a hash destination,
the second arguments is the key to the hash, and the third argument
the value to be stored. It is up to the subroutine to store the value,
@@ -1786,6 +1790,12 @@ it is interpreted specially by GetOptions(). There is currently one
special command implemented: C<die("!FINISH")> will cause GetOptions()
to stop processing options, as if it encountered a double dash C<-->.
+In version 2.37 the first argument to the callback function was
+changed from string to object. This was done to make room for
+extensions and more detailed control. The object stringifies to the
+option name so this change should not introduce compatibility
+problems.
+
=head2 Options with multiple names
Often it is user friendly to supply alternate mnemonic names for
@@ -2155,7 +2165,8 @@ it will set variable C<$stdio>.
A special option 'name' C<< <> >> can be used to designate a subroutine
to handle non-option arguments. When GetOptions() encounters an
argument that does not look like an option, it will immediately call this
-subroutine and passes it one parameter: the argument name.
+subroutine and passes it one parameter: the argument name. Well, actually
+it is an object that stringifies to the argument name.
For example:
@@ -2567,7 +2578,7 @@ This can be accomplished with a destination routine:
GetOptions('list=s%' =>
sub { push(@{$list{$_[1]}}, $_[2]) });
-=head1 Trouble Shooting
+=head1 Troubleshooting
=head2 GetOptions does not return a false result when an option is not supplied
@@ -2618,7 +2629,7 @@ Johan Vromans <jvromans@squirrel.nl>
=head1 COPYRIGHT AND DISCLAIMER
-This program is Copyright 1990,2007 by Johan Vromans.
+This program is Copyright 1990,2009 by Johan Vromans.
This program is free software; you can redistribute it and/or
modify it under the terms of the Perl Artistic License or the
GNU General Public License as published by the Free Software
diff --git a/lib/Getopt/Long/CHANGES b/lib/Getopt/Long/CHANGES
index 2a22e6df4d..679da2abae 100644
--- a/lib/Getopt/Long/CHANGES
+++ b/lib/Getopt/Long/CHANGES
@@ -1,3 +1,25 @@
+Changes in version 2.38
+-----------------------
+
+* Bugfix for Ticket 35759: First arg to callback function evaluates
+ to false when used in bool context.
+
+* Fix problem with prototypes of GetOptionsFrom* functions.
+
+* Fix restoring default die handler.
+
+* Bugfix for Ticket 24941: Autoabbrev with + incorrect.
+
+Changes in version 2.37
+-----------------------
+
+* The first argument to callback function is now an object and will
+ get methods for finer control in the future. The object stringifies
+ to the option name, so current code should not notice a difference.
+
+* Bugfix: With gnu_compat, --foo= will no longer trigger "Option
+ requires an argument" but return the empty string.
+
Changes in version 2.36
-----------------------
diff --git a/lib/Getopt/Long/README b/lib/Getopt/Long/README
index fb653f3a35..b1b8e2a8f4 100644
--- a/lib/Getopt/Long/README
+++ b/lib/Getopt/Long/README
@@ -200,7 +200,7 @@ Or use the CPAN search engine:
COPYRIGHT AND DISCLAIMER
========================
-Module Getopt::Long is Copyright 2006,1990 by Johan Vromans.
+Module Getopt::Long is Copyright 2009,1990 by Johan Vromans.
This program is free software; you can redistribute it and/or
modify it under the terms of the Perl Artistic License or the
GNU General Public License as published by the Free Software
diff --git a/lib/IPC/Cmd.pm b/lib/IPC/Cmd.pm
index 41bcd4bab6..ae67401a3d 100644
--- a/lib/IPC/Cmd.pm
+++ b/lib/IPC/Cmd.pm
@@ -16,7 +16,7 @@ BEGIN {
$USE_IPC_RUN $USE_IPC_OPEN3 $WARN
];
- $VERSION = '0.42_01';
+ $VERSION = '0.44';
$VERBOSE = 0;
$DEBUG = 0;
$WARN = 1;
diff --git a/lib/IPC/Cmd/t/01_IPC-Cmd.t b/lib/IPC/Cmd/t/01_IPC-Cmd.t
index 95a5ba65be..e2b58d1c0b 100644
--- a/lib/IPC/Cmd/t/01_IPC-Cmd.t
+++ b/lib/IPC/Cmd/t/01_IPC-Cmd.t
@@ -22,7 +22,7 @@ my $Have_IPC_Run = $Class->can_use_ipc_run || 0;
my $Have_IPC_Open3 = $Class->can_use_ipc_open3 || 0;
diag("IPC::Run: $Have_IPC_Run IPC::Open3: $Have_IPC_Open3")
- if (! exists($ENV{'PERL_CORE'}));
+ unless exists $ENV{'PERL_CORE'};
local $IPC::Cmd::VERBOSE = $Verbose;
local $IPC::Cmd::VERBOSE = $Verbose;
diff --git a/lib/IPC/Cmd/t/src/x.tgz.packed b/lib/IPC/Cmd/t/src/x.tgz.packed
index 1986b94977..ccbaadaa82 100644
--- a/lib/IPC/Cmd/t/src/x.tgz.packed
+++ b/lib/IPC/Cmd/t/src/x.tgz.packed
@@ -10,7 +10,7 @@ To recreate it use the following command:
uupacktool.pl -p lib/IPC/Cmd/t/src/x.tgz lib/IPC/Cmd/t/src/x.tgz.packed
-Created at Sat Dec 13 18:16:56 2008
+Created at Mon May 4 10:16:10 2009
#########################################################################
__UU__
M'XL(`````````^W.NPW"0!!%T2EE2YC%:[N>#7""1,"G?QM##!&.SDE&(]W@
diff --git a/lib/Module/Build.pm b/lib/Module/Build.pm
index de0bb968c3..fe453b5d67 100644
--- a/lib/Module/Build.pm
+++ b/lib/Module/Build.pm
@@ -15,7 +15,7 @@ use Module::Build::Base;
use vars qw($VERSION @ISA);
@ISA = qw(Module::Build::Base);
-$VERSION = '0.31_0401';
+$VERSION = '0.32_01';
$VERSION = eval $VERSION;
# Okay, this is the brute-force method of finding out what kind of
@@ -54,6 +54,7 @@ my %OSTYPES = qw(
interix Unix
gnu Unix
gnukfreebsd Unix
+ nto Unix
dos Windows
MSWin32 Windows
diff --git a/lib/Module/Build/Base.pm b/lib/Module/Build/Base.pm
index 891d5df5b1..703218b56c 100644
--- a/lib/Module/Build/Base.pm
+++ b/lib/Module/Build/Base.pm
@@ -4,7 +4,7 @@ package Module::Build::Base;
use strict;
use vars qw($VERSION);
-$VERSION = '0.31_04';
+$VERSION = '0.32_01';
$VERSION = eval $VERSION;
BEGIN { require 5.00503 }
diff --git a/lib/Module/Build/Changes b/lib/Module/Build/Changes
index f421599f5e..a13b94e4ef 100644
--- a/lib/Module/Build/Changes
+++ b/lib/Module/Build/Changes
@@ -1,5 +1,9 @@
Revision history for Perl extension Module::Build.
+0.32 - Wed Feb 25 17:40:02 PST 2009
+
+ No changes since 0.31_04.
+
0.31_04 - Fri Feb 20 11:04:59 PST 2009
Other
diff --git a/lib/Module/Build/Compat.pm b/lib/Module/Build/Compat.pm
index 36dc2177c8..7025f1cef3 100644
--- a/lib/Module/Build/Compat.pm
+++ b/lib/Module/Build/Compat.pm
@@ -2,7 +2,7 @@ package Module::Build::Compat;
use strict;
use vars qw($VERSION);
-$VERSION = '0.31_04';
+$VERSION = '0.32_01';
use File::Spec;
use IO::File;
diff --git a/lib/Module/Build/Config.pm b/lib/Module/Build/Config.pm
index 41533d68d1..194b050973 100644
--- a/lib/Module/Build/Config.pm
+++ b/lib/Module/Build/Config.pm
@@ -2,7 +2,7 @@ package Module::Build::Config;
use strict;
use vars qw($VERSION);
-$VERSION = '0.31_04';
+$VERSION = '0.32';
$VERSION = eval $VERSION;
use Config;
diff --git a/lib/Module/Build/Cookbook.pm b/lib/Module/Build/Cookbook.pm
index 2c34f1b027..e0c85df949 100644
--- a/lib/Module/Build/Cookbook.pm
+++ b/lib/Module/Build/Cookbook.pm
@@ -1,7 +1,7 @@
package Module::Build::Cookbook;
use strict;
use vars qw($VERSION);
-$VERSION = '0.31_04';
+$VERSION = '0.32';
=head1 NAME
diff --git a/lib/Module/Build/Dumper.pm b/lib/Module/Build/Dumper.pm
index 7a10d85d2b..f3751bfeb2 100644
--- a/lib/Module/Build/Dumper.pm
+++ b/lib/Module/Build/Dumper.pm
@@ -1,7 +1,7 @@
package Module::Build::Dumper;
use strict;
use vars qw($VERSION);
-$VERSION = '0.31_04';
+$VERSION = '0.32';
# This is just a split-out of a wrapper function to do Data::Dumper
# stuff "the right way". See:
diff --git a/lib/Module/Build/ModuleInfo.pm b/lib/Module/Build/ModuleInfo.pm
index aa792b6973..d9821fe031 100644
--- a/lib/Module/Build/ModuleInfo.pm
+++ b/lib/Module/Build/ModuleInfo.pm
@@ -8,7 +8,7 @@ package Module::Build::ModuleInfo;
use strict;
use vars qw($VERSION);
-$VERSION = '0.31_04';
+$VERSION = '0.32';
$VERSION = eval $VERSION;
use File::Spec;
diff --git a/lib/Module/Build/Notes.pm b/lib/Module/Build/Notes.pm
index 50613c8dfd..fca40b7496 100644
--- a/lib/Module/Build/Notes.pm
+++ b/lib/Module/Build/Notes.pm
@@ -4,7 +4,7 @@ package Module::Build::Notes;
use strict;
use vars qw($VERSION);
-$VERSION = '0.31_04';
+$VERSION = '0.32';
$VERSION = eval $VERSION;
use Data::Dumper;
use IO::File;
diff --git a/lib/Module/Build/PPMMaker.pm b/lib/Module/Build/PPMMaker.pm
index 5a86e2d749..413608631c 100644
--- a/lib/Module/Build/PPMMaker.pm
+++ b/lib/Module/Build/PPMMaker.pm
@@ -2,7 +2,7 @@ package Module::Build::PPMMaker;
use strict;
use vars qw($VERSION);
-$VERSION = '0.31_04';
+$VERSION = '0.32';
$VERSION = eval $VERSION;
# This code is mostly borrowed from ExtUtils::MM_Unix 6.10_03, with a
diff --git a/lib/Module/Build/Platform/Amiga.pm b/lib/Module/Build/Platform/Amiga.pm
index d75871ea0a..4f5eb14bfd 100644
--- a/lib/Module/Build/Platform/Amiga.pm
+++ b/lib/Module/Build/Platform/Amiga.pm
@@ -2,7 +2,7 @@ package Module::Build::Platform::Amiga;
use strict;
use vars qw($VERSION);
-$VERSION = '0.31_04';
+$VERSION = '0.32';
$VERSION = eval $VERSION;
use Module::Build::Base;
diff --git a/lib/Module/Build/Platform/Default.pm b/lib/Module/Build/Platform/Default.pm
index 07f30c5665..c3f6a504ba 100644
--- a/lib/Module/Build/Platform/Default.pm
+++ b/lib/Module/Build/Platform/Default.pm
@@ -2,7 +2,7 @@ package Module::Build::Platform::Default;
use strict;
use vars qw($VERSION);
-$VERSION = '0.31_04';
+$VERSION = '0.32';
$VERSION = eval $VERSION;
use Module::Build::Base;
diff --git a/lib/Module/Build/Platform/EBCDIC.pm b/lib/Module/Build/Platform/EBCDIC.pm
index 15a0006af7..26c3ee5892 100644
--- a/lib/Module/Build/Platform/EBCDIC.pm
+++ b/lib/Module/Build/Platform/EBCDIC.pm
@@ -2,7 +2,7 @@ package Module::Build::Platform::EBCDIC;
use strict;
use vars qw($VERSION);
-$VERSION = '0.31_04';
+$VERSION = '0.32';
$VERSION = eval $VERSION;
use Module::Build::Base;
diff --git a/lib/Module/Build/Platform/MPEiX.pm b/lib/Module/Build/Platform/MPEiX.pm
index c6ee04f524..f59902023c 100644
--- a/lib/Module/Build/Platform/MPEiX.pm
+++ b/lib/Module/Build/Platform/MPEiX.pm
@@ -2,7 +2,7 @@ package Module::Build::Platform::MPEiX;
use strict;
use vars qw($VERSION);
-$VERSION = '0.31_04';
+$VERSION = '0.32';
$VERSION = eval $VERSION;
use Module::Build::Base;
diff --git a/lib/Module/Build/Platform/MacOS.pm b/lib/Module/Build/Platform/MacOS.pm
index 4e9f06f88d..f7e22a3b84 100644
--- a/lib/Module/Build/Platform/MacOS.pm
+++ b/lib/Module/Build/Platform/MacOS.pm
@@ -2,7 +2,7 @@ package Module::Build::Platform::MacOS;
use strict;
use vars qw($VERSION);
-$VERSION = '0.31_04';
+$VERSION = '0.32';
$VERSION = eval $VERSION;
use Module::Build::Base;
use vars qw(@ISA);
diff --git a/lib/Module/Build/Platform/RiscOS.pm b/lib/Module/Build/Platform/RiscOS.pm
index 237d9c361f..1f732f5808 100644
--- a/lib/Module/Build/Platform/RiscOS.pm
+++ b/lib/Module/Build/Platform/RiscOS.pm
@@ -2,7 +2,7 @@ package Module::Build::Platform::RiscOS;
use strict;
use vars qw($VERSION);
-$VERSION = '0.31_04';
+$VERSION = '0.32';
$VERSION = eval $VERSION;
use Module::Build::Base;
diff --git a/lib/Module/Build/Platform/Unix.pm b/lib/Module/Build/Platform/Unix.pm
index abf0844732..498e248d73 100644
--- a/lib/Module/Build/Platform/Unix.pm
+++ b/lib/Module/Build/Platform/Unix.pm
@@ -2,7 +2,7 @@ package Module::Build::Platform::Unix;
use strict;
use vars qw($VERSION);
-$VERSION = '0.31_04';
+$VERSION = '0.32';
$VERSION = eval $VERSION;
use Module::Build::Base;
diff --git a/lib/Module/Build/Platform/VMS.pm b/lib/Module/Build/Platform/VMS.pm
index 699f5ae13d..69912c8afc 100644
--- a/lib/Module/Build/Platform/VMS.pm
+++ b/lib/Module/Build/Platform/VMS.pm
@@ -2,7 +2,7 @@ package Module::Build::Platform::VMS;
use strict;
use vars qw($VERSION);
-$VERSION = '0.31_04';
+$VERSION = '0.32_01';
$VERSION = eval $VERSION;
use Module::Build::Base;
diff --git a/lib/Module/Build/Platform/VOS.pm b/lib/Module/Build/Platform/VOS.pm
index ec7962cd92..ca77134a77 100644
--- a/lib/Module/Build/Platform/VOS.pm
+++ b/lib/Module/Build/Platform/VOS.pm
@@ -2,7 +2,7 @@ package Module::Build::Platform::VOS;
use strict;
use vars qw($VERSION);
-$VERSION = '0.31_04';
+$VERSION = '0.32';
$VERSION = eval $VERSION;
use Module::Build::Base;
diff --git a/lib/Module/Build/Platform/Windows.pm b/lib/Module/Build/Platform/Windows.pm
index 829c98d72f..c8b412c510 100644
--- a/lib/Module/Build/Platform/Windows.pm
+++ b/lib/Module/Build/Platform/Windows.pm
@@ -2,7 +2,7 @@ package Module::Build::Platform::Windows;
use strict;
use vars qw($VERSION);
-$VERSION = '0.31_04';
+$VERSION = '0.32';
$VERSION = eval $VERSION;
use Config;
diff --git a/lib/Module/Build/Platform/aix.pm b/lib/Module/Build/Platform/aix.pm
index 440abbac0e..c8c5b49abc 100644
--- a/lib/Module/Build/Platform/aix.pm
+++ b/lib/Module/Build/Platform/aix.pm
@@ -2,7 +2,7 @@ package Module::Build::Platform::aix;
use strict;
use vars qw($VERSION);
-$VERSION = '0.31_04';
+$VERSION = '0.32';
$VERSION = eval $VERSION;
use Module::Build::Platform::Unix;
diff --git a/lib/Module/Build/Platform/cygwin.pm b/lib/Module/Build/Platform/cygwin.pm
index 71717c0ce3..62c6573a61 100644
--- a/lib/Module/Build/Platform/cygwin.pm
+++ b/lib/Module/Build/Platform/cygwin.pm
@@ -2,7 +2,7 @@ package Module::Build::Platform::cygwin;
use strict;
use vars qw($VERSION);
-$VERSION = '0.31_04';
+$VERSION = '0.32';
$VERSION = eval $VERSION;
use Module::Build::Platform::Unix;
diff --git a/lib/Module/Build/Platform/darwin.pm b/lib/Module/Build/Platform/darwin.pm
index bc0f7a769b..aa87fb6ef2 100644
--- a/lib/Module/Build/Platform/darwin.pm
+++ b/lib/Module/Build/Platform/darwin.pm
@@ -2,7 +2,7 @@ package Module::Build::Platform::darwin;
use strict;
use vars qw($VERSION);
-$VERSION = '0.31_04';
+$VERSION = '0.32';
$VERSION = eval $VERSION;
use Module::Build::Platform::Unix;
diff --git a/lib/Module/Build/Platform/os2.pm b/lib/Module/Build/Platform/os2.pm
index 54f4100cdf..ba124dd7c9 100644
--- a/lib/Module/Build/Platform/os2.pm
+++ b/lib/Module/Build/Platform/os2.pm
@@ -2,7 +2,7 @@ package Module::Build::Platform::os2;
use strict;
use vars qw($VERSION);
-$VERSION = '0.31_04';
+$VERSION = '0.32';
$VERSION = eval $VERSION;
use Module::Build::Platform::Unix;
diff --git a/lib/Module/Build/PodParser.pm b/lib/Module/Build/PodParser.pm
index 79ddab53db..0012aab621 100644
--- a/lib/Module/Build/PodParser.pm
+++ b/lib/Module/Build/PodParser.pm
@@ -2,7 +2,7 @@ package Module::Build::PodParser;
use strict;
use vars qw($VERSION);
-$VERSION = '0.31_04';
+$VERSION = '0.32';
$VERSION = eval $VERSION;
use vars qw(@ISA);
diff --git a/lib/Module/CoreList.pm b/lib/Module/CoreList.pm
index 7b117f3500..b0546a98bd 100644
--- a/lib/Module/CoreList.pm
+++ b/lib/Module/CoreList.pm
@@ -1,7 +1,8 @@
package Module::CoreList;
use strict;
-use vars qw/$VERSION %released %patchlevel %version %families/;
-$VERSION = '2.17';
+use vars qw/$VERSION %released %patchlevel %version %families %upstream
+ %bug_tracker/;
+$VERSION = '2.17_01';
=head1 NAME
@@ -9076,6 +9077,926 @@ for my $version ( sort { $a <=> $b } keys %released ) {
},
);
+%upstream = (
+ 'App::Prove' => undef,
+ 'App::Prove::State' => undef,
+ 'App::Prove::State::Result'=> undef,
+ 'App::Prove::State::Result::Test'=> undef,
+ 'Archive::Extract' => 'cpan',
+ 'Archive::Tar' => 'cpan',
+ 'Archive::Tar::Constant'=> 'cpan',
+ 'Archive::Tar::File' => 'cpan',
+ 'Attribute::Handlers' => 'blead',
+ 'AutoLoader' => 'cpan',
+ 'AutoSplit' => 'cpan',
+ 'B::Concise' => undef,
+ 'B::Debug' => undef,
+ 'B::Deparse' => undef,
+ 'B::Lint' => undef,
+ 'CGI' => undef,
+ 'CGI::Apache' => undef,
+ 'CGI::Carp' => undef,
+ 'CGI::Cookie' => undef,
+ 'CGI::Fast' => undef,
+ 'CGI::Pretty' => undef,
+ 'CGI::Push' => undef,
+ 'CGI::Switch' => undef,
+ 'CGI::Util' => undef,
+ 'CPAN' => 'CPAN',
+ 'CPAN::Author' => 'CPAN',
+ 'CPAN::Bundle' => 'CPAN',
+ 'CPAN::CacheMgr' => 'CPAN',
+ 'CPAN::Complete' => 'CPAN',
+ 'CPAN::Debug' => 'CPAN',
+ 'CPAN::DeferredCode' => 'CPAN',
+ 'CPAN::Distribution' => 'CPAN',
+ 'CPAN::Distroprefs' => 'CPAN',
+ 'CPAN::Distrostatus' => 'CPAN',
+ 'CPAN::Exception::RecursiveDependency'=> 'CPAN',
+ 'CPAN::Exception::blocked_urllist'=> 'CPAN',
+ 'CPAN::Exception::yaml_not_installed'=> 'CPAN',
+ 'CPAN::FTP' => 'CPAN',
+ 'CPAN::FTP::netrc' => 'CPAN',
+ 'CPAN::FirstTime' => 'CPAN',
+ 'CPAN::HandleConfig' => 'CPAN',
+ 'CPAN::Index' => 'CPAN',
+ 'CPAN::InfoObj' => 'CPAN',
+ 'CPAN::Kwalify' => 'CPAN',
+ 'CPAN::LWP::UserAgent' => 'CPAN',
+ 'CPAN::Module' => 'CPAN',
+ 'CPAN::Nox' => 'CPAN',
+ 'CPAN::Prompt' => 'CPAN',
+ 'CPAN::Queue' => 'CPAN',
+ 'CPAN::Shell' => 'CPAN',
+ 'CPAN::Tarzip' => 'CPAN',
+ 'CPAN::URL' => 'CPAN',
+ 'CPAN::Version' => 'CPAN',
+ 'CPANPLUS' => 'cpan',
+ 'CPANPLUS::Backend' => 'cpan',
+ 'CPANPLUS::Backend::RV' => 'CPAN',
+ 'CPANPLUS::Config' => 'cpan',
+ 'CPANPLUS::Configure' => 'cpan',
+ 'CPANPLUS::Configure::Setup'=> 'cpan',
+ 'CPANPLUS::Dist' => 'cpan',
+ 'CPANPLUS::Dist::Autobundle'=> 'CPAN',
+ 'CPANPLUS::Dist::Base' => 'cpan',
+ 'CPANPLUS::Dist::Build' => 'cpan',
+ 'CPANPLUS::Dist::Build::Constants'=> 'cpan',
+ 'CPANPLUS::Dist::MM' => 'cpan',
+ 'CPANPLUS::Dist::Sample'=> 'cpan',
+ 'CPANPLUS::Error' => 'cpan',
+ 'CPANPLUS::Internals' => 'cpan',
+ 'CPANPLUS::Internals::Constants'=> 'CPAN',
+ 'CPANPLUS::Internals::Constants::Report'=> 'CPAN',
+ 'CPANPLUS::Internals::Extract'=> 'CPAN',
+ 'CPANPLUS::Internals::Fetch'=> 'CPAN',
+ 'CPANPLUS::Internals::Report'=> 'CPAN',
+ 'CPANPLUS::Internals::Search'=> 'CPAN',
+ 'CPANPLUS::Internals::Source'=> 'CPAN',
+ 'CPANPLUS::Internals::Source::Memory'=> 'CPAN',
+ 'CPANPLUS::Internals::Source::SQLite'=> 'CPAN',
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> 'CPAN',
+ 'CPANPLUS::Internals::Utils'=> 'CPAN',
+ 'CPANPLUS::Internals::Utils::Autoflush'=> 'CPAN',
+ 'CPANPLUS::Module' => 'cpan',
+ 'CPANPLUS::Module::Author'=> 'CPAN',
+ 'CPANPLUS::Module::Author::Fake'=> 'CPAN',
+ 'CPANPLUS::Module::Checksums'=> 'CPAN',
+ 'CPANPLUS::Module::Fake'=> 'CPAN',
+ 'CPANPLUS::Module::Signature'=> 'CPAN',
+ 'CPANPLUS::Selfupdate' => 'cpan',
+ 'CPANPLUS::Shell' => 'cpan',
+ 'CPANPLUS::Shell::Classic'=> 'CPAN',
+ 'CPANPLUS::Shell::Default'=> 'CPAN',
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> 'CPAN',
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> 'CPAN',
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> 'CPAN',
+ 'CPANPLUS::inc' => 'cpan',
+ 'Class::ISA' => undef,
+ 'Compress::Raw::Bzip2' => undef,
+ 'Compress::Raw::Zlib' => undef,
+ 'Cwd' => 'cpan',
+ 'DB_File' => undef,
+ 'DCLsym' => undef,
+ 'Devel::InnerPackage' => undef,
+ 'Devel::PPPort' => 'cpan',
+ 'Digest' => undef,
+ 'Digest::MD5' => undef,
+ 'Digest::SHA' => undef,
+ 'Digest::base' => undef,
+ 'Digest::file' => undef,
+ 'Encode' => undef,
+ 'Encode::Alias' => undef,
+ 'Encode::Byte' => undef,
+ 'Encode::CJKConstants' => undef,
+ 'Encode::CN' => undef,
+ 'Encode::CN::HZ' => undef,
+ 'Encode::Config' => undef,
+ 'Encode::EBCDIC' => undef,
+ 'Encode::Encoder' => undef,
+ 'Encode::Encoding' => undef,
+ 'Encode::GSM0338' => undef,
+ 'Encode::Guess' => undef,
+ 'Encode::JP' => undef,
+ 'Encode::JP::H2Z' => undef,
+ 'Encode::JP::JIS7' => undef,
+ 'Encode::KR' => undef,
+ 'Encode::KR::2022_KR' => undef,
+ 'Encode::MIME::Header' => undef,
+ 'Encode::MIME::Header::ISO_2022_JP'=> undef,
+ 'Encode::MIME::Name' => undef,
+ 'Encode::Symbol' => undef,
+ 'Encode::TW' => undef,
+ 'Encode::Unicode' => undef,
+ 'Encode::Unicode::UTF7' => undef,
+ 'Exporter' => undef,
+ 'Exporter::Heavy' => undef,
+ 'ExtUtils::CBuilder' => undef,
+ 'ExtUtils::CBuilder::Base'=> undef,
+ 'ExtUtils::CBuilder::Platform::Unix'=> undef,
+ 'ExtUtils::CBuilder::Platform::VMS'=> undef,
+ 'ExtUtils::CBuilder::Platform::Windows'=> undef,
+ 'ExtUtils::CBuilder::Platform::aix'=> undef,
+ 'ExtUtils::CBuilder::Platform::cygwin'=> undef,
+ 'ExtUtils::CBuilder::Platform::darwin'=> undef,
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> undef,
+ 'ExtUtils::CBuilder::Platform::os2'=> undef,
+ 'ExtUtils::Command' => undef,
+ 'ExtUtils::Command::MM' => 'first-come',
+ 'ExtUtils::Constant' => undef,
+ 'ExtUtils::Constant::Base'=> undef,
+ 'ExtUtils::Constant::ProxySubs'=> undef,
+ 'ExtUtils::Constant::Utils'=> undef,
+ 'ExtUtils::Constant::XS'=> undef,
+ 'ExtUtils::Install' => 'blead',
+ 'ExtUtils::Installed' => 'blead',
+ 'ExtUtils::Liblist' => 'first-come',
+ 'ExtUtils::Liblist::Kid'=> 'first-come',
+ 'ExtUtils::MM' => 'first-come',
+ 'ExtUtils::MM_AIX' => 'first-come',
+ 'ExtUtils::MM_Any' => 'first-come',
+ 'ExtUtils::MM_BeOS' => 'first-come',
+ 'ExtUtils::MM_Cygwin' => 'first-come',
+ 'ExtUtils::MM_DOS' => 'first-come',
+ 'ExtUtils::MM_Darwin' => 'first-come',
+ 'ExtUtils::MM_MacOS' => 'first-come',
+ 'ExtUtils::MM_NW5' => 'first-come',
+ 'ExtUtils::MM_OS2' => 'first-come',
+ 'ExtUtils::MM_QNX' => 'first-come',
+ 'ExtUtils::MM_UWIN' => 'first-come',
+ 'ExtUtils::MM_Unix' => 'first-come',
+ 'ExtUtils::MM_VMS' => 'first-come',
+ 'ExtUtils::MM_VOS' => 'first-come',
+ 'ExtUtils::MM_Win32' => 'first-come',
+ 'ExtUtils::MM_Win95' => 'first-come',
+ 'ExtUtils::MY' => 'first-come',
+ 'ExtUtils::MakeMaker' => 'first-come',
+ 'ExtUtils::MakeMaker::Config'=> 'first-come',
+ 'ExtUtils::MakeMaker::bytes'=> 'first-come',
+ 'ExtUtils::MakeMaker::vmsish'=> 'first-come',
+ 'ExtUtils::Manifest' => undef,
+ 'ExtUtils::Mkbootstrap' => 'first-come',
+ 'ExtUtils::Mksymlists' => 'first-come',
+ 'ExtUtils::Packlist' => 'blead',
+ 'ExtUtils::ParseXS' => undef,
+ 'ExtUtils::testlib' => 'first-come',
+ 'Fatal' => 'cpan',
+ 'File::Fetch' => 'cpan',
+ 'File::Path' => undef,
+ 'File::Spec' => 'cpan',
+ 'File::Spec::Cygwin' => 'cpan',
+ 'File::Spec::Epoc' => 'cpan',
+ 'File::Spec::Functions' => 'cpan',
+ 'File::Spec::Mac' => 'cpan',
+ 'File::Spec::OS2' => 'cpan',
+ 'File::Spec::Unix' => 'cpan',
+ 'File::Spec::VMS' => 'cpan',
+ 'File::Spec::Win32' => 'cpan',
+ 'File::Temp' => undef,
+ 'Filespec' => undef,
+ 'Filter::Simple' => 'blead',
+ 'Filter::Util::Call' => undef,
+ 'Getopt::Long' => 'cpan',
+ 'IO' => undef,
+ 'IO::Dir' => undef,
+ 'IO::File' => undef,
+ 'IO::Handle' => undef,
+ 'IO::Pipe' => undef,
+ 'IO::Poll' => undef,
+ 'IO::Seekable' => undef,
+ 'IO::Select' => undef,
+ 'IO::Socket' => undef,
+ 'IO::Socket::INET' => undef,
+ 'IO::Socket::UNIX' => undef,
+ 'IO::Zlib' => undef,
+ 'IPC::Cmd' => 'cpan',
+ 'IPC::Msg' => 'cpan',
+ 'IPC::Semaphore' => 'cpan',
+ 'IPC::SharedMem' => 'cpan',
+ 'IPC::SysV' => 'cpan',
+ 'List::Util' => undef,
+ 'Locale::Constants' => undef,
+ 'Locale::Country' => undef,
+ 'Locale::Currency' => undef,
+ 'Locale::Language' => undef,
+ 'Locale::Maketext' => undef,
+ 'Locale::Maketext::Guts'=> undef,
+ 'Locale::Maketext::GutsLoader'=> undef,
+ 'Locale::Maketext::Simple'=> undef,
+ 'Locale::Script' => undef,
+ 'Log::Message' => 'cpan',
+ 'Log::Message::Config' => 'cpan',
+ 'Log::Message::Handlers'=> 'cpan',
+ 'Log::Message::Item' => 'cpan',
+ 'Log::Message::Simple' => 'cpan',
+ 'MIME::Base64' => undef,
+ 'MIME::QuotedPrint' => undef,
+ 'Math::BigFloat' => undef,
+ 'Math::BigFloat::Trace' => undef,
+ 'Math::BigInt' => undef,
+ 'Math::BigInt::Calc' => undef,
+ 'Math::BigInt::CalcEmu' => undef,
+ 'Math::BigInt::FastCalc'=> undef,
+ 'Math::BigInt::Trace' => undef,
+ 'Math::BigRat' => undef,
+ 'Math::Complex' => 'cpan',
+ 'Math::Trig' => 'cpan',
+ 'Memoize' => undef,
+ 'Memoize::AnyDBM_File' => undef,
+ 'Memoize::Expire' => undef,
+ 'Memoize::ExpireFile' => undef,
+ 'Memoize::ExpireTest' => undef,
+ 'Memoize::NDBM_File' => undef,
+ 'Memoize::SDBM_File' => undef,
+ 'Memoize::Storable' => undef,
+ 'Module::Build' => undef,
+ 'Module::Build::Base' => undef,
+ 'Module::Build::Compat' => undef,
+ 'Module::Build::Config' => undef,
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> undef,
+ 'Module::Build::Dumper' => undef,
+ 'Module::Build::ModuleInfo'=> undef,
+ 'Module::Build::Notes' => undef,
+ 'Module::Build::PPMMaker'=> undef,
+ 'Module::Build::Platform::Amiga'=> undef,
+ 'Module::Build::Platform::Default'=> undef,
+ 'Module::Build::Platform::EBCDIC'=> undef,
+ 'Module::Build::Platform::MPEiX'=> undef,
+ 'Module::Build::Platform::MacOS'=> undef,
+ 'Module::Build::Platform::RiscOS'=> undef,
+ 'Module::Build::Platform::Unix'=> undef,
+ 'Module::Build::Platform::VMS'=> undef,
+ 'Module::Build::Platform::VOS'=> undef,
+ 'Module::Build::Platform::Windows'=> undef,
+ 'Module::Build::Platform::aix'=> undef,
+ 'Module::Build::Platform::cygwin'=> undef,
+ 'Module::Build::Platform::darwin'=> undef,
+ 'Module::Build::Platform::os2'=> undef,
+ 'Module::Build::PodParser'=> undef,
+ 'Module::Build::Version'=> undef,
+ 'Module::Build::YAML' => undef,
+ 'Module::CoreList' => 'blead',
+ 'Module::Load' => 'cpan',
+ 'Module::Load::Conditional'=> 'cpan',
+ 'Module::Loaded' => 'cpan',
+ 'Module::Pluggable' => undef,
+ 'Module::Pluggable::Object'=> undef,
+ 'NEXT' => 'cpan',
+ 'Net::Cmd' => undef,
+ 'Net::Config' => undef,
+ 'Net::Domain' => undef,
+ 'Net::FTP' => undef,
+ 'Net::FTP::A' => undef,
+ 'Net::FTP::E' => undef,
+ 'Net::FTP::I' => undef,
+ 'Net::FTP::L' => undef,
+ 'Net::FTP::dataconn' => undef,
+ 'Net::NNTP' => undef,
+ 'Net::Netrc' => undef,
+ 'Net::POP3' => undef,
+ 'Net::Ping' => 'blead',
+ 'Net::SMTP' => undef,
+ 'Net::Time' => undef,
+ 'Object::Accessor' => 'cpan',
+ 'Package::Constants' => 'cpan',
+ 'Params::Check' => 'cpan',
+ 'Parse::CPAN::Meta' => 'cpan',
+ 'PerlIO::via::QuotedPrint'=> undef,
+ 'Pod::Checker' => undef,
+ 'Pod::Escapes' => undef,
+ 'Pod::Find' => undef,
+ 'Pod::InputObjects' => undef,
+ 'Pod::LaTeX' => undef,
+ 'Pod::Man' => 'cpan',
+ 'Pod::ParseLink' => 'cpan',
+ 'Pod::ParseUtils' => undef,
+ 'Pod::Parser' => undef,
+ 'Pod::Perldoc' => undef,
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => undef,
+ 'Pod::Plainer' => 'blead',
+ 'Pod::Select' => undef,
+ 'Pod::Simple' => undef,
+ 'Pod::Simple::BlackBox' => undef,
+ 'Pod::Simple::Checker' => undef,
+ 'Pod::Simple::Debug' => undef,
+ 'Pod::Simple::DumpAsText'=> undef,
+ 'Pod::Simple::DumpAsXML'=> undef,
+ 'Pod::Simple::HTML' => undef,
+ 'Pod::Simple::HTMLBatch'=> undef,
+ 'Pod::Simple::HTMLLegacy'=> undef,
+ 'Pod::Simple::LinkSection'=> undef,
+ 'Pod::Simple::Methody' => undef,
+ 'Pod::Simple::Progress' => undef,
+ 'Pod::Simple::PullParser'=> undef,
+ 'Pod::Simple::PullParserEndToken'=> undef,
+ 'Pod::Simple::PullParserStartToken'=> undef,
+ 'Pod::Simple::PullParserTextToken'=> undef,
+ 'Pod::Simple::PullParserToken'=> undef,
+ 'Pod::Simple::RTF' => undef,
+ 'Pod::Simple::Search' => undef,
+ 'Pod::Simple::SimpleTree'=> undef,
+ 'Pod::Simple::Text' => undef,
+ 'Pod::Simple::TextContent'=> undef,
+ 'Pod::Simple::TiedOutFH'=> undef,
+ 'Pod::Simple::Transcode'=> undef,
+ 'Pod::Simple::TranscodeDumb'=> undef,
+ 'Pod::Simple::TranscodeSmart'=> undef,
+ 'Pod::Simple::XHTML' => undef,
+ 'Pod::Simple::XMLOutStream'=> undef,
+ 'Pod::Text' => 'cpan',
+ 'Pod::Text::Color' => 'cpan',
+ 'Pod::Text::Overstrike' => 'cpan',
+ 'Pod::Text::Termcap' => 'cpan',
+ 'Pod::Usage' => undef,
+ 'Safe' => 'blead',
+ 'Scalar::Util' => undef,
+ 'SelfLoader' => 'blead',
+ 'Shell' => undef,
+ 'Stdio' => undef,
+ 'Storable' => undef,
+ 'Switch' => 'blead',
+ 'Sys::Syslog' => undef,
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => undef,
+ 'TAP::Formatter::Base' => undef,
+ 'TAP::Formatter::Color' => undef,
+ 'TAP::Formatter::Console'=> undef,
+ 'TAP::Formatter::Console::ParallelSession'=> undef,
+ 'TAP::Formatter::Console::Session'=> undef,
+ 'TAP::Formatter::File' => undef,
+ 'TAP::Formatter::File::Session'=> undef,
+ 'TAP::Formatter::Session'=> undef,
+ 'TAP::Harness' => undef,
+ 'TAP::Object' => undef,
+ 'TAP::Parser' => undef,
+ 'TAP::Parser::Aggregator'=> undef,
+ 'TAP::Parser::Grammar' => undef,
+ 'TAP::Parser::Iterator' => undef,
+ 'TAP::Parser::Iterator::Array'=> undef,
+ 'TAP::Parser::Iterator::Process'=> undef,
+ 'TAP::Parser::Iterator::Stream'=> undef,
+ 'TAP::Parser::IteratorFactory'=> undef,
+ 'TAP::Parser::Multiplexer'=> undef,
+ 'TAP::Parser::Result' => undef,
+ 'TAP::Parser::Result::Bailout'=> undef,
+ 'TAP::Parser::Result::Comment'=> undef,
+ 'TAP::Parser::Result::Plan'=> undef,
+ 'TAP::Parser::Result::Pragma'=> undef,
+ 'TAP::Parser::Result::Test'=> undef,
+ 'TAP::Parser::Result::Unknown'=> undef,
+ 'TAP::Parser::Result::Version'=> undef,
+ 'TAP::Parser::Result::YAML'=> undef,
+ 'TAP::Parser::ResultFactory'=> undef,
+ 'TAP::Parser::Scheduler'=> undef,
+ 'TAP::Parser::Scheduler::Job'=> undef,
+ 'TAP::Parser::Scheduler::Spinner'=> undef,
+ 'TAP::Parser::Source' => undef,
+ 'TAP::Parser::Source::Perl'=> undef,
+ 'TAP::Parser::Utils' => undef,
+ 'TAP::Parser::YAMLish::Reader'=> undef,
+ 'TAP::Parser::YAMLish::Writer'=> undef,
+ 'Term::ANSIColor' => 'cpan',
+ 'Term::Cap' => undef,
+ 'Term::UI' => 'cpan',
+ 'Term::UI::History' => 'cpan',
+ 'Test' => undef,
+ 'Test::Builder' => undef,
+ 'Test::Builder::Module' => undef,
+ 'Test::Builder::Tester' => undef,
+ 'Test::Builder::Tester::Color'=> undef,
+ 'Test::Harness' => undef,
+ 'Test::More' => undef,
+ 'Test::Simple' => undef,
+ 'Text::Balanced' => undef,
+ 'Text::ParseWords' => undef,
+ 'Text::Soundex' => undef,
+ 'Text::Tabs' => 'cpan',
+ 'Text::Wrap' => 'cpan',
+ 'Thread::Queue' => 'blead',
+ 'Thread::Semaphore' => 'blead',
+ 'Tie::File' => undef,
+ 'Tie::RefHash' => 'cpan',
+ 'Time::HiRes' => undef,
+ 'Time::Local' => undef,
+ 'Time::Piece' => undef,
+ 'Time::Piece::Seconds' => undef,
+ 'Unicode::Collate' => 'first-come',
+ 'Unicode::Normalize' => 'first-come',
+ 'Win32' => undef,
+ 'Win32API::File' => undef,
+ 'Win32API::File::ExtUtils::Myconst2perl'=> undef,
+ 'Win32CORE' => undef,
+ 'XSLoader' => undef,
+ 'autodie' => 'cpan',
+ 'autodie::exception' => 'cpan',
+ 'autodie::exception::system'=> 'cpan',
+ 'base' => 'blead',
+ 'bigint' => undef,
+ 'bignum' => undef,
+ 'bigrat' => undef,
+ 'constant' => undef,
+ 'encoding' => undef,
+ 'encoding::warnings' => undef,
+ 'fields' => 'blead',
+ 'if' => undef,
+ 'lib' => 'blead',
+ 'parent' => undef,
+ 'threads' => 'blead',
+ 'threads::shared' => 'blead',
+ 'version' => undef,
+ 'warnings' => undef,
+ 'warnings::register' => undef,
+);
+
+%bug_tracker = (
+ 'App::Prove' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'App::Prove::State' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'App::Prove::State::Result'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'App::Prove::State::Result::Test'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'Archive::Extract' => undef,
+ 'Archive::Tar' => undef,
+ 'Archive::Tar::Constant'=> undef,
+ 'Archive::Tar::File' => undef,
+ 'Attribute::Handlers' => undef,
+ 'AutoLoader' => undef,
+ 'AutoSplit' => undef,
+ 'B::Debug' => undef,
+ 'B::Lint' => undef,
+ 'CGI' => undef,
+ 'CGI::Apache' => undef,
+ 'CGI::Carp' => undef,
+ 'CGI::Cookie' => undef,
+ 'CGI::Fast' => undef,
+ 'CGI::Pretty' => undef,
+ 'CGI::Push' => undef,
+ 'CGI::Switch' => undef,
+ 'CGI::Util' => undef,
+ 'CPAN' => undef,
+ 'CPAN::Author' => undef,
+ 'CPAN::Bundle' => undef,
+ 'CPAN::CacheMgr' => undef,
+ 'CPAN::Complete' => undef,
+ 'CPAN::Debug' => undef,
+ 'CPAN::DeferredCode' => undef,
+ 'CPAN::Distribution' => undef,
+ 'CPAN::Distroprefs' => undef,
+ 'CPAN::Distrostatus' => undef,
+ 'CPAN::Exception::RecursiveDependency'=> undef,
+ 'CPAN::Exception::blocked_urllist'=> undef,
+ 'CPAN::Exception::yaml_not_installed'=> undef,
+ 'CPAN::FTP' => undef,
+ 'CPAN::FTP::netrc' => undef,
+ 'CPAN::FirstTime' => undef,
+ 'CPAN::HandleConfig' => undef,
+ 'CPAN::Index' => undef,
+ 'CPAN::InfoObj' => undef,
+ 'CPAN::Kwalify' => undef,
+ 'CPAN::LWP::UserAgent' => undef,
+ 'CPAN::Module' => undef,
+ 'CPAN::Nox' => undef,
+ 'CPAN::Prompt' => undef,
+ 'CPAN::Queue' => undef,
+ 'CPAN::Shell' => undef,
+ 'CPAN::Tarzip' => undef,
+ 'CPAN::URL' => undef,
+ 'CPAN::Version' => undef,
+ 'CPANPLUS' => undef,
+ 'CPANPLUS::Backend' => undef,
+ 'CPANPLUS::Backend::RV' => undef,
+ 'CPANPLUS::Config' => undef,
+ 'CPANPLUS::Configure' => undef,
+ 'CPANPLUS::Configure::Setup'=> undef,
+ 'CPANPLUS::Dist' => undef,
+ 'CPANPLUS::Dist::Autobundle'=> undef,
+ 'CPANPLUS::Dist::Base' => undef,
+ 'CPANPLUS::Dist::Build' => undef,
+ 'CPANPLUS::Dist::Build::Constants'=> undef,
+ 'CPANPLUS::Dist::MM' => undef,
+ 'CPANPLUS::Dist::Sample'=> undef,
+ 'CPANPLUS::Error' => undef,
+ 'CPANPLUS::Internals' => undef,
+ 'CPANPLUS::Internals::Constants'=> undef,
+ 'CPANPLUS::Internals::Constants::Report'=> undef,
+ 'CPANPLUS::Internals::Extract'=> undef,
+ 'CPANPLUS::Internals::Fetch'=> undef,
+ 'CPANPLUS::Internals::Report'=> undef,
+ 'CPANPLUS::Internals::Search'=> undef,
+ 'CPANPLUS::Internals::Source'=> undef,
+ 'CPANPLUS::Internals::Source::Memory'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite'=> undef,
+ 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef,
+ 'CPANPLUS::Internals::Utils'=> undef,
+ 'CPANPLUS::Internals::Utils::Autoflush'=> undef,
+ 'CPANPLUS::Module' => undef,
+ 'CPANPLUS::Module::Author'=> undef,
+ 'CPANPLUS::Module::Author::Fake'=> undef,
+ 'CPANPLUS::Module::Checksums'=> undef,
+ 'CPANPLUS::Module::Fake'=> undef,
+ 'CPANPLUS::Module::Signature'=> undef,
+ 'CPANPLUS::Selfupdate' => undef,
+ 'CPANPLUS::Shell' => undef,
+ 'CPANPLUS::Shell::Classic'=> undef,
+ 'CPANPLUS::Shell::Default'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef,
+ 'CPANPLUS::Shell::Default::Plugins::Source'=> undef,
+ 'CPANPLUS::inc' => undef,
+ 'Class::ISA' => undef,
+ 'Compress::Raw::Bzip2' => undef,
+ 'Compress::Raw::Zlib' => undef,
+ 'Cwd' => undef,
+ 'DB_File' => undef,
+ 'DCLsym' => undef,
+ 'Devel::InnerPackage' => undef,
+ 'Devel::PPPort' => undef,
+ 'Digest' => undef,
+ 'Digest::MD5' => undef,
+ 'Digest::SHA' => undef,
+ 'Digest::base' => undef,
+ 'Digest::file' => undef,
+ 'Encode' => undef,
+ 'Encode::Alias' => undef,
+ 'Encode::Byte' => undef,
+ 'Encode::CJKConstants' => undef,
+ 'Encode::CN' => undef,
+ 'Encode::CN::HZ' => undef,
+ 'Encode::Config' => undef,
+ 'Encode::EBCDIC' => undef,
+ 'Encode::Encoder' => undef,
+ 'Encode::Encoding' => undef,
+ 'Encode::GSM0338' => undef,
+ 'Encode::Guess' => undef,
+ 'Encode::JP' => undef,
+ 'Encode::JP::H2Z' => undef,
+ 'Encode::JP::JIS7' => undef,
+ 'Encode::KR' => undef,
+ 'Encode::KR::2022_KR' => undef,
+ 'Encode::MIME::Header' => undef,
+ 'Encode::MIME::Header::ISO_2022_JP'=> undef,
+ 'Encode::MIME::Name' => undef,
+ 'Encode::Symbol' => undef,
+ 'Encode::TW' => undef,
+ 'Encode::Unicode' => undef,
+ 'Encode::Unicode::UTF7' => undef,
+ 'Exporter' => undef,
+ 'Exporter::Heavy' => undef,
+ 'ExtUtils::CBuilder' => undef,
+ 'ExtUtils::CBuilder::Base'=> undef,
+ 'ExtUtils::CBuilder::Platform::Unix'=> undef,
+ 'ExtUtils::CBuilder::Platform::VMS'=> undef,
+ 'ExtUtils::CBuilder::Platform::Windows'=> undef,
+ 'ExtUtils::CBuilder::Platform::aix'=> undef,
+ 'ExtUtils::CBuilder::Platform::cygwin'=> undef,
+ 'ExtUtils::CBuilder::Platform::darwin'=> undef,
+ 'ExtUtils::CBuilder::Platform::dec_osf'=> undef,
+ 'ExtUtils::CBuilder::Platform::os2'=> undef,
+ 'ExtUtils::Command' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-Command',
+ 'ExtUtils::Command::MM' => undef,
+ 'ExtUtils::Constant' => undef,
+ 'ExtUtils::Constant::Base'=> undef,
+ 'ExtUtils::Constant::ProxySubs'=> undef,
+ 'ExtUtils::Constant::Utils'=> undef,
+ 'ExtUtils::Constant::XS'=> undef,
+ 'ExtUtils::Install' => undef,
+ 'ExtUtils::Installed' => undef,
+ 'ExtUtils::Liblist' => undef,
+ 'ExtUtils::Liblist::Kid'=> undef,
+ 'ExtUtils::MM' => undef,
+ 'ExtUtils::MM_AIX' => undef,
+ 'ExtUtils::MM_Any' => undef,
+ 'ExtUtils::MM_BeOS' => undef,
+ 'ExtUtils::MM_Cygwin' => undef,
+ 'ExtUtils::MM_DOS' => undef,
+ 'ExtUtils::MM_Darwin' => undef,
+ 'ExtUtils::MM_MacOS' => undef,
+ 'ExtUtils::MM_NW5' => undef,
+ 'ExtUtils::MM_OS2' => undef,
+ 'ExtUtils::MM_QNX' => undef,
+ 'ExtUtils::MM_UWIN' => undef,
+ 'ExtUtils::MM_Unix' => undef,
+ 'ExtUtils::MM_VMS' => undef,
+ 'ExtUtils::MM_VOS' => undef,
+ 'ExtUtils::MM_Win32' => undef,
+ 'ExtUtils::MM_Win95' => undef,
+ 'ExtUtils::MY' => undef,
+ 'ExtUtils::MakeMaker' => undef,
+ 'ExtUtils::MakeMaker::Config'=> undef,
+ 'ExtUtils::MakeMaker::bytes'=> undef,
+ 'ExtUtils::MakeMaker::vmsish'=> undef,
+ 'ExtUtils::Manifest' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-Manifest',
+ 'ExtUtils::Mkbootstrap' => undef,
+ 'ExtUtils::Mksymlists' => undef,
+ 'ExtUtils::Packlist' => undef,
+ 'ExtUtils::ParseXS' => undef,
+ 'ExtUtils::testlib' => undef,
+ 'Fatal' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=autodie',
+ 'File::Fetch' => undef,
+ 'File::Path' => undef,
+ 'File::Spec' => undef,
+ 'File::Spec::Cygwin' => undef,
+ 'File::Spec::Epoc' => undef,
+ 'File::Spec::Functions' => undef,
+ 'File::Spec::Mac' => undef,
+ 'File::Spec::OS2' => undef,
+ 'File::Spec::Unix' => undef,
+ 'File::Spec::VMS' => undef,
+ 'File::Spec::Win32' => undef,
+ 'File::Temp' => undef,
+ 'Filespec' => undef,
+ 'Filter::Simple' => undef,
+ 'Filter::Util::Call' => undef,
+ 'Getopt::Long' => undef,
+ 'IO' => undef,
+ 'IO::Dir' => undef,
+ 'IO::File' => undef,
+ 'IO::Handle' => undef,
+ 'IO::Pipe' => undef,
+ 'IO::Poll' => undef,
+ 'IO::Seekable' => undef,
+ 'IO::Select' => undef,
+ 'IO::Socket' => undef,
+ 'IO::Socket::INET' => undef,
+ 'IO::Socket::UNIX' => undef,
+ 'IO::Zlib' => undef,
+ 'IPC::Cmd' => undef,
+ 'IPC::Msg' => undef,
+ 'IPC::Semaphore' => undef,
+ 'IPC::SharedMem' => undef,
+ 'IPC::SysV' => undef,
+ 'List::Util' => undef,
+ 'Locale::Constants' => undef,
+ 'Locale::Country' => undef,
+ 'Locale::Currency' => undef,
+ 'Locale::Language' => undef,
+ 'Locale::Maketext' => undef,
+ 'Locale::Maketext::Guts'=> undef,
+ 'Locale::Maketext::GutsLoader'=> undef,
+ 'Locale::Maketext::Simple'=> undef,
+ 'Locale::Script' => undef,
+ 'Log::Message' => undef,
+ 'Log::Message::Config' => undef,
+ 'Log::Message::Handlers'=> undef,
+ 'Log::Message::Item' => undef,
+ 'Log::Message::Simple' => undef,
+ 'MIME::Base64' => undef,
+ 'MIME::QuotedPrint' => undef,
+ 'Math::BigFloat' => undef,
+ 'Math::BigFloat::Trace' => undef,
+ 'Math::BigInt' => undef,
+ 'Math::BigInt::Calc' => undef,
+ 'Math::BigInt::CalcEmu' => undef,
+ 'Math::BigInt::FastCalc'=> undef,
+ 'Math::BigInt::Trace' => undef,
+ 'Math::BigRat' => undef,
+ 'Math::Complex' => undef,
+ 'Math::Trig' => undef,
+ 'Memoize' => undef,
+ 'Memoize::AnyDBM_File' => undef,
+ 'Memoize::Expire' => undef,
+ 'Memoize::ExpireFile' => undef,
+ 'Memoize::ExpireTest' => undef,
+ 'Memoize::NDBM_File' => undef,
+ 'Memoize::SDBM_File' => undef,
+ 'Memoize::Storable' => undef,
+ 'Module::Build' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Base' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Compat' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Config' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::ConfigData'=> undef,
+ 'Module::Build::Cookbook'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Dumper' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::ModuleInfo'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Notes' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::PPMMaker'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Platform::Amiga'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Platform::Default'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Platform::EBCDIC'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Platform::MPEiX'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Platform::MacOS'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Platform::RiscOS'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Platform::Unix'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Platform::VMS'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Platform::VOS'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Platform::Windows'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Platform::aix'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Platform::cygwin'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Platform::darwin'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Platform::os2'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::PodParser'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::Version'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::Build::YAML' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=Module-Build',
+ 'Module::CoreList' => undef,
+ 'Module::Load' => undef,
+ 'Module::Load::Conditional'=> undef,
+ 'Module::Loaded' => undef,
+ 'Module::Pluggable' => undef,
+ 'Module::Pluggable::Object'=> undef,
+ 'NEXT' => undef,
+ 'Net::Cmd' => undef,
+ 'Net::Config' => undef,
+ 'Net::Domain' => undef,
+ 'Net::FTP' => undef,
+ 'Net::FTP::A' => undef,
+ 'Net::FTP::E' => undef,
+ 'Net::FTP::I' => undef,
+ 'Net::FTP::L' => undef,
+ 'Net::FTP::dataconn' => undef,
+ 'Net::NNTP' => undef,
+ 'Net::Netrc' => undef,
+ 'Net::POP3' => undef,
+ 'Net::Ping' => undef,
+ 'Net::SMTP' => undef,
+ 'Net::Time' => undef,
+ 'Object::Accessor' => undef,
+ 'Package::Constants' => undef,
+ 'Params::Check' => undef,
+ 'Parse::CPAN::Meta' => undef,
+ 'PerlIO::via::QuotedPrint'=> undef,
+ 'Pod::Checker' => undef,
+ 'Pod::Escapes' => undef,
+ 'Pod::Find' => undef,
+ 'Pod::InputObjects' => undef,
+ 'Pod::LaTeX' => undef,
+ 'Pod::Man' => undef,
+ 'Pod::ParseLink' => undef,
+ 'Pod::ParseUtils' => undef,
+ 'Pod::Parser' => undef,
+ 'Pod::Perldoc' => undef,
+ 'Pod::Perldoc::BaseTo' => undef,
+ 'Pod::Perldoc::GetOptsOO'=> undef,
+ 'Pod::Perldoc::ToChecker'=> undef,
+ 'Pod::Perldoc::ToMan' => undef,
+ 'Pod::Perldoc::ToNroff' => undef,
+ 'Pod::Perldoc::ToPod' => undef,
+ 'Pod::Perldoc::ToRtf' => undef,
+ 'Pod::Perldoc::ToText' => undef,
+ 'Pod::Perldoc::ToTk' => undef,
+ 'Pod::Perldoc::ToXml' => undef,
+ 'Pod::PlainText' => undef,
+ 'Pod::Plainer' => undef,
+ 'Pod::Select' => undef,
+ 'Pod::Simple' => undef,
+ 'Pod::Simple::BlackBox' => undef,
+ 'Pod::Simple::Checker' => undef,
+ 'Pod::Simple::Debug' => undef,
+ 'Pod::Simple::DumpAsText'=> undef,
+ 'Pod::Simple::DumpAsXML'=> undef,
+ 'Pod::Simple::HTML' => undef,
+ 'Pod::Simple::HTMLBatch'=> undef,
+ 'Pod::Simple::HTMLLegacy'=> undef,
+ 'Pod::Simple::LinkSection'=> undef,
+ 'Pod::Simple::Methody' => undef,
+ 'Pod::Simple::Progress' => undef,
+ 'Pod::Simple::PullParser'=> undef,
+ 'Pod::Simple::PullParserEndToken'=> undef,
+ 'Pod::Simple::PullParserStartToken'=> undef,
+ 'Pod::Simple::PullParserTextToken'=> undef,
+ 'Pod::Simple::PullParserToken'=> undef,
+ 'Pod::Simple::RTF' => undef,
+ 'Pod::Simple::Search' => undef,
+ 'Pod::Simple::SimpleTree'=> undef,
+ 'Pod::Simple::Text' => undef,
+ 'Pod::Simple::TextContent'=> undef,
+ 'Pod::Simple::TiedOutFH'=> undef,
+ 'Pod::Simple::Transcode'=> undef,
+ 'Pod::Simple::TranscodeDumb'=> undef,
+ 'Pod::Simple::TranscodeSmart'=> undef,
+ 'Pod::Simple::XHTML' => undef,
+ 'Pod::Simple::XMLOutStream'=> undef,
+ 'Pod::Text' => undef,
+ 'Pod::Text::Color' => undef,
+ 'Pod::Text::Overstrike' => undef,
+ 'Pod::Text::Termcap' => undef,
+ 'Pod::Usage' => undef,
+ 'Safe' => undef,
+ 'Scalar::Util' => undef,
+ 'SelfLoader' => undef,
+ 'Shell' => undef,
+ 'Stdio' => undef,
+ 'Storable' => undef,
+ 'Switch' => undef,
+ 'Sys::Syslog' => undef,
+ 'Sys::Syslog::win32::Win32'=> undef,
+ 'TAP::Base' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Formatter::Base' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Formatter::Color' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Formatter::Console'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Formatter::Console::ParallelSession'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Formatter::Console::Session'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Formatter::File' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Formatter::File::Session'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Formatter::Session'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Harness' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Object' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Aggregator'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Grammar' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Iterator' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Iterator::Array'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Iterator::Process'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Iterator::Stream'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::IteratorFactory'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Multiplexer'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Result' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Result::Bailout'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Result::Comment'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Result::Plan'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Result::Pragma'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Result::Test'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Result::Unknown'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Result::Version'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Result::YAML'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::ResultFactory'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Scheduler'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Scheduler::Job'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Scheduler::Spinner'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Source' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Source::Perl'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::Utils' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::YAMLish::Reader'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'TAP::Parser::YAMLish::Writer'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'Term::ANSIColor' => undef,
+ 'Term::Cap' => undef,
+ 'Term::UI' => undef,
+ 'Term::UI::History' => undef,
+ 'Test' => undef,
+ 'Test::Builder' => 'http://code.google.com/p/test-more/issues',
+ 'Test::Builder::Module' => 'http://code.google.com/p/test-more/issues',
+ 'Test::Builder::Tester' => 'http://code.google.com/p/test-more/issues',
+ 'Test::Builder::Tester::Color'=> 'http://code.google.com/p/test-more/issues',
+ 'Test::Harness' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness',
+ 'Test::More' => 'http://code.google.com/p/test-more/issues',
+ 'Test::Simple' => 'http://code.google.com/p/test-more/issues',
+ 'Text::Balanced' => undef,
+ 'Text::ParseWords' => undef,
+ 'Text::Soundex' => undef,
+ 'Text::Tabs' => undef,
+ 'Text::Wrap' => undef,
+ 'Thread::Queue' => undef,
+ 'Thread::Semaphore' => undef,
+ 'Tie::File' => undef,
+ 'Tie::RefHash' => undef,
+ 'Time::HiRes' => undef,
+ 'Time::Local' => undef,
+ 'Time::Piece' => undef,
+ 'Time::Piece::Seconds' => undef,
+ 'Unicode::Collate' => undef,
+ 'Unicode::Normalize' => undef,
+ 'Win32' => undef,
+ 'Win32API::File' => undef,
+ 'Win32API::File::ExtUtils::Myconst2perl'=> undef,
+ 'XSLoader' => undef,
+ 'autodie' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=autodie',
+ 'autodie::exception' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=autodie',
+ 'autodie::exception::system'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=autodie',
+ 'base' => undef,
+ 'bigint' => undef,
+ 'bignum' => undef,
+ 'bigrat' => undef,
+ 'constant' => undef,
+ 'encoding' => undef,
+ 'encoding::warnings' => undef,
+ 'fields' => undef,
+ 'if' => undef,
+ 'lib' => undef,
+ 'parent' => undef,
+ 'threads' => undef,
+ 'threads::shared' => undef,
+ 'version' => undef,
+ 'warnings' => undef,
+);
+
# Create aliases with trailing zeros for $] use
$released{'5.000'} = $released{5};
diff --git a/lib/NEXT.pm b/lib/NEXT.pm
index dc3127763b..f36fb7d516 100644
--- a/lib/NEXT.pm
+++ b/lib/NEXT.pm
@@ -1,5 +1,5 @@
package NEXT;
-$VERSION = '0.61';
+$VERSION = '0.63';
use Carp;
use strict;
use overload ();
@@ -61,11 +61,19 @@ sub NEXT::ELSEWHERE::buildAUTOLOAD
last if shift @forebears eq $caller_class
}
no strict 'refs';
- @{$NEXT::NEXT{$key,$wanted_method}} =
- map { *{"${_}::$caller_method"}{CODE}||() } @forebears
+ @{$NEXT::NEXT{$key,$wanted_method}} =
+ map {
+ my $stash = \%{"${_}::"};
+ ($stash->{$caller_method} && (*{$stash->{$caller_method}}{CODE}))
+ ? *{$stash->{$caller_method}}{CODE}
+ : () } @forebears
unless $wanted_method eq 'AUTOLOAD';
- @{$NEXT::NEXT{$key,$wanted_method}} =
- map { (*{"${_}::AUTOLOAD"}{CODE}) ? "${_}::AUTOLOAD" : ()} @forebears
+ @{$NEXT::NEXT{$key,$wanted_method}} =
+ map {
+ my $stash = \%{"${_}::"};
+ ($stash->{AUTOLOAD} && (*{$stash->{AUTOLOAD}}{CODE}))
+ ? "${_}::AUTOLOAD"
+ : () } @forebears
unless @{$NEXT::NEXT{$key,$wanted_method}||[]};
$NEXT::SEEN->{$key,*{$caller}{CODE}}++;
}
diff --git a/lib/NEXT/Changes b/lib/NEXT/Changes
index fc34098778..6888015705 100644
--- a/lib/NEXT/Changes
+++ b/lib/NEXT/Changes
@@ -1,69 +1,56 @@
Revision history for Perl extension NEXT.pm.
-0.01 Tue Apr 10 18:27:00 EST 2001
-
- - original version
-
-
-0.01 Thu Apr 12 17:06:49 2001
-
- - Documented the difference between NEXT and SUPER (thanks Ken)
-
-
-
-0.01 Thu Apr 12 17:15:42 2001
-
-
-
-0.02 Mon Sep 3 07:52:27 2001
-
- - Fixed setting of $AUTOLOAD in NEXT'd AUTOLOADS (thanks Leonid)
-
- - Changed licence for inclusion in core distribution
-
-
-0.50 Fri Nov 16 11:20:40 2001
-
- - Added a $VERSION (oops!)
-
- - Fixed handling of diamond patterns (thanks Paul)
-
- - Added NEXT::ACTUAL to require existence of next method (thanks Paul)
-
- - Added NEXT::UNSEEN to avoid calling multiply inherited
- methods twice (thanks Paul)
-
- - Re-fixed setting of $AUTOLOAD in NEXT'd AUTOLOADS to be
- consistent with more useful SUPER:: behaviour
-
- - Corified tests
-
-
-0.51 Tue Jul 29 23:09:48 2003
-
- - Fixed NEXT::UNSEEN bug under diamond inheritance (thanks Dan
- and Alan)
-
- - Moved &ancestors out of NEXT class in case anyone ever
- calls NEXT::ancestors
-
- - Replaced UNSEEN with DISTINCT (but left UNSEEN operational
- for backwards compatibility)
-
-
-0.52 Wed Jul 30 21:06:59 2003
-
- - Refixed NEXT::UNSEEN bug under diamond inheritance
-
-
-0.53 Tue Aug 12 10:53:25 2003
-
- - Re-re-fixed NEXT::UNSEEN bug under diamond inheritance
-
-
-0.60 Wed Aug 13 03:55:33 2003
-
- - Re-re-re-fixed NEXT::UNSEEN bug under diamond inheritance
- (Note to self: don't code whilst on vacation!)
-
- - Implemented and documented EVERY functionality
+0.63 Fri Apr 10 16:52:44 2009
+ - Specify plans for all tests (Jarkko Hietaniemi). Merged from blead
+ perl (Florian Ragwitz).
+ - Default to installing to privlib instead of sitelib on perls where
+ NEXT is core (Jerry D. Hedden).
+
+0.62 Wed Apr 8 03:27:25 2009
+ - Be less aggressive when looking at the symbol table to find
+ methods. This prevents "used only once" warnings on 5.10.
+
+0.61 Tue Mar 24 02:50:26 2009
+ - Pod tweaks (Alan Ferrency).
+ - Fix a bug when using NEXT from within an eval block (Dave Rolsky).
+ - Fix some pod typos (Piotr Fusik).
+ - Fix a bug when using NEXT within overloaded stringification
+ (Marcel Grünauer).
+ - Make NEXT work with AUTOLOAD (Damian Conway).
+
+0.60 Wed Aug 13 03:55:33 2003
+ - Re-re-re-fixed NEXT::UNSEEN bug under diamond inheritance
+ (Note to self: don't code whilst on vacation!)
+ - Implemented and documented EVERY functionality
+
+0.53 Tue Aug 12 10:53:25 2003
+ - Re-re-fixed NEXT::UNSEEN bug under diamond inheritance
+
+0.52 Wed Jul 30 21:06:59 2003
+ - Refixed NEXT::UNSEEN bug under diamond inheritance
+
+0.51 Tue Jul 29 23:09:48 2003
+ - Fixed NEXT::UNSEEN bug under diamond inheritance (thanks Dan
+ and Alan)
+ - Moved &ancestors out of NEXT class in case anyone ever
+ calls NEXT::ancestors
+ - Replaced UNSEEN with DISTINCT (but left UNSEEN operational
+ for backwards compatibility)
+
+0.50 Fri Nov 16 11:20:40 2001
+ - Added a $VERSION (oops!)
+ - Fixed handling of diamond patterns (thanks Paul)
+ - Added NEXT::ACTUAL to require existence of next method (thanks Paul)
+ - Added NEXT::UNSEEN to avoid calling multiply inherited
+ methods twice (thanks Paul)
+ - Re-fixed setting of $AUTOLOAD in NEXT'd AUTOLOADS to be
+ consistent with more useful SUPER:: behaviour
+ - Corified tests
+
+0.02 Mon Sep 3 07:52:27 2001
+ - Fixed setting of $AUTOLOAD in NEXT'd AUTOLOADS (thanks Leonid)
+ - Changed licence for inclusion in core distribution
+ - Documented the difference between NEXT and SUPER (thanks Ken)
+
+0.01 Tue Apr 10 18:27:00 EST 2001
+ - original version
diff --git a/lib/Net/hostent.t b/lib/Net/hostent.t
index 2616b56425..421f19dc35 100644
--- a/lib/Net/hostent.t
+++ b/lib/Net/hostent.t
@@ -33,6 +33,10 @@ sub DIE {
use Socket;
my $h = gethost('localhost');
+SKIP: {
+skip "Can't resolve localhost and you don't have /etc/hosts", 6
+ if (!defined($h) && !-e '/etc/hosts');
+
ok(defined $h, "gethost('localhost')") ||
DIE("Can't continue without working gethost: $!");
@@ -89,3 +93,4 @@ SKIP: {
print "# " . $h->name . " " . join (",", @{$h->aliases}) . "\n";
}
}
+}
diff --git a/lib/Parse/CPAN/Meta.pm b/lib/Parse/CPAN/Meta.pm
index 6a80681794..afbb587bfd 100644
--- a/lib/Parse/CPAN/Meta.pm
+++ b/lib/Parse/CPAN/Meta.pm
@@ -5,7 +5,7 @@ use Carp 'croak';
BEGIN {
require 5.004;
require Exporter;
- $Parse::CPAN::Meta::VERSION = '0.04_01';
+ $Parse::CPAN::Meta::VERSION = '0.05';
@Parse::CPAN::Meta::ISA = qw{ Exporter };
@Parse::CPAN::Meta::EXPORT_OK = qw{ Load LoadFile };
}
diff --git a/lib/Parse/CPAN/Meta/Changes b/lib/Parse/CPAN/Meta/Changes
index 5a166519a1..d602d4a58c 100644
--- a/lib/Parse/CPAN/Meta/Changes
+++ b/lib/Parse/CPAN/Meta/Changes
@@ -1,5 +1,8 @@
Revision history for Perl extension Parse-CPAN-Meta
+0.05 Wed 11 Mar 2009
+ - Upgrade previous release to a stable release.
+
0.04_01 Tue 3 Mar 2009
- Merge Unicode / BOM fixes from YAML::Tiny
diff --git a/lib/Term/UI.pm b/lib/Term/UI.pm
index 4b20faad9c..136f75bb6a 100644
--- a/lib/Term/UI.pm
+++ b/lib/Term/UI.pm
@@ -11,7 +11,7 @@ use strict;
BEGIN {
use vars qw[$VERSION $AUTOREPLY $VERBOSE $INVALID];
$VERBOSE = 1;
- $VERSION = '0.18';
+ $VERSION = '0.20';
$INVALID = loc('Invalid selection, please try again: ');
}
@@ -147,7 +147,7 @@ sub get_reply {
### so this choice is the default? add it to 'prompt_add'
### so we can construct a "foo? [DIGIT]" type prompt
- $prompt_add = $i if $choice eq $args->{default};
+ $prompt_add = $i if (defined $args->{default} and $choice eq $args->{default});
### create a "DIGIT> choice" type line
$args->{print_me} .= sprintf "\n%3s> %-s", $i, $choice;
diff --git a/lib/Text/Tabs.pm b/lib/Text/Tabs.pm
index 610e870c11..d3c06a08c1 100644
--- a/lib/Text/Tabs.pm
+++ b/lib/Text/Tabs.pm
@@ -7,7 +7,7 @@ require Exporter;
@EXPORT = qw(expand unexpand $tabstop);
use vars qw($VERSION $tabstop $debug);
-$VERSION = 2007.1117;
+$VERSION = 2009.0305;
use strict;
diff --git a/lib/Text/TabsWrap/CHANGELOG b/lib/Text/TabsWrap/CHANGELOG
index 8d4171e87d..df839794c5 100644
--- a/lib/Text/TabsWrap/CHANGELOG
+++ b/lib/Text/TabsWrap/CHANGELOG
@@ -1,4 +1,13 @@
+= 2009/03/05
+
+Test improvements from Dave Mitchel sent back in 2005...
+
+Added code to increase $columns if it's not big enough to accommodate
+the subsequent tab.
+
+Minor documentation fixes from David Landgren <david at landgren.net>.
+
Use warnings::warnif instead of just warn for columns < 2. Appled per
request of Rafael Garcia-Suarez <rgarciasuarez at gmail.com>.
diff --git a/lib/Text/TabsWrap/t/Jacobson.t b/lib/Text/TabsWrap/t/Jacobson.t
index 22d42e4d49..d2727e4629 100644
--- a/lib/Text/TabsWrap/t/Jacobson.t
+++ b/lib/Text/TabsWrap/t/Jacobson.t
@@ -10,7 +10,7 @@ $huge='overflow';
$Text::Wrap::columns=9;
$break="(?<=[,.])";
eval {
-$a=wrap('','',
+$a=$a=wrap('','',
"mmmm,n,ooo,ppp.qqqq.rrrrr,sssssssssssss,ttttttttt,uu,vvv wwwwwwwww####\n");
};
diff --git a/lib/Text/TabsWrap/t/Jacobson2.t b/lib/Text/TabsWrap/t/Jacobson2.t
index 5874e0ecb2..b7b06faf82 100644
--- a/lib/Text/TabsWrap/t/Jacobson2.t
+++ b/lib/Text/TabsWrap/t/Jacobson2.t
@@ -8,7 +8,7 @@ $huge='overflow';
$Text::Wrap::columns=9;
$break="(?<=[,.])";
eval {
-$a=wrap('','',
+$a=$a=wrap('','',
"mmmm,n,ooo,ppp.qqqq.rrrrr.adsljasdf\nlasjdflajsdflajsdfljasdfl\nlasjdflasjdflasf,sssssssssssss,ttttttttt,uu,vvv wwwwwwwww####\n");
};
diff --git a/lib/Text/TabsWrap/t/dandv.t b/lib/Text/TabsWrap/t/dandv.t
new file mode 100644
index 0000000000..b6ee69ada1
--- /dev/null
+++ b/lib/Text/TabsWrap/t/dandv.t
@@ -0,0 +1,8 @@
+
+use Text::Wrap;
+use Test::More tests => 2;
+$Text::Wrap::columns = 4;
+eval { $x = Text::Wrap::wrap('', '123', 'some text'); };
+is($@, '');
+is($x, "some\n123t\n123e\n123x\n123t");
+
diff --git a/lib/Text/TabsWrap/t/fill.t b/lib/Text/TabsWrap/t/fill.t
index 8af4a0e9c4..dab043297e 100755
--- a/lib/Text/TabsWrap/t/fill.t
+++ b/lib/Text/TabsWrap/t/fill.t
@@ -49,8 +49,9 @@ DONE
$| = 1;
-my $numtests = scalar(@tests) / 2;
-print "1..$numtests\n";
+print "1..";
+print @tests/2;
+print "\n";
use Text::Wrap;
diff --git a/lib/Text/TabsWrap/t/tabs.t b/lib/Text/TabsWrap/t/tabs.t
index cd6f32c443..1bba9a63e2 100755
--- a/lib/Text/TabsWrap/t/tabs.t
+++ b/lib/Text/TabsWrap/t/tabs.t
@@ -86,8 +86,9 @@ DONE
$| = 1;
-my $numtests = scalar(@tests) / 2;
-print "1..$numtests\n";
+print "1..";
+print @tests/2;
+print "\n";
use Text::Tabs;
diff --git a/lib/Text/TabsWrap/t/wrap.t b/lib/Text/TabsWrap/t/wrap.t
index 37ffbb5db8..b9d51f24b6 100755
--- a/lib/Text/TabsWrap/t/wrap.t
+++ b/lib/Text/TabsWrap/t/wrap.t
@@ -1,6 +1,6 @@
-#!/usr/bin/perl5.00502
+#!/usr/bin/perl
-@tests = (split(/\nEND\n/s, <<DONE));
+@tests = (split(/\nEND\n/s, <<'DONE'));
TEST1
This
is
@@ -112,6 +112,17 @@ END
Lines
END
+TEST13 break=\d
+I saw 3 ships come sailing in
+END
+ I saw 3 ships come sailing in
+END
+TEST14 break=\d
+the.quick.brown.fox.jumps.over.the.9.lazy.dogs.for.no.good.reason.whatsoever.apparently
+END
+ the.quick.brown.fox.jumps.over.the.
+ .lazy.dogs.for.no.good.reason.whatsoever.apparently
+END
DONE
@@ -130,7 +141,9 @@ while (@st) {
my $in = shift(@st);
my $out = shift(@st);
- $in =~ s/^TEST(\d+)?\n//;
+ $in =~ s/^TEST(\d+)( break=(.*))?\n//
+ or die "bad TEST header line: $in\n";
+ local $Text::Wrap::break = $3 if defined $3;
my $back = wrap(' ', ' ', $in);
@@ -164,7 +177,9 @@ while(@st) {
my $in = shift(@st);
my $out = shift(@st);
- $in =~ s/^TEST(\d+)?\n//;
+ $in =~ s/^TEST(\d+)( break=(.*))?\n//
+ or die "bad TEST header line: $in\n";
+ local $Text::Wrap::break = $3 if defined $3;
my @in = split("\n", $in, -1);
@in = ((map { "$_\n" } @in[0..$#in-1]), $in[-1]);
diff --git a/lib/Text/TabsWrap/t/wrap_separator2.t b/lib/Text/TabsWrap/t/wrap_separator2.t
new file mode 100644
index 0000000000..b31864fff5
--- /dev/null
+++ b/lib/Text/TabsWrap/t/wrap_separator2.t
@@ -0,0 +1,13 @@
+#!/usr/local/bin/perl -w
+#Author: Dan Dascalescu
+use strict;
+use Test::More tests => 1;
+
+use Text::Wrap;
+
+local $Text::Wrap::columns = 15;
+local $Text::Wrap::separator2 = '[N]';
+
+is(wrap('','','some long text here that should be wrapped on at least three lines'),
+"some long text[N]here that[N]should be[N]wrapped on at[N]least three[N]lines",
+'If you just to preserve existing newlines but add new breaks with something else, set $Text::Wrap::separator2 instead.');
diff --git a/lib/Text/Wrap.pm b/lib/Text/Wrap.pm
index 3dee92f4e4..de8620247f 100644
--- a/lib/Text/Wrap.pm
+++ b/lib/Text/Wrap.pm
@@ -7,7 +7,7 @@ require Exporter;
@EXPORT = qw(wrap fill);
@EXPORT_OK = qw($columns $break $huge);
-$VERSION = 2006.1117;
+$VERSION = 2009.0305;
use vars qw($VERSION $columns $debug $break $huge $unexpand $tabstop
$separator $separator2);
@@ -35,9 +35,15 @@ sub wrap
my $tail = pop(@t);
my $t = expand(join("", (map { /\s+\z/ ? ( $_ ) : ($_, ' ') } @t), $tail));
my $lead = $ip;
+ my $nll = $columns - length(expand($xp)) - 1;
+ if ($nll <= 0 && $xp ne '') {
+ my $nc = length(expand($xp)) + 2;
+ warnings::warnif "Increasing \$Text::Wrap::columns from $columns to $nc to accommodate length of subsequent tab";
+ $columns = $nc;
+ $nll = 1;
+ }
my $ll = $columns - length(expand($ip)) - 1;
$ll = 0 if $ll < 0;
- my $nll = $columns - length(expand($xp)) - 1;
my $nl = "";
my $remainder = "";
@@ -176,9 +182,10 @@ use C<local($Text::Wrap::VARIABLE) = YOURVALUE> when you change the
values so that the original value is restored. This C<local()> trick
will not work if you import the variable into your own namespace.
-Lines are wrapped at C<$Text::Wrap::columns> columns. C<$Text::Wrap::columns>
-should be set to the full width of your output device. In fact,
-every resulting line will have length of no more than C<$columns - 1>.
+Lines are wrapped at C<$Text::Wrap::columns> columns (default value: 76).
+C<$Text::Wrap::columns> should be set to the full width of your output
+device. In fact, every resulting line will have length of no more than
+C<$columns - 1>.
It is possible to control which characters terminate words by
modifying C<$Text::Wrap::break>. Set this to a string such as
@@ -187,6 +194,9 @@ such as C<qr/[\s']/> (to break before spaces or apostrophes). The
default is simply C<'\s'>; that is, words are terminated by spaces.
(This means, among other things, that trailing punctuation such as
full stops or commas stay with the word they are "attached" to.)
+Setting C<$Text::Wrap::break> to a regular expression that doesn't
+eat any characters (perhaps just a forward look-ahead assertion) will
+cause warnings.
Beginner note: In example 2, above C<$columns> is imported into
the local namespace, and set locally. In example 3,
@@ -201,8 +211,8 @@ the number of characters you do want for your tabstops.
If you want to separate your lines with something other than C<\n>
then set C<$Text::Wrap::separator> to your preference. This replaces
-all newlines with C<$Text::Wrap::separator>. If you just want to
-preserve existing newlines but add new breaks with something else, set
+all newlines with C<$Text::Wrap::separator>. If you just want to
+preserve existing newlines but add new breaks with something else, set
C<$Text::Wrap::separator2> instead.
When words that are longer than C<$columns> are encountered, they
@@ -240,11 +250,16 @@ Result:
"This is a bit of|text that forms a|normal book-style|paragraph"
+=head1 SEE ALSO
+
+For wrapping multi-byte characters: L<Text::WrapI18N>.
+For more detailed controls: L<Text::Format>.
+
=head1 LICENSE
-David Muir Sharnoff <muir@idiom.com> with help from Tim Pierce and
-many many others. Copyright (C) 1996-2006 David Muir Sharnoff.
+David Muir Sharnoff <muir@idiom.org> with help from Tim Pierce and
+many many others. Copyright (C) 1996-2009 David Muir Sharnoff.
This module may be modified, used, copied, and redistributed at
-your own risk. Publicly redistributed modified versions must use
-a different name.
+your own risk. Publicly redistributed versions that are modified
+must use a different name.
diff --git a/lib/autodie.pm b/lib/autodie.pm
index 41ad856ddf..cb999a8334 100644
--- a/lib/autodie.pm
+++ b/lib/autodie.pm
@@ -8,7 +8,7 @@ our @ISA = qw(Fatal);
our $VERSION;
BEGIN {
- $VERSION = "1.998";
+ $VERSION = "1.999";
}
use constant ERROR_WRONG_FATAL => q{
@@ -307,6 +307,11 @@ See also L<Fatal/DIAGNOSTICS>.
is used with package filehandles (eg, C<FILE>). It's strongly recommended
you use scalar filehandles instead.
+Under Perl 5.8 only, C<autodie> I<does not> propagate into string C<eval>
+statements, although it can be explicitly enabled inside a string
+C<eval>. This bug does not affect block C<eval> statements in
+any version of Perl.
+
When using C<autodie> or C<Fatal> with user subroutines, the
declaration of those subroutines must appear before the first use of
C<Fatal> or C<autodie>, or have been exported from a module.
diff --git a/lib/autodie/exception.pm b/lib/autodie/exception.pm
index 45a32b076d..f297bf8461 100644
--- a/lib/autodie/exception.pm
+++ b/lib/autodie/exception.pm
@@ -14,7 +14,7 @@ use overload
use if ($] >= 5.010), overload => '~~' => "matches";
-our $VERSION = '1.998';
+our $VERSION = '1.999';
my $PACKAGE = __PACKAGE__; # Useful to have a scalar for hash keys.
@@ -628,6 +628,28 @@ sub _init {
}
+ # We now have everything correct, *except* for our subroutine
+ # name. If it's __ANON__ or (eval), then we need to keep on
+ # digging deeper into our stack to find the real name. However we
+ # don't update our other information, since that will be correct
+ # for our current exception.
+
+ my $first_guess_subroutine = $sub;
+
+ while (defined $sub and $sub =~ /^\(eval\)$|::__ANON__$/) {
+ $depth++;
+
+ $sub = (CORE::caller($depth))[3];
+ }
+
+ # If we end up falling out the bottom of our stack, then our
+ # __ANON__ guess is the best we can get. This includes situations
+ # where we were called from thetop level of a program.
+
+ if (not defined $sub) {
+ $sub = $first_guess_subroutine;
+ }
+
$this->{$PACKAGE}{package} = $package;
$this->{$PACKAGE}{file} = $file;
$this->{$PACKAGE}{line} = $line;
diff --git a/lib/autodie/exception/system.pm b/lib/autodie/exception/system.pm
index e49bf4b39e..6b1144054a 100644
--- a/lib/autodie/exception/system.pm
+++ b/lib/autodie/exception/system.pm
@@ -5,7 +5,7 @@ use warnings;
use base 'autodie::exception';
use Carp qw(croak);
-our $VERSION = '1.998';
+our $VERSION = '1.999';
my $PACKAGE = __PACKAGE__;
@@ -16,7 +16,7 @@ autodie::exception::system - Exceptions from autodying system().
=head1 SYNOPSIS
eval {
- use autodie;
+ use autodie qw(system);
system($cmd, @args);
diff --git a/lib/h2ph.t b/lib/h2ph.t
index 7b339b3927..27dd7b9d0a 100755
--- a/lib/h2ph.t
+++ b/lib/h2ph.t
@@ -1,4 +1,5 @@
#!./perl
+use strict;
# quickie tests to see if h2ph actually runs and does more or less what is
# expected
@@ -8,6 +9,8 @@ BEGIN {
@INC = '../lib';
}
+require './test.pl';
+
my $extracted_program = '../utils/h2ph'; # unix, nt, ...
if ($^O eq 'VMS') { $extracted_program = '[-.utils]h2ph.com'; }
if (!(-e $extracted_program)) {
@@ -15,23 +18,35 @@ if (!(-e $extracted_program)) {
exit 0;
}
-print "1..2\n";
+plan(4);
# quickly compare two text files
sub txt_compare {
- local ($/, $A, $B);
+ local $/;
+ my ($A, $B);
for (($A,$B) = @_) { open(_,"<$_") ? $_ = <_> : die "$_ : $!"; close _ }
$A cmp $B;
}
-# does it run?
-$ok = system("$^X \"-I../lib\" $extracted_program -d. \"-Q\" lib/h2ph.h");
-print(($ok == 0 ? "" : "not "), "ok 1\n");
+my $result = runperl( progfile => $extracted_program,
+ args => ['-d.', '-Q', 'lib/h2ph.h']);
+is( $?, 0, "$extracted_program runs successfully" );
-# does it work? well, does it do what we expect? :-)
-$ok = txt_compare("lib/h2ph.ph", "lib/h2ph.pht");
-print(($ok == 0 ? "" : "not "), "ok 2\n");
+is ( txt_compare("lib/h2ph.ph", "lib/h2ph.pht"),
+ 0,
+ "generated file has expected contents" );
-# cleanup - should this be in an END block?
-unlink("lib/h2ph.ph");
-unlink("_h2ph_pre.ph");
+$result = runperl( progfile => 'lib/h2ph.pht',
+ switches => ['-c'],
+ stderr => 1 );
+like( $result, qr/syntax OK$/, "output compiles");
+
+$result = runperl( switches => ["-w"],
+ prog => '$SIG{__WARN__} = sub { die $_[0] }; require q(lib/h2ph.pht);');
+is( $result, '', "output free of warnings" );
+
+# cleanup
+END {
+ 1 while unlink("lib/h2ph.ph");
+ 1 while unlink("_h2ph_pre.ph");
+}
diff --git a/lib/newgetopt.pl b/lib/newgetopt.pl
index 95eef220fe..1de6a6ebb1 100644
--- a/lib/newgetopt.pl
+++ b/lib/newgetopt.pl
@@ -1,4 +1,4 @@
-# $Id: newgetopt.pl,v 1.18 2001-09-21 15:34:59+02 jv Exp $
+# $Id: newgetopt.pl,v 1.18 2001/09/21 13:34:59 jv Exp $
# This library is no longer being maintained, and is included for backward
# compatibility with Perl 4 programs which may require it.
diff --git a/lib/overload.pm b/lib/overload.pm
index 2c0c8f9322..da114c505e 100644
--- a/lib/overload.pm
+++ b/lib/overload.pm
@@ -136,6 +136,7 @@ sub mycan { # Real can would leave stubs.
func => "atan2 cos sin exp abs log sqrt int",
conversion => 'bool "" 0+',
iterators => '<>',
+ filetest => "-X",
dereferencing => '${} @{} %{} &{} *{}',
special => 'nomethod fallback =');
@@ -424,6 +425,29 @@ I<globbing> syntax C<E<lt>${var}E<gt>>.
B<BUGS> Even in list context, the iterator is currently called only
once and with scalar context.
+=item * I<File tests>
+
+ "-X"
+
+This overload is used for all the filetest operators (C<-f>, C<-x> and
+so on: see L<perlfunc/-X> for the full list). Even though these are
+unary operators, the method will be called with a second argument which
+is a single letter indicating which test was performed. Note that the
+overload key is the literal string C<"-X">: you can't provide separate
+overloads for the different tests.
+
+Calling an overloaded filetest operator does not affect the stat value
+associated with the special filehandle C<_>. It still refers to the
+result of the last C<stat>, C<lstat> or unoverloaded filetest.
+
+If not overloaded, these operators will fall back to the default
+behaviour even without C<< fallback => 1 >>. This means that if the
+object is a blessed glob or blessed IO ref it will be treated as a
+filehandle, otherwise string overloading will be invoked and the result
+treated as a filename.
+
+This overload was introduced in perl 5.12.
+
=item * I<Dereferencing>
'${}', '@{}', '%{}', '&{}', '*{}'.
@@ -463,6 +487,7 @@ A computer-readable form of the above table is available in the hash
func => 'atan2 cos sin exp abs log sqrt',
conversion => 'bool "" 0+',
iterators => '<>',
+ filetest => '-X',
dereferencing => '${} @{} %{} &{} *{}',
special => 'nomethod fallback ='
diff --git a/lib/overload/numbers.pm b/lib/overload/numbers.pm
index 2e9e9ac1d9..7c39b1c17a 100644
--- a/lib/overload/numbers.pm
+++ b/lib/overload/numbers.pm
@@ -80,6 +80,7 @@ our @names = qw#
(.
(.=
(~~
+ (-X
DESTROY
#;
@@ -150,6 +151,7 @@ our @enums = qw#
concat
concat_ass
smart
+ ftest
DESTROY
#;
diff --git a/lib/perl5db.pl b/lib/perl5db.pl
index 765b0e57b9..9162d16212 100644
--- a/lib/perl5db.pl
+++ b/lib/perl5db.pl
@@ -8195,7 +8195,6 @@ my @pods = qw(
os2
os390
os400
- othrtut
packtut
plan9
pod
diff --git a/make_ext.pl b/make_ext.pl
index d0dcfbfd99..22a97eb7af 100644
--- a/make_ext.pl
+++ b/make_ext.pl
@@ -291,7 +291,8 @@ EOM
my $libd = VMS::Filespec::vmspath($lib_dir);
push @args, "INST_LIB=$libd", "INST_ARCHLIB=$libd";
} else {
- push @args, 'INSTALLDIRS=perl', 'INSTALLMAN3DIR=none';
+ push @args, 'INSTALLDIRS=perl', 'INSTALLMAN1DIR=none',
+ 'INSTALLMAN3DIR=none';
}
push @args, @$pass_through;
_quote_args(\@args) if $is_VMS;
diff --git a/mg.c b/mg.c
index c94f50eb8e..276e13dc57 100644
--- a/mg.c
+++ b/mg.c
@@ -772,14 +772,7 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
break;
case '\005': /* ^E */
if (nextchar == '\0') {
-#if defined(MACOS_TRADITIONAL)
- {
- char msg[256];
-
- sv_setnv(sv,(double)gMacPerl_OSErr);
- sv_setpv(sv, gMacPerl_OSErr ? GetSysErrText(gMacPerl_OSErr, msg) : "");
- }
-#elif defined(VMS)
+#if defined(VMS)
{
# include <descrip.h>
# include <starlet.h>
@@ -1075,10 +1068,8 @@ Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
(void)SvIOK_on(sv); /* what a wonderful hack! */
#endif
break;
-#ifndef MACOS_TRADITIONAL
case '0':
break;
-#endif
}
return 0;
}
@@ -2385,21 +2376,17 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
break;
case '\005': /* ^E */
if (*(mg->mg_ptr+1) == '\0') {
-#ifdef MACOS_TRADITIONAL
- gMacPerl_OSErr = SvIV(sv);
-#else
-# ifdef VMS
+#ifdef VMS
set_vaxc_errno(SvIV(sv));
-# else
-# ifdef WIN32
+#else
+# ifdef WIN32
SetLastError( SvIV(sv) );
-# else
-# ifdef OS2
+# else
+# ifdef OS2
os2_setsyserrno(SvIV(sv));
-# else
+# else
/* will anyone ever use this? */
SETERRNO(SvIV(sv), 4);
-# endif
# endif
# endif
#endif
@@ -2774,7 +2761,6 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
case ':':
PL_chopset = SvPV_force(sv,len);
break;
-#ifndef MACOS_TRADITIONAL
case '0':
LOCK_DOLLARZERO_MUTEX;
#ifdef HAS_SETPROCTITLE
@@ -2840,7 +2826,6 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
#endif
UNLOCK_DOLLARZERO_MUTEX;
break;
-#endif
}
return 0;
}
diff --git a/mint/README b/mint/README
index 85e8a75291..258130d49f 100644
--- a/mint/README
+++ b/mint/README
@@ -10,5 +10,5 @@ when compiling Perl.
The file system.c is an enhanced version of the system() function
in the MiNTLib. It is strongly recommended that you insert this
-version into your libc before you compile Perl (see README.MiNT
+version into your libc before you compile Perl (see README.mint
in the toplevel directory for details).
diff --git a/op.c b/op.c
index fe0ad142ce..f1faf42f07 100644
--- a/op.c
+++ b/op.c
@@ -4355,6 +4355,7 @@ Perl_newASSIGNOP(pTHX_ I32 flags, OP *left, I32 optype, OP *right)
PL_eval_start = 0;
else {
if (!PL_madskills) { /* assignment to $[ is ignored when making a mad dump */
+ deprecate("assignment to $[");
op_free(o);
o = newSVOP(OP_CONST, 0, newSViv(CopARYBASE_get(&PL_compiling)));
o->op_private |= OPpCONST_ARYBASE;
@@ -5594,12 +5595,6 @@ Perl_newATTRSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
cv = (!name || GvCVGEN(gv)) ? NULL : GvCV(gv);
-#ifdef GV_UNIQUE_CHECK
- if (cv && GvUNIQUE(gv) && SvREADONLY(cv)) {
- Perl_croak(aTHX_ "Can't define subroutine %s (GV is unique)", name);
- }
-#endif
-
if (!block || !ps || *ps || attrs
|| (CvFLAGS(PL_compcv) & CVf_BUILTIN_ATTRS)
#ifdef PERL_MAD
@@ -5613,12 +5608,6 @@ Perl_newATTRSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
if (cv) {
const bool exists = CvROOT(cv) || CvXSUB(cv);
-#ifdef GV_UNIQUE_CHECK
- if (exists && GvUNIQUE(gv)) {
- Perl_croak(aTHX_ "Can't redefine unique subroutine %s", name);
- }
-#endif
-
/* if the subroutine doesn't exist and wasn't pre-declared
* with a prototype, assume it will be AUTOLOADed,
* skipping the prototype check
@@ -5956,6 +5945,11 @@ S_process_special_blocks(pTHX_ const char *const fullname, GV *const gv,
Creates a constant sub equivalent to Perl C<sub FOO () { 123 }> which is
eligible for inlining at compile-time.
+Passing NULL for SV creates a constant sub equivalent to C<sub BAR () {}>,
+which won't be called if used as a destructor, but will suppress the overhead
+of a call to C<AUTOLOAD>. (This form, however, isn't eligible for inlining at
+compile time.)
+
=cut
*/
@@ -6156,20 +6150,19 @@ Perl_newFORM(pTHX_ I32 floor, OP *o, OP *block)
? gv_fetchsv(cSVOPo->op_sv, GV_ADD, SVt_PVFM)
: gv_fetchpvs("STDOUT", GV_ADD|GV_NOTQUAL, SVt_PVFM);
-#ifdef GV_UNIQUE_CHECK
- if (GvUNIQUE(gv)) {
- Perl_croak(aTHX_ "Bad symbol for form (GV is unique)");
- }
-#endif
GvMULTI_on(gv);
if ((cv = GvFORM(gv))) {
if (ckWARN(WARN_REDEFINE)) {
const line_t oldline = CopLINE(PL_curcop);
if (PL_parser && PL_parser->copline != NOLINE)
CopLINE_set(PL_curcop, PL_parser->copline);
- Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
- o ? "Format %"SVf" redefined"
- : "Format STDOUT redefined", SVfARG(cSVOPo->op_sv));
+ if (o) {
+ Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
+ "Format %"SVf" redefined", SVfARG(cSVOPo->op_sv));
+ } else {
+ Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
+ "Format STDOUT redefined");
+ }
CopLINE_set(PL_curcop, oldline);
}
SvREFCNT_dec(cv);
@@ -6547,6 +6540,8 @@ Perl_ck_eval(pTHX_ OP *o)
/* establish postfix order */
enter->op_next = (OP*)enter;
+ CHECKOP(OP_ENTERTRY, enter);
+
o = prepend_elem(OP_LINESEQ, (OP*)enter, (OP*)kid);
o->op_type = OP_LEAVETRY;
o->op_ppaddr = PL_ppaddr[OP_LEAVETRY];
@@ -8568,7 +8563,7 @@ Perl_peep(pTHX_ register OP *o)
/* Make the CONST have a shared SV */
svp = cSVOPx_svp(((BINOP*)o)->op_last);
- if ((!SvFAKE(sv = *svp) || !SvREADONLY(sv)) && !IS_PADCONST(sv)) {
+ if (!SvFAKE(sv = *svp) || !SvREADONLY(sv)) {
key = SvPV_const(sv, keylen);
lexname = newSVpvn_share(key,
SvUTF8(sv) ? -(I32)keylen : (I32)keylen,
@@ -8973,6 +8968,7 @@ const_sv_xsub(pTHX_ CV* cv)
{
dVAR;
dXSARGS;
+ SV *const sv = MUTABLE_SV(XSANY.any_ptr);
if (items != 0) {
NOOP;
#if 0
@@ -8980,8 +8976,11 @@ const_sv_xsub(pTHX_ CV* cv)
HvNAME_get(GvSTASH(CvGV(cv))), GvNAME(CvGV(cv)));
#endif
}
+ if (!sv) {
+ XSRETURN(0);
+ }
EXTEND(sp, 1);
- ST(0) = MUTABLE_SV(XSANY.any_ptr);
+ ST(0) = sv;
XSRETURN(1);
}
diff --git a/overload.c b/overload.c
index 2f1f870f65..909a0ee529 100644
--- a/overload.c
+++ b/overload.c
@@ -82,6 +82,7 @@ static const U8 PL_AMG_namelens[NofAMmeth] = {
2,
3,
3,
+ 3,
7
};
@@ -157,5 +158,6 @@ static const char * const PL_AMG_names[NofAMmeth] = {
"(.",
"(.=",
"(~~",
+ "(-X",
"DESTROY"
};
diff --git a/overload.h b/overload.h
index 1750585122..1a1e69ca54 100644
--- a/overload.h
+++ b/overload.h
@@ -79,6 +79,7 @@ enum {
concat_amg,
concat_ass_amg,
smart_amg,
+ ftest_amg,
DESTROY_amg,
max_amg_code
/* Do not leave a trailing comma here. C9X allows it, C89 doesn't. */
diff --git a/overload.pl b/overload.pl
index 6f0fe34ffd..38331cbda3 100644
--- a/overload.pl
+++ b/overload.pl
@@ -217,5 +217,6 @@ repeat_ass (x=
concat (.
concat_ass (.=
smart (~~
+ftest (-X
# Note: Perl_Gv_AMupdate() assumes that DESTROY is the last entry
DESTROY DESTROY
diff --git a/pad.c b/pad.c
index 568c8df67b..a68e202efb 100644
--- a/pad.c
+++ b/pad.c
@@ -1310,13 +1310,7 @@ Perl_pad_free(pTHX_ PADOFFSET po)
SvPADTMP_off(PL_curpad[po]);
#ifdef USE_ITHREADS
/* SV could be a shared hash key (eg bugid #19022) */
- if (
-#ifdef PERL_OLD_COPY_ON_WRITE
- !SvIsCOW(PL_curpad[po])
-#else
- !SvFAKE(PL_curpad[po])
-#endif
- )
+ if (!SvIsCOW(PL_curpad[po]))
SvREADONLY_off(PL_curpad[po]); /* could be a freed constant */
#endif
}
diff --git a/pad.h b/pad.h
index 10e094eef2..352a592f83 100644
--- a/pad.h
+++ b/pad.h
@@ -239,7 +239,7 @@ Restore the old pad saved into the local variable opad by PAD_SAVE_LOCAL()
PTR2UV(PL_comppad), PTR2UV(PL_curpad)));
#define PAD_RESTORE_LOCAL(opad) \
- PL_comppad = opad; \
+ PL_comppad = opad && SvIS_FREED(opad) ? NULL : opad; \
PL_curpad = PL_comppad ? AvARRAY(PL_comppad) : NULL; \
DEBUG_Xv(PerlIO_printf(Perl_debug_log, \
"Pad 0x%"UVxf"[0x%"UVxf"] restore_local\n", \
diff --git a/perl.c b/perl.c
index 32c0a48562..567ca758e6 100644
--- a/perl.c
+++ b/perl.c
@@ -1711,11 +1711,6 @@ S_parse_body(pTHX_ char **env, XSINIT_t xsinit)
PL_minus_E = TRUE;
/* FALL THROUGH */
case 'e':
-#ifdef MACOS_TRADITIONAL
- /* ignore -e for Dev:Pseudo argument */
- if (argv[1] && !strcmp(argv[1], "Dev:Pseudo"))
- break;
-#endif
forbid_setid('e', FALSE);
if (!PL_e_script) {
PL_e_script = newSVpvs("");
@@ -1923,7 +1918,7 @@ S_parse_body(pTHX_ char **env, XSINIT_t xsinit)
d = s;
if (!*s)
break;
- if (!strchr("CDIMUdmtw", *s))
+ if (!strchr("CDIMUdmtwW", *s))
Perl_croak(aTHX_ "Illegal switch in PERL5OPT: -%c", *s);
while (++s && *s) {
if (isSPACE(*s)) {
@@ -2002,11 +1997,7 @@ S_parse_body(pTHX_ char **env, XSINIT_t xsinit)
# endif
#endif
- if (PL_doextract
-#ifdef MACOS_TRADITIONAL
- || gMacPerl_AlwaysExtract
-#endif
- ) {
+ if (PL_doextract) {
/* This will croak if suidscript is true, as -x cannot be used with
setuid scripts. */
@@ -2028,7 +2019,6 @@ S_parse_body(pTHX_ char **env, XSINIT_t xsinit)
boot_core_PerlIO();
boot_core_UNIVERSAL();
- boot_core_xsutils();
boot_core_mro();
if (xsinit)
@@ -2147,16 +2137,6 @@ S_parse_body(pTHX_ char **env, XSINIT_t xsinit)
/* now parse the script */
SETERRNO(0,SS_NORMAL);
-#ifdef MACOS_TRADITIONAL
- if (gMacPerl_SyntaxError = (yyparse() || PL_parser->error_count)) {
- if (PL_minus_c)
- Perl_croak(aTHX_ "%s had compilation errors.\n", MacPerl_MPWFileName(PL_origfilename));
- else {
- Perl_croak(aTHX_ "Execution of %s aborted due to compilation errors.\n",
- MacPerl_MPWFileName(PL_origfilename));
- }
- }
-#else
if (yyparse() || PL_parser->error_count) {
if (PL_minus_c)
Perl_croak(aTHX_ "%s had compilation errors.\n", PL_origfilename);
@@ -2165,7 +2145,6 @@ S_parse_body(pTHX_ char **env, XSINIT_t xsinit)
PL_origfilename);
}
}
-#endif
CopLINE_set(PL_curcop, 0);
PL_curstash = PL_defstash;
if (PL_e_script) {
@@ -2283,13 +2262,7 @@ S_run_body(pTHX_ I32 oldscope)
#endif
if (PL_minus_c) {
-#ifdef MACOS_TRADITIONAL
- PerlIO_printf(Perl_error_log, "%s%s syntax OK\n",
- (gMacPerl_ErrorFormat ? "# " : ""),
- MacPerl_MPWFileName(PL_origfilename));
-#else
PerlIO_printf(Perl_error_log, "%s syntax OK\n", PL_origfilename);
-#endif
my_exit(0);
}
if (PERLDB_SINGLE && PL_DBsingle)
@@ -3203,9 +3176,6 @@ Perl_moreswitches(pTHX_ const char *s)
s++;
return s;
case 'u':
-#ifdef MACOS_TRADITIONAL
- Perl_croak(aTHX_ "Believe me, you don't want to use \"-u\" on a Macintosh");
-#endif
PL_do_undump = TRUE;
s++;
return s;
@@ -3264,11 +3234,6 @@ Perl_moreswitches(pTHX_ const char *s)
PerlIO_printf(PerlIO_stdout(),
"\n\nCopyright 1987-2009, Larry Wall\n");
-#ifdef MACOS_TRADITIONAL
- PerlIO_printf(PerlIO_stdout(),
- "\nMac OS port Copyright 1991-2002, Matthias Neeracher;\n"
- "maintained by Chris Nandor\n");
-#endif
#ifdef MSDOS
PerlIO_printf(PerlIO_stdout(),
"\nMS-DOS port Copyright (c) 1989, 1990, Diomidis Spinellis\n");
@@ -3665,38 +3630,14 @@ S_find_beginning(pTHX_ SV* linestr_sv, PerlIO *rsfp)
dVAR;
const char *s;
register const char *s2;
-#ifdef MACOS_TRADITIONAL
- int maclines = 0;
-#endif
PERL_ARGS_ASSERT_FIND_BEGINNING;
/* skip forward in input to the real script? */
-#ifdef MACOS_TRADITIONAL
- /* Since the Mac OS does not honor #! arguments for us, we do it ourselves */
-
- while (PL_doextract || gMacPerl_AlwaysExtract) {
- if ((s = sv_gets(linestr_sv, rsfp, 0)) == NULL) {
- if (!gMacPerl_AlwaysExtract)
- Perl_croak(aTHX_ "No Perl script found in input\n");
-
- if (PL_doextract) /* require explicit override ? */
- if (!OverrideExtract(PL_origfilename))
- Perl_croak(aTHX_ "User aborted script\n");
- else
- PL_doextract = FALSE;
-
- /* Pater peccavi, file does not have #! */
- PerlIO_rewind(rsfp);
-
- break;
- }
-#else
while (PL_doextract) {
if ((s = sv_gets(linestr_sv, rsfp, 0)) == NULL)
Perl_croak(aTHX_ "No Perl script found in input\n");
-#endif
s2 = s;
if (*s == '#' && s[1] == '!' && ((s = instr(s,"perl")) || (s = instr(s2,"PERL")))) {
PerlIO_ungetc(rsfp, '\n'); /* to keep line count right */
@@ -3711,20 +3652,6 @@ S_find_beginning(pTHX_ SV* linestr_sv, PerlIO *rsfp)
while ((s = moreswitches(s)))
;
}
-#ifdef MACOS_TRADITIONAL
- /* We are always searching for the #!perl line in MacPerl,
- * so if we find it, still keep the line count correct
- * by counting lines we already skipped over
- */
- for (; maclines > 0 ; maclines--)
- PerlIO_ungetc(rsfp, '\n');
-
- break;
-
- /* gMacPerl_AlwaysExtract is false in MPW tool */
- } else if (gMacPerl_AlwaysExtract) {
- ++maclines;
-#endif
}
}
}
@@ -4010,17 +3937,12 @@ S_init_postdump_symbols(pTHX_ register int argc, register char **argv, register
init_argv_symbols(argc,argv);
if ((tmpgv = gv_fetchpvs("0", GV_ADD|GV_NOTQUAL, SVt_PV))) {
-#ifdef MACOS_TRADITIONAL
- /* $0 is not majick on a Mac */
- sv_setpv(GvSV(tmpgv),MacPerl_MPWFileName(PL_origfilename));
-#else
sv_setpv(GvSV(tmpgv),PL_origfilename);
{
GV * const gv = gv_fetchpv("0", GV_ADD, SVt_PV);
if (gv)
sv_magic(GvSV(gv), MUTABLE_SV(gv), PERL_MAGIC_sv, "0", 1);
}
-#endif
}
if ((PL_envgv = gv_fetchpvs("ENV", GV_ADD|GV_NOTQUAL, SVt_PVHV))) {
HV *hv;
@@ -4142,33 +4064,6 @@ S_init_perllib(pTHX)
INCPUSH_ADD_SUB_DIRS|INCPUSH_CAN_RELOCATE);
#endif
-#ifdef MACOS_TRADITIONAL
- {
- Stat_t tmpstatbuf;
- SV * privdir = newSV(0);
- char * macperl = PerlEnv_getenv("MACPERL");
-
- if (!macperl)
- macperl = "";
-
-# ifdef ARCHLIB_EXP
- S_incpush_use_sep(aTHX_ STR_WITH_LEN(ARCHLIB_EXP), INCPUSH_CAN_RELOCATE);
-# endif
-
- Perl_sv_setpvf(aTHX_ privdir, "%slib:", macperl);
- if (PerlLIO_stat(SvPVX(privdir), &tmpstatbuf) >= 0 && S_ISDIR(tmpstatbuf.st_mode))
- incpush_use_sep(SvPVX(privdir), SvCUR(privdir),
- INCPUSH_ADD_SUB_DIRS);
- Perl_sv_setpvf(aTHX_ privdir, "%ssite_perl:", macperl);
- if (PerlLIO_stat(SvPVX(privdir), SvCUR(privdir), &tmpstatbuf) >= 0 && S_ISDIR(tmpstatbuf.st_mode))
- incpush_use_sep(SvPVX(privdir), SvCUR(privdir),
- INCPUSH_ADD_SUB_DIRS);
-
- SvREFCNT_dec(privdir);
- if (!PL_tainting)
- S_incpush(aTHX_ STR_WITH_LEN(":"), 0);
- }
-#else
#ifdef SITEARCH_EXP
/* sitearch is always relative to sitelib on Windows for
* DLL-based path intuition to work correctly */
@@ -4235,7 +4130,6 @@ S_init_perllib(pTHX)
INCPUSH_ADD_VERSIONED_SUB_DIRS|INCPUSH_NOT_BASEDIR
|INCPUSH_CAN_RELOCATE);
#endif
-#endif /* MACOS_TRADITIONAL */
if (!PL_tainting) {
#ifndef VMS
@@ -4274,7 +4168,6 @@ S_init_perllib(pTHX)
|INCPUSH_NOT_BASEDIR|INCPUSH_CAN_RELOCATE);
#endif
-#ifndef MACOS_TRADITIONAL
#if defined(SITELIB_STEM) && defined(PERL_INC_VERSION_LIST)
/* Search for version-specific dirs below here */
S_incpush_use_sep(aTHX_ STR_WITH_LEN(SITELIB_STEM),
@@ -4296,7 +4189,6 @@ S_init_perllib(pTHX)
if (!PL_tainting)
S_incpush(aTHX_ STR_WITH_LEN("."), 0);
-#endif /* MACOS_TRADITIONAL */
}
#if defined(DOSISH) || defined(EPOC) || defined(__SYMBIAN32__)
@@ -4305,11 +4197,7 @@ S_init_perllib(pTHX)
# if defined(VMS)
# define PERLLIB_SEP '|'
# else
-# if defined(MACOS_TRADITIONAL)
-# define PERLLIB_SEP ','
-# else
-# define PERLLIB_SEP ':'
-# endif
+# define PERLLIB_SEP ':'
# endif
#endif
#ifndef PERLLIB_MANGLE
@@ -4384,16 +4272,6 @@ S_incpush(pTHX_ const char *const dir, STRLEN len, U32 flags)
libdir = newSVpv(PERLLIB_MANGLE(dir, 0), 0);
}
-#ifdef MACOS_TRADITIONAL
- if (!strchr(SvPVX(libdir), ':')) {
- char buf[256];
-
- sv_setpv(libdir, MacPerl_CanonDir(SvPVX(libdir), buf, 0));
- }
- if (SvPVX(libdir)[SvCUR(libdir)-1] != ':')
- sv_catpvs(libdir, ":");
-#endif
-
/* Do the if() outside the #ifdef to avoid warnings about an unused
parameter. */
if (canrelocate) {
@@ -4523,22 +4401,12 @@ S_incpush(pTHX_ const char *const dir, STRLEN len, U32 flags)
subdir = newSVsv(libdir);
if (add_versioned_sub_dirs) {
-#ifdef MACOS_TRADITIONAL
-#define PERL_ARCH_FMT_PREFIX ""
-#define PERL_ARCH_FMT_SUFFIX ":"
-#define PERL_ARCH_FMT_PATH PERL_FS_VERSION ""
-#else
-#define PERL_ARCH_FMT_PREFIX "/"
-#define PERL_ARCH_FMT_SUFFIX ""
-#define PERL_ARCH_FMT_PATH "/" PERL_FS_VERSION
-#endif
/* .../version/archname if -d .../version/archname */
- sv_catpvs(subdir, PERL_ARCH_FMT_PATH \
- PERL_ARCH_FMT_PREFIX ARCHNAME PERL_ARCH_FMT_SUFFIX);
+ sv_catpvs(subdir, "/" PERL_FS_VERSION "/" ARCHNAME);
subdir = S_incpush_if_exists(aTHX_ av, subdir, libdir);
/* .../version if -d .../version */
- sv_catpvs(subdir, PERL_ARCH_FMT_PATH);
+ sv_catpvs(subdir, "/" PERL_FS_VERSION);
subdir = S_incpush_if_exists(aTHX_ av, subdir, libdir);
}
@@ -4546,8 +4414,7 @@ S_incpush(pTHX_ const char *const dir, STRLEN len, U32 flags)
if (addoldvers) {
for (incver = incverlist; *incver; incver++) {
/* .../xxx if -d .../xxx */
- Perl_sv_catpvf(aTHX_ subdir, PERL_ARCH_FMT_PREFIX \
- "%s" PERL_ARCH_FMT_SUFFIX, *incver);
+ Perl_sv_catpvf(aTHX_ subdir, "/%s", *incver);
subdir = S_incpush_if_exists(aTHX_ av, subdir, libdir);
}
}
@@ -4555,8 +4422,7 @@ S_incpush(pTHX_ const char *const dir, STRLEN len, U32 flags)
if (add_archonly_sub_dirs) {
/* .../archname if -d .../archname */
- sv_catpvs(subdir,
- PERL_ARCH_FMT_PREFIX ARCHNAME PERL_ARCH_FMT_SUFFIX);
+ sv_catpvs(subdir, "/" ARCHNAME);
subdir = S_incpush_if_exists(aTHX_ av, subdir, libdir);
}
diff --git a/perl.h b/perl.h
index c890e1f670..0e52ebca6b 100644
--- a/perl.h
+++ b/perl.h
@@ -943,7 +943,7 @@ EXTERN_C int usleep(unsigned int);
#define PERL_USES_PL_PIDSTATUS
#endif
-#if !defined(OS2) && !defined(WIN32) && !defined(DJGPP) && !defined(EPOC) && !defined(__SYMBIAN32__) && !defined(MACOS_TRADITIONAL)
+#if !defined(OS2) && !defined(WIN32) && !defined(DJGPP) && !defined(EPOC) && !defined(__SYMBIAN32__)
#define PERL_DEFAULT_DO_EXEC3_IMPLEMENTATION
#endif
@@ -1143,6 +1143,13 @@ EXTERN_C int usleep(unsigned int);
# include <sys/stat.h>
#endif
+/* Microsoft VC's sys/stat.h defines all S_Ixxx macros except S_IFIFO.
+ This definition should ideally go into win32/win32.h, but S_IFIFO is
+ used later here in perl.h before win32/win32.h is being included. */
+#if !defined(S_IFIFO) && defined(_S_IFIFO)
+# define S_IFIFO _S_IFIFO
+#endif
+
/* The stat macros for Amdahl UTS, Unisoft System V/88 (and derivatives
like UTekV) are broken, sometimes giving false positives. Undefine
them here and let the code below set them to proper values.
@@ -2502,7 +2509,7 @@ typedef struct clone_params CLONE_PARAMS;
# endif
#endif
-#if defined(OS2) || defined(MACOS_TRADITIONAL)
+#if defined(OS2)
# include "iperlsys.h"
#endif
@@ -2564,13 +2571,6 @@ typedef struct clone_params CLONE_PARAMS;
# define ISHISH "symbian"
#endif
-#if defined(MACOS_TRADITIONAL)
-# include "macos/macish.h"
-# ifndef NO_ENVIRON_ARRAY
-# define NO_ENVIRON_ARRAY
-# endif
-# define ISHISH "macos classic"
-#endif
#if defined(__HAIKU__)
# include "haiku/haikuish.h"
@@ -2680,6 +2680,25 @@ typedef struct clone_params CLONE_PARAMS;
# define PERL_SYS_INIT3_BODY(argvp,argcp,envp) PERL_SYS_INIT_BODY(argvp,argcp)
#endif
+/*
+=for apidoc Am|void|PERL_SYS_INIT|int argc|char** argv
+Provides system-specific tune up of the C runtime environment necessary to
+run Perl interpreters. This should be called only once, before creating
+any Perl interpreters.
+
+=for apidoc Am|void|PERL_SYS_INIT3|int argc|char** argv|char** env
+Provides system-specific tune up of the C runtime environment necessary to
+run Perl interpreters. This should be called only once, before creating
+any Perl interpreters.
+
+=for apidoc Am|void|PERL_SYS_TERM|
+Provides system-specific clean up of the C runtime environment after
+running Perl interpreters. This should be called only once, after
+freeing any remaining Perl interpreters.
+
+=cut
+ */
+
#define PERL_SYS_INIT(argc, argv) Perl_sys_init(argc, argv)
#define PERL_SYS_INIT3(argc, argv, env) Perl_sys_init3(argc, argv, env)
#define PERL_SYS_TERM() Perl_sys_term()
@@ -3321,7 +3340,7 @@ typedef struct crypt_data { /* straight from /usr/include/crypt.h */
#endif /* threading */
#endif /* AIX */
-#if !defined(OS2) && !defined(MACOS_TRADITIONAL)
+#if !defined(OS2)
# include "iperlsys.h"
#endif
diff --git a/perly.act b/perly.act
index 5a908c3956..cb1d67db0e 100644
--- a/perly.act
+++ b/perly.act
@@ -1,10 +1,10 @@
case 2:
-#line 137 "perly.y"
+#line 142 "perly.y"
{ (yyval.ival) = (ps[(1) - (2)].val.ival); newPROG(block_end((ps[(1) - (2)].val.ival),(ps[(2) - (2)].val.opval))); ;}
break;
case 3:
-#line 142 "perly.y"
+#line 147 "perly.y"
{ if (PL_parser->copline > (line_t)IVAL((ps[(1) - (4)].val.i_tkval)))
PL_parser->copline = (line_t)IVAL((ps[(1) - (4)].val.i_tkval));
(yyval.opval) = block_end((ps[(2) - (4)].val.ival), (ps[(3) - (4)].val.opval));
@@ -14,24 +14,24 @@ case 2:
break;
case 4:
-#line 151 "perly.y"
+#line 156 "perly.y"
{ (yyval.ival) = block_start(TRUE); ;}
break;
case 5:
-#line 155 "perly.y"
+#line 160 "perly.y"
{ (yyval.ival) = (I32) allocmy("$_"); ;}
break;
case 6:
-#line 159 "perly.y"
+#line 164 "perly.y"
{
PL_parser->expect = XSTATE; (yyval.ival) = block_start(TRUE);
;}
break;
case 7:
-#line 166 "perly.y"
+#line 171 "perly.y"
{ if (PL_parser->copline > (line_t)IVAL((ps[(1) - (4)].val.i_tkval)))
PL_parser->copline = (line_t)IVAL((ps[(1) - (4)].val.i_tkval));
(yyval.opval) = block_end((ps[(2) - (4)].val.ival), (ps[(3) - (4)].val.opval));
@@ -41,17 +41,17 @@ case 2:
break;
case 8:
-#line 175 "perly.y"
+#line 180 "perly.y"
{ (yyval.ival) = block_start(FALSE); ;}
break;
case 9:
-#line 180 "perly.y"
+#line 185 "perly.y"
{ (yyval.opval) = (OP*)NULL; ;}
break;
case 10:
-#line 182 "perly.y"
+#line 187 "perly.y"
{
(yyval.opval) = IF_MAD(
append_list(OP_LINESEQ,
@@ -61,7 +61,7 @@ case 2:
break;
case 11:
-#line 189 "perly.y"
+#line 194 "perly.y"
{ (yyval.opval) = append_list(OP_LINESEQ,
(LISTOP*)(ps[(1) - (2)].val.opval), (LISTOP*)(ps[(2) - (2)].val.opval));
PL_pad_reset_pending = TRUE;
@@ -71,23 +71,23 @@ case 2:
break;
case 12:
-#line 199 "perly.y"
+#line 204 "perly.y"
{ (yyval.opval) = newSTATEOP(0, PVAL((ps[(1) - (2)].val.p_tkval)), (ps[(2) - (2)].val.opval));
TOKEN_GETMAD((ps[(1) - (2)].val.p_tkval),((LISTOP*)(yyval.opval))->op_first,'L'); ;}
break;
case 14:
-#line 203 "perly.y"
+#line 208 "perly.y"
{ (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
break;
case 15:
-#line 205 "perly.y"
+#line 210 "perly.y"
{ (yyval.opval) = newSTATEOP(0, PVAL((ps[(1) - (2)].val.p_tkval)), (ps[(2) - (2)].val.opval)); ;}
break;
case 16:
-#line 207 "perly.y"
+#line 212 "perly.y"
{
if (PVAL((ps[(1) - (2)].val.p_tkval))) {
(yyval.opval) = newSTATEOP(0, PVAL((ps[(1) - (2)].val.p_tkval)), newOP(OP_NULL, 0));
@@ -107,7 +107,7 @@ case 2:
break;
case 17:
-#line 224 "perly.y"
+#line 229 "perly.y"
{
(yyval.opval) = newSTATEOP(0, PVAL((ps[(1) - (3)].val.p_tkval)), (ps[(2) - (3)].val.opval));
PL_parser->expect = XSTATE;
@@ -126,45 +126,45 @@ case 2:
break;
case 18:
-#line 243 "perly.y"
+#line 248 "perly.y"
{ (yyval.opval) = (OP*)NULL; ;}
break;
case 19:
-#line 245 "perly.y"
+#line 250 "perly.y"
{ (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
break;
case 20:
-#line 247 "perly.y"
+#line 252 "perly.y"
{ (yyval.opval) = newLOGOP(OP_AND, 0, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval));
TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'i');
;}
break;
case 21:
-#line 251 "perly.y"
+#line 256 "perly.y"
{ (yyval.opval) = newLOGOP(OP_OR, 0, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval));
TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'i');
;}
break;
case 22:
-#line 255 "perly.y"
+#line 260 "perly.y"
{ (yyval.opval) = newLOOPOP(OPf_PARENS, 1, scalar((ps[(3) - (3)].val.opval)), (ps[(1) - (3)].val.opval));
TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'w');
;}
break;
case 23:
-#line 259 "perly.y"
+#line 264 "perly.y"
{ (yyval.opval) = newLOOPOP(OPf_PARENS, 1, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval));
TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'w');
;}
break;
case 24:
-#line 263 "perly.y"
+#line 268 "perly.y"
{ (yyval.opval) = newFOROP(0, NULL, (line_t)IVAL((ps[(2) - (3)].val.i_tkval)),
(OP*)NULL, (ps[(3) - (3)].val.opval), (ps[(1) - (3)].val.opval), (OP*)NULL);
TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),((LISTOP*)(yyval.opval))->op_first->op_sibling,'w');
@@ -172,19 +172,24 @@ case 2:
break;
case 25:
-#line 271 "perly.y"
- { (yyval.opval) = (OP*)NULL; ;}
+#line 273 "perly.y"
+ { (yyval.opval) = newWHENOP((ps[(3) - (3)].val.opval), scope((ps[(1) - (3)].val.opval))); ;}
break;
case 26:
-#line 273 "perly.y"
+#line 278 "perly.y"
+ { (yyval.opval) = (OP*)NULL; ;}
+ break;
+
+ case 27:
+#line 280 "perly.y"
{ ((ps[(2) - (2)].val.opval))->op_flags |= OPf_PARENS; (yyval.opval) = scope((ps[(2) - (2)].val.opval));
TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 27:
-#line 277 "perly.y"
+ case 28:
+#line 284 "perly.y"
{ PL_parser->copline = (line_t)IVAL((ps[(1) - (6)].val.i_tkval));
(yyval.opval) = newCONDOP(0, newSTATEOP(OPf_SPECIAL,NULL,(ps[(3) - (6)].val.opval)), scope((ps[(5) - (6)].val.opval)), (ps[(6) - (6)].val.opval));
PL_hints |= HINT_BLOCK_SCOPE;
@@ -194,8 +199,8 @@ case 2:
;}
break;
- case 28:
-#line 288 "perly.y"
+ case 29:
+#line 295 "perly.y"
{ PL_parser->copline = (line_t)IVAL((ps[(1) - (7)].val.i_tkval));
(yyval.opval) = block_end((ps[(3) - (7)].val.ival),
newCONDOP(0, (ps[(4) - (7)].val.opval), scope((ps[(6) - (7)].val.opval)), (ps[(7) - (7)].val.opval)));
@@ -205,8 +210,8 @@ case 2:
;}
break;
- case 29:
-#line 296 "perly.y"
+ case 30:
+#line 303 "perly.y"
{ PL_parser->copline = (line_t)IVAL((ps[(1) - (7)].val.i_tkval));
(yyval.opval) = block_end((ps[(3) - (7)].val.ival),
newCONDOP(0, (ps[(4) - (7)].val.opval), scope((ps[(6) - (7)].val.opval)), (ps[(7) - (7)].val.opval)));
@@ -216,31 +221,31 @@ case 2:
;}
break;
- case 30:
-#line 307 "perly.y"
+ case 31:
+#line 314 "perly.y"
{ (yyval.opval) = block_end((ps[(3) - (6)].val.ival),
newWHENOP((ps[(4) - (6)].val.opval), scope((ps[(6) - (6)].val.opval)))); ;}
break;
- case 31:
-#line 310 "perly.y"
+ case 32:
+#line 317 "perly.y"
{ (yyval.opval) = newWHENOP(0, scope((ps[(2) - (2)].val.opval))); ;}
break;
- case 32:
-#line 315 "perly.y"
+ case 33:
+#line 322 "perly.y"
{ (yyval.opval) = (OP*)NULL; ;}
break;
- case 33:
-#line 317 "perly.y"
+ case 34:
+#line 324 "perly.y"
{ (yyval.opval) = scope((ps[(2) - (2)].val.opval));
TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 34:
-#line 324 "perly.y"
+ case 35:
+#line 331 "perly.y"
{ OP *innerop;
PL_parser->copline = (line_t)(ps[(2) - (9)].val.i_tkval);
(yyval.opval) = block_end((ps[(4) - (9)].val.ival),
@@ -254,8 +259,8 @@ case 2:
;}
break;
- case 35:
-#line 337 "perly.y"
+ case 36:
+#line 344 "perly.y"
{ OP *innerop;
PL_parser->copline = (line_t)(ps[(2) - (9)].val.i_tkval);
(yyval.opval) = block_end((ps[(4) - (9)].val.ival),
@@ -269,8 +274,8 @@ case 2:
;}
break;
- case 36:
-#line 349 "perly.y"
+ case 37:
+#line 356 "perly.y"
{ OP *innerop;
(yyval.opval) = block_end((ps[(4) - (10)].val.ival),
innerop = newFOROP(0, PVAL((ps[(1) - (10)].val.p_tkval)), (line_t)IVAL((ps[(2) - (10)].val.i_tkval)),
@@ -283,8 +288,8 @@ case 2:
;}
break;
- case 37:
-#line 360 "perly.y"
+ case 38:
+#line 367 "perly.y"
{ OP *innerop;
(yyval.opval) = block_end((ps[(5) - (9)].val.ival),
innerop = newFOROP(0, PVAL((ps[(1) - (9)].val.p_tkval)), (line_t)IVAL((ps[(2) - (9)].val.i_tkval)),
@@ -296,8 +301,8 @@ case 2:
;}
break;
- case 38:
-#line 370 "perly.y"
+ case 39:
+#line 377 "perly.y"
{ OP *innerop;
(yyval.opval) = block_end((ps[(4) - (8)].val.ival),
innerop = newFOROP(0, PVAL((ps[(1) - (8)].val.p_tkval)), (line_t)IVAL((ps[(2) - (8)].val.i_tkval)),
@@ -309,8 +314,8 @@ case 2:
;}
break;
- case 39:
-#line 382 "perly.y"
+ case 40:
+#line 389 "perly.y"
{ OP *forop;
PL_parser->copline = (line_t)IVAL((ps[(2) - (12)].val.i_tkval));
forop = newSTATEOP(0, PVAL((ps[(1) - (12)].val.p_tkval)),
@@ -342,16 +347,16 @@ case 2:
(yyval.opval) = block_end((ps[(4) - (12)].val.ival), forop); ;}
break;
- case 40:
-#line 412 "perly.y"
+ case 41:
+#line 419 "perly.y"
{ (yyval.opval) = newSTATEOP(0, PVAL((ps[(1) - (3)].val.p_tkval)),
newWHILEOP(0, 1, (LOOP*)(OP*)NULL,
NOLINE, (OP*)NULL, (ps[(2) - (3)].val.opval), (ps[(3) - (3)].val.opval), 0));
TOKEN_GETMAD((ps[(1) - (3)].val.p_tkval),((LISTOP*)(yyval.opval))->op_first,'L'); ;}
break;
- case 41:
-#line 420 "perly.y"
+ case 42:
+#line 427 "perly.y"
{ PL_parser->copline = (line_t) (ps[(2) - (8)].val.i_tkval);
(yyval.opval) = block_end((ps[(4) - (8)].val.ival),
newSTATEOP(0, PVAL((ps[(1) - (8)].val.p_tkval)),
@@ -359,47 +364,47 @@ case 2:
(PADOFFSET) (ps[(5) - (8)].val.ival)) )); ;}
break;
- case 42:
-#line 429 "perly.y"
+ case 43:
+#line 436 "perly.y"
{ (yyval.ival) = (PL_min_intro_pending &&
PL_max_intro_pending >= PL_min_intro_pending);
intro_my(); ;}
break;
- case 43:
-#line 435 "perly.y"
+ case 44:
+#line 442 "perly.y"
{ (yyval.opval) = (OP*)NULL; ;}
break;
- case 45:
-#line 441 "perly.y"
+ case 46:
+#line 448 "perly.y"
{ YYSTYPE tmplval;
(void)scan_num("1", &tmplval);
(yyval.opval) = tmplval.opval; ;}
break;
- case 47:
-#line 449 "perly.y"
- { (yyval.opval) = invert(scalar((ps[(1) - (1)].val.opval))); ;}
- break;
-
case 48:
-#line 454 "perly.y"
- { (yyval.opval) = (ps[(1) - (1)].val.opval); intro_my(); ;}
+#line 456 "perly.y"
+ { (yyval.opval) = invert(scalar((ps[(1) - (1)].val.opval))); ;}
break;
case 49:
-#line 458 "perly.y"
+#line 461 "perly.y"
{ (yyval.opval) = (ps[(1) - (1)].val.opval); intro_my(); ;}
break;
case 50:
-#line 462 "perly.y"
+#line 465 "perly.y"
{ (yyval.opval) = (ps[(1) - (1)].val.opval); intro_my(); ;}
break;
case 51:
-#line 467 "perly.y"
+#line 469 "perly.y"
+ { (yyval.opval) = (ps[(1) - (1)].val.opval); intro_my(); ;}
+ break;
+
+ case 52:
+#line 474 "perly.y"
{
#ifdef MAD
YYSTYPE tmplval;
@@ -411,45 +416,45 @@ case 2:
;}
break;
- case 53:
-#line 481 "perly.y"
- { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
- break;
-
case 54:
-#line 483 "perly.y"
+#line 488 "perly.y"
{ (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
break;
case 55:
-#line 485 "perly.y"
+#line 490 "perly.y"
{ (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
break;
case 56:
-#line 487 "perly.y"
+#line 492 "perly.y"
{ (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
break;
case 57:
-#line 489 "perly.y"
+#line 494 "perly.y"
{ (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
break;
case 58:
-#line 494 "perly.y"
+#line 496 "perly.y"
{ (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
break;
case 59:
-#line 498 "perly.y"
+#line 501 "perly.y"
+ { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
+ break;
+
+ case 60:
+#line 505 "perly.y"
{ (yyval.opval) = newOP(OP_NULL,0);
TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'p');
;}
break;
- case 60:
-#line 504 "perly.y"
+ case 61:
+#line 511 "perly.y"
{ SvREFCNT_inc_simple_void(PL_compcv);
#ifdef MAD
(yyval.opval) = newFORM((ps[(2) - (4)].val.ival), (ps[(3) - (4)].val.opval), (ps[(4) - (4)].val.opval));
@@ -463,18 +468,18 @@ case 2:
;}
break;
- case 61:
-#line 517 "perly.y"
+ case 62:
+#line 524 "perly.y"
{ (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
break;
- case 62:
-#line 518 "perly.y"
+ case 63:
+#line 525 "perly.y"
{ (yyval.opval) = (OP*)NULL; ;}
break;
- case 63:
-#line 523 "perly.y"
+ case 64:
+#line 530 "perly.y"
{ SvREFCNT_inc_simple_void(PL_compcv);
#ifdef MAD
(yyval.opval) = newMYSUB((ps[(2) - (6)].val.ival), (ps[(3) - (6)].val.opval), (ps[(4) - (6)].val.opval), (ps[(5) - (6)].val.opval), (ps[(6) - (6)].val.opval));
@@ -486,8 +491,8 @@ case 2:
;}
break;
- case 64:
-#line 536 "perly.y"
+ case 65:
+#line 543 "perly.y"
{ SvREFCNT_inc_simple_void(PL_compcv);
#ifdef MAD
{
@@ -509,26 +514,26 @@ case 2:
;}
break;
- case 65:
-#line 558 "perly.y"
+ case 66:
+#line 565 "perly.y"
{ (yyval.ival) = start_subparse(FALSE, 0);
SAVEFREESV(PL_compcv); ;}
break;
- case 66:
-#line 564 "perly.y"
+ case 67:
+#line 571 "perly.y"
{ (yyval.ival) = start_subparse(FALSE, CVf_ANON);
SAVEFREESV(PL_compcv); ;}
break;
- case 67:
-#line 569 "perly.y"
+ case 68:
+#line 576 "perly.y"
{ (yyval.ival) = start_subparse(TRUE, 0);
SAVEFREESV(PL_compcv); ;}
break;
- case 68:
-#line 574 "perly.y"
+ case 69:
+#line 581 "perly.y"
{ const char *const name = SvPV_nolen_const(((SVOP*)(ps[(1) - (1)].val.opval))->op_sv);
if (strEQ(name, "BEGIN") || strEQ(name, "END")
|| strEQ(name, "INIT") || strEQ(name, "CHECK")
@@ -537,25 +542,25 @@ case 2:
(yyval.opval) = (ps[(1) - (1)].val.opval); ;}
break;
- case 69:
-#line 584 "perly.y"
+ case 70:
+#line 591 "perly.y"
{ (yyval.opval) = (OP*)NULL; ;}
break;
- case 71:
-#line 590 "perly.y"
+ case 72:
+#line 597 "perly.y"
{ (yyval.opval) = (OP*)NULL; ;}
break;
- case 72:
-#line 592 "perly.y"
+ case 73:
+#line 599 "perly.y"
{ (yyval.opval) = (ps[(2) - (2)].val.opval);
TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),':');
;}
break;
- case 73:
-#line 596 "perly.y"
+ case 74:
+#line 603 "perly.y"
{ (yyval.opval) = IF_MAD(
newOP(OP_NULL, 0),
(OP*)NULL
@@ -564,15 +569,15 @@ case 2:
;}
break;
- case 74:
-#line 606 "perly.y"
+ case 75:
+#line 613 "perly.y"
{ (yyval.opval) = (ps[(2) - (2)].val.opval);
TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),':');
;}
break;
- case 75:
-#line 610 "perly.y"
+ case 76:
+#line 617 "perly.y"
{ (yyval.opval) = IF_MAD(
newOP(OP_NULL, 0),
(OP*)NULL
@@ -581,13 +586,13 @@ case 2:
;}
break;
- case 76:
-#line 619 "perly.y"
+ case 77:
+#line 626 "perly.y"
{ (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
break;
- case 77:
-#line 620 "perly.y"
+ case 78:
+#line 627 "perly.y"
{ (yyval.opval) = IF_MAD(
newOP(OP_NULL,0),
(OP*)NULL
@@ -597,8 +602,8 @@ case 2:
;}
break;
- case 78:
-#line 630 "perly.y"
+ case 79:
+#line 637 "perly.y"
{
#ifdef MAD
(yyval.opval) = package((ps[(2) - (3)].val.opval));
@@ -611,13 +616,13 @@ case 2:
;}
break;
- case 79:
-#line 643 "perly.y"
+ case 80:
+#line 650 "perly.y"
{ CvSPECIAL_on(PL_compcv); /* It's a BEGIN {} */ ;}
break;
- case 80:
-#line 645 "perly.y"
+ case 81:
+#line 652 "perly.y"
{ SvREFCNT_inc_simple_void(PL_compcv);
#ifdef MAD
(yyval.opval) = utilize(IVAL((ps[(1) - (7)].val.i_tkval)), (ps[(2) - (7)].val.ival), (ps[(4) - (7)].val.opval), (ps[(5) - (7)].val.opval), (ps[(6) - (7)].val.opval));
@@ -633,29 +638,29 @@ case 2:
;}
break;
- case 81:
-#line 662 "perly.y"
+ case 82:
+#line 669 "perly.y"
{ (yyval.opval) = newLOGOP(OP_AND, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval));
TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 82:
-#line 666 "perly.y"
+ case 83:
+#line 673 "perly.y"
{ (yyval.opval) = newLOGOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval));
TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 83:
-#line 670 "perly.y"
+ case 84:
+#line 677 "perly.y"
{ (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval));
TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 85:
-#line 678 "perly.y"
+ case 86:
+#line 685 "perly.y"
{
#ifdef MAD
OP* op = newNULLLIST();
@@ -667,8 +672,8 @@ case 2:
;}
break;
- case 86:
-#line 688 "perly.y"
+ case 87:
+#line 695 "perly.y"
{
OP* term = (ps[(3) - (3)].val.opval);
DO_MAD(
@@ -679,16 +684,16 @@ case 2:
;}
break;
- case 88:
-#line 701 "perly.y"
+ case 89:
+#line 708 "perly.y"
{ (yyval.opval) = convert(IVAL((ps[(1) - (3)].val.i_tkval)), OPf_STACKED,
prepend_elem(OP_LIST, newGVREF(IVAL((ps[(1) - (3)].val.i_tkval)),(ps[(2) - (3)].val.opval)), (ps[(3) - (3)].val.opval)) );
TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 89:
-#line 706 "perly.y"
+ case 90:
+#line 713 "perly.y"
{ (yyval.opval) = convert(IVAL((ps[(1) - (5)].val.i_tkval)), OPf_STACKED,
prepend_elem(OP_LIST, newGVREF(IVAL((ps[(1) - (5)].val.i_tkval)),(ps[(3) - (5)].val.opval)), (ps[(4) - (5)].val.opval)) );
TOKEN_GETMAD((ps[(1) - (5)].val.i_tkval),(yyval.opval),'o');
@@ -697,8 +702,8 @@ case 2:
;}
break;
- case 90:
-#line 713 "perly.y"
+ case 91:
+#line 720 "perly.y"
{ (yyval.opval) = convert(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST,
prepend_elem(OP_LIST, scalar((ps[(1) - (6)].val.opval)), (ps[(5) - (6)].val.opval)),
@@ -709,8 +714,8 @@ case 2:
;}
break;
- case 91:
-#line 722 "perly.y"
+ case 92:
+#line 729 "perly.y"
{ (yyval.opval) = convert(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST, scalar((ps[(1) - (3)].val.opval)),
newUNOP(OP_METHOD, 0, (ps[(3) - (3)].val.opval))));
@@ -718,8 +723,8 @@ case 2:
;}
break;
- case 92:
-#line 728 "perly.y"
+ case 93:
+#line 735 "perly.y"
{ (yyval.opval) = convert(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST,
prepend_elem(OP_LIST, (ps[(2) - (3)].val.opval), (ps[(3) - (3)].val.opval)),
@@ -727,8 +732,8 @@ case 2:
;}
break;
- case 93:
-#line 734 "perly.y"
+ case 94:
+#line 741 "perly.y"
{ (yyval.opval) = convert(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST,
prepend_elem(OP_LIST, (ps[(2) - (5)].val.opval), (ps[(4) - (5)].val.opval)),
@@ -738,15 +743,15 @@ case 2:
;}
break;
- case 94:
-#line 742 "perly.y"
+ case 95:
+#line 749 "perly.y"
{ (yyval.opval) = convert(IVAL((ps[(1) - (2)].val.i_tkval)), 0, (ps[(2) - (2)].val.opval));
TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 95:
-#line 746 "perly.y"
+ case 96:
+#line 753 "perly.y"
{ (yyval.opval) = convert(IVAL((ps[(1) - (4)].val.i_tkval)), 0, (ps[(3) - (4)].val.opval));
TOKEN_GETMAD((ps[(1) - (4)].val.i_tkval),(yyval.opval),'o');
TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'(');
@@ -754,22 +759,22 @@ case 2:
;}
break;
- case 96:
-#line 752 "perly.y"
+ case 97:
+#line 759 "perly.y"
{ SvREFCNT_inc_simple_void(PL_compcv);
(yyval.opval) = newANONATTRSUB((ps[(2) - (3)].val.ival), 0, (OP*)NULL, (ps[(3) - (3)].val.opval)); ;}
break;
- case 97:
-#line 755 "perly.y"
+ case 98:
+#line 762 "perly.y"
{ (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST,
prepend_elem(OP_LIST, (ps[(4) - (5)].val.opval), (ps[(5) - (5)].val.opval)), (ps[(1) - (5)].val.opval)));
;}
break;
- case 100:
-#line 770 "perly.y"
+ case 101:
+#line 777 "perly.y"
{ (yyval.opval) = newBINOP(OP_GELEM, 0, (ps[(1) - (5)].val.opval), scalar((ps[(3) - (5)].val.opval)));
PL_parser->expect = XOPERATOR;
TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'{');
@@ -778,16 +783,16 @@ case 2:
;}
break;
- case 101:
-#line 777 "perly.y"
+ case 102:
+#line 784 "perly.y"
{ (yyval.opval) = newBINOP(OP_AELEM, 0, oopsAV((ps[(1) - (4)].val.opval)), scalar((ps[(3) - (4)].val.opval)));
TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'[');
TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),']');
;}
break;
- case 102:
-#line 782 "perly.y"
+ case 103:
+#line 789 "perly.y"
{ (yyval.opval) = newBINOP(OP_AELEM, 0,
ref(newAVREF((ps[(1) - (5)].val.opval)),OP_RV2AV),
scalar((ps[(4) - (5)].val.opval)));
@@ -797,8 +802,8 @@ case 2:
;}
break;
- case 103:
-#line 790 "perly.y"
+ case 104:
+#line 797 "perly.y"
{ (yyval.opval) = newBINOP(OP_AELEM, 0,
ref(newAVREF((ps[(1) - (4)].val.opval)),OP_RV2AV),
scalar((ps[(3) - (4)].val.opval)));
@@ -807,8 +812,8 @@ case 2:
;}
break;
- case 104:
-#line 797 "perly.y"
+ case 105:
+#line 804 "perly.y"
{ (yyval.opval) = newBINOP(OP_HELEM, 0, oopsHV((ps[(1) - (5)].val.opval)), jmaybe((ps[(3) - (5)].val.opval)));
PL_parser->expect = XOPERATOR;
TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'{');
@@ -817,8 +822,8 @@ case 2:
;}
break;
- case 105:
-#line 804 "perly.y"
+ case 106:
+#line 811 "perly.y"
{ (yyval.opval) = newBINOP(OP_HELEM, 0,
ref(newHVREF((ps[(1) - (6)].val.opval)),OP_RV2HV),
jmaybe((ps[(4) - (6)].val.opval)));
@@ -830,8 +835,8 @@ case 2:
;}
break;
- case 106:
-#line 814 "perly.y"
+ case 107:
+#line 821 "perly.y"
{ (yyval.opval) = newBINOP(OP_HELEM, 0,
ref(newHVREF((ps[(1) - (5)].val.opval)),OP_RV2HV),
jmaybe((ps[(3) - (5)].val.opval)));
@@ -842,8 +847,8 @@ case 2:
;}
break;
- case 107:
-#line 823 "perly.y"
+ case 108:
+#line 830 "perly.y"
{ (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
newCVREF(0, scalar((ps[(1) - (4)].val.opval))));
TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'a');
@@ -852,8 +857,8 @@ case 2:
;}
break;
- case 108:
-#line 830 "perly.y"
+ case 109:
+#line 837 "perly.y"
{ (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST, (ps[(4) - (5)].val.opval),
newCVREF(0, scalar((ps[(1) - (5)].val.opval)))));
@@ -863,8 +868,8 @@ case 2:
;}
break;
- case 109:
-#line 839 "perly.y"
+ case 110:
+#line 846 "perly.y"
{ (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST, (ps[(3) - (4)].val.opval),
newCVREF(0, scalar((ps[(1) - (4)].val.opval)))));
@@ -873,8 +878,8 @@ case 2:
;}
break;
- case 110:
-#line 846 "perly.y"
+ case 111:
+#line 853 "perly.y"
{ (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
newCVREF(0, scalar((ps[(1) - (3)].val.opval))));
TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'(');
@@ -882,8 +887,8 @@ case 2:
;}
break;
- case 111:
-#line 852 "perly.y"
+ case 112:
+#line 859 "perly.y"
{ (yyval.opval) = newSLICEOP(0, (ps[(5) - (6)].val.opval), (ps[(2) - (6)].val.opval));
TOKEN_GETMAD((ps[(1) - (6)].val.i_tkval),(yyval.opval),'(');
TOKEN_GETMAD((ps[(3) - (6)].val.i_tkval),(yyval.opval),')');
@@ -892,8 +897,8 @@ case 2:
;}
break;
- case 112:
-#line 859 "perly.y"
+ case 113:
+#line 866 "perly.y"
{ (yyval.opval) = newSLICEOP(0, (ps[(4) - (5)].val.opval), (OP*)NULL);
TOKEN_GETMAD((ps[(1) - (5)].val.i_tkval),(yyval.opval),'(');
TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),')');
@@ -902,22 +907,22 @@ case 2:
;}
break;
- case 113:
-#line 869 "perly.y"
+ case 114:
+#line 876 "perly.y"
{ (yyval.opval) = newASSIGNOP(OPf_STACKED, (ps[(1) - (3)].val.opval), IVAL((ps[(2) - (3)].val.i_tkval)), (ps[(3) - (3)].val.opval));
TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 114:
-#line 873 "perly.y"
+ case 115:
+#line 880 "perly.y"
{ (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 115:
-#line 877 "perly.y"
+ case 116:
+#line 884 "perly.y"
{ if (IVAL((ps[(2) - (3)].val.i_tkval)) != OP_REPEAT)
scalar((ps[(1) - (3)].val.opval));
(yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, (ps[(1) - (3)].val.opval), scalar((ps[(3) - (3)].val.opval)));
@@ -925,50 +930,50 @@ case 2:
;}
break;
- case 116:
-#line 883 "perly.y"
- { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
- TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
- ;}
- break;
-
case 117:
-#line 887 "perly.y"
+#line 890 "perly.y"
{ (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
;}
break;
case 118:
-#line 891 "perly.y"
+#line 894 "perly.y"
{ (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
;}
break;
case 119:
-#line 895 "perly.y"
+#line 898 "perly.y"
{ (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
;}
break;
case 120:
-#line 899 "perly.y"
+#line 902 "perly.y"
{ (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
;}
break;
case 121:
-#line 903 "perly.y"
+#line 906 "perly.y"
{ (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
;}
break;
case 122:
-#line 907 "perly.y"
+#line 910 "perly.y"
+ { (yyval.opval) = newBINOP(IVAL((ps[(2) - (3)].val.i_tkval)), 0, scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
+ TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
+ ;}
+ break;
+
+ case 123:
+#line 914 "perly.y"
{
(yyval.opval) = newRANGE(IVAL((ps[(2) - (3)].val.i_tkval)), scalar((ps[(1) - (3)].val.opval)), scalar((ps[(3) - (3)].val.opval)));
DO_MAD({
@@ -982,29 +987,29 @@ case 2:
;}
break;
- case 123:
-#line 919 "perly.y"
+ case 124:
+#line 926 "perly.y"
{ (yyval.opval) = newLOGOP(OP_AND, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval));
TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 124:
-#line 923 "perly.y"
+ case 125:
+#line 930 "perly.y"
{ (yyval.opval) = newLOGOP(OP_OR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval));
TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 125:
-#line 927 "perly.y"
+ case 126:
+#line 934 "perly.y"
{ (yyval.opval) = newLOGOP(OP_DOR, 0, (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval));
TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 126:
-#line 931 "perly.y"
+ case 127:
+#line 938 "perly.y"
{ (yyval.opval) = bind_match(IVAL((ps[(2) - (3)].val.i_tkval)), (ps[(1) - (3)].val.opval), (ps[(3) - (3)].val.opval));
TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),
((yyval.opval)->op_type == OP_NOT
@@ -1013,15 +1018,15 @@ case 2:
;}
break;
- case 127:
-#line 941 "perly.y"
+ case 128:
+#line 948 "perly.y"
{ (yyval.opval) = newUNOP(OP_NEGATE, 0, scalar((ps[(2) - (2)].val.opval)));
TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 128:
-#line 945 "perly.y"
+ case 129:
+#line 952 "perly.y"
{ (yyval.opval) = IF_MAD(
newUNOP(OP_NULL, 0, (ps[(2) - (2)].val.opval)),
(ps[(2) - (2)].val.opval)
@@ -1030,70 +1035,70 @@ case 2:
;}
break;
- case 129:
-#line 952 "perly.y"
+ case 130:
+#line 959 "perly.y"
{ (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[(2) - (2)].val.opval)));
TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 130:
-#line 956 "perly.y"
+ case 131:
+#line 963 "perly.y"
{ (yyval.opval) = newUNOP(OP_COMPLEMENT, 0, scalar((ps[(2) - (2)].val.opval)));
TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 131:
-#line 960 "perly.y"
+ case 132:
+#line 967 "perly.y"
{ (yyval.opval) = newUNOP(OP_POSTINC, 0,
mod(scalar((ps[(1) - (2)].val.opval)), OP_POSTINC));
TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 132:
-#line 965 "perly.y"
+ case 133:
+#line 972 "perly.y"
{ (yyval.opval) = newUNOP(OP_POSTDEC, 0,
mod(scalar((ps[(1) - (2)].val.opval)), OP_POSTDEC));
TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 133:
-#line 970 "perly.y"
+ case 134:
+#line 977 "perly.y"
{ (yyval.opval) = newUNOP(OP_PREINC, 0,
mod(scalar((ps[(2) - (2)].val.opval)), OP_PREINC));
TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 134:
-#line 975 "perly.y"
+ case 135:
+#line 982 "perly.y"
{ (yyval.opval) = newUNOP(OP_PREDEC, 0,
mod(scalar((ps[(2) - (2)].val.opval)), OP_PREDEC));
TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 135:
-#line 984 "perly.y"
+ case 136:
+#line 991 "perly.y"
{ (yyval.opval) = newANONLIST((ps[(2) - (3)].val.opval));
TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'[');
TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),']');
;}
break;
- case 136:
-#line 989 "perly.y"
+ case 137:
+#line 996 "perly.y"
{ (yyval.opval) = newANONLIST((OP*)NULL);
TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'[');
TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),']');
;}
break;
- case 137:
-#line 994 "perly.y"
+ case 138:
+#line 1001 "perly.y"
{ (yyval.opval) = newANONHASH((ps[(2) - (4)].val.opval));
TOKEN_GETMAD((ps[(1) - (4)].val.i_tkval),(yyval.opval),'{');
TOKEN_GETMAD((ps[(3) - (4)].val.i_tkval),(yyval.opval),';');
@@ -1101,8 +1106,8 @@ case 2:
;}
break;
- case 138:
-#line 1000 "perly.y"
+ case 139:
+#line 1007 "perly.y"
{ (yyval.opval) = newANONHASH((OP*)NULL);
TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'{');
TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),';');
@@ -1110,8 +1115,8 @@ case 2:
;}
break;
- case 139:
-#line 1006 "perly.y"
+ case 140:
+#line 1013 "perly.y"
{ SvREFCNT_inc_simple_void(PL_compcv);
(yyval.opval) = newANONATTRSUB((ps[(2) - (5)].val.ival), (ps[(3) - (5)].val.opval), (ps[(4) - (5)].val.opval), (ps[(5) - (5)].val.opval));
TOKEN_GETMAD((ps[(1) - (5)].val.i_tkval),(yyval.opval),'o');
@@ -1120,22 +1125,22 @@ case 2:
;}
break;
- case 140:
-#line 1017 "perly.y"
+ case 141:
+#line 1024 "perly.y"
{ (yyval.opval) = dofile((ps[(2) - (2)].val.opval), IVAL((ps[(1) - (2)].val.i_tkval)));
TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 141:
-#line 1021 "perly.y"
+ case 142:
+#line 1028 "perly.y"
{ (yyval.opval) = newUNOP(OP_NULL, OPf_SPECIAL, scope((ps[(2) - (2)].val.opval)));
TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'D');
;}
break;
- case 142:
-#line 1025 "perly.y"
+ case 143:
+#line 1032 "perly.y"
{ (yyval.opval) = newUNOP(OP_ENTERSUB,
OPf_SPECIAL|OPf_STACKED,
prepend_elem(OP_LIST,
@@ -1149,8 +1154,8 @@ case 2:
;}
break;
- case 143:
-#line 1037 "perly.y"
+ case 144:
+#line 1044 "perly.y"
{ (yyval.opval) = newUNOP(OP_ENTERSUB,
OPf_SPECIAL|OPf_STACKED,
append_elem(OP_LIST,
@@ -1165,8 +1170,8 @@ case 2:
;}
break;
- case 144:
-#line 1050 "perly.y"
+ case 145:
+#line 1057 "perly.y"
{ (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_SPECIAL|OPf_STACKED,
prepend_elem(OP_LIST,
scalar(newCVREF(0,scalar((ps[(2) - (4)].val.opval)))), (OP*)NULL)); dep();
@@ -1176,8 +1181,8 @@ case 2:
;}
break;
- case 145:
-#line 1058 "perly.y"
+ case 146:
+#line 1065 "perly.y"
{ (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_SPECIAL|OPf_STACKED,
prepend_elem(OP_LIST,
(ps[(4) - (5)].val.opval),
@@ -1188,81 +1193,81 @@ case 2:
;}
break;
- case 150:
-#line 1074 "perly.y"
+ case 151:
+#line 1081 "perly.y"
{ (yyval.opval) = newCONDOP(0, (ps[(1) - (5)].val.opval), (ps[(3) - (5)].val.opval), (ps[(5) - (5)].val.opval));
TOKEN_GETMAD((ps[(2) - (5)].val.i_tkval),(yyval.opval),'?');
TOKEN_GETMAD((ps[(4) - (5)].val.i_tkval),(yyval.opval),':');
;}
break;
- case 151:
-#line 1079 "perly.y"
+ case 152:
+#line 1086 "perly.y"
{ (yyval.opval) = newUNOP(OP_REFGEN, 0, mod((ps[(2) - (2)].val.opval),OP_REFGEN));
TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 152:
-#line 1083 "perly.y"
+ case 153:
+#line 1090 "perly.y"
{ (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
break;
- case 153:
-#line 1085 "perly.y"
+ case 154:
+#line 1092 "perly.y"
{ (yyval.opval) = localize((ps[(2) - (2)].val.opval),IVAL((ps[(1) - (2)].val.i_tkval)));
TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'k');
;}
break;
- case 154:
-#line 1089 "perly.y"
+ case 155:
+#line 1096 "perly.y"
{ (yyval.opval) = sawparens(IF_MAD(newUNOP(OP_NULL,0,(ps[(2) - (3)].val.opval)), (ps[(2) - (3)].val.opval)));
TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'(');
TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')');
;}
break;
- case 155:
-#line 1094 "perly.y"
+ case 156:
+#line 1101 "perly.y"
{ (yyval.opval) = sawparens(newNULLLIST());
TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'(');
TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),')');
;}
break;
- case 156:
-#line 1099 "perly.y"
- { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
- break;
-
case 157:
-#line 1101 "perly.y"
+#line 1106 "perly.y"
{ (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
break;
case 158:
-#line 1103 "perly.y"
+#line 1108 "perly.y"
{ (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
break;
case 159:
-#line 1105 "perly.y"
+#line 1110 "perly.y"
{ (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
break;
case 160:
-#line 1107 "perly.y"
- { (yyval.opval) = newUNOP(OP_AV2ARYLEN, 0, ref((ps[(1) - (1)].val.opval), OP_AV2ARYLEN));;}
+#line 1112 "perly.y"
+ { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
break;
case 161:
-#line 1109 "perly.y"
- { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
+#line 1114 "perly.y"
+ { (yyval.opval) = newUNOP(OP_AV2ARYLEN, 0, ref((ps[(1) - (1)].val.opval), OP_AV2ARYLEN));;}
break;
case 162:
-#line 1111 "perly.y"
+#line 1116 "perly.y"
+ { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
+ break;
+
+ case 163:
+#line 1118 "perly.y"
{ (yyval.opval) = prepend_elem(OP_ASLICE,
newOP(OP_PUSHMARK, 0),
newLISTOP(OP_ASLICE, 0,
@@ -1273,8 +1278,8 @@ case 2:
;}
break;
- case 163:
-#line 1120 "perly.y"
+ case 164:
+#line 1127 "perly.y"
{ (yyval.opval) = prepend_elem(OP_HSLICE,
newOP(OP_PUSHMARK, 0),
newLISTOP(OP_HSLICE, 0,
@@ -1287,26 +1292,26 @@ case 2:
;}
break;
- case 164:
-#line 1131 "perly.y"
+ case 165:
+#line 1138 "perly.y"
{ (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
break;
- case 165:
-#line 1133 "perly.y"
+ case 166:
+#line 1140 "perly.y"
{ (yyval.opval) = newUNOP(OP_ENTERSUB, 0, scalar((ps[(1) - (1)].val.opval))); ;}
break;
- case 166:
-#line 1135 "perly.y"
+ case 167:
+#line 1142 "perly.y"
{ (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[(1) - (3)].val.opval)));
TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'(');
TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')');
;}
break;
- case 167:
-#line 1140 "perly.y"
+ case 168:
+#line 1147 "perly.y"
{
(yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST, (ps[(3) - (4)].val.opval), scalar((ps[(1) - (4)].val.opval))));
@@ -1321,91 +1326,91 @@ case 2:
;}
break;
- case 168:
-#line 1153 "perly.y"
+ case 169:
+#line 1160 "perly.y"
{ (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST, (ps[(3) - (3)].val.opval), scalar((ps[(2) - (3)].val.opval))));
TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 169:
-#line 1158 "perly.y"
+ case 170:
+#line 1165 "perly.y"
{ (yyval.opval) = newOP(IVAL((ps[(1) - (1)].val.i_tkval)), OPf_SPECIAL);
PL_hints |= HINT_BLOCK_SCOPE;
TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 170:
-#line 1163 "perly.y"
+ case 171:
+#line 1170 "perly.y"
{ (yyval.opval) = newLOOPEX(IVAL((ps[(1) - (2)].val.i_tkval)),(ps[(2) - (2)].val.opval));
TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 171:
-#line 1167 "perly.y"
+ case 172:
+#line 1174 "perly.y"
{ (yyval.opval) = newUNOP(OP_NOT, 0, scalar((ps[(2) - (2)].val.opval)));
TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 172:
-#line 1171 "perly.y"
+ case 173:
+#line 1178 "perly.y"
{ (yyval.opval) = newOP(IVAL((ps[(1) - (1)].val.i_tkval)), 0);
TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 173:
-#line 1175 "perly.y"
+ case 174:
+#line 1182 "perly.y"
{ (yyval.opval) = newUNOP(IVAL((ps[(1) - (2)].val.i_tkval)), 0, (ps[(2) - (2)].val.opval));
TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 174:
-#line 1179 "perly.y"
+ case 175:
+#line 1186 "perly.y"
{ (yyval.opval) = newUNOP(IVAL((ps[(1) - (2)].val.i_tkval)), 0, (ps[(2) - (2)].val.opval));
TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 175:
-#line 1183 "perly.y"
+ case 176:
+#line 1190 "perly.y"
{ (yyval.opval) = newOP(OP_REQUIRE, (ps[(1) - (1)].val.i_tkval) ? OPf_SPECIAL : 0);
TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 176:
-#line 1187 "perly.y"
+ case 177:
+#line 1194 "perly.y"
{ (yyval.opval) = newUNOP(OP_REQUIRE, (ps[(1) - (2)].val.i_tkval) ? OPf_SPECIAL : 0, (ps[(2) - (2)].val.opval));
TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 177:
-#line 1191 "perly.y"
+ case 178:
+#line 1198 "perly.y"
{ (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED, scalar((ps[(1) - (1)].val.opval))); ;}
break;
- case 178:
-#line 1193 "perly.y"
+ case 179:
+#line 1200 "perly.y"
{ (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
append_elem(OP_LIST, (ps[(2) - (2)].val.opval), scalar((ps[(1) - (2)].val.opval)))); ;}
break;
- case 179:
-#line 1196 "perly.y"
+ case 180:
+#line 1203 "perly.y"
{ (yyval.opval) = newOP(IVAL((ps[(1) - (1)].val.i_tkval)), 0);
TOKEN_GETMAD((ps[(1) - (1)].val.i_tkval),(yyval.opval),'o');
;}
break;
- case 180:
-#line 1200 "perly.y"
+ case 181:
+#line 1207 "perly.y"
{ (yyval.opval) = newOP(IVAL((ps[(1) - (3)].val.i_tkval)), 0);
TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'o');
TOKEN_GETMAD((ps[(2) - (3)].val.i_tkval),(yyval.opval),'(');
@@ -1413,14 +1418,14 @@ case 2:
;}
break;
- case 181:
-#line 1206 "perly.y"
+ case 182:
+#line 1213 "perly.y"
{ (yyval.opval) = newUNOP(OP_ENTERSUB, OPf_STACKED,
scalar((ps[(1) - (1)].val.opval))); ;}
break;
- case 182:
-#line 1209 "perly.y"
+ case 183:
+#line 1216 "perly.y"
{ (yyval.opval) = (IVAL((ps[(1) - (3)].val.i_tkval)) == OP_NOT)
? newUNOP(IVAL((ps[(1) - (3)].val.i_tkval)), 0, newSVOP(OP_CONST, 0, newSViv(0)))
: newOP(IVAL((ps[(1) - (3)].val.i_tkval)), OPf_SPECIAL);
@@ -1431,8 +1436,8 @@ case 2:
;}
break;
- case 183:
-#line 1218 "perly.y"
+ case 184:
+#line 1225 "perly.y"
{ (yyval.opval) = newUNOP(IVAL((ps[(1) - (4)].val.i_tkval)), 0, (ps[(3) - (4)].val.opval));
TOKEN_GETMAD((ps[(1) - (4)].val.i_tkval),(yyval.opval),'o');
TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'(');
@@ -1440,24 +1445,24 @@ case 2:
;}
break;
- case 184:
-#line 1224 "perly.y"
+ case 185:
+#line 1231 "perly.y"
{ (yyval.opval) = pmruntime((ps[(1) - (4)].val.opval), (ps[(3) - (4)].val.opval), 1);
TOKEN_GETMAD((ps[(2) - (4)].val.i_tkval),(yyval.opval),'(');
TOKEN_GETMAD((ps[(4) - (4)].val.i_tkval),(yyval.opval),')');
;}
break;
- case 187:
-#line 1231 "perly.y"
+ case 188:
+#line 1238 "perly.y"
{
(yyval.opval) = newLISTOP(OP_DIE, 0, newOP(OP_PUSHMARK, 0),
newSVOP(OP_CONST, 0, newSVpvs("Unimplemented")));
;}
break;
- case 188:
-#line 1239 "perly.y"
+ case 189:
+#line 1246 "perly.y"
{ (yyval.opval) = my_attrs((ps[(2) - (3)].val.opval),(ps[(3) - (3)].val.opval));
DO_MAD(
token_getmad((ps[(1) - (3)].val.i_tkval),(yyval.opval),'d');
@@ -1467,66 +1472,66 @@ case 2:
;}
break;
- case 189:
-#line 1247 "perly.y"
+ case 190:
+#line 1254 "perly.y"
{ (yyval.opval) = localize((ps[(2) - (2)].val.opval),IVAL((ps[(1) - (2)].val.i_tkval)));
TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'d');
;}
break;
- case 190:
-#line 1254 "perly.y"
+ case 191:
+#line 1261 "perly.y"
{ (yyval.opval) = sawparens((ps[(2) - (3)].val.opval));
TOKEN_GETMAD((ps[(1) - (3)].val.i_tkval),(yyval.opval),'(');
TOKEN_GETMAD((ps[(3) - (3)].val.i_tkval),(yyval.opval),')');
;}
break;
- case 191:
-#line 1259 "perly.y"
+ case 192:
+#line 1266 "perly.y"
{ (yyval.opval) = sawparens(newNULLLIST());
TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'(');
TOKEN_GETMAD((ps[(2) - (2)].val.i_tkval),(yyval.opval),')');
;}
break;
- case 192:
-#line 1264 "perly.y"
- { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
- break;
-
case 193:
-#line 1266 "perly.y"
+#line 1271 "perly.y"
{ (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
break;
case 194:
-#line 1268 "perly.y"
+#line 1273 "perly.y"
{ (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
break;
case 195:
-#line 1273 "perly.y"
- { (yyval.opval) = (OP*)NULL; ;}
+#line 1275 "perly.y"
+ { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
break;
case 196:
-#line 1275 "perly.y"
- { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
+#line 1280 "perly.y"
+ { (yyval.opval) = (OP*)NULL; ;}
break;
case 197:
-#line 1279 "perly.y"
- { (yyval.opval) = (OP*)NULL; ;}
+#line 1282 "perly.y"
+ { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
break;
case 198:
-#line 1281 "perly.y"
- { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
+#line 1286 "perly.y"
+ { (yyval.opval) = (OP*)NULL; ;}
break;
case 199:
-#line 1283 "perly.y"
+#line 1288 "perly.y"
+ { (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
+ break;
+
+ case 200:
+#line 1290 "perly.y"
{
#ifdef MAD
OP* op = newNULLLIST();
@@ -1539,75 +1544,72 @@ case 2:
;}
break;
- case 200:
-#line 1298 "perly.y"
+ case 201:
+#line 1305 "perly.y"
{ PL_parser->in_my = 0; (yyval.opval) = my((ps[(1) - (1)].val.opval)); ;}
break;
- case 201:
-#line 1302 "perly.y"
+ case 202:
+#line 1309 "perly.y"
{ (yyval.opval) = newCVREF(IVAL((ps[(1) - (2)].val.i_tkval)),(ps[(2) - (2)].val.opval));
TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'&');
;}
break;
- case 202:
-#line 1308 "perly.y"
+ case 203:
+#line 1315 "perly.y"
{ (yyval.opval) = newSVREF((ps[(2) - (2)].val.opval));
TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'$');
;}
break;
- case 203:
-#line 1314 "perly.y"
+ case 204:
+#line 1321 "perly.y"
{ (yyval.opval) = newAVREF((ps[(2) - (2)].val.opval));
TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'@');
;}
break;
- case 204:
-#line 1320 "perly.y"
+ case 205:
+#line 1327 "perly.y"
{ (yyval.opval) = newHVREF((ps[(2) - (2)].val.opval));
TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'%');
;}
break;
- case 205:
-#line 1326 "perly.y"
+ case 206:
+#line 1333 "perly.y"
{ (yyval.opval) = newAVREF((ps[(2) - (2)].val.opval));
TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'l');
;}
break;
- case 206:
-#line 1332 "perly.y"
+ case 207:
+#line 1339 "perly.y"
{ (yyval.opval) = newGVREF(0,(ps[(2) - (2)].val.opval));
TOKEN_GETMAD((ps[(1) - (2)].val.i_tkval),(yyval.opval),'*');
;}
break;
- case 207:
-#line 1339 "perly.y"
+ case 208:
+#line 1346 "perly.y"
{ (yyval.opval) = scalar((ps[(1) - (1)].val.opval)); ;}
break;
- case 208:
-#line 1341 "perly.y"
+ case 209:
+#line 1348 "perly.y"
{ (yyval.opval) = scalar((ps[(1) - (1)].val.opval)); ;}
break;
- case 209:
-#line 1343 "perly.y"
+ case 210:
+#line 1350 "perly.y"
{ (yyval.opval) = scope((ps[(1) - (1)].val.opval)); ;}
break;
- case 210:
-#line 1346 "perly.y"
+ case 211:
+#line 1353 "perly.y"
{ (yyval.opval) = (ps[(1) - (1)].val.opval); ;}
break;
-
-/* Line 1267 of yacc.c. */
-
default: break;
diff --git a/perly.h b/perly.h
index 802da29804..a8c7f042dd 100644
--- a/perly.h
+++ b/perly.h
@@ -1,25 +1,24 @@
#ifdef PERL_CORE
-/* A Bison parser, made by GNU Bison 2.3. */
-/* Skeleton interface for Bison's Yacc-like parsers in C
+/* A Bison parser, made by GNU Bison 2.4.1. */
- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+/* Skeleton interface for Bison's Yacc-like parsers in C
+
+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
Free Software Foundation, Inc.
-
- This program is free software; you can redistribute it and/or modify
+
+ This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
-
+
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA. */
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* As a special exception, you may create a larger work that contains
part or all of the Bison parser skeleton and distribute that work
@@ -30,10 +29,11 @@
special exception, which will cause the skeleton and the resulting
Bison output files to be licensed under the GNU General Public
License without this special exception.
-
+
This special exception was added by the Free Software Foundation in
version 2.2 of Bison. */
+
/* Tokens. */
#ifndef YYTOKENTYPE
# define YYTOKENTYPE
@@ -111,6 +111,7 @@
PEG = 326
};
#endif
+
/* Tokens. */
#define WORD 258
#define METHOD 259
@@ -184,11 +185,13 @@
-
#endif /* PERL_CORE */
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef union YYSTYPE
{
+
+/* Line 1676 of yacc.c */
+
I32 ival; /* __DEFAULT__ (marker for regen_perly.pl;
must always be 1st union member) */
char *pval;
@@ -204,13 +207,16 @@ typedef union YYSTYPE
#ifdef PERL_MAD
TOKEN* tkval;
#endif
-}
-/* Line 1489 of yacc.c. */
- YYSTYPE;
+
+
+
+/* Line 1676 of yacc.c */
+} YYSTYPE;
+# define YYSTYPE_IS_TRIVIAL 1
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
-# define YYSTYPE_IS_TRIVIAL 1
#endif
+
diff --git a/perly.tab b/perly.tab
index 85c70a0faa..2b78718d82 100644
--- a/perly.tab
+++ b/perly.tab
@@ -1,15 +1,15 @@
#define YYFINAL 3
/* YYLAST -- Last index in YYTABLE. */
-#define YYLAST 2059
+#define YYLAST 2061
/* YYNTOKENS -- Number of terminals. */
#define YYNTOKENS 91
/* YYNNTS -- Number of nonterminals. */
#define YYNNTS 65
/* YYNRULES -- Number of rules. */
-#define YYNRULES 210
+#define YYNRULES 211
/* YYNRULES -- Number of states. */
-#define YYNSTATES 420
+#define YYNSTATES 422
/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
#define YYUNDEFTOK 2
@@ -63,26 +63,26 @@ static const yytype_uint16 yyprhs[] =
{
0, 0, 3, 6, 11, 12, 13, 14, 19, 20,
21, 24, 27, 30, 32, 34, 37, 40, 44, 46,
- 48, 52, 56, 60, 64, 68, 69, 72, 79, 87,
- 95, 102, 105, 106, 109, 119, 129, 140, 150, 159,
- 172, 176, 185, 186, 187, 189, 190, 192, 194, 196,
- 198, 200, 201, 203, 205, 207, 209, 211, 213, 215,
- 217, 222, 224, 225, 232, 239, 240, 241, 242, 244,
- 245, 247, 248, 251, 253, 256, 258, 260, 262, 266,
- 267, 275, 279, 283, 287, 289, 292, 296, 298, 302,
- 308, 315, 319, 323, 329, 332, 337, 338, 344, 346,
- 348, 354, 359, 365, 370, 376, 383, 389, 394, 400,
- 405, 409, 416, 422, 426, 430, 434, 438, 442, 446,
- 450, 454, 458, 462, 466, 470, 474, 478, 481, 484,
- 487, 490, 493, 496, 499, 502, 506, 509, 514, 518,
- 524, 527, 530, 535, 541, 546, 552, 554, 556, 558,
- 560, 566, 569, 571, 574, 578, 581, 583, 585, 587,
- 589, 591, 593, 598, 604, 606, 608, 612, 617, 621,
- 623, 626, 629, 631, 634, 637, 639, 642, 644, 647,
- 649, 653, 655, 659, 664, 669, 671, 673, 675, 679,
- 682, 686, 689, 691, 693, 695, 696, 698, 699, 701,
- 704, 706, 709, 712, 715, 718, 721, 724, 726, 728,
- 730
+ 48, 52, 56, 60, 64, 68, 72, 73, 76, 83,
+ 91, 99, 106, 109, 110, 113, 123, 133, 144, 154,
+ 163, 176, 180, 189, 190, 191, 193, 194, 196, 198,
+ 200, 202, 204, 205, 207, 209, 211, 213, 215, 217,
+ 219, 221, 226, 228, 229, 236, 243, 244, 245, 246,
+ 248, 249, 251, 252, 255, 257, 260, 262, 264, 266,
+ 270, 271, 279, 283, 287, 291, 293, 296, 300, 302,
+ 306, 312, 319, 323, 327, 333, 336, 341, 342, 348,
+ 350, 352, 358, 363, 369, 374, 380, 387, 393, 398,
+ 404, 409, 413, 420, 426, 430, 434, 438, 442, 446,
+ 450, 454, 458, 462, 466, 470, 474, 478, 482, 485,
+ 488, 491, 494, 497, 500, 503, 506, 510, 513, 518,
+ 522, 528, 531, 534, 539, 545, 550, 556, 558, 560,
+ 562, 564, 570, 573, 575, 578, 582, 585, 587, 589,
+ 591, 593, 595, 597, 602, 608, 610, 612, 616, 621,
+ 625, 627, 630, 633, 635, 638, 641, 643, 646, 648,
+ 651, 653, 657, 659, 663, 668, 673, 675, 677, 679,
+ 683, 686, 690, 693, 695, 697, 699, 700, 702, 703,
+ 705, 708, 710, 713, 716, 719, 722, 725, 728, 730,
+ 732, 734
};
/* YYRHS -- A `-1'-separated list of the rules' RHS. */
@@ -94,101 +94,101 @@ static const yytype_int16 yyrhs[] =
106, -1, 107, -1, 115, 104, -1, 115, 14, -1,
115, 101, 14, -1, 1, -1, 133, -1, 133, 32,
133, -1, 133, 33, 133, -1, 133, 30, 133, -1,
- 133, 31, 111, -1, 133, 37, 133, -1, -1, 34,
- 97, -1, 35, 89, 112, 88, 97, 102, -1, 32,
- 89, 94, 112, 88, 97, 102, -1, 33, 89, 94,
- 114, 88, 97, 102, -1, 39, 89, 94, 112, 88,
- 97, -1, 40, 93, -1, -1, 36, 93, -1, 115,
- 30, 89, 94, 110, 88, 108, 97, 105, -1, 115,
- 31, 89, 94, 111, 88, 108, 97, 105, -1, 115,
- 37, 58, 94, 148, 89, 112, 88, 97, 105, -1,
- 115, 37, 150, 89, 94, 112, 88, 97, 105, -1,
- 115, 37, 89, 94, 112, 88, 97, 105, -1, 115,
- 37, 89, 94, 113, 14, 110, 14, 108, 113, 88,
- 97, -1, 115, 93, 105, -1, 115, 38, 89, 94,
- 95, 112, 88, 97, -1, -1, -1, 101, -1, -1,
- 133, -1, 133, -1, 133, -1, 109, -1, 111, -1,
- -1, 24, -1, 118, -1, 121, -1, 120, -1, 130,
- -1, 131, -1, 117, -1, 90, -1, 25, 124, 119,
- 93, -1, 15, -1, -1, 59, 122, 125, 126, 127,
- 129, -1, 26, 122, 125, 126, 127, 129, -1, -1,
- -1, -1, 15, -1, -1, 18, -1, -1, 61, 18,
- -1, 61, -1, 61, 18, -1, 61, -1, 93, -1,
- 14, -1, 28, 15, 14, -1, -1, 29, 122, 132,
- 15, 15, 146, 14, -1, 133, 65, 133, -1, 133,
- 64, 133, -1, 133, 63, 133, -1, 134, -1, 134,
- 67, -1, 134, 67, 143, -1, 143, -1, 48, 155,
- 134, -1, 46, 89, 155, 133, 88, -1, 143, 87,
- 137, 89, 147, 88, -1, 143, 87, 137, -1, 16,
- 155, 146, -1, 17, 155, 89, 147, 88, -1, 48,
- 146, -1, 46, 89, 147, 88, -1, -1, 23, 123,
- 93, 136, 146, -1, 16, -1, 150, -1, 154, 3,
- 133, 14, 4, -1, 150, 5, 133, 6, -1, 143,
- 87, 5, 133, 6, -1, 138, 5, 133, 6, -1,
- 150, 3, 133, 14, 4, -1, 143, 87, 3, 133,
- 14, 4, -1, 138, 3, 133, 14, 4, -1, 143,
- 87, 89, 88, -1, 143, 87, 89, 133, 88, -1,
- 138, 89, 133, 88, -1, 138, 89, 88, -1, 89,
- 133, 88, 5, 133, 6, -1, 89, 88, 5, 133,
- 6, -1, 143, 68, 143, -1, 143, 82, 143, -1,
- 143, 51, 143, -1, 143, 52, 143, -1, 143, 76,
- 143, -1, 143, 49, 143, -1, 143, 50, 143, -1,
- 143, 75, 143, -1, 143, 74, 143, -1, 143, 42,
- 143, -1, 143, 73, 143, -1, 143, 72, 143, -1,
- 143, 71, 143, -1, 143, 77, 143, -1, 7, 143,
- -1, 8, 143, -1, 78, 143, -1, 79, 143, -1,
- 143, 84, -1, 143, 83, -1, 86, 143, -1, 85,
- 143, -1, 5, 133, 6, -1, 5, 6, -1, 55,
- 133, 14, 4, -1, 55, 14, 4, -1, 27, 123,
- 126, 127, 93, -1, 54, 143, -1, 54, 93, -1,
- 54, 15, 89, 88, -1, 54, 15, 89, 133, 88,
- -1, 54, 150, 89, 88, -1, 54, 150, 89, 133,
- 88, -1, 139, -1, 140, -1, 141, -1, 142, -1,
- 143, 69, 143, 70, 143, -1, 80, 143, -1, 144,
- -1, 57, 143, -1, 89, 133, 88, -1, 89, 88,
- -1, 150, -1, 154, -1, 152, -1, 151, -1, 153,
- -1, 138, -1, 151, 5, 133, 6, -1, 151, 3,
- 133, 14, 4, -1, 18, -1, 149, -1, 149, 89,
- 88, -1, 149, 89, 133, 88, -1, 56, 15, 146,
- -1, 41, -1, 41, 143, -1, 66, 134, -1, 47,
- -1, 47, 93, -1, 47, 143, -1, 60, -1, 60,
- 143, -1, 22, -1, 22, 143, -1, 44, -1, 44,
- 89, 88, -1, 21, -1, 45, 89, 88, -1, 45,
- 89, 133, 88, -1, 19, 89, 134, 88, -1, 15,
- -1, 135, -1, 43, -1, 58, 145, 128, -1, 58,
- 145, -1, 89, 133, 88, -1, 89, 88, -1, 150,
- -1, 152, -1, 151, -1, -1, 134, -1, -1, 133,
- -1, 133, 67, -1, 150, -1, 13, 155, -1, 9,
- 155, -1, 10, 155, -1, 11, 155, -1, 53, 155,
- -1, 12, 155, -1, 15, -1, 150, -1, 93, -1,
- 20, -1
+ 133, 31, 111, -1, 133, 37, 133, -1, 133, 39,
+ 133, -1, -1, 34, 97, -1, 35, 89, 112, 88,
+ 97, 102, -1, 32, 89, 94, 112, 88, 97, 102,
+ -1, 33, 89, 94, 114, 88, 97, 102, -1, 39,
+ 89, 94, 112, 88, 97, -1, 40, 93, -1, -1,
+ 36, 93, -1, 115, 30, 89, 94, 110, 88, 108,
+ 97, 105, -1, 115, 31, 89, 94, 111, 88, 108,
+ 97, 105, -1, 115, 37, 58, 94, 148, 89, 112,
+ 88, 97, 105, -1, 115, 37, 150, 89, 94, 112,
+ 88, 97, 105, -1, 115, 37, 89, 94, 112, 88,
+ 97, 105, -1, 115, 37, 89, 94, 113, 14, 110,
+ 14, 108, 113, 88, 97, -1, 115, 93, 105, -1,
+ 115, 38, 89, 94, 95, 112, 88, 97, -1, -1,
+ -1, 101, -1, -1, 133, -1, 133, -1, 133, -1,
+ 109, -1, 111, -1, -1, 24, -1, 118, -1, 121,
+ -1, 120, -1, 130, -1, 131, -1, 117, -1, 90,
+ -1, 25, 124, 119, 93, -1, 15, -1, -1, 59,
+ 122, 125, 126, 127, 129, -1, 26, 122, 125, 126,
+ 127, 129, -1, -1, -1, -1, 15, -1, -1, 18,
+ -1, -1, 61, 18, -1, 61, -1, 61, 18, -1,
+ 61, -1, 93, -1, 14, -1, 28, 15, 14, -1,
+ -1, 29, 122, 132, 15, 15, 146, 14, -1, 133,
+ 65, 133, -1, 133, 64, 133, -1, 133, 63, 133,
+ -1, 134, -1, 134, 67, -1, 134, 67, 143, -1,
+ 143, -1, 48, 155, 134, -1, 46, 89, 155, 133,
+ 88, -1, 143, 87, 137, 89, 147, 88, -1, 143,
+ 87, 137, -1, 16, 155, 146, -1, 17, 155, 89,
+ 147, 88, -1, 48, 146, -1, 46, 89, 147, 88,
+ -1, -1, 23, 123, 93, 136, 146, -1, 16, -1,
+ 150, -1, 154, 3, 133, 14, 4, -1, 150, 5,
+ 133, 6, -1, 143, 87, 5, 133, 6, -1, 138,
+ 5, 133, 6, -1, 150, 3, 133, 14, 4, -1,
+ 143, 87, 3, 133, 14, 4, -1, 138, 3, 133,
+ 14, 4, -1, 143, 87, 89, 88, -1, 143, 87,
+ 89, 133, 88, -1, 138, 89, 133, 88, -1, 138,
+ 89, 88, -1, 89, 133, 88, 5, 133, 6, -1,
+ 89, 88, 5, 133, 6, -1, 143, 68, 143, -1,
+ 143, 82, 143, -1, 143, 51, 143, -1, 143, 52,
+ 143, -1, 143, 76, 143, -1, 143, 49, 143, -1,
+ 143, 50, 143, -1, 143, 75, 143, -1, 143, 74,
+ 143, -1, 143, 42, 143, -1, 143, 73, 143, -1,
+ 143, 72, 143, -1, 143, 71, 143, -1, 143, 77,
+ 143, -1, 7, 143, -1, 8, 143, -1, 78, 143,
+ -1, 79, 143, -1, 143, 84, -1, 143, 83, -1,
+ 86, 143, -1, 85, 143, -1, 5, 133, 6, -1,
+ 5, 6, -1, 55, 133, 14, 4, -1, 55, 14,
+ 4, -1, 27, 123, 126, 127, 93, -1, 54, 143,
+ -1, 54, 93, -1, 54, 15, 89, 88, -1, 54,
+ 15, 89, 133, 88, -1, 54, 150, 89, 88, -1,
+ 54, 150, 89, 133, 88, -1, 139, -1, 140, -1,
+ 141, -1, 142, -1, 143, 69, 143, 70, 143, -1,
+ 80, 143, -1, 144, -1, 57, 143, -1, 89, 133,
+ 88, -1, 89, 88, -1, 150, -1, 154, -1, 152,
+ -1, 151, -1, 153, -1, 138, -1, 151, 5, 133,
+ 6, -1, 151, 3, 133, 14, 4, -1, 18, -1,
+ 149, -1, 149, 89, 88, -1, 149, 89, 133, 88,
+ -1, 56, 15, 146, -1, 41, -1, 41, 143, -1,
+ 66, 134, -1, 47, -1, 47, 93, -1, 47, 143,
+ -1, 60, -1, 60, 143, -1, 22, -1, 22, 143,
+ -1, 44, -1, 44, 89, 88, -1, 21, -1, 45,
+ 89, 88, -1, 45, 89, 133, 88, -1, 19, 89,
+ 134, 88, -1, 15, -1, 135, -1, 43, -1, 58,
+ 145, 128, -1, 58, 145, -1, 89, 133, 88, -1,
+ 89, 88, -1, 150, -1, 152, -1, 151, -1, -1,
+ 134, -1, -1, 133, -1, 133, 67, -1, 150, -1,
+ 13, 155, -1, 9, 155, -1, 10, 155, -1, 11,
+ 155, -1, 53, 155, -1, 12, 155, -1, 15, -1,
+ 150, -1, 93, -1, 20, -1
};
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
static const yytype_uint16 yyrline[] =
{
- 0, 135, 135, 141, 151, 155, 159, 165, 175, 180,
- 181, 188, 198, 201, 202, 204, 206, 223, 242, 244,
- 246, 250, 254, 258, 262, 271, 272, 276, 287, 295,
- 306, 309, 315, 316, 323, 336, 348, 359, 369, 379,
- 411, 419, 429, 435, 436, 441, 444, 448, 453, 457,
- 461, 467, 476, 480, 482, 484, 486, 488, 493, 497,
- 503, 517, 518, 522, 535, 558, 564, 569, 574, 584,
- 585, 590, 591, 595, 605, 609, 619, 620, 629, 643,
- 642, 661, 665, 669, 673, 677, 687, 696, 700, 705,
- 712, 721, 727, 733, 741, 745, 752, 751, 762, 763,
- 767, 776, 781, 789, 796, 803, 813, 822, 829, 838,
- 845, 851, 858, 868, 872, 876, 882, 886, 890, 894,
- 898, 902, 906, 918, 922, 926, 930, 940, 944, 951,
- 955, 959, 964, 969, 974, 983, 988, 993, 999, 1005,
- 1016, 1020, 1024, 1036, 1049, 1057, 1069, 1070, 1071, 1072,
- 1073, 1078, 1082, 1084, 1088, 1093, 1098, 1100, 1102, 1104,
- 1106, 1108, 1110, 1119, 1130, 1132, 1134, 1139, 1152, 1157,
- 1162, 1166, 1170, 1174, 1178, 1182, 1186, 1190, 1192, 1195,
- 1199, 1205, 1208, 1217, 1223, 1228, 1229, 1230, 1238, 1246,
- 1253, 1258, 1263, 1265, 1267, 1272, 1274, 1279, 1280, 1282,
- 1297, 1301, 1307, 1313, 1319, 1325, 1331, 1338, 1340, 1342,
- 1345
+ 0, 140, 140, 146, 156, 160, 164, 170, 180, 185,
+ 186, 193, 203, 206, 207, 209, 211, 228, 247, 249,
+ 251, 255, 259, 263, 267, 272, 278, 279, 283, 294,
+ 302, 313, 316, 322, 323, 330, 343, 355, 366, 376,
+ 386, 418, 426, 436, 442, 443, 448, 451, 455, 460,
+ 464, 468, 474, 483, 487, 489, 491, 493, 495, 500,
+ 504, 510, 524, 525, 529, 542, 565, 571, 576, 581,
+ 591, 592, 597, 598, 602, 612, 616, 626, 627, 636,
+ 650, 649, 668, 672, 676, 680, 684, 694, 703, 707,
+ 712, 719, 728, 734, 740, 748, 752, 759, 758, 769,
+ 770, 774, 783, 788, 796, 803, 810, 820, 829, 836,
+ 845, 852, 858, 865, 875, 879, 883, 889, 893, 897,
+ 901, 905, 909, 913, 925, 929, 933, 937, 947, 951,
+ 958, 962, 966, 971, 976, 981, 990, 995, 1000, 1006,
+ 1012, 1023, 1027, 1031, 1043, 1056, 1064, 1076, 1077, 1078,
+ 1079, 1080, 1085, 1089, 1091, 1095, 1100, 1105, 1107, 1109,
+ 1111, 1113, 1115, 1117, 1126, 1137, 1139, 1141, 1146, 1159,
+ 1164, 1169, 1173, 1177, 1181, 1185, 1189, 1193, 1197, 1199,
+ 1202, 1206, 1212, 1215, 1224, 1230, 1235, 1236, 1237, 1245,
+ 1253, 1260, 1265, 1270, 1272, 1274, 1279, 1281, 1286, 1287,
+ 1289, 1304, 1308, 1314, 1320, 1326, 1332, 1338, 1345, 1347,
+ 1349, 1352
};
#endif
@@ -214,7 +214,7 @@ static const char *const yytname[] =
"loop", "switch", "mintro", "nexpr", "texpr", "iexpr", "mexpr", "mnexpr",
"miexpr", "label", "decl", "peg", "format", "formname", "mysubrout",
"subrout", "startsub", "startanonsub", "startformsub", "subname",
- "proto", "subattrlist", "myattrlist", "subbody", "package", "use", "@1",
+ "proto", "subattrlist", "myattrlist", "subbody", "package", "use", "$@1",
"expr", "argexpr", "listop", "@2", "method", "subscripted", "termbinop",
"termunop", "anonymous", "termdo", "term", "myattrterm", "myterm",
"listexpr", "listexprcom", "my_scalar", "amper", "scalar", "ary", "hsh",
@@ -245,26 +245,26 @@ static const yytype_uint8 yyr1[] =
{
0, 91, 92, 93, 94, 95, 96, 97, 98, 99,
99, 99, 100, 100, 100, 100, 100, 100, 101, 101,
- 101, 101, 101, 101, 101, 102, 102, 102, 103, 103,
- 104, 104, 105, 105, 106, 106, 106, 106, 106, 106,
- 106, 107, 108, 109, 109, 110, 110, 111, 112, 113,
- 114, 115, 115, 116, 116, 116, 116, 116, 116, 117,
- 118, 119, 119, 120, 121, 122, 123, 124, 125, 126,
- 126, 127, 127, 127, 128, 128, 129, 129, 130, 132,
- 131, 133, 133, 133, 133, 134, 134, 134, 135, 135,
- 135, 135, 135, 135, 135, 135, 136, 135, 137, 137,
- 138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
- 138, 138, 138, 139, 139, 139, 139, 139, 139, 139,
- 139, 139, 139, 139, 139, 139, 139, 140, 140, 140,
- 140, 140, 140, 140, 140, 141, 141, 141, 141, 141,
- 142, 142, 142, 142, 142, 142, 143, 143, 143, 143,
+ 101, 101, 101, 101, 101, 101, 102, 102, 102, 103,
+ 103, 104, 104, 105, 105, 106, 106, 106, 106, 106,
+ 106, 106, 107, 108, 109, 109, 110, 110, 111, 112,
+ 113, 114, 115, 115, 116, 116, 116, 116, 116, 116,
+ 117, 118, 119, 119, 120, 121, 122, 123, 124, 125,
+ 126, 126, 127, 127, 127, 128, 128, 129, 129, 130,
+ 132, 131, 133, 133, 133, 133, 134, 134, 134, 135,
+ 135, 135, 135, 135, 135, 135, 135, 136, 135, 137,
+ 137, 138, 138, 138, 138, 138, 138, 138, 138, 138,
+ 138, 138, 138, 138, 139, 139, 139, 139, 139, 139,
+ 139, 139, 139, 139, 139, 139, 139, 139, 140, 140,
+ 140, 140, 140, 140, 140, 140, 141, 141, 141, 141,
+ 141, 142, 142, 142, 142, 142, 142, 143, 143, 143,
143, 143, 143, 143, 143, 143, 143, 143, 143, 143,
143, 143, 143, 143, 143, 143, 143, 143, 143, 143,
143, 143, 143, 143, 143, 143, 143, 143, 143, 143,
- 143, 143, 143, 143, 143, 143, 143, 143, 144, 144,
- 145, 145, 145, 145, 145, 146, 146, 147, 147, 147,
- 148, 149, 150, 151, 152, 153, 154, 155, 155, 155,
- 155
+ 143, 143, 143, 143, 143, 143, 143, 143, 143, 144,
+ 144, 145, 145, 145, 145, 145, 146, 146, 147, 147,
+ 147, 148, 149, 150, 151, 152, 153, 154, 155, 155,
+ 155, 155
};
/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
@@ -272,26 +272,26 @@ static const yytype_uint8 yyr2[] =
{
0, 2, 2, 4, 0, 0, 0, 4, 0, 0,
2, 2, 2, 1, 1, 2, 2, 3, 1, 1,
- 3, 3, 3, 3, 3, 0, 2, 6, 7, 7,
- 6, 2, 0, 2, 9, 9, 10, 9, 8, 12,
- 3, 8, 0, 0, 1, 0, 1, 1, 1, 1,
- 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,
- 4, 1, 0, 6, 6, 0, 0, 0, 1, 0,
- 1, 0, 2, 1, 2, 1, 1, 1, 3, 0,
- 7, 3, 3, 3, 1, 2, 3, 1, 3, 5,
- 6, 3, 3, 5, 2, 4, 0, 5, 1, 1,
- 5, 4, 5, 4, 5, 6, 5, 4, 5, 4,
- 3, 6, 5, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 2, 2, 2,
- 2, 2, 2, 2, 2, 3, 2, 4, 3, 5,
- 2, 2, 4, 5, 4, 5, 1, 1, 1, 1,
- 5, 2, 1, 2, 3, 2, 1, 1, 1, 1,
- 1, 1, 4, 5, 1, 1, 3, 4, 3, 1,
- 2, 2, 1, 2, 2, 1, 2, 1, 2, 1,
- 3, 1, 3, 4, 4, 1, 1, 1, 3, 2,
- 3, 2, 1, 1, 1, 0, 1, 0, 1, 2,
- 1, 2, 2, 2, 2, 2, 2, 1, 1, 1,
- 1
+ 3, 3, 3, 3, 3, 3, 0, 2, 6, 7,
+ 7, 6, 2, 0, 2, 9, 9, 10, 9, 8,
+ 12, 3, 8, 0, 0, 1, 0, 1, 1, 1,
+ 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,
+ 1, 4, 1, 0, 6, 6, 0, 0, 0, 1,
+ 0, 1, 0, 2, 1, 2, 1, 1, 1, 3,
+ 0, 7, 3, 3, 3, 1, 2, 3, 1, 3,
+ 5, 6, 3, 3, 5, 2, 4, 0, 5, 1,
+ 1, 5, 4, 5, 4, 5, 6, 5, 4, 5,
+ 4, 3, 6, 5, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 2, 2,
+ 2, 2, 2, 2, 2, 2, 3, 2, 4, 3,
+ 5, 2, 2, 4, 5, 4, 5, 1, 1, 1,
+ 1, 5, 2, 1, 2, 3, 2, 1, 1, 1,
+ 1, 1, 1, 4, 5, 1, 1, 3, 4, 3,
+ 1, 2, 2, 1, 2, 2, 1, 2, 1, 2,
+ 1, 3, 1, 3, 4, 4, 1, 1, 1, 3,
+ 2, 3, 2, 1, 1, 1, 0, 1, 0, 1,
+ 2, 1, 2, 2, 2, 2, 2, 2, 1, 1,
+ 1, 1
};
/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -299,59 +299,60 @@ static const yytype_uint8 yyr2[] =
means the default is an error. */
static const yytype_uint8 yydefact[] =
{
- 6, 0, 9, 1, 51, 52, 67, 65, 0, 65,
- 65, 59, 11, 13, 14, 0, 10, 58, 53, 55,
- 54, 56, 57, 62, 0, 0, 79, 0, 18, 4,
- 0, 0, 0, 0, 0, 0, 0, 0, 16, 185,
- 0, 0, 164, 0, 181, 177, 66, 66, 0, 0,
- 0, 0, 0, 0, 0, 0, 169, 187, 179, 0,
- 0, 172, 195, 0, 0, 0, 0, 0, 0, 175,
- 0, 0, 0, 0, 0, 0, 0, 32, 0, 12,
- 15, 19, 84, 186, 161, 146, 147, 148, 149, 87,
- 152, 165, 156, 159, 158, 160, 157, 61, 0, 68,
- 69, 78, 0, 69, 9, 136, 0, 127, 128, 207,
- 210, 209, 208, 202, 203, 204, 206, 201, 195, 0,
- 0, 178, 0, 69, 4, 4, 4, 4, 4, 4,
- 0, 4, 4, 31, 170, 0, 0, 197, 173, 174,
- 207, 196, 94, 208, 0, 205, 185, 141, 140, 156,
- 0, 0, 195, 153, 0, 189, 192, 194, 193, 176,
- 171, 129, 130, 151, 134, 133, 155, 0, 0, 40,
- 17, 0, 0, 0, 0, 0, 0, 0, 0, 85,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 132, 131,
- 0, 0, 0, 0, 0, 0, 0, 60, 70, 71,
- 0, 71, 51, 135, 92, 197, 0, 96, 71, 45,
- 0, 0, 0, 0, 0, 4, 5, 0, 180, 182,
- 0, 198, 0, 0, 88, 0, 0, 138, 0, 168,
- 191, 0, 75, 188, 0, 154, 33, 22, 23, 47,
- 20, 21, 24, 83, 82, 81, 86, 0, 0, 110,
- 0, 122, 118, 119, 115, 116, 113, 0, 125, 124,
- 123, 121, 120, 117, 126, 114, 0, 0, 98, 0,
- 91, 99, 166, 0, 0, 0, 0, 0, 0, 73,
- 0, 195, 0, 3, 0, 184, 195, 0, 0, 46,
- 0, 0, 48, 50, 0, 0, 200, 44, 49, 0,
- 0, 19, 0, 0, 0, 183, 199, 95, 0, 142,
- 0, 144, 0, 137, 190, 74, 0, 0, 0, 103,
- 109, 0, 0, 0, 107, 0, 197, 167, 0, 101,
- 0, 162, 0, 72, 77, 76, 64, 0, 63, 93,
- 97, 139, 42, 42, 0, 0, 0, 0, 45, 0,
- 0, 0, 89, 143, 145, 112, 0, 106, 150, 0,
- 102, 108, 0, 104, 163, 100, 80, 0, 0, 8,
- 25, 25, 0, 32, 0, 0, 0, 30, 111, 105,
- 90, 32, 32, 9, 0, 0, 28, 29, 0, 38,
- 42, 32, 41, 34, 35, 51, 26, 0, 32, 0,
- 37, 7, 0, 36, 0, 0, 0, 25, 39, 27
+ 6, 0, 9, 1, 52, 53, 68, 66, 0, 66,
+ 66, 60, 11, 13, 14, 0, 10, 59, 54, 56,
+ 55, 57, 58, 63, 0, 0, 80, 0, 18, 4,
+ 0, 0, 0, 0, 0, 0, 0, 0, 16, 186,
+ 0, 0, 165, 0, 182, 178, 67, 67, 0, 0,
+ 0, 0, 0, 0, 0, 0, 170, 188, 180, 0,
+ 0, 173, 196, 0, 0, 0, 0, 0, 0, 176,
+ 0, 0, 0, 0, 0, 0, 0, 33, 0, 12,
+ 15, 19, 85, 187, 162, 147, 148, 149, 150, 88,
+ 153, 166, 157, 160, 159, 161, 158, 62, 0, 69,
+ 70, 79, 0, 70, 9, 137, 0, 128, 129, 208,
+ 211, 210, 209, 203, 204, 205, 207, 202, 196, 0,
+ 0, 179, 0, 70, 4, 4, 4, 4, 4, 4,
+ 0, 4, 4, 32, 171, 0, 0, 198, 174, 175,
+ 208, 197, 95, 209, 0, 206, 186, 142, 141, 157,
+ 0, 0, 196, 154, 0, 190, 193, 195, 194, 177,
+ 172, 130, 131, 152, 135, 134, 156, 0, 0, 41,
+ 17, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 86, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 133,
+ 132, 0, 0, 0, 0, 0, 0, 0, 61, 71,
+ 72, 0, 72, 52, 136, 93, 198, 0, 97, 72,
+ 46, 0, 0, 0, 0, 0, 4, 5, 0, 181,
+ 183, 0, 199, 0, 0, 89, 0, 0, 139, 0,
+ 169, 192, 0, 76, 189, 0, 155, 34, 22, 23,
+ 48, 20, 21, 24, 25, 84, 83, 82, 87, 0,
+ 0, 111, 0, 123, 119, 120, 116, 117, 114, 0,
+ 126, 125, 124, 122, 121, 118, 127, 115, 0, 0,
+ 99, 0, 92, 100, 167, 0, 0, 0, 0, 0,
+ 0, 74, 0, 196, 0, 3, 0, 185, 196, 0,
+ 0, 47, 0, 0, 49, 51, 0, 0, 201, 45,
+ 50, 0, 0, 19, 0, 0, 0, 184, 200, 96,
+ 0, 143, 0, 145, 0, 138, 191, 75, 0, 0,
+ 0, 104, 110, 0, 0, 0, 108, 0, 198, 168,
+ 0, 102, 0, 163, 0, 73, 78, 77, 65, 0,
+ 64, 94, 98, 140, 43, 43, 0, 0, 0, 0,
+ 46, 0, 0, 0, 90, 144, 146, 113, 0, 107,
+ 151, 0, 103, 109, 0, 105, 164, 101, 81, 0,
+ 0, 8, 26, 26, 0, 33, 0, 0, 0, 31,
+ 112, 106, 91, 33, 33, 9, 0, 0, 29, 30,
+ 0, 39, 43, 33, 42, 35, 36, 52, 27, 0,
+ 33, 0, 38, 7, 0, 37, 0, 0, 0, 26,
+ 40, 28
};
/* YYDEFGOTO[NTERM-NUM]. */
static const yytype_int16 yydefgoto[] =
{
- -1, 1, 111, 104, 313, 2, 380, 393, 4, 12,
- 307, 396, 79, 80, 169, 13, 14, 377, 308, 298,
- 248, 301, 310, 304, 15, 16, 17, 18, 98, 19,
- 20, 24, 122, 23, 100, 209, 290, 243, 346, 21,
- 22, 102, 302, 82, 83, 296, 280, 84, 85, 86,
- 87, 88, 89, 90, 155, 142, 232, 305, 91, 92,
+ -1, 1, 111, 104, 315, 2, 382, 395, 4, 12,
+ 309, 398, 79, 80, 169, 13, 14, 379, 310, 300,
+ 249, 303, 312, 306, 15, 16, 17, 18, 98, 19,
+ 20, 24, 122, 23, 100, 210, 292, 244, 348, 21,
+ 22, 102, 304, 82, 83, 298, 282, 84, 85, 86,
+ 87, 88, 89, 90, 155, 142, 233, 307, 91, 92,
93, 94, 95, 96, 113
};
@@ -360,485 +361,488 @@ static const yytype_int16 yydefgoto[] =
#define YYPACT_NINF -354
static const yytype_int16 yypact[] =
{
- -354, 40, -354, -354, 90, -354, -354, -354, 3, -354,
- -354, -354, -354, -354, -354, 292, -354, -354, -354, -354,
- -354, -354, -354, 66, 74, 57, -354, 74, -354, -354,
- 874, 1720, 1720, 348, 348, 348, 348, 348, -354, -354,
- 348, 348, -354, 19, -354, 1720, -354, -354, 22, 44,
- 51, 58, 8, 75, 79, 168, 1720, -354, 88, 95,
- 96, 643, 558, 348, 728, 957, 164, 1720, 43, 1720,
- 1720, 1720, 1720, 1720, 1720, 1720, 1040, 146, 181, -354,
- -354, 1001, 136, -354, 18, -354, -354, -354, -354, 1894,
- -354, 117, 54, 133, -354, -354, 211, -354, 168, -354,
- 197, -354, 204, 197, -354, -354, 28, 504, 504, -354,
- -354, -354, -354, -354, -354, -354, -354, -354, 1720, 128,
- 1720, 419, 168, 197, -354, -354, -354, -354, -354, -354,
- 139, -354, -354, -354, 1894, 137, 1125, 558, -354, 419,
- 1781, 136, -354, 790, 1720, -354, 148, -354, 419, 24,
- 256, 35, 1720, 419, 1210, 208, -354, -354, -354, 419,
- 136, 504, 504, 504, 114, 114, 258, -33, 168, -354,
- -354, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720,
- 1720, 1720, 1295, 1720, 1720, 1720, 1720, 1720, 1720, 1720,
- 1720, 1720, 1720, 1720, 1720, 1720, 1720, 1720, -354, -354,
- 17, 1380, 1720, 1720, 1720, 1720, 1720, -354, -354, 215,
- 253, 215, 198, -354, -354, 1720, -43, -354, 215, 1720,
- 1720, 1720, 1720, 269, 388, -354, -354, 1720, -354, -354,
- 81, 608, 195, 1720, 136, 1465, 1550, -354, 287, -354,
- -354, 87, 274, -354, 1720, 289, -354, 217, -354, 217,
- 217, 217, 217, 231, 231, -354, 1894, 167, 78, -354,
- 349, 1972, 906, 715, 339, 277, 1894, 1855, 459, 459,
- 545, 629, 859, 376, 504, 504, 1720, 1720, -354, 1635,
- 209, -354, -354, 457, 222, 129, 302, 147, 320, 299,
- 123, 1720, 123, -354, 238, -354, 1720, 168, 239, 217,
- 254, 265, 217, -354, 267, 229, -354, -354, -354, 268,
- 330, 387, 1720, 1720, 281, -354, -354, -354, 519, -354,
- 604, -354, 630, -354, -354, -354, 202, 1720, 358, -354,
- -354, 1720, 327, 207, -354, 689, 1720, -354, 369, -354,
- 370, -354, 371, -354, -354, -354, -354, 362, -354, -354,
- -354, -354, -354, -354, 377, 377, 1720, 377, 1720, 291,
- 294, 377, -354, -354, -354, -354, 210, -354, 1933, 382,
- -354, -354, 300, -354, -354, -354, -354, 377, 377, -354,
- 9, 9, 337, 146, 394, 377, 377, -354, -354, -354,
- -354, 146, 146, -354, 377, 341, -354, -354, 377, -354,
- -354, 146, -354, -354, -354, 230, -354, 1720, 146, 471,
- -354, -354, 350, -354, 351, 377, 377, 9, -354, -354
+ -354, 26, -354, -354, 145, -354, -354, -354, 25, -354,
+ -354, -354, -354, -354, -354, 294, -354, -354, -354, -354,
+ -354, -354, -354, 64, 71, 96, -354, 71, -354, -354,
+ 876, 1722, 1722, 373, 373, 373, 373, 373, -354, -354,
+ 373, 373, -354, 24, -354, 1722, -354, -354, 55, 63,
+ 90, 104, 0, 107, 108, 116, 1722, -354, 113, 118,
+ 120, 645, 560, 373, 730, 959, 138, 1722, 35, 1722,
+ 1722, 1722, 1722, 1722, 1722, 1722, 1042, 177, 204, -354,
+ -354, 1003, 162, -354, 14, -354, -354, -354, -354, 1896,
+ -354, 167, 38, 73, -354, -354, 231, -354, 116, -354,
+ 239, -354, 244, 239, -354, -354, 30, 133, 133, -354,
+ -354, -354, -354, -354, -354, -354, -354, -354, 1722, 172,
+ 1722, 421, 116, 239, -354, -354, -354, -354, -354, -354,
+ 173, -354, -354, -354, 1896, 179, 1127, 560, -354, 421,
+ 1783, 162, -354, 792, 1722, -354, 176, -354, 421, 22,
+ 270, 7, 1722, 421, 1212, 219, -354, -354, -354, 421,
+ 162, 133, 133, 133, -10, -10, 277, 255, 116, -354,
+ -354, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722,
+ 1722, 1722, 1722, 1297, 1722, 1722, 1722, 1722, 1722, 1722,
+ 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, 1722, -354,
+ -354, 13, 1382, 1722, 1722, 1722, 1722, 1722, -354, -354,
+ 226, 275, 226, 122, -354, -354, 1722, -39, -354, 226,
+ 1722, 1722, 1722, 1722, 282, 390, -354, -354, 1722, -354,
+ -354, 306, 360, 206, 1722, 162, 1467, 1552, -354, 289,
+ -354, -354, 322, 278, -354, 1722, 293, -354, 377, -354,
+ 377, 377, 377, 377, 377, 235, 235, -354, 1896, 33,
+ 69, -354, 351, 1974, 908, 717, 201, 279, 1896, 1857,
+ 461, 461, 547, 631, 861, 378, 133, 133, 1722, 1722,
+ -354, 1637, 233, -354, -354, 459, 121, 77, 135, 112,
+ 168, 310, 78, 1722, 78, -354, 241, -354, 1722, 116,
+ 248, 377, 256, 258, 377, -354, 265, 266, -354, -354,
+ -354, 269, 344, 389, 1722, 1722, 276, -354, -354, -354,
+ 521, -354, 606, -354, 632, -354, -354, -354, 174, 1722,
+ 361, -354, -354, 1722, 212, 205, -354, 691, 1722, -354,
+ 371, -354, 374, -354, 386, -354, -354, -354, -354, 367,
+ -354, -354, -354, -354, -354, -354, 415, 415, 1722, 415,
+ 1722, 304, 363, 415, -354, -354, -354, -354, 208, -354,
+ 1935, 428, -354, -354, 369, -354, -354, -354, -354, 415,
+ 415, -354, 81, 81, 370, 177, 435, 415, 415, -354,
+ -354, -354, -354, 177, 177, -354, 415, 375, -354, -354,
+ 415, -354, -354, 177, -354, -354, -354, 199, -354, 1722,
+ 177, 473, -354, -354, 379, -354, 383, 415, 415, 81,
+ -354, -354
};
/* YYPGOTO[NTERM-NUM]. */
static const yytype_int16 yypgoto[] =
{
- -354, -354, -13, -49, -354, -354, 1505, -354, -103, -354,
- 425, -353, -354, -354, -345, -354, -354, -342, -354, 89,
- -48, -208, 46, -354, -354, -354, -354, -354, -354, -354,
- -354, 93, 402, -354, 429, 31, -146, -354, 165, -354,
- -354, -354, -15, -58, -354, -354, -354, -354, -354, -354,
- -354, -354, 56, -354, -354, -113, -212, -354, -354, -27,
- 393, 396, -354, -354, 33
+ -354, -354, -13, -72, -354, -354, 1505, -354, -103, -354,
+ 444, -353, -354, -354, -26, -354, -354, -335, -354, 103,
+ -116, -215, 76, -354, -354, -354, -354, -354, -354, -354,
+ -354, 128, 419, -354, 466, -19, -181, -354, 207, -354,
+ -354, -354, -15, -38, -354, -354, -354, -354, -354, -354,
+ -354, -354, 56, -354, -354, -115, -202, -354, -354, -29,
+ 431, 434, -354, -354, 28
};
/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
positive, shift that token. If negative, reduce the rule which
number is the opposite. If zero, do what YYDEFACT says.
If YYTABLE_NINF, syntax error. */
-#define YYTABLE_NINF -186
+#define YYTABLE_NINF -187
static const yytype_int16 yytable[] =
{
- 81, 212, 77, 294, 141, 214, 112, 112, 112, 112,
- 112, 378, 160, 112, 112, 106, 309, 33, 25, 314,
- 276, 180, 277, 181, 179, 130, 33, 202, 397, 203,
- 176, 177, 178, 278, 213, 143, 112, 149, 399, 239,
- 3, 156, 133, 394, 395, 295, 403, 404, 138, 238,
- 151, 147, 33, 34, 35, 245, 410, 202, 409, 203,
- 141, 167, 216, 413, 419, 292, 128, 114, 115, 116,
- 117, 101, 297, 118, 119, 219, 220, 221, 222, 223,
- 224, 97, 226, 227, 329, 207, 234, 107, 108, 99,
- -2, 176, 177, 178, 141, 144, 145, 129, 176, 177,
- 178, 121, 26, 27, 359, 360, 279, 182, 120, 217,
- 143, 124, 134, 236, 5, 6, 7, 139, 8, 9,
- 148, 230, 231, 153, 372, 159, 29, 161, 162, 163,
- 164, 165, 154, 125, 211, 339, 204, 344, 205, 241,
- 126, 176, 177, 178, 176, 177, 178, 127, 382, 10,
- 176, 177, 178, 341, 218, 246, 247, 249, 250, 251,
- 252, 253, 254, 255, 131, 257, 258, 260, 132, 315,
- 233, 29, 300, 281, 303, 324, 312, 135, 347, 152,
- 11, 328, 168, 350, 136, 137, 283, 284, 285, 286,
- 287, 288, 176, 177, 178, 170, 306, -186, -186, 412,
- 231, 200, 293, 179, 299, 249, 201, 249, 365, 311,
- 176, 177, 178, 370, 206, 208, 388, 215, 318, 210,
- 320, 322, 5, 6, 7, 228, 8, 9, 225, 326,
- 176, 177, 178, 141, 411, 256, 338, 235, 141, 261,
- 262, 263, 264, 265, 266, 267, 268, 269, 270, 271,
- 272, 273, 274, 275, 5, 6, 7, 10, 8, 9,
- 237, 332, 333, 244, 335, 176, 177, 178, 291, 242,
- 176, 177, 178, 176, 177, 178, 289, 345, 33, 345,
- 176, 177, 178, 317, 351, 176, 177, 178, 11, 10,
- 405, 323, 325, 28, 327, 29, 178, 30, 336, 31,
- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
- 42, 43, 366, 44, 45, 46, 340, 343, 356, 47,
- 11, 231, 48, 49, 50, 51, 349, 352, 186, 52,
- 53, 54, 55, 56, 342, 57, 58, 59, 60, 61,
- 62, 369, 353, 299, 358, 63, 64, 65, 66, 67,
- 68, 29, 69, 354, 196, 355, 357, 33, 70, 197,
- 198, 199, 367, 109, 200, 176, 177, 178, 110, 361,
- 71, 72, 73, 373, 374, 375, 376, 74, 75, 385,
- 379, 76, 386, 176, 177, 178, 389, 368, 390, 28,
- 176, 177, 178, 30, 81, 31, 32, 33, 34, 35,
- 36, 37, -43, 39, 40, 41, 42, 43, 400, 44,
- 45, 46, 176, 177, 178, 47, 196, 171, 172, 173,
- 174, 197, 198, 199, 175, 398, 200, 186, 187, 56,
- 407, 57, 58, 59, 60, 61, 62, 330, 415, 416,
- 78, 63, 64, 65, 66, 67, 68, 384, 69, 123,
- 176, 177, 178, 196, 70, 414, 103, 348, 197, 198,
- 199, 157, 0, 200, 158, 0, 71, 72, 73, 0,
- 186, 187, 28, 74, 75, -48, 30, 76, 31, 32,
- 33, 34, 35, 36, 37, 0, 39, 40, 41, 42,
- 43, 0, 44, 45, 46, 195, 196, 0, 47, 0,
- 0, 197, 198, 199, 0, 0, 200, 0, 184, 185,
- 186, 187, 56, 0, 57, 58, 59, 60, 61, 62,
- 176, 177, 178, 0, 63, 64, 65, 66, 67, 68,
- 0, 69, 192, 193, 194, 195, 196, 70, 0, 0,
- 0, 197, 198, 199, 0, 337, 200, 0, 0, 71,
- 72, 73, 0, 0, 0, 0, 74, 75, 0, -43,
- 76, 29, 0, 30, 0, 31, 32, 33, 34, 35,
- 36, 37, 0, 140, 40, 41, 42, 43, 110, 44,
- 45, 46, 176, 177, 178, 47, 197, 198, 199, 0,
- 0, 200, 0, 0, 184, 185, 186, 187, 0, 56,
- 0, 57, 58, 59, 60, 61, 62, 362, 0, 0,
- 0, 63, 64, 65, 66, 67, 68, 0, 69, 193,
- 194, 195, 196, 0, 70, 0, 0, 197, 198, 199,
- 0, 0, 200, 0, 0, 0, 71, 72, 73, 0,
- 0, 0, 0, 74, 75, 0, 29, 76, 30, 0,
- 31, 32, 33, 34, 35, 36, 37, 0, 39, 40,
- 41, 42, 43, 0, 44, 45, 46, 176, 177, 178,
- 47, 176, 177, 178, 0, 316, 0, 0, 184, 185,
- 186, 187, 0, 0, 56, 0, 57, 58, 59, 60,
- 61, 62, 363, 176, 177, 178, 63, 64, 65, 66,
- 67, 68, 0, 69, 194, 195, 196, 0, 0, 70,
- 0, 197, 198, 199, 0, 0, 200, 0, 364, 0,
+ 81, 213, 77, 215, 112, 112, 112, 112, 112, 33,
+ 311, 112, 112, 316, 296, 106, 278, 181, 279, 182,
+ 380, 239, 33, 130, 141, 203, 3, 204, 180, 280,
+ 399, 294, 160, 143, 112, 149, 214, 240, 299, 156,
+ 25, 203, 133, 204, 33, 34, 35, 330, 138, 297,
+ 151, 147, 220, 221, 222, 223, 224, 225, 128, 227,
+ 228, 167, 114, 115, 116, 117, 421, 411, 118, 119,
+ 177, 178, 179, -187, -187, 331, 205, 201, 206, 97,
+ 141, 29, 217, 341, 212, 208, 99, 107, 108, 129,
+ 144, 145, 346, 177, 178, 179, 177, 178, 179, 361,
+ 362, 121, 281, 183, 219, 302, 235, 305, 143, 218,
+ 101, 237, 134, 120, 141, 396, 397, 139, 343, 29,
+ 148, 231, 232, 153, 154, 159, 295, 161, 162, 163,
+ 164, 165, 177, 178, 179, 340, 374, 26, 27, 242,
+ 177, 178, 179, 384, 124, -2, 5, 6, 7, 342,
+ 8, 9, 125, 152, 314, 247, 248, 250, 251, 252,
+ 253, 254, 255, 256, 257, 234, 259, 260, 262, 5,
+ 6, 7, 283, 8, 9, 177, 178, 179, 349, 126,
+ 367, 10, 344, 352, 177, 178, 179, 285, 286, 287,
+ 288, 289, 290, 127, 414, 308, 131, 132, 177, 178,
+ 179, 232, 135, 413, 10, 301, 250, 136, 250, 137,
+ 313, 372, 11, 168, 390, 198, 199, 200, 170, 320,
+ 201, 322, 324, 5, 6, 7, 371, 8, 9, 180,
+ 328, 177, 178, 179, 207, 11, 258, 177, 178, 179,
+ 263, 264, 265, 266, 267, 268, 269, 270, 271, 272,
+ 273, 274, 275, 276, 277, 141, 202, 209, 10, 211,
+ 141, 216, 226, 334, 335, 236, 337, 229, 177, 178,
+ 179, 177, 178, 179, 238, 177, 178, 179, 197, 347,
+ 243, 347, 245, 198, 199, 200, 353, 291, 201, 11,
+ 293, 33, 407, 325, 319, 28, 327, 29, 329, 30,
+ 179, 31, 32, 33, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 368, 44, 45, 46, 177, 178,
+ 179, 47, 338, 232, 48, 49, 50, 51, 345, 351,
+ 187, 52, 53, 54, 55, 56, 354, 57, 58, 59,
+ 60, 61, 62, 246, 355, 301, 356, 63, 64, 65,
+ 66, 67, 68, 357, 69, 358, 197, 359, 360, 401,
+ 70, 198, 199, 200, 363, 369, 201, 405, 406, 177,
+ 178, 179, 71, 72, 73, 375, 29, 412, 376, 74,
+ 75, 378, 33, 76, 415, 177, 178, 179, 109, 370,
+ 377, 28, 387, 110, 317, 30, 81, 31, 32, 33,
+ 34, 35, 36, 37, -44, 39, 40, 41, 42, 43,
+ 326, 44, 45, 46, 177, 178, 179, 47, 381, 171,
+ 172, 173, 174, 177, 178, 179, 175, 318, 176, 187,
+ 188, 56, 391, 57, 58, 59, 60, 61, 62, 332,
+ 177, 178, 179, 63, 64, 65, 66, 67, 68, 402,
+ 69, 388, 177, 178, 179, 197, 70, 392, 400, 78,
+ 198, 199, 200, 386, 409, 201, 123, 417, 71, 72,
+ 73, 418, 187, 188, 28, 74, 75, -49, 30, 76,
+ 31, 32, 33, 34, 35, 36, 37, 416, 39, 40,
+ 41, 42, 43, 103, 44, 45, 46, 196, 197, 157,
+ 47, 350, 158, 198, 199, 200, 0, 0, 201, 0,
+ 185, 186, 187, 188, 56, 0, 57, 58, 59, 60,
+ 61, 62, 177, 178, 179, 0, 63, 64, 65, 66,
+ 67, 68, 0, 69, 193, 194, 195, 196, 197, 70,
+ 0, 0, 0, 198, 199, 200, 0, 339, 201, 0,
0, 71, 72, 73, 0, 0, 0, 0, 74, 75,
- 0, 29, 76, 30, 0, 31, 32, 33, 34, 35,
- 36, 37, 0, 146, 40, 41, 42, 43, 0, 44,
- 45, 46, 176, 177, 178, 47, 0, 0, 0, 0,
- 0, 0, 0, 0, 184, -186, 186, 187, 0, 56,
- 0, 57, 58, 59, 60, 61, 62, 371, 0, 0,
- 0, 63, 64, 65, 66, 67, 68, 0, 69, 0,
- 0, 195, 196, 202, 70, 203, -156, 197, 198, 199,
- 0, 0, 200, 0, -156, 0, 71, 72, 73, 0,
- 0, 0, 0, 74, 75, 0, 0, 76, 0, 0,
- -156, -156, -156, -156, 0, 0, 0, -156, 0, 0,
- 0, 0, -156, 0, 0, 0, 0, 0, 0, -156,
- -156, -156, -156, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, -156, -156, -156, 0, -156, -156, -156,
- -156, -156, -156, -156, -156, -156, -156, -156, 0, 0,
- 0, 0, -156, -156, -156, 0, 0, -156, -156, 30,
- 105, 31, 32, 33, 34, 35, 36, 37, 0, 39,
- 40, 41, 42, 43, 0, 44, 45, 46, 0, 0,
- 0, 47, 0, 0, 0, 0, 0, 0, 184, 185,
- 186, 187, 0, 0, 0, 56, 0, 57, 58, 59,
- 60, 61, 62, 0, 0, 0, 0, 63, 64, 65,
- 66, 67, 68, 0, 69, 195, 196, 0, 0, 0,
- 70, 197, 198, 199, 0, 0, 200, 0, 0, 0,
- 0, 0, 71, 72, 73, -186, 0, 186, 187, 74,
- 75, 0, 30, 76, 31, 32, 33, 34, 35, 36,
- 37, 150, 39, 40, 41, 42, 43, 0, 44, 45,
- 46, 0, 195, 196, 47, 0, 0, 0, 197, 198,
- 199, 0, 0, 200, 0, 0, 0, 0, 56, 0,
+ 0, -44, 76, 29, 0, 30, 0, 31, 32, 33,
+ 34, 35, 36, 37, 0, 140, 40, 41, 42, 43,
+ 110, 44, 45, 46, 177, 178, 179, 47, 0, 0,
+ 0, 0, 0, 0, 0, 0, 185, 186, 187, 188,
+ 0, 56, 0, 57, 58, 59, 60, 61, 62, 364,
+ 0, 0, 0, 63, 64, 65, 66, 67, 68, 0,
+ 69, 194, 195, 196, 197, 0, 70, 0, 0, 198,
+ 199, 200, 0, 0, 201, 0, 0, 0, 71, 72,
+ 73, 0, 0, 0, 0, 74, 75, 0, 29, 76,
+ 30, 0, 31, 32, 33, 34, 35, 36, 37, 0,
+ 39, 40, 41, 42, 43, 0, 44, 45, 46, 177,
+ 178, 179, 47, 0, 0, 0, 0, 0, 0, 0,
+ 185, 186, 187, 188, 0, 0, 56, 0, 57, 58,
+ 59, 60, 61, 62, 365, 177, 178, 179, 63, 64,
+ 65, 66, 67, 68, 0, 69, 195, 196, 197, 0,
+ 0, 70, 0, 198, 199, 200, 0, 0, 201, 0,
+ 366, 0, 0, 71, 72, 73, 0, 0, 0, 0,
+ 74, 75, 0, 29, 76, 30, 0, 31, 32, 33,
+ 34, 35, 36, 37, 0, 146, 40, 41, 42, 43,
+ 0, 44, 45, 46, 177, 178, 179, 47, 0, 0,
+ 0, 0, 0, 0, 0, 0, 185, -187, 187, 188,
+ 0, 56, 0, 57, 58, 59, 60, 61, 62, 373,
+ 0, 0, 0, 63, 64, 65, 66, 67, 68, 0,
+ 69, 0, 0, 196, 197, 203, 70, 204, -157, 198,
+ 199, 200, 0, 0, 201, 0, -157, 0, 71, 72,
+ 73, 0, 0, 0, 0, 74, 75, 0, 0, 76,
+ 0, 0, -157, -157, -157, -157, 0, 0, 0, -157,
+ 0, -157, 0, 0, -157, 0, 0, 0, 0, 0,
+ 0, -157, -157, -157, -157, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, -157, -157, -157, 0, -157,
+ -157, -157, -157, -157, -157, -157, -157, -157, -157, -157,
+ 0, 0, 0, 0, -157, -157, -157, 0, 0, -157,
+ -157, 30, 105, 31, 32, 33, 34, 35, 36, 37,
+ 0, 39, 40, 41, 42, 43, 0, 44, 45, 46,
+ 0, 0, 0, 47, 0, 0, 0, 0, 0, 0,
+ 185, 186, 187, 188, 0, 0, 0, 56, 0, 57,
+ 58, 59, 60, 61, 62, 0, 0, 0, 0, 63,
+ 64, 65, 66, 67, 68, 0, 69, 196, 197, 0,
+ 0, 0, 70, 198, 199, 200, 0, 0, 201, 0,
+ 0, 0, 0, 0, 71, 72, 73, -187, 0, 187,
+ 188, 74, 75, 0, 30, 76, 31, 32, 33, 34,
+ 35, 36, 37, 150, 39, 40, 41, 42, 43, 0,
+ 44, 45, 46, 0, 196, 197, 47, 0, 0, 0,
+ 198, 199, 200, 0, 0, 201, 0, 0, 0, 0,
+ 56, 0, 57, 58, 59, 60, 61, 62, 0, 0,
+ 0, 0, 63, 64, 65, 66, 67, 68, 0, 69,
+ 0, 0, 0, 0, 0, 70, 0, 0, 0, 0,
+ 0, 0, 0, 171, 172, 173, 174, 71, 72, 73,
+ 175, 0, 176, 0, 74, 75, 0, 30, 76, 31,
+ 32, 33, 34, 35, 36, 37, 0, 39, 40, 41,
+ 42, 43, 0, 44, 45, 46, 177, 178, 179, 47,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 56, 0, 57, 58, 59, 60, 61,
+ 62, 0, 0, 0, 0, 63, 64, 65, 66, 67,
+ 68, 0, 69, 0, 0, 0, 0, 0, 70, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 71, 72, 73, 0, 0, 0, 0, 74, 75, 0,
+ 166, 76, 30, 0, 31, 32, 33, 34, 35, 36,
+ 37, 0, 39, 40, 41, 42, 43, 0, 44, 45,
+ 46, 0, 0, 0, 47, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 56, 0,
57, 58, 59, 60, 61, 62, 0, 0, 0, 0,
63, 64, 65, 66, 67, 68, 0, 69, 0, 0,
0, 0, 0, 70, 0, 0, 0, 0, 0, 0,
- 0, 171, 172, 173, 174, 71, 72, 73, 175, 0,
- 0, 0, 74, 75, 0, 30, 76, 31, 32, 33,
- 34, 35, 36, 37, 0, 39, 40, 41, 42, 43,
- 0, 44, 45, 46, 176, 177, 178, 47, 0, 0,
+ 0, 0, 0, 0, 0, 71, 72, 73, 0, 0,
+ 0, 0, 74, 75, 0, 230, 76, 30, 0, 31,
+ 32, 33, 34, 35, 36, 37, 0, 39, 40, 41,
+ 42, 43, 0, 44, 45, 46, 0, 0, 0, 47,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 56, 0, 57, 58, 59, 60, 61, 62, 0,
- 0, 0, 0, 63, 64, 65, 66, 67, 68, 0,
- 69, 0, 0, 0, 0, 0, 70, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 71, 72,
- 73, 0, 0, 0, 0, 74, 75, 0, 166, 76,
- 30, 0, 31, 32, 33, 34, 35, 36, 37, 0,
- 39, 40, 41, 42, 43, 0, 44, 45, 46, 0,
- 0, 0, 47, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 56, 0, 57, 58,
- 59, 60, 61, 62, 0, 0, 0, 0, 63, 64,
- 65, 66, 67, 68, 0, 69, 0, 0, 0, 0,
- 0, 70, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 71, 72, 73, 0, 0, 0, 0,
- 74, 75, 0, 229, 76, 30, 0, 31, 32, 33,
- 34, 35, 36, 37, 0, 39, 40, 41, 42, 43,
- 0, 44, 45, 46, 0, 0, 0, 47, 0, 0,
+ 0, 0, 0, 56, 0, 57, 58, 59, 60, 61,
+ 62, 0, 0, 0, 0, 63, 64, 65, 66, 67,
+ 68, 0, 69, 0, 0, 0, 0, 0, 70, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 56, 0, 57, 58, 59, 60, 61, 62, 0,
- 0, 0, 0, 63, 64, 65, 66, 67, 68, 0,
- 69, 0, 0, 0, 0, 0, 70, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 71, 72,
- 73, 0, 0, 0, 0, 74, 75, 0, 240, 76,
- 30, 0, 31, 32, 33, 34, 35, 36, 37, 0,
- 39, 40, 41, 42, 43, 0, 44, 45, 46, 0,
- 0, 0, 47, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 56, 0, 57, 58,
- 59, 60, 61, 62, 0, 0, 0, 0, 63, 64,
- 65, 66, 67, 68, 0, 69, 0, 0, 0, 0,
- 0, 70, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 71, 72, 73, 0, 0, 0, 0,
- 74, 75, 0, 259, 76, 30, 0, 31, 32, 33,
- 34, 35, 36, 37, 0, 39, 40, 41, 42, 43,
- 0, 44, 45, 46, 0, 0, 0, 47, 0, 0,
+ 71, 72, 73, 0, 0, 0, 0, 74, 75, 0,
+ 241, 76, 30, 0, 31, 32, 33, 34, 35, 36,
+ 37, 0, 39, 40, 41, 42, 43, 0, 44, 45,
+ 46, 0, 0, 0, 47, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 56, 0,
+ 57, 58, 59, 60, 61, 62, 0, 0, 0, 0,
+ 63, 64, 65, 66, 67, 68, 0, 69, 0, 0,
+ 0, 0, 0, 70, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 71, 72, 73, 0, 0,
+ 0, 0, 74, 75, 0, 261, 76, 30, 0, 31,
+ 32, 33, 34, 35, 36, 37, 0, 39, 40, 41,
+ 42, 43, 0, 44, 45, 46, 0, 0, 0, 47,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 56, 0, 57, 58, 59, 60, 61, 62, 0,
- 0, 0, 0, 63, 64, 65, 66, 67, 68, 0,
- 69, 0, 0, 0, 0, 0, 70, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 71, 72,
- 73, 0, 0, 0, 0, 74, 75, 0, 282, 76,
- 30, 0, 31, 32, 33, 34, 35, 36, 37, 0,
- 39, 40, 41, 42, 43, 0, 44, 45, 46, 0,
- 0, 0, 47, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 56, 0, 57, 58,
- 59, 60, 61, 62, 0, 0, 0, 0, 63, 64,
- 65, 66, 67, 68, 0, 69, 0, 0, 0, 0,
- 0, 70, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 71, 72, 73, 0, 0, 0, 0,
- 74, 75, 0, 319, 76, 30, 0, 31, 32, 33,
- 34, 35, 36, 37, 0, 39, 40, 41, 42, 43,
- 0, 44, 45, 46, 0, 0, 0, 47, 0, 0,
+ 0, 0, 0, 56, 0, 57, 58, 59, 60, 61,
+ 62, 0, 0, 0, 0, 63, 64, 65, 66, 67,
+ 68, 0, 69, 0, 0, 0, 0, 0, 70, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 56, 0, 57, 58, 59, 60, 61, 62, 0,
- 0, 0, 0, 63, 64, 65, 66, 67, 68, 0,
- 69, 0, 0, 0, 0, 0, 70, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 71, 72,
- 73, 0, 0, 0, 0, 74, 75, 0, 321, 76,
- 30, 0, 31, 32, 33, 34, 35, 36, 37, 0,
- 39, 40, 41, 42, 43, 0, 44, 45, 46, 0,
- 0, 0, 47, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 56, 0, 57, 58,
- 59, 60, 61, 62, 0, 0, 0, 0, 63, 64,
- 65, 66, 67, 68, 0, 69, 0, 0, 0, 0,
- 0, 70, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 71, 72, 73, 0, 0, 0, 0,
- 74, 75, 0, 334, 76, 30, 0, 31, 32, 33,
- 34, 35, 36, 37, 0, 39, 40, 41, 42, 43,
- 0, 44, 45, 46, 0, 0, 0, 47, 0, 0,
+ 71, 72, 73, 0, 0, 0, 0, 74, 75, 0,
+ 284, 76, 30, 0, 31, 32, 33, 34, 35, 36,
+ 37, 0, 39, 40, 41, 42, 43, 0, 44, 45,
+ 46, 0, 0, 0, 47, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 56, 0,
+ 57, 58, 59, 60, 61, 62, 0, 0, 0, 0,
+ 63, 64, 65, 66, 67, 68, 0, 69, 0, 0,
+ 0, 0, 0, 70, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 71, 72, 73, 0, 0,
+ 0, 0, 74, 75, 0, 321, 76, 30, 0, 31,
+ 32, 33, 34, 35, 36, 37, 0, 39, 40, 41,
+ 42, 43, 0, 44, 45, 46, 0, 0, 0, 47,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 56, 0, 57, 58, 59, 60, 61, 62, 0,
- 0, 0, 0, 63, 64, 65, 66, 67, 68, 0,
- 69, 0, 0, 0, 0, 0, 70, -185, 0, 0,
- 0, 0, 0, 0, 0, -185, 0, 0, 71, 72,
- 73, 0, 0, 0, 0, 74, 75, 0, 0, 76,
- 0, -185, -185, -185, -185, 0, 0, 0, -185, 0,
- 0, 0, 0, -185, 0, 0, 0, 0, 0, 0,
- -185, -185, -185, -185, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, -185, -185, -185, 0, -185, -185,
- -185, -185, -185, -185, -185, -185, -185, -185, -185, 0,
- 381, 0, 383, -185, -185, -185, 387, 0, -185, -185,
+ 0, 0, 0, 56, 0, 57, 58, 59, 60, 61,
+ 62, 0, 0, 0, 0, 63, 64, 65, 66, 67,
+ 68, 0, 69, 0, 0, 0, 0, 0, 70, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 391, 392, 0, 0, 0, 0, 0, 0,
- 401, 402, 0, 0, 0, 0, 0, 183, 0, 406,
- 0, 0, 0, 408, 184, 185, 186, 187, 0, 0,
+ 71, 72, 73, 0, 0, 0, 0, 74, 75, 0,
+ 323, 76, 30, 0, 31, 32, 33, 34, 35, 36,
+ 37, 0, 39, 40, 41, 42, 43, 0, 44, 45,
+ 46, 0, 0, 0, 47, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 56, 0,
+ 57, 58, 59, 60, 61, 62, 0, 0, 0, 0,
+ 63, 64, 65, 66, 67, 68, 0, 69, 0, 0,
+ 0, 0, 0, 70, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 71, 72, 73, 0, 0,
+ 0, 0, 74, 75, 0, 336, 76, 30, 0, 31,
+ 32, 33, 34, 35, 36, 37, 0, 39, 40, 41,
+ 42, 43, 0, 44, 45, 46, 0, 0, 0, 47,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 56, 0, 57, 58, 59, 60, 61,
+ 62, 0, 0, 0, 0, 63, 64, 65, 66, 67,
+ 68, 0, 69, 0, 0, 0, 0, 0, 70, -186,
+ 0, 0, 0, 0, 0, 0, 0, -186, 0, 0,
+ 71, 72, 73, 0, 0, 0, 0, 74, 75, 0,
+ 0, 76, 0, -186, -186, -186, -186, 0, 0, 0,
+ -186, 0, -186, 0, 0, -186, 0, 0, 0, 0,
+ 0, 0, -186, -186, -186, -186, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, -186, -186, -186, 0,
+ -186, -186, -186, -186, -186, -186, -186, -186, -186, -186,
+ -186, 0, 383, 0, 385, -186, -186, -186, 389, 0,
+ -186, -186, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 393, 394, 0, 0, 0, 0,
+ 0, 0, 403, 404, 0, 0, 0, 0, 0, 184,
+ 0, 408, 0, 0, 0, 410, 185, 186, 187, 188,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 417, 418, 0, 188, 189, 331, 190, 191, 192, 193,
- 194, 195, 196, 0, 0, 0, 183, 197, 198, 199,
- 0, 0, 200, 184, 185, 186, 187, 0, 0, 0,
+ 0, 0, 419, 420, 0, 189, 190, 333, 191, 192,
+ 193, 194, 195, 196, 197, 0, 0, 0, 184, 198,
+ 199, 200, 0, 0, 201, 185, 186, 187, 188, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 188, 189, 0, 190, 191, 192, 193, 194,
- 195, 196, 0, 0, 0, 183, 197, 198, 199, 0,
- 0, 200, 184, 185, 186, 187, 0, 0, 0, 0,
+ 0, 0, 0, 0, 189, 190, 0, 191, 192, 193,
+ 194, 195, 196, 197, 0, 0, 0, 184, 198, 199,
+ 200, 0, 0, 201, 185, 186, 187, 188, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 189, 0, 190, 191, 192, 193, 194, 195,
- 196, 0, 0, 0, -186, 197, 198, 199, 0, 0,
- 200, 184, 185, 186, 187, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 190, 0, 191, 192, 193, 194,
+ 195, 196, 197, 0, 0, 0, -187, 198, 199, 200,
+ 0, 0, 201, 185, 186, 187, 188, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 190, 191, 192, 193, 194, 195, 196,
- 0, 0, 0, 0, 197, 198, 199, 0, 0, 200
+ 0, 0, 0, 0, 0, 191, 192, 193, 194, 195,
+ 196, 197, 0, 0, 0, 0, 198, 199, 200, 0,
+ 0, 201
};
static const yytype_int16 yycheck[] =
{
- 15, 104, 15, 215, 62, 118, 33, 34, 35, 36,
- 37, 353, 70, 40, 41, 30, 224, 9, 15, 227,
- 3, 3, 5, 5, 67, 52, 9, 3, 381, 5,
- 63, 64, 65, 16, 6, 62, 63, 64, 383, 152,
- 0, 68, 55, 34, 35, 88, 391, 392, 61, 14,
- 65, 64, 9, 10, 11, 88, 401, 3, 400, 5,
- 118, 76, 120, 408, 417, 211, 58, 34, 35, 36,
- 37, 14, 218, 40, 41, 124, 125, 126, 127, 128,
- 129, 15, 131, 132, 6, 98, 144, 31, 32, 15,
- 0, 63, 64, 65, 152, 62, 63, 89, 63, 64,
- 65, 45, 9, 10, 312, 313, 89, 89, 89, 122,
- 137, 89, 56, 89, 24, 25, 26, 61, 28, 29,
- 64, 136, 137, 67, 336, 69, 3, 71, 72, 73,
- 74, 75, 89, 89, 103, 6, 3, 14, 5, 154,
- 89, 63, 64, 65, 63, 64, 65, 89, 356, 59,
- 63, 64, 65, 6, 123, 168, 171, 172, 173, 174,
- 175, 176, 177, 178, 89, 180, 181, 182, 89, 88,
- 137, 3, 220, 200, 222, 88, 225, 89, 291, 15,
- 90, 14, 36, 296, 89, 89, 201, 202, 203, 204,
- 205, 206, 63, 64, 65, 14, 223, 83, 84, 407,
- 215, 87, 4, 67, 219, 220, 89, 222, 6, 224,
- 63, 64, 65, 6, 3, 18, 6, 89, 233, 15,
- 235, 236, 24, 25, 26, 88, 28, 29, 89, 244,
- 63, 64, 65, 291, 4, 179, 14, 89, 296, 183,
+ 15, 104, 15, 118, 33, 34, 35, 36, 37, 9,
+ 225, 40, 41, 228, 216, 30, 3, 3, 5, 5,
+ 355, 14, 9, 52, 62, 3, 0, 5, 67, 16,
+ 383, 212, 70, 62, 63, 64, 6, 152, 219, 68,
+ 15, 3, 55, 5, 9, 10, 11, 14, 61, 88,
+ 65, 64, 124, 125, 126, 127, 128, 129, 58, 131,
+ 132, 76, 34, 35, 36, 37, 419, 402, 40, 41,
+ 63, 64, 65, 83, 84, 6, 3, 87, 5, 15,
+ 118, 3, 120, 6, 103, 98, 15, 31, 32, 89,
+ 62, 63, 14, 63, 64, 65, 63, 64, 65, 314,
+ 315, 45, 89, 89, 123, 221, 144, 223, 137, 122,
+ 14, 89, 56, 89, 152, 34, 35, 61, 6, 3,
+ 64, 136, 137, 67, 89, 69, 4, 71, 72, 73,
+ 74, 75, 63, 64, 65, 14, 338, 9, 10, 154,
+ 63, 64, 65, 358, 89, 0, 24, 25, 26, 14,
+ 28, 29, 89, 15, 226, 168, 171, 172, 173, 174,
+ 175, 176, 177, 178, 179, 137, 181, 182, 183, 24,
+ 25, 26, 201, 28, 29, 63, 64, 65, 293, 89,
+ 6, 59, 14, 298, 63, 64, 65, 202, 203, 204,
+ 205, 206, 207, 89, 409, 224, 89, 89, 63, 64,
+ 65, 216, 89, 4, 59, 220, 221, 89, 223, 89,
+ 225, 6, 90, 36, 6, 82, 83, 84, 14, 234,
+ 87, 236, 237, 24, 25, 26, 14, 28, 29, 67,
+ 245, 63, 64, 65, 3, 90, 180, 63, 64, 65,
184, 185, 186, 187, 188, 189, 190, 191, 192, 193,
- 194, 195, 196, 197, 24, 25, 26, 59, 28, 29,
- 4, 276, 277, 5, 279, 63, 64, 65, 15, 61,
- 63, 64, 65, 63, 64, 65, 61, 290, 9, 292,
- 63, 64, 65, 88, 297, 63, 64, 65, 90, 59,
- 393, 4, 18, 1, 5, 3, 65, 5, 89, 7,
- 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
- 18, 19, 327, 21, 22, 23, 14, 18, 89, 27,
- 90, 336, 30, 31, 32, 33, 88, 88, 51, 37,
- 38, 39, 40, 41, 14, 43, 44, 45, 46, 47,
- 48, 14, 88, 358, 14, 53, 54, 55, 56, 57,
- 58, 3, 60, 88, 77, 88, 88, 9, 66, 82,
- 83, 84, 4, 15, 87, 63, 64, 65, 20, 88,
- 78, 79, 80, 4, 4, 4, 14, 85, 86, 88,
- 3, 89, 88, 63, 64, 65, 4, 331, 88, 1,
- 63, 64, 65, 5, 409, 7, 8, 9, 10, 11,
- 12, 13, 14, 15, 16, 17, 18, 19, 14, 21,
- 22, 23, 63, 64, 65, 27, 77, 30, 31, 32,
- 33, 82, 83, 84, 37, 88, 87, 51, 52, 41,
- 89, 43, 44, 45, 46, 47, 48, 88, 88, 88,
- 15, 53, 54, 55, 56, 57, 58, 358, 60, 47,
- 63, 64, 65, 77, 66, 409, 27, 292, 82, 83,
- 84, 68, -1, 87, 68, -1, 78, 79, 80, -1,
- 51, 52, 1, 85, 86, 88, 5, 89, 7, 8,
- 9, 10, 11, 12, 13, -1, 15, 16, 17, 18,
- 19, -1, 21, 22, 23, 76, 77, -1, 27, -1,
- -1, 82, 83, 84, -1, -1, 87, -1, 49, 50,
- 51, 52, 41, -1, 43, 44, 45, 46, 47, 48,
- 63, 64, 65, -1, 53, 54, 55, 56, 57, 58,
- -1, 60, 73, 74, 75, 76, 77, 66, -1, -1,
- -1, 82, 83, 84, -1, 88, 87, -1, -1, 78,
- 79, 80, -1, -1, -1, -1, 85, 86, -1, 88,
- 89, 3, -1, 5, -1, 7, 8, 9, 10, 11,
- 12, 13, -1, 15, 16, 17, 18, 19, 20, 21,
- 22, 23, 63, 64, 65, 27, 82, 83, 84, -1,
- -1, 87, -1, -1, 49, 50, 51, 52, -1, 41,
- -1, 43, 44, 45, 46, 47, 48, 88, -1, -1,
- -1, 53, 54, 55, 56, 57, 58, -1, 60, 74,
- 75, 76, 77, -1, 66, -1, -1, 82, 83, 84,
- -1, -1, 87, -1, -1, -1, 78, 79, 80, -1,
- -1, -1, -1, 85, 86, -1, 3, 89, 5, -1,
- 7, 8, 9, 10, 11, 12, 13, -1, 15, 16,
- 17, 18, 19, -1, 21, 22, 23, 63, 64, 65,
- 27, 63, 64, 65, -1, 67, -1, -1, 49, 50,
- 51, 52, -1, -1, 41, -1, 43, 44, 45, 46,
- 47, 48, 88, 63, 64, 65, 53, 54, 55, 56,
- 57, 58, -1, 60, 75, 76, 77, -1, -1, 66,
- -1, 82, 83, 84, -1, -1, 87, -1, 88, -1,
+ 194, 195, 196, 197, 198, 293, 89, 18, 59, 15,
+ 298, 89, 89, 278, 279, 89, 281, 88, 63, 64,
+ 65, 63, 64, 65, 4, 63, 64, 65, 77, 292,
+ 61, 294, 5, 82, 83, 84, 299, 61, 87, 90,
+ 15, 9, 395, 4, 88, 1, 18, 3, 5, 5,
+ 65, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 329, 21, 22, 23, 63, 64,
+ 65, 27, 89, 338, 30, 31, 32, 33, 18, 88,
+ 51, 37, 38, 39, 40, 41, 88, 43, 44, 45,
+ 46, 47, 48, 88, 88, 360, 88, 53, 54, 55,
+ 56, 57, 58, 88, 60, 89, 77, 88, 14, 385,
+ 66, 82, 83, 84, 88, 4, 87, 393, 394, 63,
+ 64, 65, 78, 79, 80, 4, 3, 403, 4, 85,
+ 86, 14, 9, 89, 410, 63, 64, 65, 15, 333,
+ 4, 1, 88, 20, 88, 5, 411, 7, 8, 9,
+ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+ 88, 21, 22, 23, 63, 64, 65, 27, 3, 30,
+ 31, 32, 33, 63, 64, 65, 37, 67, 39, 51,
+ 52, 41, 4, 43, 44, 45, 46, 47, 48, 88,
+ 63, 64, 65, 53, 54, 55, 56, 57, 58, 14,
+ 60, 88, 63, 64, 65, 77, 66, 88, 88, 15,
+ 82, 83, 84, 360, 89, 87, 47, 88, 78, 79,
+ 80, 88, 51, 52, 1, 85, 86, 88, 5, 89,
+ 7, 8, 9, 10, 11, 12, 13, 411, 15, 16,
+ 17, 18, 19, 27, 21, 22, 23, 76, 77, 68,
+ 27, 294, 68, 82, 83, 84, -1, -1, 87, -1,
+ 49, 50, 51, 52, 41, -1, 43, 44, 45, 46,
+ 47, 48, 63, 64, 65, -1, 53, 54, 55, 56,
+ 57, 58, -1, 60, 73, 74, 75, 76, 77, 66,
+ -1, -1, -1, 82, 83, 84, -1, 88, 87, -1,
-1, 78, 79, 80, -1, -1, -1, -1, 85, 86,
- -1, 3, 89, 5, -1, 7, 8, 9, 10, 11,
- 12, 13, -1, 15, 16, 17, 18, 19, -1, 21,
- 22, 23, 63, 64, 65, 27, -1, -1, -1, -1,
- -1, -1, -1, -1, 49, 50, 51, 52, -1, 41,
- -1, 43, 44, 45, 46, 47, 48, 88, -1, -1,
- -1, 53, 54, 55, 56, 57, 58, -1, 60, -1,
- -1, 76, 77, 3, 66, 5, 6, 82, 83, 84,
- -1, -1, 87, -1, 14, -1, 78, 79, 80, -1,
- -1, -1, -1, 85, 86, -1, -1, 89, -1, -1,
- 30, 31, 32, 33, -1, -1, -1, 37, -1, -1,
- -1, -1, 42, -1, -1, -1, -1, -1, -1, 49,
- 50, 51, 52, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 63, 64, 65, -1, 67, 68, 69,
- 70, 71, 72, 73, 74, 75, 76, 77, -1, -1,
- -1, -1, 82, 83, 84, -1, -1, 87, 88, 5,
- 6, 7, 8, 9, 10, 11, 12, 13, -1, 15,
- 16, 17, 18, 19, -1, 21, 22, 23, -1, -1,
- -1, 27, -1, -1, -1, -1, -1, -1, 49, 50,
- 51, 52, -1, -1, -1, 41, -1, 43, 44, 45,
- 46, 47, 48, -1, -1, -1, -1, 53, 54, 55,
- 56, 57, 58, -1, 60, 76, 77, -1, -1, -1,
- 66, 82, 83, 84, -1, -1, 87, -1, -1, -1,
- -1, -1, 78, 79, 80, 49, -1, 51, 52, 85,
- 86, -1, 5, 89, 7, 8, 9, 10, 11, 12,
- 13, 14, 15, 16, 17, 18, 19, -1, 21, 22,
- 23, -1, 76, 77, 27, -1, -1, -1, 82, 83,
- 84, -1, -1, 87, -1, -1, -1, -1, 41, -1,
- 43, 44, 45, 46, 47, 48, -1, -1, -1, -1,
- 53, 54, 55, 56, 57, 58, -1, 60, -1, -1,
- -1, -1, -1, 66, -1, -1, -1, -1, -1, -1,
- -1, 30, 31, 32, 33, 78, 79, 80, 37, -1,
- -1, -1, 85, 86, -1, 5, 89, 7, 8, 9,
+ -1, 88, 89, 3, -1, 5, -1, 7, 8, 9,
10, 11, 12, 13, -1, 15, 16, 17, 18, 19,
- -1, 21, 22, 23, 63, 64, 65, 27, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 41, -1, 43, 44, 45, 46, 47, 48, -1,
+ 20, 21, 22, 23, 63, 64, 65, 27, -1, -1,
+ -1, -1, -1, -1, -1, -1, 49, 50, 51, 52,
+ -1, 41, -1, 43, 44, 45, 46, 47, 48, 88,
-1, -1, -1, 53, 54, 55, 56, 57, 58, -1,
- 60, -1, -1, -1, -1, -1, 66, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 78, 79,
- 80, -1, -1, -1, -1, 85, 86, -1, 88, 89,
+ 60, 74, 75, 76, 77, -1, 66, -1, -1, 82,
+ 83, 84, -1, -1, 87, -1, -1, -1, 78, 79,
+ 80, -1, -1, -1, -1, 85, 86, -1, 3, 89,
5, -1, 7, 8, 9, 10, 11, 12, 13, -1,
- 15, 16, 17, 18, 19, -1, 21, 22, 23, -1,
- -1, -1, 27, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 41, -1, 43, 44,
- 45, 46, 47, 48, -1, -1, -1, -1, 53, 54,
- 55, 56, 57, 58, -1, 60, -1, -1, -1, -1,
- -1, 66, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 78, 79, 80, -1, -1, -1, -1,
- 85, 86, -1, 88, 89, 5, -1, 7, 8, 9,
+ 15, 16, 17, 18, 19, -1, 21, 22, 23, 63,
+ 64, 65, 27, -1, -1, -1, -1, -1, -1, -1,
+ 49, 50, 51, 52, -1, -1, 41, -1, 43, 44,
+ 45, 46, 47, 48, 88, 63, 64, 65, 53, 54,
+ 55, 56, 57, 58, -1, 60, 75, 76, 77, -1,
+ -1, 66, -1, 82, 83, 84, -1, -1, 87, -1,
+ 88, -1, -1, 78, 79, 80, -1, -1, -1, -1,
+ 85, 86, -1, 3, 89, 5, -1, 7, 8, 9,
10, 11, 12, 13, -1, 15, 16, 17, 18, 19,
- -1, 21, 22, 23, -1, -1, -1, 27, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 41, -1, 43, 44, 45, 46, 47, 48, -1,
+ -1, 21, 22, 23, 63, 64, 65, 27, -1, -1,
+ -1, -1, -1, -1, -1, -1, 49, 50, 51, 52,
+ -1, 41, -1, 43, 44, 45, 46, 47, 48, 88,
-1, -1, -1, 53, 54, 55, 56, 57, 58, -1,
- 60, -1, -1, -1, -1, -1, 66, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 78, 79,
- 80, -1, -1, -1, -1, 85, 86, -1, 88, 89,
- 5, -1, 7, 8, 9, 10, 11, 12, 13, -1,
- 15, 16, 17, 18, 19, -1, 21, 22, 23, -1,
- -1, -1, 27, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 41, -1, 43, 44,
- 45, 46, 47, 48, -1, -1, -1, -1, 53, 54,
- 55, 56, 57, 58, -1, 60, -1, -1, -1, -1,
- -1, 66, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 78, 79, 80, -1, -1, -1, -1,
- 85, 86, -1, 88, 89, 5, -1, 7, 8, 9,
- 10, 11, 12, 13, -1, 15, 16, 17, 18, 19,
- -1, 21, 22, 23, -1, -1, -1, 27, -1, -1,
+ 60, -1, -1, 76, 77, 3, 66, 5, 6, 82,
+ 83, 84, -1, -1, 87, -1, 14, -1, 78, 79,
+ 80, -1, -1, -1, -1, 85, 86, -1, -1, 89,
+ -1, -1, 30, 31, 32, 33, -1, -1, -1, 37,
+ -1, 39, -1, -1, 42, -1, -1, -1, -1, -1,
+ -1, 49, 50, 51, 52, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 63, 64, 65, -1, 67,
+ 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
+ -1, -1, -1, -1, 82, 83, 84, -1, -1, 87,
+ 88, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ -1, 15, 16, 17, 18, 19, -1, 21, 22, 23,
+ -1, -1, -1, 27, -1, -1, -1, -1, -1, -1,
+ 49, 50, 51, 52, -1, -1, -1, 41, -1, 43,
+ 44, 45, 46, 47, 48, -1, -1, -1, -1, 53,
+ 54, 55, 56, 57, 58, -1, 60, 76, 77, -1,
+ -1, -1, 66, 82, 83, 84, -1, -1, 87, -1,
+ -1, -1, -1, -1, 78, 79, 80, 49, -1, 51,
+ 52, 85, 86, -1, 5, 89, 7, 8, 9, 10,
+ 11, 12, 13, 14, 15, 16, 17, 18, 19, -1,
+ 21, 22, 23, -1, 76, 77, 27, -1, -1, -1,
+ 82, 83, 84, -1, -1, 87, -1, -1, -1, -1,
+ 41, -1, 43, 44, 45, 46, 47, 48, -1, -1,
+ -1, -1, 53, 54, 55, 56, 57, 58, -1, 60,
+ -1, -1, -1, -1, -1, 66, -1, -1, -1, -1,
+ -1, -1, -1, 30, 31, 32, 33, 78, 79, 80,
+ 37, -1, 39, -1, 85, 86, -1, 5, 89, 7,
+ 8, 9, 10, 11, 12, 13, -1, 15, 16, 17,
+ 18, 19, -1, 21, 22, 23, 63, 64, 65, 27,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 41, -1, 43, 44, 45, 46, 47, 48, -1,
- -1, -1, -1, 53, 54, 55, 56, 57, 58, -1,
- 60, -1, -1, -1, -1, -1, 66, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 78, 79,
- 80, -1, -1, -1, -1, 85, 86, -1, 88, 89,
- 5, -1, 7, 8, 9, 10, 11, 12, 13, -1,
- 15, 16, 17, 18, 19, -1, 21, 22, 23, -1,
- -1, -1, 27, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 41, -1, 43, 44,
- 45, 46, 47, 48, -1, -1, -1, -1, 53, 54,
- 55, 56, 57, 58, -1, 60, -1, -1, -1, -1,
- -1, 66, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 78, 79, 80, -1, -1, -1, -1,
- 85, 86, -1, 88, 89, 5, -1, 7, 8, 9,
- 10, 11, 12, 13, -1, 15, 16, 17, 18, 19,
- -1, 21, 22, 23, -1, -1, -1, 27, -1, -1,
+ -1, -1, -1, 41, -1, 43, 44, 45, 46, 47,
+ 48, -1, -1, -1, -1, 53, 54, 55, 56, 57,
+ 58, -1, 60, -1, -1, -1, -1, -1, 66, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 41, -1, 43, 44, 45, 46, 47, 48, -1,
- -1, -1, -1, 53, 54, 55, 56, 57, 58, -1,
- 60, -1, -1, -1, -1, -1, 66, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, 78, 79,
- 80, -1, -1, -1, -1, 85, 86, -1, 88, 89,
- 5, -1, 7, 8, 9, 10, 11, 12, 13, -1,
- 15, 16, 17, 18, 19, -1, 21, 22, 23, -1,
- -1, -1, 27, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 41, -1, 43, 44,
- 45, 46, 47, 48, -1, -1, -1, -1, 53, 54,
- 55, 56, 57, 58, -1, 60, -1, -1, -1, -1,
- -1, 66, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 78, 79, 80, -1, -1, -1, -1,
- 85, 86, -1, 88, 89, 5, -1, 7, 8, 9,
- 10, 11, 12, 13, -1, 15, 16, 17, 18, 19,
- -1, 21, 22, 23, -1, -1, -1, 27, -1, -1,
+ 78, 79, 80, -1, -1, -1, -1, 85, 86, -1,
+ 88, 89, 5, -1, 7, 8, 9, 10, 11, 12,
+ 13, -1, 15, 16, 17, 18, 19, -1, 21, 22,
+ 23, -1, -1, -1, 27, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 41, -1,
+ 43, 44, 45, 46, 47, 48, -1, -1, -1, -1,
+ 53, 54, 55, 56, 57, 58, -1, 60, -1, -1,
+ -1, -1, -1, 66, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 78, 79, 80, -1, -1,
+ -1, -1, 85, 86, -1, 88, 89, 5, -1, 7,
+ 8, 9, 10, 11, 12, 13, -1, 15, 16, 17,
+ 18, 19, -1, 21, 22, 23, -1, -1, -1, 27,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, 41, -1, 43, 44, 45, 46, 47, 48, -1,
- -1, -1, -1, 53, 54, 55, 56, 57, 58, -1,
- 60, -1, -1, -1, -1, -1, 66, 6, -1, -1,
- -1, -1, -1, -1, -1, 14, -1, -1, 78, 79,
- 80, -1, -1, -1, -1, 85, 86, -1, -1, 89,
- -1, 30, 31, 32, 33, -1, -1, -1, 37, -1,
- -1, -1, -1, 42, -1, -1, -1, -1, -1, -1,
- 49, 50, 51, 52, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, 63, 64, 65, -1, 67, 68,
- 69, 70, 71, 72, 73, 74, 75, 76, 77, -1,
- 355, -1, 357, 82, 83, 84, 361, -1, 87, 88,
+ -1, -1, -1, 41, -1, 43, 44, 45, 46, 47,
+ 48, -1, -1, -1, -1, 53, 54, 55, 56, 57,
+ 58, -1, 60, -1, -1, -1, -1, -1, 66, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 377, 378, -1, -1, -1, -1, -1, -1,
- 385, 386, -1, -1, -1, -1, -1, 42, -1, 394,
- -1, -1, -1, 398, 49, 50, 51, 52, -1, -1,
+ 78, 79, 80, -1, -1, -1, -1, 85, 86, -1,
+ 88, 89, 5, -1, 7, 8, 9, 10, 11, 12,
+ 13, -1, 15, 16, 17, 18, 19, -1, 21, 22,
+ 23, -1, -1, -1, 27, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 41, -1,
+ 43, 44, 45, 46, 47, 48, -1, -1, -1, -1,
+ 53, 54, 55, 56, 57, 58, -1, 60, -1, -1,
+ -1, -1, -1, 66, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 78, 79, 80, -1, -1,
+ -1, -1, 85, 86, -1, 88, 89, 5, -1, 7,
+ 8, 9, 10, 11, 12, 13, -1, 15, 16, 17,
+ 18, 19, -1, 21, 22, 23, -1, -1, -1, 27,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- 415, 416, -1, 68, 69, 70, 71, 72, 73, 74,
- 75, 76, 77, -1, -1, -1, 42, 82, 83, 84,
- -1, -1, 87, 49, 50, 51, 52, -1, -1, -1,
+ -1, -1, -1, 41, -1, 43, 44, 45, 46, 47,
+ 48, -1, -1, -1, -1, 53, 54, 55, 56, 57,
+ 58, -1, 60, -1, -1, -1, -1, -1, 66, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 78, 79, 80, -1, -1, -1, -1, 85, 86, -1,
+ 88, 89, 5, -1, 7, 8, 9, 10, 11, 12,
+ 13, -1, 15, 16, 17, 18, 19, -1, 21, 22,
+ 23, -1, -1, -1, 27, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 41, -1,
+ 43, 44, 45, 46, 47, 48, -1, -1, -1, -1,
+ 53, 54, 55, 56, 57, 58, -1, 60, -1, -1,
+ -1, -1, -1, 66, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 78, 79, 80, -1, -1,
+ -1, -1, 85, 86, -1, 88, 89, 5, -1, 7,
+ 8, 9, 10, 11, 12, 13, -1, 15, 16, 17,
+ 18, 19, -1, 21, 22, 23, -1, -1, -1, 27,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 41, -1, 43, 44, 45, 46, 47,
+ 48, -1, -1, -1, -1, 53, 54, 55, 56, 57,
+ 58, -1, 60, -1, -1, -1, -1, -1, 66, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 68, 69, -1, 71, 72, 73, 74, 75,
- 76, 77, -1, -1, -1, 42, 82, 83, 84, -1,
- -1, 87, 49, 50, 51, 52, -1, -1, -1, -1,
+ 78, 79, 80, -1, -1, -1, -1, 85, 86, -1,
+ 88, 89, 5, -1, 7, 8, 9, 10, 11, 12,
+ 13, -1, 15, 16, 17, 18, 19, -1, 21, 22,
+ 23, -1, -1, -1, 27, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 41, -1,
+ 43, 44, 45, 46, 47, 48, -1, -1, -1, -1,
+ 53, 54, 55, 56, 57, 58, -1, 60, -1, -1,
+ -1, -1, -1, 66, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 78, 79, 80, -1, -1,
+ -1, -1, 85, 86, -1, 88, 89, 5, -1, 7,
+ 8, 9, 10, 11, 12, 13, -1, 15, 16, 17,
+ 18, 19, -1, 21, 22, 23, -1, -1, -1, 27,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 41, -1, 43, 44, 45, 46, 47,
+ 48, -1, -1, -1, -1, 53, 54, 55, 56, 57,
+ 58, -1, 60, -1, -1, -1, -1, -1, 66, 6,
+ -1, -1, -1, -1, -1, -1, -1, 14, -1, -1,
+ 78, 79, 80, -1, -1, -1, -1, 85, 86, -1,
+ -1, 89, -1, 30, 31, 32, 33, -1, -1, -1,
+ 37, -1, 39, -1, -1, 42, -1, -1, -1, -1,
+ -1, -1, 49, 50, 51, 52, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 63, 64, 65, -1,
+ 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
+ 77, -1, 357, -1, 359, 82, 83, 84, 363, -1,
+ 87, 88, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 379, 380, -1, -1, -1, -1,
+ -1, -1, 387, 388, -1, -1, -1, -1, -1, 42,
+ -1, 396, -1, -1, -1, 400, 49, 50, 51, 52,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 69, -1, 71, 72, 73, 74, 75, 76,
- 77, -1, -1, -1, 42, 82, 83, 84, -1, -1,
- 87, 49, 50, 51, 52, -1, -1, -1, -1, -1,
+ -1, -1, 417, 418, -1, 68, 69, 70, 71, 72,
+ 73, 74, 75, 76, 77, -1, -1, -1, 42, 82,
+ 83, 84, -1, -1, 87, 49, 50, 51, 52, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 68, 69, -1, 71, 72, 73,
+ 74, 75, 76, 77, -1, -1, -1, 42, 82, 83,
+ 84, -1, -1, 87, 49, 50, 51, 52, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 69, -1, 71, 72, 73, 74,
+ 75, 76, 77, -1, -1, -1, 42, 82, 83, 84,
+ -1, -1, 87, 49, 50, 51, 52, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, 71, 72, 73, 74, 75, 76, 77,
- -1, -1, -1, -1, 82, 83, 84, -1, -1, 87
+ -1, -1, -1, -1, -1, 71, 72, 73, 74, 75,
+ 76, 77, -1, -1, -1, -1, 82, 83, 84, -1,
+ -1, 87
};
/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -862,31 +866,32 @@ static const yytype_uint8 yystos[] =
15, 134, 146, 150, 155, 155, 15, 93, 143, 150,
14, 133, 15, 143, 89, 145, 150, 151, 152, 143,
134, 143, 143, 143, 143, 143, 88, 133, 36, 105,
- 14, 30, 31, 32, 33, 37, 63, 64, 65, 67,
- 3, 5, 89, 42, 49, 50, 51, 52, 68, 69,
- 71, 72, 73, 74, 75, 76, 77, 82, 83, 84,
- 87, 89, 3, 5, 3, 5, 3, 93, 18, 126,
- 15, 126, 99, 6, 146, 89, 134, 93, 126, 94,
- 94, 94, 94, 94, 94, 89, 94, 94, 88, 88,
- 133, 133, 147, 155, 134, 89, 89, 4, 14, 146,
- 88, 133, 61, 128, 5, 88, 93, 133, 111, 133,
- 133, 133, 133, 133, 133, 133, 143, 133, 133, 88,
- 133, 143, 143, 143, 143, 143, 143, 143, 143, 143,
- 143, 143, 143, 143, 143, 143, 3, 5, 16, 89,
- 137, 150, 88, 133, 133, 133, 133, 133, 133, 61,
- 127, 15, 127, 4, 147, 88, 136, 127, 110, 133,
- 111, 112, 133, 111, 114, 148, 150, 101, 109, 112,
- 113, 133, 94, 95, 112, 88, 67, 88, 133, 88,
- 133, 88, 133, 4, 88, 18, 133, 5, 14, 6,
- 88, 70, 133, 133, 88, 133, 89, 88, 14, 6,
- 14, 6, 14, 18, 14, 93, 129, 146, 129, 88,
- 146, 93, 88, 88, 88, 88, 89, 88, 14, 112,
- 112, 88, 88, 88, 88, 6, 133, 4, 143, 14,
- 6, 88, 147, 4, 4, 4, 14, 108, 108, 3,
- 97, 97, 112, 97, 110, 88, 88, 97, 6, 4,
- 88, 97, 97, 98, 34, 35, 102, 102, 88, 105,
- 14, 97, 97, 105, 105, 99, 97, 89, 97, 108,
- 105, 4, 112, 105, 113, 88, 88, 97, 97, 102
+ 14, 30, 31, 32, 33, 37, 39, 63, 64, 65,
+ 67, 3, 5, 89, 42, 49, 50, 51, 52, 68,
+ 69, 71, 72, 73, 74, 75, 76, 77, 82, 83,
+ 84, 87, 89, 3, 5, 3, 5, 3, 93, 18,
+ 126, 15, 126, 99, 6, 146, 89, 134, 93, 126,
+ 94, 94, 94, 94, 94, 94, 89, 94, 94, 88,
+ 88, 133, 133, 147, 155, 134, 89, 89, 4, 14,
+ 146, 88, 133, 61, 128, 5, 88, 93, 133, 111,
+ 133, 133, 133, 133, 133, 133, 133, 133, 143, 133,
+ 133, 88, 133, 143, 143, 143, 143, 143, 143, 143,
+ 143, 143, 143, 143, 143, 143, 143, 143, 3, 5,
+ 16, 89, 137, 150, 88, 133, 133, 133, 133, 133,
+ 133, 61, 127, 15, 127, 4, 147, 88, 136, 127,
+ 110, 133, 111, 112, 133, 111, 114, 148, 150, 101,
+ 109, 112, 113, 133, 94, 95, 112, 88, 67, 88,
+ 133, 88, 133, 88, 133, 4, 88, 18, 133, 5,
+ 14, 6, 88, 70, 133, 133, 88, 133, 89, 88,
+ 14, 6, 14, 6, 14, 18, 14, 93, 129, 146,
+ 129, 88, 146, 93, 88, 88, 88, 88, 89, 88,
+ 14, 112, 112, 88, 88, 88, 88, 6, 133, 4,
+ 143, 14, 6, 88, 147, 4, 4, 4, 14, 108,
+ 108, 3, 97, 97, 112, 97, 110, 88, 88, 97,
+ 6, 4, 88, 97, 97, 98, 34, 35, 102, 102,
+ 88, 105, 14, 97, 97, 105, 105, 99, 97, 89,
+ 97, 108, 105, 4, 112, 105, 113, 88, 88, 97,
+ 97, 102
};
typedef enum {
diff --git a/perly.y b/perly.y
index aad4dd7729..c07f48a4d3 100644
--- a/perly.y
+++ b/perly.y
@@ -269,6 +269,8 @@ sideff : error
(OP*)NULL, $3, $1, (OP*)NULL);
TOKEN_GETMAD($2,((LISTOP*)$$)->op_first->op_sibling,'w');
}
+ | expr WHEN expr
+ { $$ = newWHENOP($3, scope($1)); }
;
/* else and elsif blocks */
diff --git a/plan9/config_sh.sample b/plan9/config_sh.sample
index 69db0ebe76..eda91c1f00 100644
--- a/plan9/config_sh.sample
+++ b/plan9/config_sh.sample
@@ -212,6 +212,7 @@ d_ftime='undef'
d_futimes='undef'
d_gdbm_ndbm_h_uses_prototypes='undef'
d_gdbmndbm_h_uses_prototypes='undef'
+d_getaddrinfo='undef'
d_getcwd='define'
d_getespwnam='undef'
d_getfsstat='undef'
@@ -233,6 +234,7 @@ d_getlogin='define'
d_getlogin_r='undef'
d_getmntent='undef'
d_getmnt='undef'
+d_getnameinfo='undef'
d_getnbyaddr='undef'
d_getnbyname='undef'
d_getnent='undef'
@@ -278,6 +280,8 @@ d_ilogbl='undef'
d_inc_version_list='undef'
d_index='undef'
d_inetaton='undef'
+d_inetntop='undef'
+d_inetpton='undef'
d_int64_t='define'
d_isascii='undef'
d_isfinite='undef'
@@ -556,7 +560,7 @@ endservent_r_proto='0'
eunicefix=':'
exe_ext=''
expr='expr'
-extensions='B ByteLoader Cwd Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call IO List/Util MIME/Base64 Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes Unicode/Normalize attrs re threads threads/shared Encode/Byte Encode/CN Encode/EBCDIC Encode/JP Encode/KR Encode/Symbol Encode/TW Encode/Unicode Errno'
+extensions='B ByteLoader Cwd Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call IO List/Util MIME/Base64 Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes Unicode/Normalize attributes re threads threads/shared Encode/Byte Encode/CN Encode/EBCDIC Encode/JP Encode/KR Encode/Symbol Encode/TW Encode/Unicode Errno'
extras=''
fflushNULL='define'
fflushall='undef'
@@ -729,7 +733,7 @@ issymlink='/bin/test -h'
ivdformat='"ld"'
ivsize='4'
ivtype='long'
-known_extensions='B ByteLoader Cwd DB_File Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call GDBM_File I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 NDBM_File ODBM_File Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes Unicode/Normalize XS/APItest XS/Typemap attrs re threads threads/shared'
+known_extensions='B ByteLoader Cwd DB_File Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call GDBM_File I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 NDBM_File ODBM_File Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes Unicode/Normalize XS/APItest XS/Typemap attributes re threads threads/shared'
ksh=''
ld='ld'
lddlflags=''
@@ -929,7 +933,7 @@ src='.'
ssizetype='ssize_t'
startperl='#!/bin/perl'
startsh='#!/bin/sh'
-static_ext='B ByteLoader Cwd Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call IO List/Util MIME/Base64 Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes Unicode/Normalize attrs re threads threads/shared Encode/Byte Encode/CN Encode/EBCDIC Encode/JP Encode/KR Encode/Symbol Encode/TW Encode/Unicode'
+static_ext='B ByteLoader Cwd Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call IO List/Util MIME/Base64 Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes Unicode/Normalize attributes re threads threads/shared Encode/Byte Encode/CN Encode/EBCDIC Encode/JP Encode/KR Encode/Symbol Encode/TW Encode/Unicode'
stdchar='char'
stdio_base='((fp)->_base)'
stdio_bufsiz='((fp)->_cnt + (fp)->_ptr - (fp)->_base)'
diff --git a/plan9/mkfile b/plan9/mkfile
index 033faa3d04..47866d5ef4 100644
--- a/plan9/mkfile
+++ b/plan9/mkfile
@@ -22,7 +22,7 @@ installman3dir = /sys/man/2
podnames = perl perlbook perlboot perlbot perldata perldebtut perldiag perldsc perlform perlfunc perlipc perllexwarn perllol perlmod perlmodlib perlmodinstall perlnewmod perlop perlopentut perlpacktut perlpod perlport perlrequick perlretut perlref perlreftut perlrequick perlrun perlsec perlstyle perlsub perlsyn perltie perltoc perltooc perltoot perltrap perlutil perlunifaq perluniintro perlvar
faqpodnames = perlfaq perlfaq1 perlfaq2 perlfaq3 perlfaq4 perlfaq5 perlfaq6 perlfaq7 perlfaq8 perlfaq9
-advpodnames = perlapi perlapio perlcall perlclib perlcompile perldebguts perldbmfilter perldebug perldelta perldiag perlebcdic perlembed perlfilter perlfork perlguts perlhack perlintern perliol perllocale perlnumber perlobj perlothrtut perlpodspec perlre perlthrtut perltodo perlunicode perlxs perlxs perlxstut
+advpodnames = perlapi perlapio perlcall perlclib perlcompile perldebguts perldbmfilter perldebug perldelta perldiag perlebcdic perlembed perlfilter perlfork perlguts perlhack perlintern perliol perllocale perlnumber perlobj perlpodspec perlre perlthrtut perltodo perlunicode perlxs perlxs perlxstut
archpodnames = perlaix perlamiga perlapollo perlbeos perlbs2000 perlce perlcygwin perldgux perldos perlepoc perlfreebsd perlhpux perlhurd perlirix perlmachten perlmacos perlmint perlmpeix perlnetware perlos2 perlos390 perlos400 perlplan9 perlqnx perlsolaris perltru64 perluts perlvmesa perlvms perlvos perlwin32
histpods = perl5004delta perl5005delta perl561delta perl56delta perl570delta perl571delta perl572delta perl573delta perl58delta perlhist
@@ -35,7 +35,7 @@ ext_xs = IO.xs Socket.xs Opcode.xs dl_none.xs Fcntl.xs POSIX.xs
ext_c = ${ext_xs:%.xs=%.c}
ext_obj = ${ext_xs:%.xs=%.$O}
-obj = av.$O deb.$O doio.$O doop.$O dump.$O globals.$O gv.$O hv.$O locale.$O malloc.$O mathoms.$O mg.$O numeric.$O op.$O pad.$O perlapi.$O perlio.$O perly.$O pp.$O pp_ctl.$O pp_hot.$O pp_pack.$O pp_sort.$O pp_sys.$O reentr.$O regcomp.$O regexec.$O run.$O scope.$O sv.$O taint.$O toke.$O universal.$O utf8.$O util.$O xsutils.$O
+obj = av.$O deb.$O doio.$O doop.$O dump.$O globals.$O gv.$O hv.$O locale.$O malloc.$O mathoms.$O mg.$O numeric.$O op.$O pad.$O perlapi.$O perlio.$O perly.$O pp.$O pp_ctl.$O pp_hot.$O pp_pack.$O pp_sort.$O pp_sys.$O reentr.$O regcomp.$O regexec.$O run.$O scope.$O sv.$O taint.$O toke.$O universal.$O utf8.$O util.$O
OBJS = perl.$O plan9.$O $obj
diff --git a/pod.lst b/pod.lst
index d33c782f03..7470b90e89 100644
--- a/pod.lst
+++ b/pod.lst
@@ -1,6 +1,7 @@
# h - Header
# o - Omit from toc
# r - top level READMEs to be copied/symlinked
+# g - other autogenerated pods
# a - for auxiliary documentation
# number - indent by
# D - this version's perldelta
@@ -10,7 +11,7 @@ h Overview
perl Perl overview (this section)
perlintro Perl introduction for beginners
- perltoc Perl documentation table of contents
+go perltoc Perl documentation table of contents
h Tutorials
@@ -76,7 +77,6 @@ h Reference Manual
perlnumber Perl number semantics
perlthrtut Perl threads tutorial
-2 perlothrtut Old Perl threads tutorial
perlport Perl portability guide
perllocale Perl locale support
@@ -115,8 +115,8 @@ h Internals and C Language Interface
perlreapi Perl regular expression plugin interface
perlreguts Perl regular expression engine internals
- perlapi Perl API listing (autogenerated)
- perlintern Perl internal functions (autogenerated)
+g perlapi Perl API listing (autogenerated)
+g perlintern Perl internal functions (autogenerated)
perliol C API for Perl's implementation of IO in Layers
perlapio Perl internal IO abstraction interface
@@ -205,7 +205,7 @@ r perlsymbian Perl notes for Symbian
r perltru64 Perl notes for Tru64
r perluts Perl notes for UTS
r perlvmesa Perl notes for VM/ESA
-r perlvms Perl notes for VMS
+ perlvms Perl notes for VMS
r perlvos Perl notes for Stratus VOS
r perlwin32 Perl notes for Windows
diff --git a/pod/.gitignore b/pod/.gitignore
index 2e2f9c931a..9ab103cc5c 100644
--- a/pod/.gitignore
+++ b/pod/.gitignore
@@ -7,7 +7,6 @@
/perlce.pod
/perlcn.pod
/perlcygwin.pod
-/perldelta.pod
/perldgux.pod
/perldos.pod
/perlepoc.pod
@@ -34,6 +33,7 @@
/perlriscos.pod
/perlsolaris.pod
/perlsymbian.pod
+/perltoc.pod
/perltru64.pod
/perltw.pod
/perluts.pod
@@ -57,3 +57,8 @@
/podchecker.bat
/podselect
/podselect.bat
+
+# generated
+/perldelta.pod
+/perlapi.pod
+/perlintern.pod
diff --git a/pod/buildtoc b/pod/buildtoc
index 4054fdac43..7b770f2427 100644
--- a/pod/buildtoc
+++ b/pod/buildtoc
@@ -1,23 +1,25 @@
#!/usr/bin/perl -w
use strict;
-use vars qw($masterpodfile %Build %Targets $Verbose $Up %Ignore
+use vars qw($masterpodfile %Build %Targets $Verbose $Quiet $Up %Ignore
@Master %Readmes %Pods %Aux %Readmepods %Pragmata %Modules
- %Copies);
+ %Copies %Generated);
use File::Spec;
use File::Find;
use FindBin;
use Text::Tabs;
use Text::Wrap;
use Getopt::Long;
+use Carp;
no locale;
$Up = File::Spec->updir;
-$masterpodfile = File::Spec->catdir($Up, "pod.lst");
+$masterpodfile = File::Spec->catfile($Up, "pod.lst");
# Generate any/all of these files
# --verbose gives slightly more output
+# --quiet suppresses routine warnings
# --build-all tries to build everything
# --build-foo updates foo as follows
# --showfiles shows the files to be changed
@@ -27,12 +29,12 @@ $masterpodfile = File::Spec->catdir($Up, "pod.lst");
toc => "perltoc.pod",
manifest => File::Spec->catdir($Up, "MANIFEST"),
perlpod => "perl.pod",
- vms => File::Spec->catdir($Up, "vms", "descrip_mms.template"),
- nmake => File::Spec->catdir($Up, "win32", "Makefile"),
- dmake => File::Spec->catdir($Up, "win32", "makefile.mk"),
- podmak => File::Spec->catdir($Up, "win32", "pod.mak"),
+ vms => File::Spec->catfile($Up, "vms", "descrip_mms.template"),
+ nmake => File::Spec->catfile($Up, "win32", "Makefile"),
+ dmake => File::Spec->catfile($Up, "win32", "makefile.mk"),
+ podmak => File::Spec->catfile($Up, "win32", "pod.mak"),
# plan9 => File::Spec->catdir($Up, "plan9", "mkfile"),
- unix => File::Spec->catdir($Up, "Makefile.SH"),
+ unix => File::Spec->catfile($Up, "Makefile.SH"),
# TODO: add roffitall
);
@@ -45,6 +47,7 @@ $0: Usage: $0 [--verbose] [--showfiles] $filesopts
__USAGE__
unless @ARGV
&& GetOptions (verbose => \$Verbose,
+ quiet => \$Quiet,
showfiles => \$showfiles,
map {+"build-$_", \$Build{$_}} @files, 'all');
# Set them all to true
@@ -115,6 +118,7 @@ foreach (<MASTER>) {
$flags{manifest_omit} = 1;
$delta_target = "$filename.pod";
}
+ $Generated{"$filename.pod"}++ if $flags =~ tr/g//d;
if ($flags =~ tr/r//d) {
my $readme = $filename;
@@ -138,8 +142,7 @@ if (defined $delta_source) {
if (defined $delta_target) {
# This way round so that keys can act as a MANIFEST skip list
# Targets will aways be in the pod directory. Currently we can only cope
- # with sources being in the same directory. Fix this and do perlvms.pod
- # with this?
+ # with sources being in the same directory.
$Copies{$delta_target} = $delta_source;
} else {
die "$0: delta source defined but not target";
@@ -202,7 +205,7 @@ close MASTER;
warn "$0: $i exists but is unknown by buildtoc\n"
unless $our_pods{$i};
warn "$0: $i exists but is unknown by ../MANIFEST\n"
- if !$manipods{$i} && !$manireadmes{$i} && !$Copies{$i};
+ if !$manipods{$i} && !$manireadmes{$i} && !$Copies{$i} && !$Generated{$i};
warn "$0: $i exists but is unknown by perl.pod\n"
if !$perlpods{$i} && !exists $sources{$i};
}
@@ -213,6 +216,8 @@ close MASTER;
foreach my $i (sort keys %manipods) {
warn "$0: $i is known by ../MANIFEST but does not exist\n"
unless $disk_pods{$i};
+ warn "$0: $i is known by ../MANIFEST but is marked as generated\n"
+ if $Generated{$i};
}
foreach my $i (sort keys %perlpods) {
warn "$0: $i is known by perl.pod but does not exist\n"
@@ -220,7 +225,7 @@ close MASTER;
}
}
-# Find all the mdoules
+# Find all the modules
{
my @modpods;
find \&getpods => qw(../lib ../ext);
@@ -248,10 +253,12 @@ close MASTER;
if ($line =~ /^=head1\s+NAME\b/) {
push @modpods, $file;
#warn "GOOD $file\n";
+ close F;
return;
}
}
- warn "$0: $file: cannot find =head1 NAME\n";
+ close F;
+ warn "$0: $file: cannot find =head1 NAME\n" unless $Quiet;
}
}
}
@@ -366,6 +373,7 @@ EOPOD2B
s/^\t//gm;
output $_;
output "\n"; # flush $LINE
+ close OUT;
}
# Below are all the auxiliary routines for generating perltoc.pod
@@ -376,6 +384,8 @@ sub podset {
local @ARGV = @_;
my $pod;
+ return unless scalar(@ARGV);
+
while(<>) {
tr/\015//d;
if (s/^=head1 (NAME)\s*/=head2 /) {
@@ -522,10 +532,12 @@ sub generate_manifest {
}
sub generate_manifest_pod {
generate_manifest map {["pod/$_.pod", $Pods{$_}]}
- grep {!$Copies{"$_.pod"}} sort keys %Pods;
+ sort grep {!$Copies{"$_.pod"}} grep {!$Generated{"$_.pod"}} keys %Pods;
}
sub generate_manifest_readme {
- generate_manifest map {["README.$_", $Readmes{$_}]} sort keys %Readmes;
+ generate_manifest sort {$a->[0] cmp $b->[0]}
+ ["README.vms", "Notes about installing the VMS port"],
+ map {["README.$_", $Readmes{$_}]} keys %Readmes;
}
sub generate_roffitall {
@@ -549,14 +561,19 @@ sub generate_descrip_mms_1 {
}
sub generate_descrip_mms_2 {
- map {sprintf <<'SNIP', $_, $_ eq 'perlvms' ? 'vms' : 'pod', $_}
-[.lib.pods]%s.pod : [.%s]%s.pod
- @ If F$Search("[.lib]pods.dir").eqs."" Then Create/Directory [.lib.pods]
- Copy/NoConfirm/Log $(MMS$SOURCE) [.lib.pods]
+ map {<<"SNIP"}
+[.lib.pods]$_.pod : [.pod]$_.pod
+ \@ If F\$Search("[.lib]pods.dir").eqs."" Then Create/Directory [.lib.pods]
+ Copy/NoConfirm/Log \$(MMS\$SOURCE) [.lib.pods]
SNIP
sort keys %Pods, keys %Readmepods;
}
+sub generate_descrip_mms_3 {
+ map qq{\t- If F\$Search("[.pod]$_").nes."" Then Delete/NoConfirm/Log [.pod]$_;*},
+ sort keys %Generated, keys %Copies;
+}
+
sub generate_nmake_1 {
# XXX Fix this with File::Spec
(map {sprintf "\tcopy ..\\README.%-8s ..\\pod\\perl$_.pod\n", $_}
@@ -569,8 +586,8 @@ sub generate_nmake_2 {
# Spot the special case
local $Text::Wrap::columns = 76;
my $line = wrap ("\t ", "\t ",
- join " ", sort keys %Copies,
- map {"perl$_.pod"} "vms", keys %Readmes);
+ join " ", sort keys %Copies, keys %Generated,
+ map {"perl$_.pod"} keys %Readmes);
$line =~ s/$/ \\/mg;
$line;
}
@@ -585,6 +602,13 @@ sub generate_pod_mak {
$line;
}
+sub verify_contiguous {
+ my ($name, $content, $what) = @_;
+ my $sections = () = $content =~ m/\0+/g;
+ croak("$0: $name contains no $what") if $sections < 1;
+ croak("$0: $name contains discontiguous $what") if $sections > 1;
+}
+
sub do_manifest {
my $name = shift;
my @manifest =
@@ -604,9 +628,7 @@ sub do_nmake {
my $makefile = join '', @_;
die "$0: $name contains NUL bytes" if $makefile =~ /\0/;
$makefile =~ s/^\tcopy \.\.\\README.*\n/\0/gm;
- my $sections = () = $makefile =~ m/\0+/g;
- die "$0: $name contains no README copies" if $sections < 1;
- die "$0: $name contains discontiguous README copies" if $sections > 1;
+ verify_contiguous($name, $makefile, 'README copies');
# Now remove the other copies that follow
1 while $makefile =~ s/\0\tcopy .*\n/\0/gm;
$makefile =~ s/\0+/join ("", &generate_nmake_1)/se;
@@ -651,10 +673,7 @@ sub do_vms {
my $makefile = join '', @_;
die "$0: $name contains NUL bytes" if $makefile =~ /\0/;
$makefile =~ s/\npod\d* =[^\n]*/\0/gs;
- my $sections = () = $makefile =~ m/\0+/g;
- die "$0: $name contains no pod assignments" if $sections < 1;
- die "$0: $name contains $sections discontigous pod assignments"
- if $sections > 1;
+ verify_contiguous($name, $makefile, 'pod assignments');
$makefile =~ s/\0+/join "\n", '', &generate_descrip_mms_1/se;
die "$0: $name contains NUL bytes" if $makefile =~ /\0/;
@@ -668,11 +687,15 @@ sub do_vms {
[^\n]+\n # Another line
[^\n]+\Q[.lib.pods]\E\n # ends [.lib.pods]
/\0/gsx;
- $sections = () = $makefile =~ m/\0+/g;
- die "$0: $name contains no copy rules" if $sections < 1;
- die "$0: $name contains $sections discontigous copy rules"
- if $sections > 1;
+ verify_contiguous($name, $makefile, 'copy rules');
$makefile =~ s/\0+/join "\n", '', &generate_descrip_mms_2/se;
+
+# Looking for rules like this:
+# - If F$Search("[.pod]perldelta.pod").nes."" Then Delete/NoConfirm/Log [.pod]perldelta.pod;*
+ $makefile =~ s!(?:\t- If F\$Search\("\[\.pod\]perl[a-z]+\Q.pod").nes."" Then Delete/NoConfirm/Log [.pod]perl\E[a-z]+\.pod;\*\n)+!\0!sg;
+ verify_contiguous($name, $makefile, 'delete rules');
+ $makefile =~ s/\0+/join "\n", &generate_descrip_mms_3, ''/se;
+
$makefile;
}
@@ -681,18 +704,27 @@ sub do_unix {
my $makefile_SH = join '', @_;
die "$0: $name contains NUL bytes" if $makefile_SH =~ /\0/;
- $makefile_SH =~ s/\n\s+-\@test -f \S+ && cd pod && \$\(LNS\) \S+ \S+ && cd \.\. && echo "\S+" >> extra.pods \# See buildtoc\n/\0/gm;
+ $makefile_SH =~ s{^(perltoc_pod_prereqs = extra.pods).*}
+ {join ' ', $1, map "pod/$_",
+ sort keys %Copies, grep {!/perltoc/} keys %Generated
+ }mge;
+
+# pod/perldelta.pod: pod/perl511delta.pod
+# cd pod && $(LNS) perl511delta.pod perldelta.pod
- my $sections = () = $makefile_SH =~ m/\0+/g;
+ $makefile_SH =~ s!(
+pod/perl[a-z0-9_]+\.pod: pod/perl[a-z0-9_]+\.pod
+ \$\(LNS\) perl[a-z0-9_]+\.pod pod/perl[a-z0-9_]+\.pod
+)+!\0!gm;
- die "$0: $name contains no copy rules" if $sections < 1;
- die "$0: $name contains $sections discontigous copy rules"
- if $sections > 1;
+ verify_contiguous($name, $makefile_SH, 'copy rules');
- my @copy_rules = map "\t-\@test -f pod/$Copies{$_} && cd pod && \$(LNS) $Copies{$_} $_ && cd .. && echo \"pod/$_\" >> extra.pods # See buildtoc",
- keys %Copies;
+ my @copy_rules = map "
+pod/$_: pod/$Copies{$_}
+ \$(LNS) $Copies{$_} pod/$_
+", keys %Copies;
- $makefile_SH =~ s/\0+/join "\n", '', @copy_rules, ''/se;
+ $makefile_SH =~ s/\0+/join '', @copy_rules/se;
$makefile_SH;
}
diff --git a/pod/perl.pod b/pod/perl.pod
index 3a10eaa957..7470e99e03 100644
--- a/pod/perl.pod
+++ b/pod/perl.pod
@@ -13,7 +13,7 @@ B<perl> S<[ B<-sTtuUWX> ]>
S<[ B<-S> ]>
S<[ B<-x>[I<dir>] ]>
S<[ B<-i>[I<extension>] ]>
- S<[ B<-e> I<'command'> ] [ B<--> ] [ I<programfile> ] [ I<argument> ]...>
+ S<[ [B<-e>|B<-E>] I<'command'> ] [ B<--> ] [ I<programfile> ] [ I<argument> ]...>
If you're new to Perl, you should start with L<perlintro>, which is a
general intro for beginners and provides some background to help you
@@ -91,7 +91,6 @@ For ease of access, the Perl manual has been split up into several sections.
perlnumber Perl number semantics
perlthrtut Perl threads tutorial
- perlothrtut Old Perl threads tutorial
perlport Perl portability guide
perllocale Perl locale support
diff --git a/pod/perlapi.pod b/pod/perlapi.pod
deleted file mode 100644
index fc51e14034..0000000000
--- a/pod/perlapi.pod
+++ /dev/null
@@ -1,7382 +0,0 @@
--*- buffer-read-only: t -*-
-
-!!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-This file is built by autodoc.pl extracting documentation from the C source
-files.
-
-=head1 NAME
-
-perlapi - autogenerated documentation for the perl public API
-
-=head1 DESCRIPTION
-X<Perl API> X<API> X<api>
-
-This file contains the documentation of the perl public API generated by
-embed.pl, specifically a listing of functions, macros, flags, and variables
-that may be used by extension writers. The interfaces of any functions that
-are not listed here are subject to change without notice. For this reason,
-blindly using functions listed in proto.h is to be avoided when writing
-extensions.
-
-Note that all Perl API global variables must be referenced with the C<PL_>
-prefix. Some macros are provided for compatibility with the older,
-unadorned names, but this support may be disabled in a future release.
-
-Perl was originally written to handle US-ASCII only (that is characters
-whose ordinal numbers are in the range 0 - 127).
-And documentation and comments may still use the term ASCII, when
-sometimes in fact the entire range from 0 - 255 is meant.
-
-Note that Perl can be compiled and run under EBCDIC (See L<perlebcdic>)
-or ASCII. Most of the documentation (and even comments in the code)
-ignore the EBCDIC possibility.
-For almost all purposes the differences are transparent.
-As an example, under EBCDIC,
-instead of UTF-8, UTF-EBCDIC is used to encode Unicode strings, and so
-whenever this documentation refers to C<utf8>
-(and variants of that name, including in function names),
-it also (essentially transparently) means C<UTF-EBCDIC>.
-But the ordinals of characters differ between ASCII, EBCDIC, and
-the UTF- encodings, and a string encoded in UTF-EBCDIC may occupy more bytes
-than in UTF-8.
-
-Also, on some EBCDIC machines, functions that are documented as operating on
-US-ASCII (or Basic Latin in Unicode terminology) may in fact operate on all
-256 characters in the EBCDIC range, not just the subset corresponding to
-US-ASCII.
-
-The listing below is alphabetical, case insensitive.
-
-
-=head1 "Gimme" Values
-
-=over 8
-
-=item GIMME
-X<GIMME>
-
-A backward-compatible version of C<GIMME_V> which can only return
-C<G_SCALAR> or C<G_ARRAY>; in a void context, it returns C<G_SCALAR>.
-Deprecated. Use C<GIMME_V> instead.
-
- U32 GIMME
-
-=for hackers
-Found in file op.h
-
-=item GIMME_V
-X<GIMME_V>
-
-The XSUB-writer's equivalent to Perl's C<wantarray>. Returns C<G_VOID>,
-C<G_SCALAR> or C<G_ARRAY> for void, scalar or list context,
-respectively.
-
- U32 GIMME_V
-
-=for hackers
-Found in file op.h
-
-=item G_ARRAY
-X<G_ARRAY>
-
-Used to indicate list context. See C<GIMME_V>, C<GIMME> and
-L<perlcall>.
-
-=for hackers
-Found in file cop.h
-
-=item G_DISCARD
-X<G_DISCARD>
-
-Indicates that arguments returned from a callback should be discarded. See
-L<perlcall>.
-
-=for hackers
-Found in file cop.h
-
-=item G_EVAL
-X<G_EVAL>
-
-Used to force a Perl C<eval> wrapper around a callback. See
-L<perlcall>.
-
-=for hackers
-Found in file cop.h
-
-=item G_NOARGS
-X<G_NOARGS>
-
-Indicates that no arguments are being sent to a callback. See
-L<perlcall>.
-
-=for hackers
-Found in file cop.h
-
-=item G_SCALAR
-X<G_SCALAR>
-
-Used to indicate scalar context. See C<GIMME_V>, C<GIMME>, and
-L<perlcall>.
-
-=for hackers
-Found in file cop.h
-
-=item G_VOID
-X<G_VOID>
-
-Used to indicate void context. See C<GIMME_V> and L<perlcall>.
-
-=for hackers
-Found in file cop.h
-
-
-=back
-
-=head1 Array Manipulation Functions
-
-=over 8
-
-=item AvFILL
-X<AvFILL>
-
-Same as C<av_len()>. Deprecated, use C<av_len()> instead.
-
- int AvFILL(AV* av)
-
-=for hackers
-Found in file av.h
-
-=item av_clear
-X<av_clear>
-
-Clears an array, making it empty. Does not free the memory used by the
-array itself.
-
- void av_clear(AV *av)
-
-=for hackers
-Found in file av.c
-
-=item av_create_and_push
-X<av_create_and_push>
-
-Push an SV onto the end of the array, creating the array if necessary.
-A small internal helper function to remove a commonly duplicated idiom.
-
-NOTE: this function is experimental and may change or be
-removed without notice.
-
- void av_create_and_push(AV **const avp, SV *const val)
-
-=for hackers
-Found in file av.c
-
-=item av_create_and_unshift_one
-X<av_create_and_unshift_one>
-
-Unshifts an SV onto the beginning of the array, creating the array if
-necessary.
-A small internal helper function to remove a commonly duplicated idiom.
-
-NOTE: this function is experimental and may change or be
-removed without notice.
-
- SV** av_create_and_unshift_one(AV **const avp, SV *const val)
-
-=for hackers
-Found in file av.c
-
-=item av_delete
-X<av_delete>
-
-Deletes the element indexed by C<key> from the array. Returns the
-deleted element. If C<flags> equals C<G_DISCARD>, the element is freed
-and null is returned.
-
- SV* av_delete(AV *av, I32 key, I32 flags)
-
-=for hackers
-Found in file av.c
-
-=item av_exists
-X<av_exists>
-
-Returns true if the element indexed by C<key> has been initialized.
-
-This relies on the fact that uninitialized array elements are set to
-C<&PL_sv_undef>.
-
- bool av_exists(AV *av, I32 key)
-
-=for hackers
-Found in file av.c
-
-=item av_extend
-X<av_extend>
-
-Pre-extend an array. The C<key> is the index to which the array should be
-extended.
-
- void av_extend(AV *av, I32 key)
-
-=for hackers
-Found in file av.c
-
-=item av_fetch
-X<av_fetch>
-
-Returns the SV at the specified index in the array. The C<key> is the
-index. If C<lval> is set then the fetch will be part of a store. Check
-that the return value is non-null before dereferencing it to a C<SV*>.
-
-See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
-more information on how to use this function on tied arrays.
-
- SV** av_fetch(AV *av, I32 key, I32 lval)
-
-=for hackers
-Found in file av.c
-
-=item av_fill
-X<av_fill>
-
-Set the highest index in the array to the given number, equivalent to
-Perl's C<$#array = $fill;>.
-
-The number of elements in the an array will be C<fill + 1> after
-av_fill() returns. If the array was previously shorter then the
-additional elements appended are set to C<PL_sv_undef>. If the array
-was longer, then the excess elements are freed. C<av_fill(av, -1)> is
-the same as C<av_clear(av)>.
-
- void av_fill(AV *av, I32 fill)
-
-=for hackers
-Found in file av.c
-
-=item av_len
-X<av_len>
-
-Returns the highest index in the array. The number of elements in the
-array is C<av_len(av) + 1>. Returns -1 if the array is empty.
-
- I32 av_len(AV *av)
-
-=for hackers
-Found in file av.c
-
-=item av_make
-X<av_make>
-
-Creates a new AV and populates it with a list of SVs. The SVs are copied
-into the array, so they may be freed after the call to av_make. The new AV
-will have a reference count of 1.
-
- AV* av_make(I32 size, SV **strp)
-
-=for hackers
-Found in file av.c
-
-=item av_pop
-X<av_pop>
-
-Pops an SV off the end of the array. Returns C<&PL_sv_undef> if the array
-is empty.
-
- SV* av_pop(AV *av)
-
-=for hackers
-Found in file av.c
-
-=item av_push
-X<av_push>
-
-Pushes an SV onto the end of the array. The array will grow automatically
-to accommodate the addition.
-
- void av_push(AV *av, SV *val)
-
-=for hackers
-Found in file av.c
-
-=item av_shift
-X<av_shift>
-
-Shifts an SV off the beginning of the array. Returns C<&PL_sv_undef> if the
-array is empty.
-
- SV* av_shift(AV *av)
-
-=for hackers
-Found in file av.c
-
-=item av_store
-X<av_store>
-
-Stores an SV in an array. The array index is specified as C<key>. The
-return value will be NULL if the operation failed or if the value did not
-need to be actually stored within the array (as in the case of tied
-arrays). Otherwise it can be dereferenced to get the original C<SV*>. Note
-that the caller is responsible for suitably incrementing the reference
-count of C<val> before the call, and decrementing it if the function
-returned NULL.
-
-See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
-more information on how to use this function on tied arrays.
-
- SV** av_store(AV *av, I32 key, SV *val)
-
-=for hackers
-Found in file av.c
-
-=item av_undef
-X<av_undef>
-
-Undefines the array. Frees the memory used by the array itself.
-
- void av_undef(AV *av)
-
-=for hackers
-Found in file av.c
-
-=item av_unshift
-X<av_unshift>
-
-Unshift the given number of C<undef> values onto the beginning of the
-array. The array will grow automatically to accommodate the addition. You
-must then use C<av_store> to assign values to these new elements.
-
- void av_unshift(AV *av, I32 num)
-
-=for hackers
-Found in file av.c
-
-=item get_av
-X<get_av>
-
-Returns the AV of the specified Perl array. C<flags> are passed to
-C<gv_fetchpv>. If C<GV_ADD> is set and the
-Perl variable does not exist then it will be created. If C<flags> is zero
-and the variable does not exist then NULL is returned.
-
-NOTE: the perl_ form of this function is deprecated.
-
- AV* get_av(const char *name, I32 flags)
-
-=for hackers
-Found in file perl.c
-
-=item newAV
-X<newAV>
-
-Creates a new AV. The reference count is set to 1.
-
- AV* newAV()
-
-=for hackers
-Found in file av.h
-
-=item sortsv
-X<sortsv>
-
-Sort an array. Here is an example:
-
- sortsv(AvARRAY(av), av_len(av)+1, Perl_sv_cmp_locale);
-
-Currently this always uses mergesort. See sortsv_flags for a more
-flexible routine.
-
- void sortsv(SV** array, size_t num_elts, SVCOMPARE_t cmp)
-
-=for hackers
-Found in file pp_sort.c
-
-=item sortsv_flags
-X<sortsv_flags>
-
-Sort an array, with various options.
-
- void sortsv_flags(SV** array, size_t num_elts, SVCOMPARE_t cmp, U32 flags)
-
-=for hackers
-Found in file pp_sort.c
-
-
-=back
-
-=head1 Callback Functions
-
-=over 8
-
-=item call_argv
-X<call_argv>
-
-Performs a callback to the specified Perl sub. See L<perlcall>.
-
-NOTE: the perl_ form of this function is deprecated.
-
- I32 call_argv(const char* sub_name, I32 flags, char** argv)
-
-=for hackers
-Found in file perl.c
-
-=item call_method
-X<call_method>
-
-Performs a callback to the specified Perl method. The blessed object must
-be on the stack. See L<perlcall>.
-
-NOTE: the perl_ form of this function is deprecated.
-
- I32 call_method(const char* methname, I32 flags)
-
-=for hackers
-Found in file perl.c
-
-=item call_pv
-X<call_pv>
-
-Performs a callback to the specified Perl sub. See L<perlcall>.
-
-NOTE: the perl_ form of this function is deprecated.
-
- I32 call_pv(const char* sub_name, I32 flags)
-
-=for hackers
-Found in file perl.c
-
-=item call_sv
-X<call_sv>
-
-Performs a callback to the Perl sub whose name is in the SV. See
-L<perlcall>.
-
-NOTE: the perl_ form of this function is deprecated.
-
- I32 call_sv(SV* sv, VOL I32 flags)
-
-=for hackers
-Found in file perl.c
-
-=item ENTER
-X<ENTER>
-
-Opening bracket on a callback. See C<LEAVE> and L<perlcall>.
-
- ENTER;
-
-=for hackers
-Found in file scope.h
-
-=item eval_pv
-X<eval_pv>
-
-Tells Perl to C<eval> the given string and return an SV* result.
-
-NOTE: the perl_ form of this function is deprecated.
-
- SV* eval_pv(const char* p, I32 croak_on_error)
-
-=for hackers
-Found in file perl.c
-
-=item eval_sv
-X<eval_sv>
-
-Tells Perl to C<eval> the string in the SV.
-
-NOTE: the perl_ form of this function is deprecated.
-
- I32 eval_sv(SV* sv, I32 flags)
-
-=for hackers
-Found in file perl.c
-
-=item FREETMPS
-X<FREETMPS>
-
-Closing bracket for temporaries on a callback. See C<SAVETMPS> and
-L<perlcall>.
-
- FREETMPS;
-
-=for hackers
-Found in file scope.h
-
-=item LEAVE
-X<LEAVE>
-
-Closing bracket on a callback. See C<ENTER> and L<perlcall>.
-
- LEAVE;
-
-=for hackers
-Found in file scope.h
-
-=item SAVETMPS
-X<SAVETMPS>
-
-Opening bracket for temporaries on a callback. See C<FREETMPS> and
-L<perlcall>.
-
- SAVETMPS;
-
-=for hackers
-Found in file scope.h
-
-
-=back
-
-=head1 Character classes
-
-=over 8
-
-=item isALNUM
-X<isALNUM>
-
-Returns a boolean indicating whether the C C<char> is a US-ASCII (Basic Latin)
-alphanumeric character (including underscore) or digit.
-
- bool isALNUM(char ch)
-
-=for hackers
-Found in file handy.h
-
-=item isALPHA
-X<isALPHA>
-
-Returns a boolean indicating whether the C C<char> is a US-ASCII (Basic Latin)
-alphabetic character.
-
- bool isALPHA(char ch)
-
-=for hackers
-Found in file handy.h
-
-=item isDIGIT
-X<isDIGIT>
-
-Returns a boolean indicating whether the C C<char> is a US-ASCII (Basic Latin)
-digit.
-
- bool isDIGIT(char ch)
-
-=for hackers
-Found in file handy.h
-
-=item isLOWER
-X<isLOWER>
-
-Returns a boolean indicating whether the C C<char> is a US-ASCII (Basic Latin)
-lowercase character.
-
- bool isLOWER(char ch)
-
-=for hackers
-Found in file handy.h
-
-=item isSPACE
-X<isSPACE>
-
-Returns a boolean indicating whether the C C<char> is a US-ASCII (Basic Latin)
-whitespace.
-
- bool isSPACE(char ch)
-
-=for hackers
-Found in file handy.h
-
-=item isUPPER
-X<isUPPER>
-
-Returns a boolean indicating whether the C C<char> is a US-ASCII (Basic Latin)
-uppercase character.
-
- bool isUPPER(char ch)
-
-=for hackers
-Found in file handy.h
-
-=item toLOWER
-X<toLOWER>
-
-Converts the specified character to lowercase. Characters outside the
-US-ASCII (Basic Latin) range are viewed as not having any case.
-
- char toLOWER(char ch)
-
-=for hackers
-Found in file handy.h
-
-=item toUPPER
-X<toUPPER>
-
-Converts the specified character to uppercase. Characters outside the
-US-ASCII (Basic Latin) range are viewed as not having any case.
-
- char toUPPER(char ch)
-
-=for hackers
-Found in file handy.h
-
-
-=back
-
-=head1 Cloning an interpreter
-
-=over 8
-
-=item perl_clone
-X<perl_clone>
-
-Create and return a new interpreter by cloning the current one.
-
-perl_clone takes these flags as parameters:
-
-CLONEf_COPY_STACKS - is used to, well, copy the stacks also,
-without it we only clone the data and zero the stacks,
-with it we copy the stacks and the new perl interpreter is
-ready to run at the exact same point as the previous one.
-The pseudo-fork code uses COPY_STACKS while the
-threads->create doesn't.
-
-CLONEf_KEEP_PTR_TABLE
-perl_clone keeps a ptr_table with the pointer of the old
-variable as a key and the new variable as a value,
-this allows it to check if something has been cloned and not
-clone it again but rather just use the value and increase the
-refcount. If KEEP_PTR_TABLE is not set then perl_clone will kill
-the ptr_table using the function
-C<ptr_table_free(PL_ptr_table); PL_ptr_table = NULL;>,
-reason to keep it around is if you want to dup some of your own
-variable who are outside the graph perl scans, example of this
-code is in threads.xs create
-
-CLONEf_CLONE_HOST
-This is a win32 thing, it is ignored on unix, it tells perls
-win32host code (which is c++) to clone itself, this is needed on
-win32 if you want to run two threads at the same time,
-if you just want to do some stuff in a separate perl interpreter
-and then throw it away and return to the original one,
-you don't need to do anything.
-
- PerlInterpreter* perl_clone(PerlInterpreter *proto_perl, UV flags)
-
-=for hackers
-Found in file sv.c
-
-
-=back
-
-=head1 CV Manipulation Functions
-
-=over 8
-
-=item CvSTASH
-X<CvSTASH>
-
-Returns the stash of the CV.
-
- HV* CvSTASH(CV* cv)
-
-=for hackers
-Found in file cv.h
-
-=item get_cv
-X<get_cv>
-
-Uses C<strlen> to get the length of C<name>, then calls C<get_cvn_flags>.
-
-NOTE: the perl_ form of this function is deprecated.
-
- CV* get_cv(const char* name, I32 flags)
-
-=for hackers
-Found in file perl.c
-
-=item get_cvn_flags
-X<get_cvn_flags>
-
-Returns the CV of the specified Perl subroutine. C<flags> are passed to
-C<gv_fetchpvn_flags>. If C<GV_ADD> is set and the Perl subroutine does not
-exist then it will be declared (which has the same effect as saying
-C<sub name;>). If C<GV_ADD> is not set and the subroutine does not exist
-then NULL is returned.
-
-NOTE: the perl_ form of this function is deprecated.
-
- CV* get_cvn_flags(const char* name, STRLEN len, I32 flags)
-
-=for hackers
-Found in file perl.c
-
-
-=back
-
-=head1 Embedding Functions
-
-=over 8
-
-=item cv_undef
-X<cv_undef>
-
-Clear out all the active components of a CV. This can happen either
-by an explicit C<undef &foo>, or by the reference count going to zero.
-In the former case, we keep the CvOUTSIDE pointer, so that any anonymous
-children can still follow the full lexical scope chain.
-
- void cv_undef(CV* cv)
-
-=for hackers
-Found in file op.c
-
-=item load_module
-X<load_module>
-
-Loads the module whose name is pointed to by the string part of name.
-Note that the actual module name, not its filename, should be given.
-Eg, "Foo::Bar" instead of "Foo/Bar.pm". flags can be any of
-PERL_LOADMOD_DENY, PERL_LOADMOD_NOIMPORT, or PERL_LOADMOD_IMPORT_OPS
-(or 0 for no flags). ver, if specified, provides version semantics
-similar to C<use Foo::Bar VERSION>. The optional trailing SV*
-arguments can be used to specify arguments to the module's import()
-method, similar to C<use Foo::Bar VERSION LIST>.
-
- void load_module(U32 flags, SV* name, SV* ver, ...)
-
-=for hackers
-Found in file op.c
-
-=item nothreadhook
-X<nothreadhook>
-
-Stub that provides thread hook for perl_destruct when there are
-no threads.
-
- int nothreadhook()
-
-=for hackers
-Found in file perl.c
-
-=item perl_alloc
-X<perl_alloc>
-
-Allocates a new Perl interpreter. See L<perlembed>.
-
- PerlInterpreter* perl_alloc()
-
-=for hackers
-Found in file perl.c
-
-=item perl_construct
-X<perl_construct>
-
-Initializes a new Perl interpreter. See L<perlembed>.
-
- void perl_construct(PerlInterpreter *my_perl)
-
-=for hackers
-Found in file perl.c
-
-=item perl_destruct
-X<perl_destruct>
-
-Shuts down a Perl interpreter. See L<perlembed>.
-
- int perl_destruct(PerlInterpreter *my_perl)
-
-=for hackers
-Found in file perl.c
-
-=item perl_free
-X<perl_free>
-
-Releases a Perl interpreter. See L<perlembed>.
-
- void perl_free(PerlInterpreter *my_perl)
-
-=for hackers
-Found in file perl.c
-
-=item perl_parse
-X<perl_parse>
-
-Tells a Perl interpreter to parse a Perl script. See L<perlembed>.
-
- int perl_parse(PerlInterpreter *my_perl, XSINIT_t xsinit, int argc, char** argv, char** env)
-
-=for hackers
-Found in file perl.c
-
-=item perl_run
-X<perl_run>
-
-Tells a Perl interpreter to run. See L<perlembed>.
-
- int perl_run(PerlInterpreter *my_perl)
-
-=for hackers
-Found in file perl.c
-
-=item require_pv
-X<require_pv>
-
-Tells Perl to C<require> the file named by the string argument. It is
-analogous to the Perl code C<eval "require '$file'">. It's even
-implemented that way; consider using load_module instead.
-
-NOTE: the perl_ form of this function is deprecated.
-
- void require_pv(const char* pv)
-
-=for hackers
-Found in file perl.c
-
-
-=back
-
-=head1 Functions in file dump.c
-
-
-=over 8
-
-=item pv_display
-X<pv_display>
-
-Similar to
-
- pv_escape(dsv,pv,cur,pvlim,PERL_PV_ESCAPE_QUOTE);
-
-except that an additional "\0" will be appended to the string when
-len > cur and pv[cur] is "\0".
-
-Note that the final string may be up to 7 chars longer than pvlim.
-
- char* pv_display(SV *dsv, const char *pv, STRLEN cur, STRLEN len, STRLEN pvlim)
-
-=for hackers
-Found in file dump.c
-
-=item pv_escape
-X<pv_escape>
-
-Escapes at most the first "count" chars of pv and puts the results into
-dsv such that the size of the escaped string will not exceed "max" chars
-and will not contain any incomplete escape sequences.
-
-If flags contains PERL_PV_ESCAPE_QUOTE then any double quotes in the string
-will also be escaped.
-
-Normally the SV will be cleared before the escaped string is prepared,
-but when PERL_PV_ESCAPE_NOCLEAR is set this will not occur.
-
-If PERL_PV_ESCAPE_UNI is set then the input string is treated as Unicode,
-if PERL_PV_ESCAPE_UNI_DETECT is set then the input string is scanned
-using C<is_utf8_string()> to determine if it is Unicode.
-
-If PERL_PV_ESCAPE_ALL is set then all input chars will be output
-using C<\x01F1> style escapes, otherwise only chars above 255 will be
-escaped using this style, other non printable chars will use octal or
-common escaped patterns like C<\n>. If PERL_PV_ESCAPE_NOBACKSLASH
-then all chars below 255 will be treated as printable and
-will be output as literals.
-
-If PERL_PV_ESCAPE_FIRSTCHAR is set then only the first char of the
-string will be escaped, regardles of max. If the string is utf8 and
-the chars value is >255 then it will be returned as a plain hex
-sequence. Thus the output will either be a single char,
-an octal escape sequence, a special escape like C<\n> or a 3 or
-more digit hex value.
-
-If PERL_PV_ESCAPE_RE is set then the escape char used will be a '%' and
-not a '\\'. This is because regexes very often contain backslashed
-sequences, whereas '%' is not a particularly common character in patterns.
-
-Returns a pointer to the escaped text as held by dsv.
-
- char* pv_escape(SV *dsv, char const * const str, const STRLEN count, const STRLEN max, STRLEN * const escaped, const U32 flags)
-
-=for hackers
-Found in file dump.c
-
-=item pv_pretty
-X<pv_pretty>
-
-Converts a string into something presentable, handling escaping via
-pv_escape() and supporting quoting and ellipses.
-
-If the PERL_PV_PRETTY_QUOTE flag is set then the result will be
-double quoted with any double quotes in the string escaped. Otherwise
-if the PERL_PV_PRETTY_LTGT flag is set then the result be wrapped in
-angle brackets.
-
-If the PERL_PV_PRETTY_ELLIPSES flag is set and not all characters in
-string were output then an ellipsis C<...> will be appended to the
-string. Note that this happens AFTER it has been quoted.
-
-If start_color is non-null then it will be inserted after the opening
-quote (if there is one) but before the escaped text. If end_color
-is non-null then it will be inserted after the escaped text but before
-any quotes or ellipses.
-
-Returns a pointer to the prettified text as held by dsv.
-
- char* pv_pretty(SV *dsv, char const * const str, const STRLEN count, const STRLEN max, char const * const start_color, char const * const end_color, const U32 flags)
-
-=for hackers
-Found in file dump.c
-
-
-=back
-
-=head1 Functions in file mathoms.c
-
-
-=over 8
-
-=item gv_fetchmethod
-X<gv_fetchmethod>
-
-See L<gv_fetchmethod_autoload>.
-
- GV* gv_fetchmethod(HV* stash, const char* name)
-
-=for hackers
-Found in file mathoms.c
-
-=item pack_cat
-X<pack_cat>
-
-The engine implementing pack() Perl function. Note: parameters next_in_list and
-flags are not used. This call should not be used; use packlist instead.
-
- void pack_cat(SV *cat, const char *pat, const char *patend, SV **beglist, SV **endlist, SV ***next_in_list, U32 flags)
-
-=for hackers
-Found in file mathoms.c
-
-=item sv_2pvbyte_nolen
-X<sv_2pvbyte_nolen>
-
-Return a pointer to the byte-encoded representation of the SV.
-May cause the SV to be downgraded from UTF-8 as a side-effect.
-
-Usually accessed via the C<SvPVbyte_nolen> macro.
-
- char* sv_2pvbyte_nolen(SV* sv)
-
-=for hackers
-Found in file mathoms.c
-
-=item sv_2pvutf8_nolen
-X<sv_2pvutf8_nolen>
-
-Return a pointer to the UTF-8-encoded representation of the SV.
-May cause the SV to be upgraded to UTF-8 as a side-effect.
-
-Usually accessed via the C<SvPVutf8_nolen> macro.
-
- char* sv_2pvutf8_nolen(SV* sv)
-
-=for hackers
-Found in file mathoms.c
-
-=item sv_2pv_nolen
-X<sv_2pv_nolen>
-
-Like C<sv_2pv()>, but doesn't return the length too. You should usually
-use the macro wrapper C<SvPV_nolen(sv)> instead.
- char* sv_2pv_nolen(SV* sv)
-
-=for hackers
-Found in file mathoms.c
-
-=item sv_catpvn_mg
-X<sv_catpvn_mg>
-
-Like C<sv_catpvn>, but also handles 'set' magic.
-
- void sv_catpvn_mg(SV *sv, const char *ptr, STRLEN len)
-
-=for hackers
-Found in file mathoms.c
-
-=item sv_catsv_mg
-X<sv_catsv_mg>
-
-Like C<sv_catsv>, but also handles 'set' magic.
-
- void sv_catsv_mg(SV *dsv, SV *ssv)
-
-=for hackers
-Found in file mathoms.c
-
-=item sv_force_normal
-X<sv_force_normal>
-
-Undo various types of fakery on an SV: if the PV is a shared string, make
-a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
-an xpvmg. See also C<sv_force_normal_flags>.
-
- void sv_force_normal(SV *sv)
-
-=for hackers
-Found in file mathoms.c
-
-=item sv_iv
-X<sv_iv>
-
-A private implementation of the C<SvIVx> macro for compilers which can't
-cope with complex macro expressions. Always use the macro instead.
-
- IV sv_iv(SV* sv)
-
-=for hackers
-Found in file mathoms.c
-
-=item sv_nolocking
-X<sv_nolocking>
-
-Dummy routine which "locks" an SV when there is no locking module present.
-Exists to avoid test for a NULL function pointer and because it could
-potentially warn under some level of strict-ness.
-
-"Superseded" by sv_nosharing().
-
- void sv_nolocking(SV *sv)
-
-=for hackers
-Found in file mathoms.c
-
-=item sv_nounlocking
-X<sv_nounlocking>
-
-Dummy routine which "unlocks" an SV when there is no locking module present.
-Exists to avoid test for a NULL function pointer and because it could
-potentially warn under some level of strict-ness.
-
-"Superseded" by sv_nosharing().
-
- void sv_nounlocking(SV *sv)
-
-=for hackers
-Found in file mathoms.c
-
-=item sv_nv
-X<sv_nv>
-
-A private implementation of the C<SvNVx> macro for compilers which can't
-cope with complex macro expressions. Always use the macro instead.
-
- NV sv_nv(SV* sv)
-
-=for hackers
-Found in file mathoms.c
-
-=item sv_pv
-X<sv_pv>
-
-Use the C<SvPV_nolen> macro instead
-
- char* sv_pv(SV *sv)
-
-=for hackers
-Found in file mathoms.c
-
-=item sv_pvbyte
-X<sv_pvbyte>
-
-Use C<SvPVbyte_nolen> instead.
-
- char* sv_pvbyte(SV *sv)
-
-=for hackers
-Found in file mathoms.c
-
-=item sv_pvbyten
-X<sv_pvbyten>
-
-A private implementation of the C<SvPVbyte> macro for compilers
-which can't cope with complex macro expressions. Always use the macro
-instead.
-
- char* sv_pvbyten(SV *sv, STRLEN *lp)
-
-=for hackers
-Found in file mathoms.c
-
-=item sv_pvn
-X<sv_pvn>
-
-A private implementation of the C<SvPV> macro for compilers which can't
-cope with complex macro expressions. Always use the macro instead.
-
- char* sv_pvn(SV *sv, STRLEN *lp)
-
-=for hackers
-Found in file mathoms.c
-
-=item sv_pvutf8
-X<sv_pvutf8>
-
-Use the C<SvPVutf8_nolen> macro instead
-
- char* sv_pvutf8(SV *sv)
-
-=for hackers
-Found in file mathoms.c
-
-=item sv_pvutf8n
-X<sv_pvutf8n>
-
-A private implementation of the C<SvPVutf8> macro for compilers
-which can't cope with complex macro expressions. Always use the macro
-instead.
-
- char* sv_pvutf8n(SV *sv, STRLEN *lp)
-
-=for hackers
-Found in file mathoms.c
-
-=item sv_taint
-X<sv_taint>
-
-Taint an SV. Use C<SvTAINTED_on> instead.
- void sv_taint(SV* sv)
-
-=for hackers
-Found in file mathoms.c
-
-=item sv_unref
-X<sv_unref>
-
-Unsets the RV status of the SV, and decrements the reference count of
-whatever was being referenced by the RV. This can almost be thought of
-as a reversal of C<newSVrv>. This is C<sv_unref_flags> with the C<flag>
-being zero. See C<SvROK_off>.
-
- void sv_unref(SV* sv)
-
-=for hackers
-Found in file mathoms.c
-
-=item sv_usepvn
-X<sv_usepvn>
-
-Tells an SV to use C<ptr> to find its string value. Implemented by
-calling C<sv_usepvn_flags> with C<flags> of 0, hence does not handle 'set'
-magic. See C<sv_usepvn_flags>.
-
- void sv_usepvn(SV* sv, char* ptr, STRLEN len)
-
-=for hackers
-Found in file mathoms.c
-
-=item sv_usepvn_mg
-X<sv_usepvn_mg>
-
-Like C<sv_usepvn>, but also handles 'set' magic.
-
- void sv_usepvn_mg(SV *sv, char *ptr, STRLEN len)
-
-=for hackers
-Found in file mathoms.c
-
-=item sv_uv
-X<sv_uv>
-
-A private implementation of the C<SvUVx> macro for compilers which can't
-cope with complex macro expressions. Always use the macro instead.
-
- UV sv_uv(SV* sv)
-
-=for hackers
-Found in file mathoms.c
-
-=item unpack_str
-X<unpack_str>
-
-The engine implementing unpack() Perl function. Note: parameters strbeg, new_s
-and ocnt are not used. This call should not be used, use unpackstring instead.
-
- I32 unpack_str(const char *pat, const char *patend, const char *s, const char *strbeg, const char *strend, char **new_s, I32 ocnt, U32 flags)
-
-=for hackers
-Found in file mathoms.c
-
-
-=back
-
-=head1 Functions in file pp_ctl.c
-
-
-=over 8
-
-=item find_runcv
-X<find_runcv>
-
-Locate the CV corresponding to the currently executing sub or eval.
-If db_seqp is non_null, skip CVs that are in the DB package and populate
-*db_seqp with the cop sequence number at the point that the DB:: code was
-entered. (allows debuggers to eval in the scope of the breakpoint rather
-than in the scope of the debugger itself).
-
- CV* find_runcv(U32 *db_seqp)
-
-=for hackers
-Found in file pp_ctl.c
-
-
-=back
-
-=head1 Functions in file pp_pack.c
-
-
-=over 8
-
-=item packlist
-X<packlist>
-
-The engine implementing pack() Perl function.
-
- void packlist(SV *cat, const char *pat, const char *patend, SV **beglist, SV **endlist)
-
-=for hackers
-Found in file pp_pack.c
-
-=item unpackstring
-X<unpackstring>
-
-The engine implementing unpack() Perl function. C<unpackstring> puts the
-extracted list items on the stack and returns the number of elements.
-Issue C<PUTBACK> before and C<SPAGAIN> after the call to this function.
-
- I32 unpackstring(const char *pat, const char *patend, const char *s, const char *strend, U32 flags)
-
-=for hackers
-Found in file pp_pack.c
-
-
-=back
-
-=head1 Functions in file pp_sys.c
-
-
-=over 8
-
-=item setdefout
-X<setdefout>
-
-Sets PL_defoutgv, the default file handle for output, to the passed in
-typeglob. As PL_defoutgv "owns" a reference on its typeglob, the reference
-count of the passed in typeglob is increased by one, and the reference count
-of the typeglob that PL_defoutgv points to is decreased by one.
-
- void setdefout(GV* gv)
-
-=for hackers
-Found in file pp_sys.c
-
-
-=back
-
-=head1 GV Functions
-
-=over 8
-
-=item GvSV
-X<GvSV>
-
-Return the SV from the GV.
-
- SV* GvSV(GV* gv)
-
-=for hackers
-Found in file gv.h
-
-=item gv_const_sv
-X<gv_const_sv>
-
-If C<gv> is a typeglob whose subroutine entry is a constant sub eligible for
-inlining, or C<gv> is a placeholder reference that would be promoted to such
-a typeglob, then returns the value returned by the sub. Otherwise, returns
-NULL.
-
- SV* gv_const_sv(GV* gv)
-
-=for hackers
-Found in file gv.c
-
-=item gv_fetchmeth
-X<gv_fetchmeth>
-
-Returns the glob with the given C<name> and a defined subroutine or
-C<NULL>. The glob lives in the given C<stash>, or in the stashes
-accessible via @ISA and UNIVERSAL::.
-
-The argument C<level> should be either 0 or -1. If C<level==0>, as a
-side-effect creates a glob with the given C<name> in the given C<stash>
-which in the case of success contains an alias for the subroutine, and sets
-up caching info for this glob.
-
-This function grants C<"SUPER"> token as a postfix of the stash name. The
-GV returned from C<gv_fetchmeth> may be a method cache entry, which is not
-visible to Perl code. So when calling C<call_sv>, you should not use
-the GV directly; instead, you should use the method's CV, which can be
-obtained from the GV with the C<GvCV> macro.
-
- GV* gv_fetchmeth(HV* stash, const char* name, STRLEN len, I32 level)
-
-=for hackers
-Found in file gv.c
-
-=item gv_fetchmethod_autoload
-X<gv_fetchmethod_autoload>
-
-Returns the glob which contains the subroutine to call to invoke the method
-on the C<stash>. In fact in the presence of autoloading this may be the
-glob for "AUTOLOAD". In this case the corresponding variable $AUTOLOAD is
-already setup.
-
-The third parameter of C<gv_fetchmethod_autoload> determines whether
-AUTOLOAD lookup is performed if the given method is not present: non-zero
-means yes, look for AUTOLOAD; zero means no, don't look for AUTOLOAD.
-Calling C<gv_fetchmethod> is equivalent to calling C<gv_fetchmethod_autoload>
-with a non-zero C<autoload> parameter.
-
-These functions grant C<"SUPER"> token as a prefix of the method name. Note
-that if you want to keep the returned glob for a long time, you need to
-check for it being "AUTOLOAD", since at the later time the call may load a
-different subroutine due to $AUTOLOAD changing its value. Use the glob
-created via a side effect to do this.
-
-These functions have the same side-effects and as C<gv_fetchmeth> with
-C<level==0>. C<name> should be writable if contains C<':'> or C<'
-''>. The warning against passing the GV returned by C<gv_fetchmeth> to
-C<call_sv> apply equally to these functions.
-
- GV* gv_fetchmethod_autoload(HV* stash, const char* name, I32 autoload)
-
-=for hackers
-Found in file gv.c
-
-=item gv_fetchmeth_autoload
-X<gv_fetchmeth_autoload>
-
-Same as gv_fetchmeth(), but looks for autoloaded subroutines too.
-Returns a glob for the subroutine.
-
-For an autoloaded subroutine without a GV, will create a GV even
-if C<level < 0>. For an autoloaded subroutine without a stub, GvCV()
-of the result may be zero.
-
- GV* gv_fetchmeth_autoload(HV* stash, const char* name, STRLEN len, I32 level)
-
-=for hackers
-Found in file gv.c
-
-=item gv_stashpv
-X<gv_stashpv>
-
-Returns a pointer to the stash for a specified package. Uses C<strlen> to
-determine the length of C<name>, then calls C<gv_stashpvn()>.
-
- HV* gv_stashpv(const char* name, I32 flags)
-
-=for hackers
-Found in file gv.c
-
-=item gv_stashpvn
-X<gv_stashpvn>
-
-Returns a pointer to the stash for a specified package. The C<namelen>
-parameter indicates the length of the C<name>, in bytes. C<flags> is passed
-to C<gv_fetchpvn_flags()>, so if set to C<GV_ADD> then the package will be
-created if it does not already exist. If the package does not exist and
-C<flags> is 0 (or any other setting that does not create packages) then NULL
-is returned.
-
-
- HV* gv_stashpvn(const char* name, U32 namelen, I32 flags)
-
-=for hackers
-Found in file gv.c
-
-=item gv_stashpvs
-X<gv_stashpvs>
-
-Like C<gv_stashpvn>, but takes a literal string instead of a string/length pair.
-
- HV* gv_stashpvs(const char* name, I32 create)
-
-=for hackers
-Found in file handy.h
-
-=item gv_stashsv
-X<gv_stashsv>
-
-Returns a pointer to the stash for a specified package. See C<gv_stashpvn>.
-
- HV* gv_stashsv(SV* sv, I32 flags)
-
-=for hackers
-Found in file gv.c
-
-
-=back
-
-=head1 Handy Values
-
-=over 8
-
-=item Nullav
-X<Nullav>
-
-Null AV pointer.
-
-(deprecated - use C<(AV *)NULL> instead)
-
-=for hackers
-Found in file av.h
-
-=item Nullch
-X<Nullch>
-
-Null character pointer. (No longer available when C<PERL_CORE> is defined.)
-
-=for hackers
-Found in file handy.h
-
-=item Nullcv
-X<Nullcv>
-
-Null CV pointer.
-
-(deprecated - use C<(CV *)NULL> instead)
-
-=for hackers
-Found in file cv.h
-
-=item Nullhv
-X<Nullhv>
-
-Null HV pointer.
-
-(deprecated - use C<(HV *)NULL> instead)
-
-=for hackers
-Found in file hv.h
-
-=item Nullsv
-X<Nullsv>
-
-Null SV pointer. (No longer available when C<PERL_CORE> is defined.)
-
-=for hackers
-Found in file handy.h
-
-
-=back
-
-=head1 Hash Manipulation Functions
-
-=over 8
-
-=item get_hv
-X<get_hv>
-
-Returns the HV of the specified Perl hash. C<flags> are passed to
-C<gv_fetchpv>. If C<GV_ADD> is set and the
-Perl variable does not exist then it will be created. If C<flags> is zero
-and the variable does not exist then NULL is returned.
-
-NOTE: the perl_ form of this function is deprecated.
-
- HV* get_hv(const char *name, I32 flags)
-
-=for hackers
-Found in file perl.c
-
-=item HEf_SVKEY
-X<HEf_SVKEY>
-
-This flag, used in the length slot of hash entries and magic structures,
-specifies the structure contains an C<SV*> pointer where a C<char*> pointer
-is to be expected. (For information only--not to be used).
-
-=for hackers
-Found in file hv.h
-
-=item HeHASH
-X<HeHASH>
-
-Returns the computed hash stored in the hash entry.
-
- U32 HeHASH(HE* he)
-
-=for hackers
-Found in file hv.h
-
-=item HeKEY
-X<HeKEY>
-
-Returns the actual pointer stored in the key slot of the hash entry. The
-pointer may be either C<char*> or C<SV*>, depending on the value of
-C<HeKLEN()>. Can be assigned to. The C<HePV()> or C<HeSVKEY()> macros are
-usually preferable for finding the value of a key.
-
- void* HeKEY(HE* he)
-
-=for hackers
-Found in file hv.h
-
-=item HeKLEN
-X<HeKLEN>
-
-If this is negative, and amounts to C<HEf_SVKEY>, it indicates the entry
-holds an C<SV*> key. Otherwise, holds the actual length of the key. Can
-be assigned to. The C<HePV()> macro is usually preferable for finding key
-lengths.
-
- STRLEN HeKLEN(HE* he)
-
-=for hackers
-Found in file hv.h
-
-=item HePV
-X<HePV>
-
-Returns the key slot of the hash entry as a C<char*> value, doing any
-necessary dereferencing of possibly C<SV*> keys. The length of the string
-is placed in C<len> (this is a macro, so do I<not> use C<&len>). If you do
-not care about what the length of the key is, you may use the global
-variable C<PL_na>, though this is rather less efficient than using a local
-variable. Remember though, that hash keys in perl are free to contain
-embedded nulls, so using C<strlen()> or similar is not a good way to find
-the length of hash keys. This is very similar to the C<SvPV()> macro
-described elsewhere in this document. See also C<HeUTF8>.
-
-If you are using C<HePV> to get values to pass to C<newSVpvn()> to create a
-new SV, you should consider using C<newSVhek(HeKEY_hek(he))> as it is more
-efficient.
-
- char* HePV(HE* he, STRLEN len)
-
-=for hackers
-Found in file hv.h
-
-=item HeSVKEY
-X<HeSVKEY>
-
-Returns the key as an C<SV*>, or C<NULL> if the hash entry does not
-contain an C<SV*> key.
-
- SV* HeSVKEY(HE* he)
-
-=for hackers
-Found in file hv.h
-
-=item HeSVKEY_force
-X<HeSVKEY_force>
-
-Returns the key as an C<SV*>. Will create and return a temporary mortal
-C<SV*> if the hash entry contains only a C<char*> key.
-
- SV* HeSVKEY_force(HE* he)
-
-=for hackers
-Found in file hv.h
-
-=item HeSVKEY_set
-X<HeSVKEY_set>
-
-Sets the key to a given C<SV*>, taking care to set the appropriate flags to
-indicate the presence of an C<SV*> key, and returns the same
-C<SV*>.
-
- SV* HeSVKEY_set(HE* he, SV* sv)
-
-=for hackers
-Found in file hv.h
-
-=item HeUTF8
-X<HeUTF8>
-
-Returns whether the C<char *> value returned by C<HePV> is encoded in UTF-8,
-doing any necessary dereferencing of possibly C<SV*> keys. The value returned
-will be 0 or non-0, not necessarily 1 (or even a value with any low bits set),
-so B<do not> blindly assign this to a C<bool> variable, as C<bool> may be a
-typedef for C<char>.
-
- char* HeUTF8(HE* he, STRLEN len)
-
-=for hackers
-Found in file hv.h
-
-=item HeVAL
-X<HeVAL>
-
-Returns the value slot (type C<SV*>) stored in the hash entry.
-
- SV* HeVAL(HE* he)
-
-=for hackers
-Found in file hv.h
-
-=item HvNAME
-X<HvNAME>
-
-Returns the package name of a stash, or NULL if C<stash> isn't a stash.
-See C<SvSTASH>, C<CvSTASH>.
-
- char* HvNAME(HV* stash)
-
-=for hackers
-Found in file hv.h
-
-=item hv_assert
-X<hv_assert>
-
-Check that a hash is in an internally consistent state.
-
- void hv_assert(HV *hv)
-
-=for hackers
-Found in file hv.c
-
-=item hv_clear
-X<hv_clear>
-
-Clears a hash, making it empty.
-
- void hv_clear(HV *hv)
-
-=for hackers
-Found in file hv.c
-
-=item hv_clear_placeholders
-X<hv_clear_placeholders>
-
-Clears any placeholders from a hash. If a restricted hash has any of its keys
-marked as readonly and the key is subsequently deleted, the key is not actually
-deleted but is marked by assigning it a value of &PL_sv_placeholder. This tags
-it so it will be ignored by future operations such as iterating over the hash,
-but will still allow the hash to have a value reassigned to the key at some
-future point. This function clears any such placeholder keys from the hash.
-See Hash::Util::lock_keys() for an example of its use.
-
- void hv_clear_placeholders(HV *hv)
-
-=for hackers
-Found in file hv.c
-
-=item hv_delete
-X<hv_delete>
-
-Deletes a key/value pair in the hash. The value SV is removed from the
-hash and returned to the caller. The C<klen> is the length of the key.
-The C<flags> value will normally be zero; if set to G_DISCARD then NULL
-will be returned.
-
- SV* hv_delete(HV *hv, const char *key, I32 klen, I32 flags)
-
-=for hackers
-Found in file hv.c
-
-=item hv_delete_ent
-X<hv_delete_ent>
-
-Deletes a key/value pair in the hash. The value SV is removed from the
-hash and returned to the caller. The C<flags> value will normally be zero;
-if set to G_DISCARD then NULL will be returned. C<hash> can be a valid
-precomputed hash value, or 0 to ask for it to be computed.
-
- SV* hv_delete_ent(HV *hv, SV *keysv, I32 flags, U32 hash)
-
-=for hackers
-Found in file hv.c
-
-=item hv_exists
-X<hv_exists>
-
-Returns a boolean indicating whether the specified hash key exists. The
-C<klen> is the length of the key.
-
- bool hv_exists(HV *hv, const char *key, I32 klen)
-
-=for hackers
-Found in file hv.c
-
-=item hv_exists_ent
-X<hv_exists_ent>
-
-Returns a boolean indicating whether the specified hash key exists. C<hash>
-can be a valid precomputed hash value, or 0 to ask for it to be
-computed.
-
- bool hv_exists_ent(HV *hv, SV *keysv, U32 hash)
-
-=for hackers
-Found in file hv.c
-
-=item hv_fetch
-X<hv_fetch>
-
-Returns the SV which corresponds to the specified key in the hash. The
-C<klen> is the length of the key. If C<lval> is set then the fetch will be
-part of a store. Check that the return value is non-null before
-dereferencing it to an C<SV*>.
-
-See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
-information on how to use this function on tied hashes.
-
- SV** hv_fetch(HV *hv, const char *key, I32 klen, I32 lval)
-
-=for hackers
-Found in file hv.c
-
-=item hv_fetchs
-X<hv_fetchs>
-
-Like C<hv_fetch>, but takes a literal string instead of a string/length pair.
-
- SV** hv_fetchs(HV* tb, const char* key, I32 lval)
-
-=for hackers
-Found in file handy.h
-
-=item hv_fetch_ent
-X<hv_fetch_ent>
-
-Returns the hash entry which corresponds to the specified key in the hash.
-C<hash> must be a valid precomputed hash number for the given C<key>, or 0
-if you want the function to compute it. IF C<lval> is set then the fetch
-will be part of a store. Make sure the return value is non-null before
-accessing it. The return value when C<tb> is a tied hash is a pointer to a
-static location, so be sure to make a copy of the structure if you need to
-store it somewhere.
-
-See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
-information on how to use this function on tied hashes.
-
- HE* hv_fetch_ent(HV *hv, SV *keysv, I32 lval, U32 hash)
-
-=for hackers
-Found in file hv.c
-
-=item hv_iterinit
-X<hv_iterinit>
-
-Prepares a starting point to traverse a hash table. Returns the number of
-keys in the hash (i.e. the same as C<HvKEYS(tb)>). The return value is
-currently only meaningful for hashes without tie magic.
-
-NOTE: Before version 5.004_65, C<hv_iterinit> used to return the number of
-hash buckets that happen to be in use. If you still need that esoteric
-value, you can get it through the macro C<HvFILL(tb)>.
-
-
- I32 hv_iterinit(HV *hv)
-
-=for hackers
-Found in file hv.c
-
-=item hv_iterkey
-X<hv_iterkey>
-
-Returns the key from the current position of the hash iterator. See
-C<hv_iterinit>.
-
- char* hv_iterkey(HE* entry, I32* retlen)
-
-=for hackers
-Found in file hv.c
-
-=item hv_iterkeysv
-X<hv_iterkeysv>
-
-Returns the key as an C<SV*> from the current position of the hash
-iterator. The return value will always be a mortal copy of the key. Also
-see C<hv_iterinit>.
-
- SV* hv_iterkeysv(HE* entry)
-
-=for hackers
-Found in file hv.c
-
-=item hv_iternext
-X<hv_iternext>
-
-Returns entries from a hash iterator. See C<hv_iterinit>.
-
-You may call C<hv_delete> or C<hv_delete_ent> on the hash entry that the
-iterator currently points to, without losing your place or invalidating your
-iterator. Note that in this case the current entry is deleted from the hash
-with your iterator holding the last reference to it. Your iterator is flagged
-to free the entry on the next call to C<hv_iternext>, so you must not discard
-your iterator immediately else the entry will leak - call C<hv_iternext> to
-trigger the resource deallocation.
-
- HE* hv_iternext(HV *hv)
-
-=for hackers
-Found in file hv.c
-
-=item hv_iternextsv
-X<hv_iternextsv>
-
-Performs an C<hv_iternext>, C<hv_iterkey>, and C<hv_iterval> in one
-operation.
-
- SV* hv_iternextsv(HV *hv, char **key, I32 *retlen)
-
-=for hackers
-Found in file hv.c
-
-=item hv_iternext_flags
-X<hv_iternext_flags>
-
-Returns entries from a hash iterator. See C<hv_iterinit> and C<hv_iternext>.
-The C<flags> value will normally be zero; if HV_ITERNEXT_WANTPLACEHOLDERS is
-set the placeholders keys (for restricted hashes) will be returned in addition
-to normal keys. By default placeholders are automatically skipped over.
-Currently a placeholder is implemented with a value that is
-C<&Perl_sv_placeholder>. Note that the implementation of placeholders and
-restricted hashes may change, and the implementation currently is
-insufficiently abstracted for any change to be tidy.
-
-NOTE: this function is experimental and may change or be
-removed without notice.
-
- HE* hv_iternext_flags(HV *hv, I32 flags)
-
-=for hackers
-Found in file hv.c
-
-=item hv_iterval
-X<hv_iterval>
-
-Returns the value from the current position of the hash iterator. See
-C<hv_iterkey>.
-
- SV* hv_iterval(HV *hv, HE *entry)
-
-=for hackers
-Found in file hv.c
-
-=item hv_magic
-X<hv_magic>
-
-Adds magic to a hash. See C<sv_magic>.
-
- void hv_magic(HV *hv, GV *gv, int how)
-
-=for hackers
-Found in file hv.c
-
-=item hv_scalar
-X<hv_scalar>
-
-Evaluates the hash in scalar context and returns the result. Handles magic when the hash is tied.
-
- SV* hv_scalar(HV *hv)
-
-=for hackers
-Found in file hv.c
-
-=item hv_store
-X<hv_store>
-
-Stores an SV in a hash. The hash key is specified as C<key> and C<klen> is
-the length of the key. The C<hash> parameter is the precomputed hash
-value; if it is zero then Perl will compute it. The return value will be
-NULL if the operation failed or if the value did not need to be actually
-stored within the hash (as in the case of tied hashes). Otherwise it can
-be dereferenced to get the original C<SV*>. Note that the caller is
-responsible for suitably incrementing the reference count of C<val> before
-the call, and decrementing it if the function returned NULL. Effectively
-a successful hv_store takes ownership of one reference to C<val>. This is
-usually what you want; a newly created SV has a reference count of one, so
-if all your code does is create SVs then store them in a hash, hv_store
-will own the only reference to the new SV, and your code doesn't need to do
-anything further to tidy up. hv_store is not implemented as a call to
-hv_store_ent, and does not create a temporary SV for the key, so if your
-key data is not already in SV form then use hv_store in preference to
-hv_store_ent.
-
-See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
-information on how to use this function on tied hashes.
-
- SV** hv_store(HV *hv, const char *key, I32 klen, SV *val, U32 hash)
-
-=for hackers
-Found in file hv.c
-
-=item hv_stores
-X<hv_stores>
-
-Like C<hv_store>, but takes a literal string instead of a string/length pair
-and omits the hash parameter.
-
- SV** hv_stores(HV* tb, const char* key, NULLOK SV* val)
-
-=for hackers
-Found in file handy.h
-
-=item hv_store_ent
-X<hv_store_ent>
-
-Stores C<val> in a hash. The hash key is specified as C<key>. The C<hash>
-parameter is the precomputed hash value; if it is zero then Perl will
-compute it. The return value is the new hash entry so created. It will be
-NULL if the operation failed or if the value did not need to be actually
-stored within the hash (as in the case of tied hashes). Otherwise the
-contents of the return value can be accessed using the C<He?> macros
-described here. Note that the caller is responsible for suitably
-incrementing the reference count of C<val> before the call, and
-decrementing it if the function returned NULL. Effectively a successful
-hv_store_ent takes ownership of one reference to C<val>. This is
-usually what you want; a newly created SV has a reference count of one, so
-if all your code does is create SVs then store them in a hash, hv_store
-will own the only reference to the new SV, and your code doesn't need to do
-anything further to tidy up. Note that hv_store_ent only reads the C<key>;
-unlike C<val> it does not take ownership of it, so maintaining the correct
-reference count on C<key> is entirely the caller's responsibility. hv_store
-is not implemented as a call to hv_store_ent, and does not create a temporary
-SV for the key, so if your key data is not already in SV form then use
-hv_store in preference to hv_store_ent.
-
-See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
-information on how to use this function on tied hashes.
-
- HE* hv_store_ent(HV *hv, SV *key, SV *val, U32 hash)
-
-=for hackers
-Found in file hv.c
-
-=item hv_undef
-X<hv_undef>
-
-Undefines the hash.
-
- void hv_undef(HV *hv)
-
-=for hackers
-Found in file hv.c
-
-=item newHV
-X<newHV>
-
-Creates a new HV. The reference count is set to 1.
-
- HV* newHV()
-
-=for hackers
-Found in file hv.h
-
-
-=back
-
-=head1 Magical Functions
-
-=over 8
-
-=item mg_clear
-X<mg_clear>
-
-Clear something magical that the SV represents. See C<sv_magic>.
-
- int mg_clear(SV* sv)
-
-=for hackers
-Found in file mg.c
-
-=item mg_copy
-X<mg_copy>
-
-Copies the magic from one SV to another. See C<sv_magic>.
-
- int mg_copy(SV *sv, SV *nsv, const char *key, I32 klen)
-
-=for hackers
-Found in file mg.c
-
-=item mg_find
-X<mg_find>
-
-Finds the magic pointer for type matching the SV. See C<sv_magic>.
-
- MAGIC* mg_find(const SV* sv, int type)
-
-=for hackers
-Found in file mg.c
-
-=item mg_free
-X<mg_free>
-
-Free any magic storage used by the SV. See C<sv_magic>.
-
- int mg_free(SV* sv)
-
-=for hackers
-Found in file mg.c
-
-=item mg_get
-X<mg_get>
-
-Do magic after a value is retrieved from the SV. See C<sv_magic>.
-
- int mg_get(SV* sv)
-
-=for hackers
-Found in file mg.c
-
-=item mg_length
-X<mg_length>
-
-Report on the SV's length. See C<sv_magic>.
-
- U32 mg_length(SV* sv)
-
-=for hackers
-Found in file mg.c
-
-=item mg_magical
-X<mg_magical>
-
-Turns on the magical status of an SV. See C<sv_magic>.
-
- void mg_magical(SV* sv)
-
-=for hackers
-Found in file mg.c
-
-=item mg_set
-X<mg_set>
-
-Do magic after a value is assigned to the SV. See C<sv_magic>.
-
- int mg_set(SV* sv)
-
-=for hackers
-Found in file mg.c
-
-=item SvGETMAGIC
-X<SvGETMAGIC>
-
-Invokes C<mg_get> on an SV if it has 'get' magic. This macro evaluates its
-argument more than once.
-
- void SvGETMAGIC(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvLOCK
-X<SvLOCK>
-
-Arranges for a mutual exclusion lock to be obtained on sv if a suitable module
-has been loaded.
-
- void SvLOCK(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvSETMAGIC
-X<SvSETMAGIC>
-
-Invokes C<mg_set> on an SV if it has 'set' magic. This macro evaluates its
-argument more than once.
-
- void SvSETMAGIC(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvSetMagicSV
-X<SvSetMagicSV>
-
-Like C<SvSetSV>, but does any set magic required afterwards.
-
- void SvSetMagicSV(SV* dsb, SV* ssv)
-
-=for hackers
-Found in file sv.h
-
-=item SvSetMagicSV_nosteal
-X<SvSetMagicSV_nosteal>
-
-Like C<SvSetSV_nosteal>, but does any set magic required afterwards.
-
- void SvSetMagicSV_nosteal(SV* dsv, SV* ssv)
-
-=for hackers
-Found in file sv.h
-
-=item SvSetSV
-X<SvSetSV>
-
-Calls C<sv_setsv> if dsv is not the same as ssv. May evaluate arguments
-more than once.
-
- void SvSetSV(SV* dsb, SV* ssv)
-
-=for hackers
-Found in file sv.h
-
-=item SvSetSV_nosteal
-X<SvSetSV_nosteal>
-
-Calls a non-destructive version of C<sv_setsv> if dsv is not the same as
-ssv. May evaluate arguments more than once.
-
- void SvSetSV_nosteal(SV* dsv, SV* ssv)
-
-=for hackers
-Found in file sv.h
-
-=item SvSHARE
-X<SvSHARE>
-
-Arranges for sv to be shared between threads if a suitable module
-has been loaded.
-
- void SvSHARE(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvUNLOCK
-X<SvUNLOCK>
-
-Releases a mutual exclusion lock on sv if a suitable module
-has been loaded.
-
- void SvUNLOCK(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-
-=back
-
-=head1 Memory Management
-
-=over 8
-
-=item Copy
-X<Copy>
-
-The XSUB-writer's interface to the C C<memcpy> function. The C<src> is the
-source, C<dest> is the destination, C<nitems> is the number of items, and C<type> is
-the type. May fail on overlapping copies. See also C<Move>.
-
- void Copy(void* src, void* dest, int nitems, type)
-
-=for hackers
-Found in file handy.h
-
-=item CopyD
-X<CopyD>
-
-Like C<Copy> but returns dest. Useful for encouraging compilers to tail-call
-optimise.
-
- void * CopyD(void* src, void* dest, int nitems, type)
-
-=for hackers
-Found in file handy.h
-
-=item Move
-X<Move>
-
-The XSUB-writer's interface to the C C<memmove> function. The C<src> is the
-source, C<dest> is the destination, C<nitems> is the number of items, and C<type> is
-the type. Can do overlapping moves. See also C<Copy>.
-
- void Move(void* src, void* dest, int nitems, type)
-
-=for hackers
-Found in file handy.h
-
-=item MoveD
-X<MoveD>
-
-Like C<Move> but returns dest. Useful for encouraging compilers to tail-call
-optimise.
-
- void * MoveD(void* src, void* dest, int nitems, type)
-
-=for hackers
-Found in file handy.h
-
-=item Newx
-X<Newx>
-
-The XSUB-writer's interface to the C C<malloc> function.
-
-In 5.9.3, Newx() and friends replace the older New() API, and drops
-the first parameter, I<x>, a debug aid which allowed callers to identify
-themselves. This aid has been superseded by a new build option,
-PERL_MEM_LOG (see L<perlhack/PERL_MEM_LOG>). The older API is still
-there for use in XS modules supporting older perls.
-
- void Newx(void* ptr, int nitems, type)
-
-=for hackers
-Found in file handy.h
-
-=item Newxc
-X<Newxc>
-
-The XSUB-writer's interface to the C C<malloc> function, with
-cast. See also C<Newx>.
-
- void Newxc(void* ptr, int nitems, type, cast)
-
-=for hackers
-Found in file handy.h
-
-=item Newxz
-X<Newxz>
-
-The XSUB-writer's interface to the C C<malloc> function. The allocated
-memory is zeroed with C<memzero>. See also C<Newx>.
-
- void Newxz(void* ptr, int nitems, type)
-
-=for hackers
-Found in file handy.h
-
-=item Poison
-X<Poison>
-
-PoisonWith(0xEF) for catching access to freed memory.
-
- void Poison(void* dest, int nitems, type)
-
-=for hackers
-Found in file handy.h
-
-=item PoisonFree
-X<PoisonFree>
-
-PoisonWith(0xEF) for catching access to freed memory.
-
- void PoisonFree(void* dest, int nitems, type)
-
-=for hackers
-Found in file handy.h
-
-=item PoisonNew
-X<PoisonNew>
-
-PoisonWith(0xAB) for catching access to allocated but uninitialized memory.
-
- void PoisonNew(void* dest, int nitems, type)
-
-=for hackers
-Found in file handy.h
-
-=item PoisonWith
-X<PoisonWith>
-
-Fill up memory with a byte pattern (a byte repeated over and over
-again) that hopefully catches attempts to access uninitialized memory.
-
- void PoisonWith(void* dest, int nitems, type, U8 byte)
-
-=for hackers
-Found in file handy.h
-
-=item Renew
-X<Renew>
-
-The XSUB-writer's interface to the C C<realloc> function.
-
- void Renew(void* ptr, int nitems, type)
-
-=for hackers
-Found in file handy.h
-
-=item Renewc
-X<Renewc>
-
-The XSUB-writer's interface to the C C<realloc> function, with
-cast.
-
- void Renewc(void* ptr, int nitems, type, cast)
-
-=for hackers
-Found in file handy.h
-
-=item Safefree
-X<Safefree>
-
-The XSUB-writer's interface to the C C<free> function.
-
- void Safefree(void* ptr)
-
-=for hackers
-Found in file handy.h
-
-=item savepv
-X<savepv>
-
-Perl's version of C<strdup()>. Returns a pointer to a newly allocated
-string which is a duplicate of C<pv>. The size of the string is
-determined by C<strlen()>. The memory allocated for the new string can
-be freed with the C<Safefree()> function.
-
- char* savepv(const char* pv)
-
-=for hackers
-Found in file util.c
-
-=item savepvn
-X<savepvn>
-
-Perl's version of what C<strndup()> would be if it existed. Returns a
-pointer to a newly allocated string which is a duplicate of the first
-C<len> bytes from C<pv>, plus a trailing NUL byte. The memory allocated for
-the new string can be freed with the C<Safefree()> function.
-
- char* savepvn(const char* pv, I32 len)
-
-=for hackers
-Found in file util.c
-
-=item savepvs
-X<savepvs>
-
-Like C<savepvn>, but takes a literal string instead of a string/length pair.
-
- char* savepvs(const char* s)
-
-=for hackers
-Found in file handy.h
-
-=item savesharedpv
-X<savesharedpv>
-
-A version of C<savepv()> which allocates the duplicate string in memory
-which is shared between threads.
-
- char* savesharedpv(const char* pv)
-
-=for hackers
-Found in file util.c
-
-=item savesharedpvn
-X<savesharedpvn>
-
-A version of C<savepvn()> which allocates the duplicate string in memory
-which is shared between threads. (With the specific difference that a NULL
-pointer is not acceptable)
-
- char* savesharedpvn(const char *const pv, const STRLEN len)
-
-=for hackers
-Found in file util.c
-
-=item savesvpv
-X<savesvpv>
-
-A version of C<savepv()>/C<savepvn()> which gets the string to duplicate from
-the passed in SV using C<SvPV()>
-
- char* savesvpv(SV* sv)
-
-=for hackers
-Found in file util.c
-
-=item StructCopy
-X<StructCopy>
-
-This is an architecture-independent macro to copy one structure to another.
-
- void StructCopy(type src, type dest, type)
-
-=for hackers
-Found in file handy.h
-
-=item Zero
-X<Zero>
-
-The XSUB-writer's interface to the C C<memzero> function. The C<dest> is the
-destination, C<nitems> is the number of items, and C<type> is the type.
-
- void Zero(void* dest, int nitems, type)
-
-=for hackers
-Found in file handy.h
-
-=item ZeroD
-X<ZeroD>
-
-Like C<Zero> but returns dest. Useful for encouraging compilers to tail-call
-optimise.
-
- void * ZeroD(void* dest, int nitems, type)
-
-=for hackers
-Found in file handy.h
-
-
-=back
-
-=head1 Miscellaneous Functions
-
-=over 8
-
-=item fbm_compile
-X<fbm_compile>
-
-Analyses the string in order to make fast searches on it using fbm_instr()
--- the Boyer-Moore algorithm.
-
- void fbm_compile(SV* sv, U32 flags)
-
-=for hackers
-Found in file util.c
-
-=item fbm_instr
-X<fbm_instr>
-
-Returns the location of the SV in the string delimited by C<str> and
-C<strend>. It returns C<NULL> if the string can't be found. The C<sv>
-does not have to be fbm_compiled, but the search will not be as fast
-then.
-
- char* fbm_instr(unsigned char* big, unsigned char* bigend, SV* littlestr, U32 flags)
-
-=for hackers
-Found in file util.c
-
-=item form
-X<form>
-
-Takes a sprintf-style format pattern and conventional
-(non-SV) arguments and returns the formatted string.
-
- (char *) Perl_form(pTHX_ const char* pat, ...)
-
-can be used any place a string (char *) is required:
-
- char * s = Perl_form("%d.%d",major,minor);
-
-Uses a single private buffer so if you want to format several strings you
-must explicitly copy the earlier strings away (and free the copies when you
-are done).
-
- char* form(const char* pat, ...)
-
-=for hackers
-Found in file util.c
-
-=item getcwd_sv
-X<getcwd_sv>
-
-Fill the sv with current working directory
-
- int getcwd_sv(SV* sv)
-
-=for hackers
-Found in file util.c
-
-=item my_snprintf
-X<my_snprintf>
-
-The C library C<snprintf> functionality, if available and
-standards-compliant (uses C<vsnprintf>, actually). However, if the
-C<vsnprintf> is not available, will unfortunately use the unsafe
-C<vsprintf> which can overrun the buffer (there is an overrun check,
-but that may be too late). Consider using C<sv_vcatpvf> instead, or
-getting C<vsnprintf>.
-
- int my_snprintf(char *buffer, const Size_t len, const char *format, ...)
-
-=for hackers
-Found in file util.c
-
-=item my_sprintf
-X<my_sprintf>
-
-The C library C<sprintf>, wrapped if necessary, to ensure that it will return
-the length of the string written to the buffer. Only rare pre-ANSI systems
-need the wrapper function - usually this is a direct call to C<sprintf>.
-
- int my_sprintf(char *buffer, const char *pat, ...)
-
-=for hackers
-Found in file util.c
-
-=item my_vsnprintf
-X<my_vsnprintf>
-
-The C library C<vsnprintf> if available and standards-compliant.
-However, if if the C<vsnprintf> is not available, will unfortunately
-use the unsafe C<vsprintf> which can overrun the buffer (there is an
-overrun check, but that may be too late). Consider using
-C<sv_vcatpvf> instead, or getting C<vsnprintf>.
-
- int my_vsnprintf(char *buffer, const Size_t len, const char *format, va_list ap)
-
-=for hackers
-Found in file util.c
-
-=item new_version
-X<new_version>
-
-Returns a new version object based on the passed in SV:
-
- SV *sv = new_version(SV *ver);
-
-Does not alter the passed in ver SV. See "upg_version" if you
-want to upgrade the SV.
-
- SV* new_version(SV *ver)
-
-=for hackers
-Found in file util.c
-
-=item scan_version
-X<scan_version>
-
-Returns a pointer to the next character after the parsed
-version string, as well as upgrading the passed in SV to
-an RV.
-
-Function must be called with an already existing SV like
-
- sv = newSV(0);
- s = scan_version(s, SV *sv, bool qv);
-
-Performs some preprocessing to the string to ensure that
-it has the correct characteristics of a version. Flags the
-object if it contains an underscore (which denotes this
-is an alpha version). The boolean qv denotes that the version
-should be interpreted as if it had multiple decimals, even if
-it doesn't.
-
- const char* scan_version(const char *s, SV *rv, bool qv)
-
-=for hackers
-Found in file util.c
-
-=item strEQ
-X<strEQ>
-
-Test two strings to see if they are equal. Returns true or false.
-
- bool strEQ(char* s1, char* s2)
-
-=for hackers
-Found in file handy.h
-
-=item strGE
-X<strGE>
-
-Test two strings to see if the first, C<s1>, is greater than or equal to
-the second, C<s2>. Returns true or false.
-
- bool strGE(char* s1, char* s2)
-
-=for hackers
-Found in file handy.h
-
-=item strGT
-X<strGT>
-
-Test two strings to see if the first, C<s1>, is greater than the second,
-C<s2>. Returns true or false.
-
- bool strGT(char* s1, char* s2)
-
-=for hackers
-Found in file handy.h
-
-=item strLE
-X<strLE>
-
-Test two strings to see if the first, C<s1>, is less than or equal to the
-second, C<s2>. Returns true or false.
-
- bool strLE(char* s1, char* s2)
-
-=for hackers
-Found in file handy.h
-
-=item strLT
-X<strLT>
-
-Test two strings to see if the first, C<s1>, is less than the second,
-C<s2>. Returns true or false.
-
- bool strLT(char* s1, char* s2)
-
-=for hackers
-Found in file handy.h
-
-=item strNE
-X<strNE>
-
-Test two strings to see if they are different. Returns true or
-false.
-
- bool strNE(char* s1, char* s2)
-
-=for hackers
-Found in file handy.h
-
-=item strnEQ
-X<strnEQ>
-
-Test two strings to see if they are equal. The C<len> parameter indicates
-the number of bytes to compare. Returns true or false. (A wrapper for
-C<strncmp>).
-
- bool strnEQ(char* s1, char* s2, STRLEN len)
-
-=for hackers
-Found in file handy.h
-
-=item strnNE
-X<strnNE>
-
-Test two strings to see if they are different. The C<len> parameter
-indicates the number of bytes to compare. Returns true or false. (A
-wrapper for C<strncmp>).
-
- bool strnNE(char* s1, char* s2, STRLEN len)
-
-=for hackers
-Found in file handy.h
-
-=item sv_destroyable
-X<sv_destroyable>
-
-Dummy routine which reports that object can be destroyed when there is no
-sharing module present. It ignores its single SV argument, and returns
-'true'. Exists to avoid test for a NULL function pointer and because it
-could potentially warn under some level of strict-ness.
-
- bool sv_destroyable(SV *sv)
-
-=for hackers
-Found in file util.c
-
-=item sv_nosharing
-X<sv_nosharing>
-
-Dummy routine which "shares" an SV when there is no sharing module present.
-Or "locks" it. Or "unlocks" it. In other words, ignores its single SV argument.
-Exists to avoid test for a NULL function pointer and because it could
-potentially warn under some level of strict-ness.
-
- void sv_nosharing(SV *sv)
-
-=for hackers
-Found in file util.c
-
-=item upg_version
-X<upg_version>
-
-In-place upgrade of the supplied SV to a version object.
-
- SV *sv = upg_version(SV *sv, bool qv);
-
-Returns a pointer to the upgraded SV. Set the boolean qv if you want
-to force this SV to be interpreted as an "extended" version.
-
- SV* upg_version(SV *ver, bool qv)
-
-=for hackers
-Found in file util.c
-
-=item vcmp
-X<vcmp>
-
-Version object aware cmp. Both operands must already have been
-converted into version objects.
-
- int vcmp(SV *lhv, SV *rhv)
-
-=for hackers
-Found in file util.c
-
-=item vnormal
-X<vnormal>
-
-Accepts a version object and returns the normalized string
-representation. Call like:
-
- sv = vnormal(rv);
-
-NOTE: you can pass either the object directly or the SV
-contained within the RV.
-
- SV* vnormal(SV *vs)
-
-=for hackers
-Found in file util.c
-
-=item vnumify
-X<vnumify>
-
-Accepts a version object and returns the normalized floating
-point representation. Call like:
-
- sv = vnumify(rv);
-
-NOTE: you can pass either the object directly or the SV
-contained within the RV.
-
- SV* vnumify(SV *vs)
-
-=for hackers
-Found in file util.c
-
-=item vstringify
-X<vstringify>
-
-In order to maintain maximum compatibility with earlier versions
-of Perl, this function will return either the floating point
-notation or the multiple dotted notation, depending on whether
-the original version contained 1 or more dots, respectively
-
- SV* vstringify(SV *vs)
-
-=for hackers
-Found in file util.c
-
-=item vverify
-X<vverify>
-
-Validates that the SV contains a valid version object.
-
- bool vverify(SV *vobj);
-
-Note that it only confirms the bare minimum structure (so as not to get
-confused by derived classes which may contain additional hash entries):
-
- bool vverify(SV *vs)
-
-=for hackers
-Found in file util.c
-
-
-=back
-
-=head1 MRO Functions
-
-=over 8
-
-=item mro_get_linear_isa
-X<mro_get_linear_isa>
-
-Returns either C<mro_get_linear_isa_c3> or
-C<mro_get_linear_isa_dfs> for the given stash,
-dependant upon which MRO is in effect
-for that stash. The return value is a
-read-only AV*.
-
-You are responsible for C<SvREFCNT_inc()> on the
-return value if you plan to store it anywhere
-semi-permanently (otherwise it might be deleted
-out from under you the next time the cache is
-invalidated).
-
- AV* mro_get_linear_isa(HV* stash)
-
-=for hackers
-Found in file mro.c
-
-=item mro_method_changed_in
-X<mro_method_changed_in>
-
-Invalidates method caching on any child classes
-of the given stash, so that they might notice
-the changes in this one.
-
-Ideally, all instances of C<PL_sub_generation++> in
-perl source outside of C<mro.c> should be
-replaced by calls to this.
-
-Perl automatically handles most of the common
-ways a method might be redefined. However, there
-are a few ways you could change a method in a stash
-without the cache code noticing, in which case you
-need to call this method afterwards:
-
-1) Directly manipulating the stash HV entries from
-XS code.
-
-2) Assigning a reference to a readonly scalar
-constant into a stash entry in order to create
-a constant subroutine (like constant.pm
-does).
-
-This same method is available from pure perl
-via, C<mro::method_changed_in(classname)>.
-
- void mro_method_changed_in(HV* stash)
-
-=for hackers
-Found in file mro.c
-
-
-=back
-
-=head1 Multicall Functions
-
-=over 8
-
-=item dMULTICALL
-X<dMULTICALL>
-
-Declare local variables for a multicall. See L<perlcall/Lightweight Callbacks>.
-
- dMULTICALL;
-
-=for hackers
-Found in file cop.h
-
-=item MULTICALL
-X<MULTICALL>
-
-Make a lightweight callback. See L<perlcall/Lightweight Callbacks>.
-
- MULTICALL;
-
-=for hackers
-Found in file cop.h
-
-=item POP_MULTICALL
-X<POP_MULTICALL>
-
-Closing bracket for a lightweight callback.
-See L<perlcall/Lightweight Callbacks>.
-
- POP_MULTICALL;
-
-=for hackers
-Found in file cop.h
-
-=item PUSH_MULTICALL
-X<PUSH_MULTICALL>
-
-Opening bracket for a lightweight callback.
-See L<perlcall/Lightweight Callbacks>.
-
- PUSH_MULTICALL;
-
-=for hackers
-Found in file cop.h
-
-
-=back
-
-=head1 Numeric functions
-
-=over 8
-
-=item grok_bin
-X<grok_bin>
-
-converts a string representing a binary number to numeric form.
-
-On entry I<start> and I<*len> give the string to scan, I<*flags> gives
-conversion flags, and I<result> should be NULL or a pointer to an NV.
-The scan stops at the end of the string, or the first invalid character.
-Unless C<PERL_SCAN_SILENT_ILLDIGIT> is set in I<*flags>, encountering an
-invalid character will also trigger a warning.
-On return I<*len> is set to the length of the scanned string,
-and I<*flags> gives output flags.
-
-If the value is <= C<UV_MAX> it is returned as a UV, the output flags are clear,
-and nothing is written to I<*result>. If the value is > UV_MAX C<grok_bin>
-returns UV_MAX, sets C<PERL_SCAN_GREATER_THAN_UV_MAX> in the output flags,
-and writes the value to I<*result> (or the value is discarded if I<result>
-is NULL).
-
-The binary number may optionally be prefixed with "0b" or "b" unless
-C<PERL_SCAN_DISALLOW_PREFIX> is set in I<*flags> on entry. If
-C<PERL_SCAN_ALLOW_UNDERSCORES> is set in I<*flags> then the binary
-number may use '_' characters to separate digits.
-
- UV grok_bin(const char* start, STRLEN* len_p, I32* flags, NV *result)
-
-=for hackers
-Found in file numeric.c
-
-=item grok_hex
-X<grok_hex>
-
-converts a string representing a hex number to numeric form.
-
-On entry I<start> and I<*len> give the string to scan, I<*flags> gives
-conversion flags, and I<result> should be NULL or a pointer to an NV.
-The scan stops at the end of the string, or the first invalid character.
-Unless C<PERL_SCAN_SILENT_ILLDIGIT> is set in I<*flags>, encountering an
-invalid character will also trigger a warning.
-On return I<*len> is set to the length of the scanned string,
-and I<*flags> gives output flags.
-
-If the value is <= UV_MAX it is returned as a UV, the output flags are clear,
-and nothing is written to I<*result>. If the value is > UV_MAX C<grok_hex>
-returns UV_MAX, sets C<PERL_SCAN_GREATER_THAN_UV_MAX> in the output flags,
-and writes the value to I<*result> (or the value is discarded if I<result>
-is NULL).
-
-The hex number may optionally be prefixed with "0x" or "x" unless
-C<PERL_SCAN_DISALLOW_PREFIX> is set in I<*flags> on entry. If
-C<PERL_SCAN_ALLOW_UNDERSCORES> is set in I<*flags> then the hex
-number may use '_' characters to separate digits.
-
- UV grok_hex(const char* start, STRLEN* len_p, I32* flags, NV *result)
-
-=for hackers
-Found in file numeric.c
-
-=item grok_number
-X<grok_number>
-
-Recognise (or not) a number. The type of the number is returned
-(0 if unrecognised), otherwise it is a bit-ORed combination of
-IS_NUMBER_IN_UV, IS_NUMBER_GREATER_THAN_UV_MAX, IS_NUMBER_NOT_INT,
-IS_NUMBER_NEG, IS_NUMBER_INFINITY, IS_NUMBER_NAN (defined in perl.h).
-
-If the value of the number can fit an in UV, it is returned in the *valuep
-IS_NUMBER_IN_UV will be set to indicate that *valuep is valid, IS_NUMBER_IN_UV
-will never be set unless *valuep is valid, but *valuep may have been assigned
-to during processing even though IS_NUMBER_IN_UV is not set on return.
-If valuep is NULL, IS_NUMBER_IN_UV will be set for the same cases as when
-valuep is non-NULL, but no actual assignment (or SEGV) will occur.
-
-IS_NUMBER_NOT_INT will be set with IS_NUMBER_IN_UV if trailing decimals were
-seen (in which case *valuep gives the true value truncated to an integer), and
-IS_NUMBER_NEG if the number is negative (in which case *valuep holds the
-absolute value). IS_NUMBER_IN_UV is not set if e notation was used or the
-number is larger than a UV.
-
- int grok_number(const char *pv, STRLEN len, UV *valuep)
-
-=for hackers
-Found in file numeric.c
-
-=item grok_numeric_radix
-X<grok_numeric_radix>
-
-Scan and skip for a numeric decimal separator (radix).
-
- bool grok_numeric_radix(const char **sp, const char *send)
-
-=for hackers
-Found in file numeric.c
-
-=item grok_oct
-X<grok_oct>
-
-converts a string representing an octal number to numeric form.
-
-On entry I<start> and I<*len> give the string to scan, I<*flags> gives
-conversion flags, and I<result> should be NULL or a pointer to an NV.
-The scan stops at the end of the string, or the first invalid character.
-Unless C<PERL_SCAN_SILENT_ILLDIGIT> is set in I<*flags>, encountering an
-invalid character will also trigger a warning.
-On return I<*len> is set to the length of the scanned string,
-and I<*flags> gives output flags.
-
-If the value is <= UV_MAX it is returned as a UV, the output flags are clear,
-and nothing is written to I<*result>. If the value is > UV_MAX C<grok_oct>
-returns UV_MAX, sets C<PERL_SCAN_GREATER_THAN_UV_MAX> in the output flags,
-and writes the value to I<*result> (or the value is discarded if I<result>
-is NULL).
-
-If C<PERL_SCAN_ALLOW_UNDERSCORES> is set in I<*flags> then the octal
-number may use '_' characters to separate digits.
-
- UV grok_oct(const char* start, STRLEN* len_p, I32* flags, NV *result)
-
-=for hackers
-Found in file numeric.c
-
-=item Perl_signbit
-X<Perl_signbit>
-
-Return a non-zero integer if the sign bit on an NV is set, and 0 if
-it is not.
-
-If Configure detects this system has a signbit() that will work with
-our NVs, then we just use it via the #define in perl.h. Otherwise,
-fall back on this implementation. As a first pass, this gets everything
-right except -0.0. Alas, catching -0.0 is the main use for this function,
-so this is not too helpful yet. Still, at least we have the scaffolding
-in place to support other systems, should that prove useful.
-
-
-Configure notes: This function is called 'Perl_signbit' instead of a
-plain 'signbit' because it is easy to imagine a system having a signbit()
-function or macro that doesn't happen to work with our particular choice
-of NVs. We shouldn't just re-#define signbit as Perl_signbit and expect
-the standard system headers to be happy. Also, this is a no-context
-function (no pTHX_) because Perl_signbit() is usually re-#defined in
-perl.h as a simple macro call to the system's signbit().
-Users should just always call Perl_signbit().
-
-NOTE: this function is experimental and may change or be
-removed without notice.
-
- int Perl_signbit(NV f)
-
-=for hackers
-Found in file numeric.c
-
-=item scan_bin
-X<scan_bin>
-
-For backwards compatibility. Use C<grok_bin> instead.
-
- NV scan_bin(const char* start, STRLEN len, STRLEN* retlen)
-
-=for hackers
-Found in file numeric.c
-
-=item scan_hex
-X<scan_hex>
-
-For backwards compatibility. Use C<grok_hex> instead.
-
- NV scan_hex(const char* start, STRLEN len, STRLEN* retlen)
-
-=for hackers
-Found in file numeric.c
-
-=item scan_oct
-X<scan_oct>
-
-For backwards compatibility. Use C<grok_oct> instead.
-
- NV scan_oct(const char* start, STRLEN len, STRLEN* retlen)
-
-=for hackers
-Found in file numeric.c
-
-
-=back
-
-=head1 Optree Manipulation Functions
-
-=over 8
-
-=item cv_const_sv
-X<cv_const_sv>
-
-If C<cv> is a constant sub eligible for inlining. returns the constant
-value returned by the sub. Otherwise, returns NULL.
-
-Constant subs can be created with C<newCONSTSUB> or as described in
-L<perlsub/"Constant Functions">.
-
- SV* cv_const_sv(const CV *const cv)
-
-=for hackers
-Found in file op.c
-
-=item newCONSTSUB
-X<newCONSTSUB>
-
-Creates a constant sub equivalent to Perl C<sub FOO () { 123 }> which is
-eligible for inlining at compile-time.
-
- CV* newCONSTSUB(HV* stash, const char* name, SV* sv)
-
-=for hackers
-Found in file op.c
-
-=item newXS
-X<newXS>
-
-Used by C<xsubpp> to hook up XSUBs as Perl subs. I<filename> needs to be
-static storage, as it is used directly as CvFILE(), without a copy being made.
-
-=for hackers
-Found in file op.c
-
-
-=back
-
-=head1 Pad Data Structures
-
-=over 8
-
-=item pad_sv
-X<pad_sv>
-
-Get the value at offset po in the current pad.
-Use macro PAD_SV instead of calling this function directly.
-
- SV* pad_sv(PADOFFSET po)
-
-=for hackers
-Found in file pad.c
-
-
-=back
-
-=head1 Per-Interpreter Variables
-
-=over 8
-
-=item PL_modglobal
-X<PL_modglobal>
-
-C<PL_modglobal> is a general purpose, interpreter global HV for use by
-extensions that need to keep information on a per-interpreter basis.
-In a pinch, it can also be used as a symbol table for extensions
-to share data among each other. It is a good idea to use keys
-prefixed by the package name of the extension that owns the data.
-
- HV* PL_modglobal
-
-=for hackers
-Found in file intrpvar.h
-
-=item PL_na
-X<PL_na>
-
-A convenience variable which is typically used with C<SvPV> when one
-doesn't care about the length of the string. It is usually more efficient
-to either declare a local variable and use that instead or to use the
-C<SvPV_nolen> macro.
-
- STRLEN PL_na
-
-=for hackers
-Found in file intrpvar.h
-
-=item PL_sv_no
-X<PL_sv_no>
-
-This is the C<false> SV. See C<PL_sv_yes>. Always refer to this as
-C<&PL_sv_no>.
-
- SV PL_sv_no
-
-=for hackers
-Found in file intrpvar.h
-
-=item PL_sv_undef
-X<PL_sv_undef>
-
-This is the C<undef> SV. Always refer to this as C<&PL_sv_undef>.
-
- SV PL_sv_undef
-
-=for hackers
-Found in file intrpvar.h
-
-=item PL_sv_yes
-X<PL_sv_yes>
-
-This is the C<true> SV. See C<PL_sv_no>. Always refer to this as
-C<&PL_sv_yes>.
-
- SV PL_sv_yes
-
-=for hackers
-Found in file intrpvar.h
-
-
-=back
-
-=head1 REGEXP Functions
-
-=over 8
-
-=item SvRX
-X<SvRX>
-
-Convenience macro to get the REGEXP from a SV. This is approximately
-equivalent to the following snippet:
-
- if (SvMAGICAL(sv))
- mg_get(sv);
- if (SvROK(sv) &&
- (tmpsv = (SV*)SvRV(sv)) &&
- SvTYPE(tmpsv) == SVt_PVMG &&
- (tmpmg = mg_find(tmpsv, PERL_MAGIC_qr)))
- {
- return (REGEXP *)tmpmg->mg_obj;
- }
-
-NULL will be returned if a REGEXP* is not found.
-
- REGEXP * SvRX(SV *sv)
-
-=for hackers
-Found in file regexp.h
-
-=item SvRXOK
-X<SvRXOK>
-
-Returns a boolean indicating whether the SV contains qr magic
-(PERL_MAGIC_qr).
-
-If you want to do something with the REGEXP* later use SvRX instead
-and check for NULL.
-
- bool SvRXOK(SV* sv)
-
-=for hackers
-Found in file regexp.h
-
-
-=back
-
-=head1 Simple Exception Handling Macros
-
-=over 8
-
-=item dXCPT
-X<dXCPT>
-
-Set up necessary local variables for exception handling.
-See L<perlguts/"Exception Handling">.
-
- dXCPT;
-
-=for hackers
-Found in file XSUB.h
-
-=item XCPT_CATCH
-X<XCPT_CATCH>
-
-Introduces a catch block. See L<perlguts/"Exception Handling">.
-
-=for hackers
-Found in file XSUB.h
-
-=item XCPT_RETHROW
-X<XCPT_RETHROW>
-
-Rethrows a previously caught exception. See L<perlguts/"Exception Handling">.
-
- XCPT_RETHROW;
-
-=for hackers
-Found in file XSUB.h
-
-=item XCPT_TRY_END
-X<XCPT_TRY_END>
-
-Ends a try block. See L<perlguts/"Exception Handling">.
-
-=for hackers
-Found in file XSUB.h
-
-=item XCPT_TRY_START
-X<XCPT_TRY_START>
-
-Starts a try block. See L<perlguts/"Exception Handling">.
-
-=for hackers
-Found in file XSUB.h
-
-
-=back
-
-=head1 Stack Manipulation Macros
-
-=over 8
-
-=item dMARK
-X<dMARK>
-
-Declare a stack marker variable, C<mark>, for the XSUB. See C<MARK> and
-C<dORIGMARK>.
-
- dMARK;
-
-=for hackers
-Found in file pp.h
-
-=item dORIGMARK
-X<dORIGMARK>
-
-Saves the original stack mark for the XSUB. See C<ORIGMARK>.
-
- dORIGMARK;
-
-=for hackers
-Found in file pp.h
-
-=item dSP
-X<dSP>
-
-Declares a local copy of perl's stack pointer for the XSUB, available via
-the C<SP> macro. See C<SP>.
-
- dSP;
-
-=for hackers
-Found in file pp.h
-
-=item EXTEND
-X<EXTEND>
-
-Used to extend the argument stack for an XSUB's return values. Once
-used, guarantees that there is room for at least C<nitems> to be pushed
-onto the stack.
-
- void EXTEND(SP, int nitems)
-
-=for hackers
-Found in file pp.h
-
-=item MARK
-X<MARK>
-
-Stack marker variable for the XSUB. See C<dMARK>.
-
-=for hackers
-Found in file pp.h
-
-=item mPUSHi
-X<mPUSHi>
-
-Push an integer onto the stack. The stack must have room for this element.
-Does not use C<TARG>. See also C<PUSHi>, C<mXPUSHi> and C<XPUSHi>.
-
- void mPUSHi(IV iv)
-
-=for hackers
-Found in file pp.h
-
-=item mPUSHn
-X<mPUSHn>
-
-Push a double onto the stack. The stack must have room for this element.
-Does not use C<TARG>. See also C<PUSHn>, C<mXPUSHn> and C<XPUSHn>.
-
- void mPUSHn(NV nv)
-
-=for hackers
-Found in file pp.h
-
-=item mPUSHp
-X<mPUSHp>
-
-Push a string onto the stack. The stack must have room for this element.
-The C<len> indicates the length of the string. Does not use C<TARG>.
-See also C<PUSHp>, C<mXPUSHp> and C<XPUSHp>.
-
- void mPUSHp(char* str, STRLEN len)
-
-=for hackers
-Found in file pp.h
-
-=item mPUSHs
-X<mPUSHs>
-
-Push an SV onto the stack and mortalizes the SV. The stack must have room
-for this element. Does not use C<TARG>. See also C<PUSHs> and C<mXPUSHs>.
-
- void mPUSHs(SV* sv)
-
-=for hackers
-Found in file pp.h
-
-=item mPUSHu
-X<mPUSHu>
-
-Push an unsigned integer onto the stack. The stack must have room for this
-element. Does not use C<TARG>. See also C<PUSHu>, C<mXPUSHu> and C<XPUSHu>.
-
- void mPUSHu(UV uv)
-
-=for hackers
-Found in file pp.h
-
-=item mXPUSHi
-X<mXPUSHi>
-
-Push an integer onto the stack, extending the stack if necessary.
-Does not use C<TARG>. See also C<XPUSHi>, C<mPUSHi> and C<PUSHi>.
-
- void mXPUSHi(IV iv)
-
-=for hackers
-Found in file pp.h
-
-=item mXPUSHn
-X<mXPUSHn>
-
-Push a double onto the stack, extending the stack if necessary.
-Does not use C<TARG>. See also C<XPUSHn>, C<mPUSHn> and C<PUSHn>.
-
- void mXPUSHn(NV nv)
-
-=for hackers
-Found in file pp.h
-
-=item mXPUSHp
-X<mXPUSHp>
-
-Push a string onto the stack, extending the stack if necessary. The C<len>
-indicates the length of the string. Does not use C<TARG>. See also C<XPUSHp>,
-C<mPUSHp> and C<PUSHp>.
-
- void mXPUSHp(char* str, STRLEN len)
-
-=for hackers
-Found in file pp.h
-
-=item mXPUSHs
-X<mXPUSHs>
-
-Push an SV onto the stack, extending the stack if necessary and mortalizes
-the SV. Does not use C<TARG>. See also C<XPUSHs> and C<mPUSHs>.
-
- void mXPUSHs(SV* sv)
-
-=for hackers
-Found in file pp.h
-
-=item mXPUSHu
-X<mXPUSHu>
-
-Push an unsigned integer onto the stack, extending the stack if necessary.
-Does not use C<TARG>. See also C<XPUSHu>, C<mPUSHu> and C<PUSHu>.
-
- void mXPUSHu(UV uv)
-
-=for hackers
-Found in file pp.h
-
-=item ORIGMARK
-X<ORIGMARK>
-
-The original stack mark for the XSUB. See C<dORIGMARK>.
-
-=for hackers
-Found in file pp.h
-
-=item POPi
-X<POPi>
-
-Pops an integer off the stack.
-
- IV POPi
-
-=for hackers
-Found in file pp.h
-
-=item POPl
-X<POPl>
-
-Pops a long off the stack.
-
- long POPl
-
-=for hackers
-Found in file pp.h
-
-=item POPn
-X<POPn>
-
-Pops a double off the stack.
-
- NV POPn
-
-=for hackers
-Found in file pp.h
-
-=item POPp
-X<POPp>
-
-Pops a string off the stack. Deprecated. New code should use POPpx.
-
- char* POPp
-
-=for hackers
-Found in file pp.h
-
-=item POPpbytex
-X<POPpbytex>
-
-Pops a string off the stack which must consist of bytes i.e. characters < 256.
-
- char* POPpbytex
-
-=for hackers
-Found in file pp.h
-
-=item POPpx
-X<POPpx>
-
-Pops a string off the stack.
-
- char* POPpx
-
-=for hackers
-Found in file pp.h
-
-=item POPs
-X<POPs>
-
-Pops an SV off the stack.
-
- SV* POPs
-
-=for hackers
-Found in file pp.h
-
-=item PUSHi
-X<PUSHi>
-
-Push an integer onto the stack. The stack must have room for this element.
-Handles 'set' magic. Uses C<TARG>, so C<dTARGET> or C<dXSTARG> should be
-called to declare it. Do not call multiple C<TARG>-oriented macros to
-return lists from XSUB's - see C<mPUSHi> instead. See also C<XPUSHi> and
-C<mXPUSHi>.
-
- void PUSHi(IV iv)
-
-=for hackers
-Found in file pp.h
-
-=item PUSHMARK
-X<PUSHMARK>
-
-Opening bracket for arguments on a callback. See C<PUTBACK> and
-L<perlcall>.
-
- void PUSHMARK(SP)
-
-=for hackers
-Found in file pp.h
-
-=item PUSHmortal
-X<PUSHmortal>
-
-Push a new mortal SV onto the stack. The stack must have room for this
-element. Does not use C<TARG>. See also C<PUSHs>, C<XPUSHmortal> and C<XPUSHs>.
-
- void PUSHmortal()
-
-=for hackers
-Found in file pp.h
-
-=item PUSHn
-X<PUSHn>
-
-Push a double onto the stack. The stack must have room for this element.
-Handles 'set' magic. Uses C<TARG>, so C<dTARGET> or C<dXSTARG> should be
-called to declare it. Do not call multiple C<TARG>-oriented macros to
-return lists from XSUB's - see C<mPUSHn> instead. See also C<XPUSHn> and
-C<mXPUSHn>.
-
- void PUSHn(NV nv)
-
-=for hackers
-Found in file pp.h
-
-=item PUSHp
-X<PUSHp>
-
-Push a string onto the stack. The stack must have room for this element.
-The C<len> indicates the length of the string. Handles 'set' magic. Uses
-C<TARG>, so C<dTARGET> or C<dXSTARG> should be called to declare it. Do not
-call multiple C<TARG>-oriented macros to return lists from XSUB's - see
-C<mPUSHp> instead. See also C<XPUSHp> and C<mXPUSHp>.
-
- void PUSHp(char* str, STRLEN len)
-
-=for hackers
-Found in file pp.h
-
-=item PUSHs
-X<PUSHs>
-
-Push an SV onto the stack. The stack must have room for this element.
-Does not handle 'set' magic. Does not use C<TARG>. See also C<PUSHmortal>,
-C<XPUSHs> and C<XPUSHmortal>.
-
- void PUSHs(SV* sv)
-
-=for hackers
-Found in file pp.h
-
-=item PUSHu
-X<PUSHu>
-
-Push an unsigned integer onto the stack. The stack must have room for this
-element. Handles 'set' magic. Uses C<TARG>, so C<dTARGET> or C<dXSTARG>
-should be called to declare it. Do not call multiple C<TARG>-oriented
-macros to return lists from XSUB's - see C<mPUSHu> instead. See also
-C<XPUSHu> and C<mXPUSHu>.
-
- void PUSHu(UV uv)
-
-=for hackers
-Found in file pp.h
-
-=item PUTBACK
-X<PUTBACK>
-
-Closing bracket for XSUB arguments. This is usually handled by C<xsubpp>.
-See C<PUSHMARK> and L<perlcall> for other uses.
-
- PUTBACK;
-
-=for hackers
-Found in file pp.h
-
-=item SP
-X<SP>
-
-Stack pointer. This is usually handled by C<xsubpp>. See C<dSP> and
-C<SPAGAIN>.
-
-=for hackers
-Found in file pp.h
-
-=item SPAGAIN
-X<SPAGAIN>
-
-Refetch the stack pointer. Used after a callback. See L<perlcall>.
-
- SPAGAIN;
-
-=for hackers
-Found in file pp.h
-
-=item XPUSHi
-X<XPUSHi>
-
-Push an integer onto the stack, extending the stack if necessary. Handles
-'set' magic. Uses C<TARG>, so C<dTARGET> or C<dXSTARG> should be called to
-declare it. Do not call multiple C<TARG>-oriented macros to return lists
-from XSUB's - see C<mXPUSHi> instead. See also C<PUSHi> and C<mPUSHi>.
-
- void XPUSHi(IV iv)
-
-=for hackers
-Found in file pp.h
-
-=item XPUSHmortal
-X<XPUSHmortal>
-
-Push a new mortal SV onto the stack, extending the stack if necessary.
-Does not use C<TARG>. See also C<XPUSHs>, C<PUSHmortal> and C<PUSHs>.
-
- void XPUSHmortal()
-
-=for hackers
-Found in file pp.h
-
-=item XPUSHn
-X<XPUSHn>
-
-Push a double onto the stack, extending the stack if necessary. Handles
-'set' magic. Uses C<TARG>, so C<dTARGET> or C<dXSTARG> should be called to
-declare it. Do not call multiple C<TARG>-oriented macros to return lists
-from XSUB's - see C<mXPUSHn> instead. See also C<PUSHn> and C<mPUSHn>.
-
- void XPUSHn(NV nv)
-
-=for hackers
-Found in file pp.h
-
-=item XPUSHp
-X<XPUSHp>
-
-Push a string onto the stack, extending the stack if necessary. The C<len>
-indicates the length of the string. Handles 'set' magic. Uses C<TARG>, so
-C<dTARGET> or C<dXSTARG> should be called to declare it. Do not call
-multiple C<TARG>-oriented macros to return lists from XSUB's - see
-C<mXPUSHp> instead. See also C<PUSHp> and C<mPUSHp>.
-
- void XPUSHp(char* str, STRLEN len)
-
-=for hackers
-Found in file pp.h
-
-=item XPUSHs
-X<XPUSHs>
-
-Push an SV onto the stack, extending the stack if necessary. Does not
-handle 'set' magic. Does not use C<TARG>. See also C<XPUSHmortal>,
-C<PUSHs> and C<PUSHmortal>.
-
- void XPUSHs(SV* sv)
-
-=for hackers
-Found in file pp.h
-
-=item XPUSHu
-X<XPUSHu>
-
-Push an unsigned integer onto the stack, extending the stack if necessary.
-Handles 'set' magic. Uses C<TARG>, so C<dTARGET> or C<dXSTARG> should be
-called to declare it. Do not call multiple C<TARG>-oriented macros to
-return lists from XSUB's - see C<mXPUSHu> instead. See also C<PUSHu> and
-C<mPUSHu>.
-
- void XPUSHu(UV uv)
-
-=for hackers
-Found in file pp.h
-
-=item XSRETURN
-X<XSRETURN>
-
-Return from XSUB, indicating number of items on the stack. This is usually
-handled by C<xsubpp>.
-
- void XSRETURN(int nitems)
-
-=for hackers
-Found in file XSUB.h
-
-=item XSRETURN_EMPTY
-X<XSRETURN_EMPTY>
-
-Return an empty list from an XSUB immediately.
-
- XSRETURN_EMPTY;
-
-=for hackers
-Found in file XSUB.h
-
-=item XSRETURN_IV
-X<XSRETURN_IV>
-
-Return an integer from an XSUB immediately. Uses C<XST_mIV>.
-
- void XSRETURN_IV(IV iv)
-
-=for hackers
-Found in file XSUB.h
-
-=item XSRETURN_NO
-X<XSRETURN_NO>
-
-Return C<&PL_sv_no> from an XSUB immediately. Uses C<XST_mNO>.
-
- XSRETURN_NO;
-
-=for hackers
-Found in file XSUB.h
-
-=item XSRETURN_NV
-X<XSRETURN_NV>
-
-Return a double from an XSUB immediately. Uses C<XST_mNV>.
-
- void XSRETURN_NV(NV nv)
-
-=for hackers
-Found in file XSUB.h
-
-=item XSRETURN_PV
-X<XSRETURN_PV>
-
-Return a copy of a string from an XSUB immediately. Uses C<XST_mPV>.
-
- void XSRETURN_PV(char* str)
-
-=for hackers
-Found in file XSUB.h
-
-=item XSRETURN_UNDEF
-X<XSRETURN_UNDEF>
-
-Return C<&PL_sv_undef> from an XSUB immediately. Uses C<XST_mUNDEF>.
-
- XSRETURN_UNDEF;
-
-=for hackers
-Found in file XSUB.h
-
-=item XSRETURN_UV
-X<XSRETURN_UV>
-
-Return an integer from an XSUB immediately. Uses C<XST_mUV>.
-
- void XSRETURN_UV(IV uv)
-
-=for hackers
-Found in file XSUB.h
-
-=item XSRETURN_YES
-X<XSRETURN_YES>
-
-Return C<&PL_sv_yes> from an XSUB immediately. Uses C<XST_mYES>.
-
- XSRETURN_YES;
-
-=for hackers
-Found in file XSUB.h
-
-=item XST_mIV
-X<XST_mIV>
-
-Place an integer into the specified position C<pos> on the stack. The
-value is stored in a new mortal SV.
-
- void XST_mIV(int pos, IV iv)
-
-=for hackers
-Found in file XSUB.h
-
-=item XST_mNO
-X<XST_mNO>
-
-Place C<&PL_sv_no> into the specified position C<pos> on the
-stack.
-
- void XST_mNO(int pos)
-
-=for hackers
-Found in file XSUB.h
-
-=item XST_mNV
-X<XST_mNV>
-
-Place a double into the specified position C<pos> on the stack. The value
-is stored in a new mortal SV.
-
- void XST_mNV(int pos, NV nv)
-
-=for hackers
-Found in file XSUB.h
-
-=item XST_mPV
-X<XST_mPV>
-
-Place a copy of a string into the specified position C<pos> on the stack.
-The value is stored in a new mortal SV.
-
- void XST_mPV(int pos, char* str)
-
-=for hackers
-Found in file XSUB.h
-
-=item XST_mUNDEF
-X<XST_mUNDEF>
-
-Place C<&PL_sv_undef> into the specified position C<pos> on the
-stack.
-
- void XST_mUNDEF(int pos)
-
-=for hackers
-Found in file XSUB.h
-
-=item XST_mYES
-X<XST_mYES>
-
-Place C<&PL_sv_yes> into the specified position C<pos> on the
-stack.
-
- void XST_mYES(int pos)
-
-=for hackers
-Found in file XSUB.h
-
-
-=back
-
-=head1 SV Flags
-
-=over 8
-
-=item svtype
-X<svtype>
-
-An enum of flags for Perl types. These are found in the file B<sv.h>
-in the C<svtype> enum. Test these flags with the C<SvTYPE> macro.
-
-=for hackers
-Found in file sv.h
-
-=item SVt_IV
-X<SVt_IV>
-
-Integer type flag for scalars. See C<svtype>.
-
-=for hackers
-Found in file sv.h
-
-=item SVt_NV
-X<SVt_NV>
-
-Double type flag for scalars. See C<svtype>.
-
-=for hackers
-Found in file sv.h
-
-=item SVt_PV
-X<SVt_PV>
-
-Pointer type flag for scalars. See C<svtype>.
-
-=for hackers
-Found in file sv.h
-
-=item SVt_PVAV
-X<SVt_PVAV>
-
-Type flag for arrays. See C<svtype>.
-
-=for hackers
-Found in file sv.h
-
-=item SVt_PVCV
-X<SVt_PVCV>
-
-Type flag for code refs. See C<svtype>.
-
-=for hackers
-Found in file sv.h
-
-=item SVt_PVHV
-X<SVt_PVHV>
-
-Type flag for hashes. See C<svtype>.
-
-=for hackers
-Found in file sv.h
-
-=item SVt_PVMG
-X<SVt_PVMG>
-
-Type flag for blessed scalars. See C<svtype>.
-
-=for hackers
-Found in file sv.h
-
-
-=back
-
-=head1 SV Manipulation Functions
-
-=over 8
-
-=item croak_xs_usage
-X<croak_xs_usage>
-
-A specialised variant of C<croak()> for emitting the usage message for xsubs
-
- croak_xs_usage(cv, "eee_yow");
-
-works out the package name and subroutine name from C<cv>, and then calls
-C<croak()>. Hence if C<cv> is C<&ouch::awk>, it would call C<croak> as:
-
- Perl_croak(aTHX_ "Usage %s::%s(%s)", "ouch" "awk", "eee_yow");
-
- void croak_xs_usage(const CV *const cv, const char *const params)
-
-=for hackers
-Found in file universal.c
-
-=item get_sv
-X<get_sv>
-
-Returns the SV of the specified Perl scalar. C<flags> are passed to
-C<gv_fetchpv>. If C<GV_ADD> is set and the
-Perl variable does not exist then it will be created. If C<flags> is zero
-and the variable does not exist then NULL is returned.
-
-NOTE: the perl_ form of this function is deprecated.
-
- SV* get_sv(const char *name, I32 flags)
-
-=for hackers
-Found in file perl.c
-
-=item newRV_inc
-X<newRV_inc>
-
-Creates an RV wrapper for an SV. The reference count for the original SV is
-incremented.
-
- SV* newRV_inc(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item newSVpvn_utf8
-X<newSVpvn_utf8>
-
-Creates a new SV and copies a string into it. If utf8 is true, calls
-C<SvUTF8_on> on the new SV. Implemented as a wrapper around C<newSVpvn_flags>.
-
- SV* newSVpvn_utf8(NULLOK const char* s, STRLEN len, U32 utf8)
-
-=for hackers
-Found in file sv.h
-
-=item SvCUR
-X<SvCUR>
-
-Returns the length of the string which is in the SV. See C<SvLEN>.
-
- STRLEN SvCUR(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvCUR_set
-X<SvCUR_set>
-
-Set the current length of the string which is in the SV. See C<SvCUR>
-and C<SvIV_set>.
-
- void SvCUR_set(SV* sv, STRLEN len)
-
-=for hackers
-Found in file sv.h
-
-=item SvEND
-X<SvEND>
-
-Returns a pointer to the last character in the string which is in the SV.
-See C<SvCUR>. Access the character as *(SvEND(sv)).
-
- char* SvEND(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvGAMAGIC
-X<SvGAMAGIC>
-
-Returns true if the SV has get magic or overloading. If either is true then
-the scalar is active data, and has the potential to return a new value every
-time it is accessed. Hence you must be careful to only read it once per user
-logical operation and work with that returned value. If neither is true then
-the scalar's value cannot change unless written to.
-
- char* SvGAMAGIC(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvGROW
-X<SvGROW>
-
-Expands the character buffer in the SV so that it has room for the
-indicated number of bytes (remember to reserve space for an extra trailing
-NUL character). Calls C<sv_grow> to perform the expansion if necessary.
-Returns a pointer to the character buffer.
-
- char * SvGROW(SV* sv, STRLEN len)
-
-=for hackers
-Found in file sv.h
-
-=item SvIOK
-X<SvIOK>
-
-Returns a U32 value indicating whether the SV contains an integer.
-
- U32 SvIOK(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvIOKp
-X<SvIOKp>
-
-Returns a U32 value indicating whether the SV contains an integer. Checks
-the B<private> setting. Use C<SvIOK> instead.
-
- U32 SvIOKp(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvIOK_notUV
-X<SvIOK_notUV>
-
-Returns a boolean indicating whether the SV contains a signed integer.
-
- bool SvIOK_notUV(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvIOK_off
-X<SvIOK_off>
-
-Unsets the IV status of an SV.
-
- void SvIOK_off(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvIOK_on
-X<SvIOK_on>
-
-Tells an SV that it is an integer.
-
- void SvIOK_on(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvIOK_only
-X<SvIOK_only>
-
-Tells an SV that it is an integer and disables all other OK bits.
-
- void SvIOK_only(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvIOK_only_UV
-X<SvIOK_only_UV>
-
-Tells and SV that it is an unsigned integer and disables all other OK bits.
-
- void SvIOK_only_UV(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvIOK_UV
-X<SvIOK_UV>
-
-Returns a boolean indicating whether the SV contains an unsigned integer.
-
- bool SvIOK_UV(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvIsCOW
-X<SvIsCOW>
-
-Returns a boolean indicating whether the SV is Copy-On-Write. (either shared
-hash key scalars, or full Copy On Write scalars if 5.9.0 is configured for
-COW)
-
- bool SvIsCOW(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvIsCOW_shared_hash
-X<SvIsCOW_shared_hash>
-
-Returns a boolean indicating whether the SV is Copy-On-Write shared hash key
-scalar.
-
- bool SvIsCOW_shared_hash(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvIV
-X<SvIV>
-
-Coerces the given SV to an integer and returns it. See C<SvIVx> for a
-version which guarantees to evaluate sv only once.
-
- IV SvIV(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvIVX
-X<SvIVX>
-
-Returns the raw value in the SV's IV slot, without checks or conversions.
-Only use when you are sure SvIOK is true. See also C<SvIV()>.
-
- IV SvIVX(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvIVx
-X<SvIVx>
-
-Coerces the given SV to an integer and returns it. Guarantees to evaluate
-C<sv> only once. Only use this if C<sv> is an expression with side effects,
-otherwise use the more efficient C<SvIV>.
-
- IV SvIVx(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvIV_nomg
-X<SvIV_nomg>
-
-Like C<SvIV> but doesn't process magic.
-
- IV SvIV_nomg(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvIV_set
-X<SvIV_set>
-
-Set the value of the IV pointer in sv to val. It is possible to perform
-the same function of this macro with an lvalue assignment to C<SvIVX>.
-With future Perls, however, it will be more efficient to use
-C<SvIV_set> instead of the lvalue assignment to C<SvIVX>.
-
- void SvIV_set(SV* sv, IV val)
-
-=for hackers
-Found in file sv.h
-
-=item SvLEN
-X<SvLEN>
-
-Returns the size of the string buffer in the SV, not including any part
-attributable to C<SvOOK>. See C<SvCUR>.
-
- STRLEN SvLEN(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvLEN_set
-X<SvLEN_set>
-
-Set the actual length of the string which is in the SV. See C<SvIV_set>.
-
- void SvLEN_set(SV* sv, STRLEN len)
-
-=for hackers
-Found in file sv.h
-
-=item SvMAGIC_set
-X<SvMAGIC_set>
-
-Set the value of the MAGIC pointer in sv to val. See C<SvIV_set>.
-
- void SvMAGIC_set(SV* sv, MAGIC* val)
-
-=for hackers
-Found in file sv.h
-
-=item SvNIOK
-X<SvNIOK>
-
-Returns a U32 value indicating whether the SV contains a number, integer or
-double.
-
- U32 SvNIOK(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvNIOKp
-X<SvNIOKp>
-
-Returns a U32 value indicating whether the SV contains a number, integer or
-double. Checks the B<private> setting. Use C<SvNIOK> instead.
-
- U32 SvNIOKp(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvNIOK_off
-X<SvNIOK_off>
-
-Unsets the NV/IV status of an SV.
-
- void SvNIOK_off(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvNOK
-X<SvNOK>
-
-Returns a U32 value indicating whether the SV contains a double.
-
- U32 SvNOK(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvNOKp
-X<SvNOKp>
-
-Returns a U32 value indicating whether the SV contains a double. Checks the
-B<private> setting. Use C<SvNOK> instead.
-
- U32 SvNOKp(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvNOK_off
-X<SvNOK_off>
-
-Unsets the NV status of an SV.
-
- void SvNOK_off(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvNOK_on
-X<SvNOK_on>
-
-Tells an SV that it is a double.
-
- void SvNOK_on(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvNOK_only
-X<SvNOK_only>
-
-Tells an SV that it is a double and disables all other OK bits.
-
- void SvNOK_only(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvNV
-X<SvNV>
-
-Coerce the given SV to a double and return it. See C<SvNVx> for a version
-which guarantees to evaluate sv only once.
-
- NV SvNV(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvNVX
-X<SvNVX>
-
-Returns the raw value in the SV's NV slot, without checks or conversions.
-Only use when you are sure SvNOK is true. See also C<SvNV()>.
-
- NV SvNVX(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvNVx
-X<SvNVx>
-
-Coerces the given SV to a double and returns it. Guarantees to evaluate
-C<sv> only once. Only use this if C<sv> is an expression with side effects,
-otherwise use the more efficient C<SvNV>.
-
- NV SvNVx(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvNV_set
-X<SvNV_set>
-
-Set the value of the NV pointer in sv to val. See C<SvIV_set>.
-
- void SvNV_set(SV* sv, NV val)
-
-=for hackers
-Found in file sv.h
-
-=item SvOK
-X<SvOK>
-
-Returns a U32 value indicating whether the value is an SV. It also tells
-whether the value is defined or not.
-
- U32 SvOK(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvOOK
-X<SvOOK>
-
-Returns a U32 indicating whether the pointer to the string buffer is offset.
-This hack is used internally to speed up removal of characters from the
-beginning of a SvPV. When SvOOK is true, then the start of the
-allocated string buffer is actually C<SvOOK_offset()> bytes before SvPVX.
-This offset used to be stored in SvIVX, but is now stored within the spare
-part of the buffer.
-
- U32 SvOOK(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvOOK_offset
-X<SvOOK_offset>
-
-Reads into I<len> the offset from SvPVX back to the true start of the
-allocated buffer, which will be non-zero if C<sv_chop> has been used to
-efficiently remove characters from start of the buffer. Implemented as a
-macro, which takes the address of I<len>, which must be of type C<STRLEN>.
-Evaluates I<sv> more than once. Sets I<len> to 0 if C<SvOOK(sv)> is false.
-
- void SvOOK_offset(NN SV*sv, STRLEN len)
-
-=for hackers
-Found in file sv.h
-
-=item SvPOK
-X<SvPOK>
-
-Returns a U32 value indicating whether the SV contains a character
-string.
-
- U32 SvPOK(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvPOKp
-X<SvPOKp>
-
-Returns a U32 value indicating whether the SV contains a character string.
-Checks the B<private> setting. Use C<SvPOK> instead.
-
- U32 SvPOKp(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvPOK_off
-X<SvPOK_off>
-
-Unsets the PV status of an SV.
-
- void SvPOK_off(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvPOK_on
-X<SvPOK_on>
-
-Tells an SV that it is a string.
-
- void SvPOK_on(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvPOK_only
-X<SvPOK_only>
-
-Tells an SV that it is a string and disables all other OK bits.
-Will also turn off the UTF-8 status.
-
- void SvPOK_only(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvPOK_only_UTF8
-X<SvPOK_only_UTF8>
-
-Tells an SV that it is a string and disables all other OK bits,
-and leaves the UTF-8 status as it was.
-
- void SvPOK_only_UTF8(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvPV
-X<SvPV>
-
-Returns a pointer to the string in the SV, or a stringified form of
-the SV if the SV does not contain a string. The SV may cache the
-stringified version becoming C<SvPOK>. Handles 'get' magic. See also
-C<SvPVx> for a version which guarantees to evaluate sv only once.
-
- char* SvPV(SV* sv, STRLEN len)
-
-=for hackers
-Found in file sv.h
-
-=item SvPVbyte
-X<SvPVbyte>
-
-Like C<SvPV>, but converts sv to byte representation first if necessary.
-
- char* SvPVbyte(SV* sv, STRLEN len)
-
-=for hackers
-Found in file sv.h
-
-=item SvPVbytex
-X<SvPVbytex>
-
-Like C<SvPV>, but converts sv to byte representation first if necessary.
-Guarantees to evaluate sv only once; use the more efficient C<SvPVbyte>
-otherwise.
-
- char* SvPVbytex(SV* sv, STRLEN len)
-
-=for hackers
-Found in file sv.h
-
-=item SvPVbytex_force
-X<SvPVbytex_force>
-
-Like C<SvPV_force>, but converts sv to byte representation first if necessary.
-Guarantees to evaluate sv only once; use the more efficient C<SvPVbyte_force>
-otherwise.
-
- char* SvPVbytex_force(SV* sv, STRLEN len)
-
-=for hackers
-Found in file sv.h
-
-=item SvPVbyte_force
-X<SvPVbyte_force>
-
-Like C<SvPV_force>, but converts sv to byte representation first if necessary.
-
- char* SvPVbyte_force(SV* sv, STRLEN len)
-
-=for hackers
-Found in file sv.h
-
-=item SvPVbyte_nolen
-X<SvPVbyte_nolen>
-
-Like C<SvPV_nolen>, but converts sv to byte representation first if necessary.
-
- char* SvPVbyte_nolen(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvPVutf8
-X<SvPVutf8>
-
-Like C<SvPV>, but converts sv to utf8 first if necessary.
-
- char* SvPVutf8(SV* sv, STRLEN len)
-
-=for hackers
-Found in file sv.h
-
-=item SvPVutf8x
-X<SvPVutf8x>
-
-Like C<SvPV>, but converts sv to utf8 first if necessary.
-Guarantees to evaluate sv only once; use the more efficient C<SvPVutf8>
-otherwise.
-
- char* SvPVutf8x(SV* sv, STRLEN len)
-
-=for hackers
-Found in file sv.h
-
-=item SvPVutf8x_force
-X<SvPVutf8x_force>
-
-Like C<SvPV_force>, but converts sv to utf8 first if necessary.
-Guarantees to evaluate sv only once; use the more efficient C<SvPVutf8_force>
-otherwise.
-
- char* SvPVutf8x_force(SV* sv, STRLEN len)
-
-=for hackers
-Found in file sv.h
-
-=item SvPVutf8_force
-X<SvPVutf8_force>
-
-Like C<SvPV_force>, but converts sv to utf8 first if necessary.
-
- char* SvPVutf8_force(SV* sv, STRLEN len)
-
-=for hackers
-Found in file sv.h
-
-=item SvPVutf8_nolen
-X<SvPVutf8_nolen>
-
-Like C<SvPV_nolen>, but converts sv to utf8 first if necessary.
-
- char* SvPVutf8_nolen(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvPVX
-X<SvPVX>
-
-Returns a pointer to the physical string in the SV. The SV must contain a
-string.
-
- char* SvPVX(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvPVx
-X<SvPVx>
-
-A version of C<SvPV> which guarantees to evaluate C<sv> only once.
-Only use this if C<sv> is an expression with side effects, otherwise use the
-more efficient C<SvPVX>.
-
- char* SvPVx(SV* sv, STRLEN len)
-
-=for hackers
-Found in file sv.h
-
-=item SvPV_force
-X<SvPV_force>
-
-Like C<SvPV> but will force the SV into containing just a string
-(C<SvPOK_only>). You want force if you are going to update the C<SvPVX>
-directly.
-
- char* SvPV_force(SV* sv, STRLEN len)
-
-=for hackers
-Found in file sv.h
-
-=item SvPV_force_nomg
-X<SvPV_force_nomg>
-
-Like C<SvPV> but will force the SV into containing just a string
-(C<SvPOK_only>). You want force if you are going to update the C<SvPVX>
-directly. Doesn't process magic.
-
- char* SvPV_force_nomg(SV* sv, STRLEN len)
-
-=for hackers
-Found in file sv.h
-
-=item SvPV_nolen
-X<SvPV_nolen>
-
-Returns a pointer to the string in the SV, or a stringified form of
-the SV if the SV does not contain a string. The SV may cache the
-stringified form becoming C<SvPOK>. Handles 'get' magic.
-
- char* SvPV_nolen(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvPV_nomg
-X<SvPV_nomg>
-
-Like C<SvPV> but doesn't process magic.
-
- char* SvPV_nomg(SV* sv, STRLEN len)
-
-=for hackers
-Found in file sv.h
-
-=item SvPV_set
-X<SvPV_set>
-
-Set the value of the PV pointer in sv to val. See C<SvIV_set>.
-
- void SvPV_set(SV* sv, char* val)
-
-=for hackers
-Found in file sv.h
-
-=item SvREFCNT
-X<SvREFCNT>
-
-Returns the value of the object's reference count.
-
- U32 SvREFCNT(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvREFCNT_dec
-X<SvREFCNT_dec>
-
-Decrements the reference count of the given SV.
-
- void SvREFCNT_dec(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvREFCNT_inc
-X<SvREFCNT_inc>
-
-Increments the reference count of the given SV.
-
-All of the following SvREFCNT_inc* macros are optimized versions of
-SvREFCNT_inc, and can be replaced with SvREFCNT_inc.
-
- SV* SvREFCNT_inc(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvREFCNT_inc_NN
-X<SvREFCNT_inc_NN>
-
-Same as SvREFCNT_inc, but can only be used if you know I<sv>
-is not NULL. Since we don't have to check the NULLness, it's faster
-and smaller.
-
- SV* SvREFCNT_inc_NN(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvREFCNT_inc_simple
-X<SvREFCNT_inc_simple>
-
-Same as SvREFCNT_inc, but can only be used with expressions without side
-effects. Since we don't have to store a temporary value, it's faster.
-
- SV* SvREFCNT_inc_simple(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvREFCNT_inc_simple_NN
-X<SvREFCNT_inc_simple_NN>
-
-Same as SvREFCNT_inc_simple, but can only be used if you know I<sv>
-is not NULL. Since we don't have to check the NULLness, it's faster
-and smaller.
-
- SV* SvREFCNT_inc_simple_NN(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvREFCNT_inc_simple_void
-X<SvREFCNT_inc_simple_void>
-
-Same as SvREFCNT_inc_simple, but can only be used if you don't need the
-return value. The macro doesn't need to return a meaningful value.
-
- void SvREFCNT_inc_simple_void(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvREFCNT_inc_simple_void_NN
-X<SvREFCNT_inc_simple_void_NN>
-
-Same as SvREFCNT_inc, but can only be used if you don't need the return
-value, and you know that I<sv> is not NULL. The macro doesn't need
-to return a meaningful value, or check for NULLness, so it's smaller
-and faster.
-
- void SvREFCNT_inc_simple_void_NN(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvREFCNT_inc_void
-X<SvREFCNT_inc_void>
-
-Same as SvREFCNT_inc, but can only be used if you don't need the
-return value. The macro doesn't need to return a meaningful value.
-
- void SvREFCNT_inc_void(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvREFCNT_inc_void_NN
-X<SvREFCNT_inc_void_NN>
-
-Same as SvREFCNT_inc, but can only be used if you don't need the return
-value, and you know that I<sv> is not NULL. The macro doesn't need
-to return a meaningful value, or check for NULLness, so it's smaller
-and faster.
-
- void SvREFCNT_inc_void_NN(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvROK
-X<SvROK>
-
-Tests if the SV is an RV.
-
- U32 SvROK(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvROK_off
-X<SvROK_off>
-
-Unsets the RV status of an SV.
-
- void SvROK_off(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvROK_on
-X<SvROK_on>
-
-Tells an SV that it is an RV.
-
- void SvROK_on(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvRV
-X<SvRV>
-
-Dereferences an RV to return the SV.
-
- SV* SvRV(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvRV_set
-X<SvRV_set>
-
-Set the value of the RV pointer in sv to val. See C<SvIV_set>.
-
- void SvRV_set(SV* sv, SV* val)
-
-=for hackers
-Found in file sv.h
-
-=item SvSTASH
-X<SvSTASH>
-
-Returns the stash of the SV.
-
- HV* SvSTASH(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvSTASH_set
-X<SvSTASH_set>
-
-Set the value of the STASH pointer in sv to val. See C<SvIV_set>.
-
- void SvSTASH_set(SV* sv, HV* val)
-
-=for hackers
-Found in file sv.h
-
-=item SvTAINT
-X<SvTAINT>
-
-Taints an SV if tainting is enabled.
-
- void SvTAINT(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvTAINTED
-X<SvTAINTED>
-
-Checks to see if an SV is tainted. Returns TRUE if it is, FALSE if
-not.
-
- bool SvTAINTED(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvTAINTED_off
-X<SvTAINTED_off>
-
-Untaints an SV. Be I<very> careful with this routine, as it short-circuits
-some of Perl's fundamental security features. XS module authors should not
-use this function unless they fully understand all the implications of
-unconditionally untainting the value. Untainting should be done in the
-standard perl fashion, via a carefully crafted regexp, rather than directly
-untainting variables.
-
- void SvTAINTED_off(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvTAINTED_on
-X<SvTAINTED_on>
-
-Marks an SV as tainted if tainting is enabled.
-
- void SvTAINTED_on(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvTRUE
-X<SvTRUE>
-
-Returns a boolean indicating whether Perl would evaluate the SV as true or
-false, defined or undefined. Does not handle 'get' magic.
-
- bool SvTRUE(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvTYPE
-X<SvTYPE>
-
-Returns the type of the SV. See C<svtype>.
-
- svtype SvTYPE(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvUOK
-X<SvUOK>
-
-Returns a boolean indicating whether the SV contains an unsigned integer.
-
- bool SvUOK(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvUPGRADE
-X<SvUPGRADE>
-
-Used to upgrade an SV to a more complex form. Uses C<sv_upgrade> to
-perform the upgrade if necessary. See C<svtype>.
-
- void SvUPGRADE(SV* sv, svtype type)
-
-=for hackers
-Found in file sv.h
-
-=item SvUTF8
-X<SvUTF8>
-
-Returns a U32 value indicating whether the SV contains UTF-8 encoded data.
-Call this after SvPV() in case any call to string overloading updates the
-internal flag.
-
- U32 SvUTF8(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvUTF8_off
-X<SvUTF8_off>
-
-Unsets the UTF-8 status of an SV.
-
- void SvUTF8_off(SV *sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvUTF8_on
-X<SvUTF8_on>
-
-Turn on the UTF-8 status of an SV (the data is not changed, just the flag).
-Do not use frivolously.
-
- void SvUTF8_on(SV *sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvUV
-X<SvUV>
-
-Coerces the given SV to an unsigned integer and returns it. See C<SvUVx>
-for a version which guarantees to evaluate sv only once.
-
- UV SvUV(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvUVX
-X<SvUVX>
-
-Returns the raw value in the SV's UV slot, without checks or conversions.
-Only use when you are sure SvIOK is true. See also C<SvUV()>.
-
- UV SvUVX(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvUVx
-X<SvUVx>
-
-Coerces the given SV to an unsigned integer and returns it. Guarantees to
-C<sv> only once. Only use this if C<sv> is an expression with side effects,
-otherwise use the more efficient C<SvUV>.
-
- UV SvUVx(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvUV_nomg
-X<SvUV_nomg>
-
-Like C<SvUV> but doesn't process magic.
-
- UV SvUV_nomg(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item SvUV_set
-X<SvUV_set>
-
-Set the value of the UV pointer in sv to val. See C<SvIV_set>.
-
- void SvUV_set(SV* sv, UV val)
-
-=for hackers
-Found in file sv.h
-
-=item SvVOK
-X<SvVOK>
-
-Returns a boolean indicating whether the SV contains a v-string.
-
- bool SvVOK(SV* sv)
-
-=for hackers
-Found in file sv.h
-
-=item sv_catpvn_nomg
-X<sv_catpvn_nomg>
-
-Like C<sv_catpvn> but doesn't process magic.
-
- void sv_catpvn_nomg(SV* sv, const char* ptr, STRLEN len)
-
-=for hackers
-Found in file sv.h
-
-=item sv_catsv_nomg
-X<sv_catsv_nomg>
-
-Like C<sv_catsv> but doesn't process magic.
-
- void sv_catsv_nomg(SV* dsv, SV* ssv)
-
-=for hackers
-Found in file sv.h
-
-=item sv_derived_from
-X<sv_derived_from>
-
-Returns a boolean indicating whether the SV is derived from the specified class
-I<at the C level>. To check derivation at the Perl level, call C<isa()> as a
-normal Perl method.
-
- bool sv_derived_from(SV* sv, const char *const name)
-
-=for hackers
-Found in file universal.c
-
-=item sv_does
-X<sv_does>
-
-Returns a boolean indicating whether the SV performs a specific, named role.
-The SV can be a Perl object or the name of a Perl class.
-
- bool sv_does(SV* sv, const char *const name)
-
-=for hackers
-Found in file universal.c
-
-=item sv_report_used
-X<sv_report_used>
-
-Dump the contents of all SVs not yet freed. (Debugging aid).
-
- void sv_report_used()
-
-=for hackers
-Found in file sv.c
-
-=item sv_setsv_nomg
-X<sv_setsv_nomg>
-
-Like C<sv_setsv> but doesn't process magic.
-
- void sv_setsv_nomg(SV* dsv, SV* ssv)
-
-=for hackers
-Found in file sv.h
-
-=item sv_utf8_upgrade_nomg
-X<sv_utf8_upgrade_nomg>
-
-Like sv_utf8_upgrade, but doesn't do magic on C<sv>
-
- STRLEN sv_utf8_upgrade_nomg(NN SV *sv)
-
-=for hackers
-Found in file sv.h
-
-
-=back
-
-=head1 SV-Body Allocation
-
-=over 8
-
-=item looks_like_number
-X<looks_like_number>
-
-Test if the content of an SV looks like a number (or is a number).
-C<Inf> and C<Infinity> are treated as numbers (so will not issue a
-non-numeric warning), even if your atof() doesn't grok them.
-
- I32 looks_like_number(SV *const sv)
-
-=for hackers
-Found in file sv.c
-
-=item newRV_noinc
-X<newRV_noinc>
-
-Creates an RV wrapper for an SV. The reference count for the original
-SV is B<not> incremented.
-
- SV* newRV_noinc(SV *const sv)
-
-=for hackers
-Found in file sv.c
-
-=item newSV
-X<newSV>
-
-Creates a new SV. A non-zero C<len> parameter indicates the number of
-bytes of preallocated string space the SV should have. An extra byte for a
-trailing NUL is also reserved. (SvPOK is not set for the SV even if string
-space is allocated.) The reference count for the new SV is set to 1.
-
-In 5.9.3, newSV() replaces the older NEWSV() API, and drops the first
-parameter, I<x>, a debug aid which allowed callers to identify themselves.
-This aid has been superseded by a new build option, PERL_MEM_LOG (see
-L<perlhack/PERL_MEM_LOG>). The older API is still there for use in XS
-modules supporting older perls.
-
- SV* newSV(const STRLEN len)
-
-=for hackers
-Found in file sv.c
-
-=item newSVhek
-X<newSVhek>
-
-Creates a new SV from the hash key structure. It will generate scalars that
-point to the shared string table where possible. Returns a new (undefined)
-SV if the hek is NULL.
-
- SV* newSVhek(const HEK *const hek)
-
-=for hackers
-Found in file sv.c
-
-=item newSViv
-X<newSViv>
-
-Creates a new SV and copies an integer into it. The reference count for the
-SV is set to 1.
-
- SV* newSViv(const IV i)
-
-=for hackers
-Found in file sv.c
-
-=item newSVnv
-X<newSVnv>
-
-Creates a new SV and copies a floating point value into it.
-The reference count for the SV is set to 1.
-
- SV* newSVnv(const NV n)
-
-=for hackers
-Found in file sv.c
-
-=item newSVpv
-X<newSVpv>
-
-Creates a new SV and copies a string into it. The reference count for the
-SV is set to 1. If C<len> is zero, Perl will compute the length using
-strlen(). For efficiency, consider using C<newSVpvn> instead.
-
- SV* newSVpv(const char *const s, const STRLEN len)
-
-=for hackers
-Found in file sv.c
-
-=item newSVpvf
-X<newSVpvf>
-
-Creates a new SV and initializes it with the string formatted like
-C<sprintf>.
-
- SV* newSVpvf(const char *const pat, ...)
-
-=for hackers
-Found in file sv.c
-
-=item newSVpvn
-X<newSVpvn>
-
-Creates a new SV and copies a string into it. The reference count for the
-SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
-string. You are responsible for ensuring that the source string is at least
-C<len> bytes long. If the C<s> argument is NULL the new SV will be undefined.
-
- SV* newSVpvn(const char *const s, const STRLEN len)
-
-=for hackers
-Found in file sv.c
-
-=item newSVpvn_flags
-X<newSVpvn_flags>
-
-Creates a new SV and copies a string into it. The reference count for the
-SV is set to 1. Note that if C<len> is zero, Perl will create a zero length
-string. You are responsible for ensuring that the source string is at least
-C<len> bytes long. If the C<s> argument is NULL the new SV will be undefined.
-Currently the only flag bits accepted are C<SVf_UTF8> and C<SVs_TEMP>.
-If C<SVs_TEMP> is set, then C<sv2mortal()> is called on the result before
-returning. If C<SVf_UTF8> is set, then it will be set on the new SV.
-C<newSVpvn_utf8()> is a convenience wrapper for this function, defined as
-
- #define newSVpvn_utf8(s, len, u) \
- newSVpvn_flags((s), (len), (u) ? SVf_UTF8 : 0)
-
- SV* newSVpvn_flags(const char *const s, const STRLEN len, const U32 flags)
-
-=for hackers
-Found in file sv.c
-
-=item newSVpvn_share
-X<newSVpvn_share>
-
-Creates a new SV with its SvPVX_const pointing to a shared string in the string
-table. If the string does not already exist in the table, it is created
-first. Turns on READONLY and FAKE. If the C<hash> parameter is non-zero, that
-value is used; otherwise the hash is computed. The string's hash can be later
-be retrieved from the SV with the C<SvSHARED_HASH()> macro. The idea here is
-that as the string table is used for shared hash keys these strings will have
-SvPVX_const == HeKEY and hash lookup will avoid string compare.
-
- SV* newSVpvn_share(const char* s, I32 len, U32 hash)
-
-=for hackers
-Found in file sv.c
-
-=item newSVpvs
-X<newSVpvs>
-
-Like C<newSVpvn>, but takes a literal string instead of a string/length pair.
-
- SV* newSVpvs(const char* s)
-
-=for hackers
-Found in file handy.h
-
-=item newSVpvs_flags
-X<newSVpvs_flags>
-
-Like C<newSVpvn_flags>, but takes a literal string instead of a string/length
-pair.
-
- SV* newSVpvs_flags(const char* s, U32 flags)
-
-=for hackers
-Found in file handy.h
-
-=item newSVpvs_share
-X<newSVpvs_share>
-
-Like C<newSVpvn_share>, but takes a literal string instead of a string/length
-pair and omits the hash parameter.
-
- SV* newSVpvs_share(const char* s)
-
-=for hackers
-Found in file handy.h
-
-=item newSVrv
-X<newSVrv>
-
-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 *const rv, const char *const classname)
-
-=for hackers
-Found in file sv.c
-
-=item newSVsv
-X<newSVsv>
-
-Creates a new SV which is an exact duplicate of the original SV.
-(Uses C<sv_setsv>).
-
- SV* newSVsv(SV *const old)
-
-=for hackers
-Found in file sv.c
-
-=item newSVuv
-X<newSVuv>
-
-Creates a new SV and copies an unsigned integer into it.
-The reference count for the SV is set to 1.
-
- SV* newSVuv(const UV u)
-
-=for hackers
-Found in file sv.c
-
-=item newSV_type
-X<newSV_type>
-
-Creates a new SV, of the type specified. The reference count for the new SV
-is set to 1.
-
- SV* newSV_type(const svtype type)
-
-=for hackers
-Found in file sv.c
-
-=item sv_2bool
-X<sv_2bool>
-
-This function is only called on magical items, and is only used by
-sv_true() or its macro equivalent.
-
- bool sv_2bool(SV *const sv)
-
-=for hackers
-Found in file sv.c
-
-=item sv_2cv
-X<sv_2cv>
-
-Using various gambits, try to get a CV from an SV; in addition, try if
-possible to set C<*st> and C<*gvp> to the stash and GV associated with it.
-The flags in C<lref> are passed to sv_fetchsv.
-
- CV* sv_2cv(SV* sv, HV **const st, GV **const gvp, const I32 lref)
-
-=for hackers
-Found in file sv.c
-
-=item sv_2io
-X<sv_2io>
-
-Using various gambits, try to get an IO from an SV: the IO slot if its a
-GV; or the recursive result if we're an RV; or the IO slot of the symbol
-named after the PV if we're a string.
-
- IO* sv_2io(SV *const sv)
-
-=for hackers
-Found in file sv.c
-
-=item sv_2iv_flags
-X<sv_2iv_flags>
-
-Return the integer value of an SV, doing any necessary string
-conversion. If flags includes SV_GMAGIC, does an mg_get() first.
-Normally used via the C<SvIV(sv)> and C<SvIVx(sv)> macros.
-
- IV sv_2iv_flags(SV *const sv, const I32 flags)
-
-=for hackers
-Found in file sv.c
-
-=item sv_2mortal
-X<sv_2mortal>
-
-Marks an existing SV as mortal. The SV will be destroyed "soon", either
-by an explicit call to FREETMPS, or by an implicit call at places such as
-statement boundaries. SvTEMP() is turned on which means that the SV's
-string buffer can be "stolen" if this SV is copied. See also C<sv_newmortal>
-and C<sv_mortalcopy>.
-
- SV* sv_2mortal(SV *const sv)
-
-=for hackers
-Found in file sv.c
-
-=item sv_2nv
-X<sv_2nv>
-
-Return the num value of an SV, doing any necessary string or integer
-conversion, magic etc. Normally used via the C<SvNV(sv)> and C<SvNVx(sv)>
-macros.
-
- NV sv_2nv(SV *const sv)
-
-=for hackers
-Found in file sv.c
-
-=item sv_2pvbyte
-X<sv_2pvbyte>
-
-Return a pointer to the byte-encoded representation of the SV, and set *lp
-to its length. May cause the SV to be downgraded from UTF-8 as a
-side-effect.
-
-Usually accessed via the C<SvPVbyte> macro.
-
- char* sv_2pvbyte(SV *const sv, STRLEN *const lp)
-
-=for hackers
-Found in file sv.c
-
-=item sv_2pvutf8
-X<sv_2pvutf8>
-
-Return a pointer to the UTF-8-encoded representation of the SV, and set *lp
-to its length. May cause the SV to be upgraded to UTF-8 as a side-effect.
-
-Usually accessed via the C<SvPVutf8> macro.
-
- char* sv_2pvutf8(SV *const sv, STRLEN *const lp)
-
-=for hackers
-Found in file sv.c
-
-=item sv_2pv_flags
-X<sv_2pv_flags>
-
-Returns a pointer to the string value of an SV, and sets *lp to its length.
-If flags includes SV_GMAGIC, does an mg_get() first. Coerces sv to a string
-if necessary.
-Normally invoked via the C<SvPV_flags> macro. C<sv_2pv()> and C<sv_2pv_nomg>
-usually end up here too.
-
- char* sv_2pv_flags(SV *const sv, STRLEN *const lp, const I32 flags)
-
-=for hackers
-Found in file sv.c
-
-=item sv_2uv_flags
-X<sv_2uv_flags>
-
-Return the unsigned integer value of an SV, doing any necessary string
-conversion. If flags includes SV_GMAGIC, does an mg_get() first.
-Normally used via the C<SvUV(sv)> and C<SvUVx(sv)> macros.
-
- UV sv_2uv_flags(SV *const sv, const I32 flags)
-
-=for hackers
-Found in file sv.c
-
-=item sv_backoff
-X<sv_backoff>
-
-Remove any string offset. You should normally use the C<SvOOK_off> macro
-wrapper instead.
-
- int sv_backoff(SV *const sv)
-
-=for hackers
-Found in file sv.c
-
-=item sv_bless
-X<sv_bless>
-
-Blesses an SV into a specified package. The SV must be an RV. The package
-must be designated by its stash (see C<gv_stashpv()>). The reference count
-of the SV is unaffected.
-
- SV* sv_bless(SV *const sv, HV *const stash)
-
-=for hackers
-Found in file sv.c
-
-=item sv_catpv
-X<sv_catpv>
-
-Concatenates the string onto the end of the string which is in the SV.
-If the SV has the UTF-8 status set, then the bytes appended should be
-valid UTF-8. Handles 'get' magic, but not 'set' magic. See C<sv_catpv_mg>.
-
- void sv_catpv(SV *const sv, const char* ptr)
-
-=for hackers
-Found in file sv.c
-
-=item sv_catpvf
-X<sv_catpvf>
-
-Processes its arguments like C<sprintf> and appends the formatted
-output to an SV. If the appended data contains "wide" characters
-(including, but not limited to, SVs with a UTF-8 PV formatted with %s,
-and characters >255 formatted with %c), the original SV might get
-upgraded to UTF-8. Handles 'get' magic, but not 'set' magic. See
-C<sv_catpvf_mg>. If the original SV was UTF-8, the pattern should be
-valid UTF-8; if the original SV was bytes, the pattern should be too.
-
- void sv_catpvf(SV *const sv, const char *const pat, ...)
-
-=for hackers
-Found in file sv.c
-
-=item sv_catpvf_mg
-X<sv_catpvf_mg>
-
-Like C<sv_catpvf>, but also handles 'set' magic.
-
- void sv_catpvf_mg(SV *const sv, const char *const pat, ...)
-
-=for hackers
-Found in file sv.c
-
-=item sv_catpvn
-X<sv_catpvn>
-
-Concatenates the string onto the end of the string which is in the SV. The
-C<len> indicates number of bytes to copy. If the SV has the UTF-8
-status set, then the bytes appended should be valid UTF-8.
-Handles 'get' magic, but not 'set' magic. See C<sv_catpvn_mg>.
-
- void sv_catpvn(SV *dsv, const char *sstr, STRLEN len)
-
-=for hackers
-Found in file sv.c
-
-=item sv_catpvn_flags
-X<sv_catpvn_flags>
-
-Concatenates the string onto the end of the string which is in the SV. The
-C<len> indicates number of bytes to copy. If the SV has the UTF-8
-status set, then the bytes appended should be valid UTF-8.
-If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<dsv> if
-appropriate, else not. C<sv_catpvn> and C<sv_catpvn_nomg> are implemented
-in terms of this function.
-
- void sv_catpvn_flags(SV *const dstr, const char *sstr, const STRLEN len, const I32 flags)
-
-=for hackers
-Found in file sv.c
-
-=item sv_catpvs
-X<sv_catpvs>
-
-Like C<sv_catpvn>, but takes a literal string instead of a string/length pair.
-
- void sv_catpvs(SV* sv, const char* s)
-
-=for hackers
-Found in file handy.h
-
-=item sv_catpv_mg
-X<sv_catpv_mg>
-
-Like C<sv_catpv>, but also handles 'set' magic.
-
- void sv_catpv_mg(SV *const sv, const char *const ptr)
-
-=for hackers
-Found in file sv.c
-
-=item sv_catsv
-X<sv_catsv>
-
-Concatenates the string from SV C<ssv> onto the end of the string in
-SV C<dsv>. Modifies C<dsv> but not C<ssv>. Handles 'get' magic, but
-not 'set' magic. See C<sv_catsv_mg>.
-
- void sv_catsv(SV *dstr, SV *sstr)
-
-=for hackers
-Found in file sv.c
-
-=item sv_catsv_flags
-X<sv_catsv_flags>
-
-Concatenates the string from SV C<ssv> onto the end of the string in
-SV C<dsv>. Modifies C<dsv> but not C<ssv>. If C<flags> has C<SV_GMAGIC>
-bit set, will C<mg_get> on the SVs if appropriate, else not. C<sv_catsv>
-and C<sv_catsv_nomg> are implemented in terms of this function.
-
- void sv_catsv_flags(SV *const dsv, SV *const ssv, const I32 flags)
-
-=for hackers
-Found in file sv.c
-
-=item sv_chop
-X<sv_chop>
-
-Efficient removal of characters from the beginning of the string buffer.
-SvPOK(sv) must be true and the C<ptr> must be a pointer to somewhere inside
-the string buffer. The C<ptr> becomes the first character of the adjusted
-string. Uses the "OOK hack".
-Beware: after this function returns, C<ptr> and SvPVX_const(sv) may no longer
-refer to the same chunk of data.
-
- void sv_chop(SV *const sv, const char *const ptr)
-
-=for hackers
-Found in file sv.c
-
-=item sv_clear
-X<sv_clear>
-
-Clear an SV: call any destructors, free up any memory used by the body,
-and free the body itself. The SV's head is I<not> freed, although
-its type is set to all 1's so that it won't inadvertently be assumed
-to be live during global destruction etc.
-This function should only be called when REFCNT is zero. Most of the time
-you'll want to call C<sv_free()> (or its macro wrapper C<SvREFCNT_dec>)
-instead.
-
- void sv_clear(SV *const sv)
-
-=for hackers
-Found in file sv.c
-
-=item sv_cmp
-X<sv_cmp>
-
-Compares the strings in two SVs. Returns -1, 0, or 1 indicating whether the
-string in C<sv1> is less than, equal to, or greater than the string in
-C<sv2>. Is UTF-8 and 'use bytes' aware, handles get magic, and will
-coerce its args to strings if necessary. See also C<sv_cmp_locale>.
-
- I32 sv_cmp(SV *const sv1, SV *const sv2)
-
-=for hackers
-Found in file sv.c
-
-=item sv_cmp_locale
-X<sv_cmp_locale>
-
-Compares the strings in two SVs in a locale-aware manner. Is UTF-8 and
-'use bytes' aware, handles get magic, and will coerce its args to strings
-if necessary. See also C<sv_cmp>.
-
- I32 sv_cmp_locale(SV *const sv1, SV *const sv2)
-
-=for hackers
-Found in file sv.c
-
-=item sv_collxfrm
-X<sv_collxfrm>
-
-Add Collate Transform magic to an SV if it doesn't already have it.
-
-Any scalar variable may carry PERL_MAGIC_collxfrm magic that contains the
-scalar data of the variable, but transformed to such a format that a normal
-memory comparison can be used to compare the data according to the locale
-settings.
-
- char* sv_collxfrm(SV *const sv, STRLEN *const nxp)
-
-=for hackers
-Found in file sv.c
-
-=item sv_copypv
-X<sv_copypv>
-
-Copies a stringified representation of the source SV into the
-destination SV. Automatically performs any necessary mg_get and
-coercion of numeric values into strings. Guaranteed to preserve
-UTF8 flag even from overloaded objects. Similar in nature to
-sv_2pv[_flags] but operates directly on an SV instead of just the
-string. Mostly uses sv_2pv_flags to do its work, except when that
-would lose the UTF-8'ness of the PV.
-
- void sv_copypv(SV *const dsv, SV *const ssv)
-
-=for hackers
-Found in file sv.c
-
-=item sv_dec
-X<sv_dec>
-
-Auto-decrement of the value in the SV, doing string to numeric conversion
-if necessary. Handles 'get' magic.
-
- void sv_dec(SV *const sv)
-
-=for hackers
-Found in file sv.c
-
-=item sv_eq
-X<sv_eq>
-
-Returns a boolean indicating whether the strings in the two SVs are
-identical. Is UTF-8 and 'use bytes' aware, handles get magic, and will
-coerce its args to strings if necessary.
-
- I32 sv_eq(SV* sv1, SV* sv2)
-
-=for hackers
-Found in file sv.c
-
-=item sv_force_normal_flags
-X<sv_force_normal_flags>
-
-Undo various types of fakery on an SV: if the PV is a shared string, make
-a private copy; if we're a ref, stop refing; if we're a glob, downgrade to
-an xpvmg; if we're a copy-on-write scalar, this is the on-write time when
-we do the copy, and is also used locally. If C<SV_COW_DROP_PV> is set
-then a copy-on-write scalar drops its PV buffer (if any) and becomes
-SvPOK_off rather than making a copy. (Used where this scalar is about to be
-set to some other value.) In addition, the C<flags> parameter gets passed to
-C<sv_unref_flags()> when unrefing. C<sv_force_normal> calls this function
-with flags set to 0.
-
- void sv_force_normal_flags(SV *const sv, const U32 flags)
-
-=for hackers
-Found in file sv.c
-
-=item sv_free
-X<sv_free>
-
-Decrement an SV's reference count, and if it drops to zero, call
-C<sv_clear> to invoke destructors and free up any memory used by
-the body; finally, deallocate the SV's head itself.
-Normally called via a wrapper macro C<SvREFCNT_dec>.
-
- void sv_free(SV *const sv)
-
-=for hackers
-Found in file sv.c
-
-=item sv_gets
-X<sv_gets>
-
-Get a line from the filehandle and store it into the SV, optionally
-appending to the currently-stored string.
-
- char* sv_gets(SV *const sv, PerlIO *const fp, I32 append)
-
-=for hackers
-Found in file sv.c
-
-=item sv_grow
-X<sv_grow>
-
-Expands the character buffer in the SV. If necessary, uses C<sv_unref> and
-upgrades the SV to C<SVt_PV>. Returns a pointer to the character buffer.
-Use the C<SvGROW> wrapper instead.
-
- char* sv_grow(SV *const sv, STRLEN newlen)
-
-=for hackers
-Found in file sv.c
-
-=item sv_inc
-X<sv_inc>
-
-Auto-increment of the value in the SV, doing string to numeric conversion
-if necessary. Handles 'get' magic.
-
- void sv_inc(SV *const sv)
-
-=for hackers
-Found in file sv.c
-
-=item sv_insert
-X<sv_insert>
-
-Inserts a string at the specified offset/length within the SV. Similar to
-the Perl substr() function. Handles get magic.
-
- void sv_insert(SV *const bigstr, const STRLEN offset, const STRLEN len, const char *const little, const STRLEN littlelen)
-
-=for hackers
-Found in file sv.c
-
-=item sv_insert_flags
-X<sv_insert_flags>
-
-Same as C<sv_insert>, but the extra C<flags> are passed the C<SvPV_force_flags> that applies to C<bigstr>.
-
- void sv_insert_flags(SV *const bigstr, const STRLEN offset, const STRLEN len, const char *const little, const STRLEN littlelen, const U32 flags)
-
-=for hackers
-Found in file sv.c
-
-=item sv_isa
-X<sv_isa>
-
-Returns a boolean indicating whether the SV is blessed into the specified
-class. This does not check for subtypes; use C<sv_derived_from> to verify
-an inheritance relationship.
-
- int sv_isa(SV* sv, const char *const name)
-
-=for hackers
-Found in file sv.c
-
-=item sv_isobject
-X<sv_isobject>
-
-Returns a boolean indicating whether the SV is an RV pointing to a blessed
-object. If the SV is not an RV, or if the object is not blessed, then this
-will return false.
-
- int sv_isobject(SV* sv)
-
-=for hackers
-Found in file sv.c
-
-=item sv_len
-X<sv_len>
-
-Returns the length of the string in the SV. Handles magic and type
-coercion. See also C<SvCUR>, which gives raw access to the xpv_cur slot.
-
- STRLEN sv_len(SV *const sv)
-
-=for hackers
-Found in file sv.c
-
-=item sv_len_utf8
-X<sv_len_utf8>
-
-Returns the number of characters in the string in an SV, counting wide
-UTF-8 bytes as a single character. Handles magic and type coercion.
-
- STRLEN sv_len_utf8(SV *const sv)
-
-=for hackers
-Found in file sv.c
-
-=item sv_magic
-X<sv_magic>
-
-Adds magic to an SV. First upgrades C<sv> to type C<SVt_PVMG> if necessary,
-then adds a new magic item of type C<how> to the head of the magic list.
-
-See C<sv_magicext> (which C<sv_magic> now calls) for a description of the
-handling of the C<name> and C<namlen> arguments.
-
-You need to use C<sv_magicext> to add magic to SvREADONLY SVs and also
-to add more than one instance of the same 'how'.
-
- void sv_magic(SV *const sv, SV *const obj, const int how, const char *const name, const I32 namlen)
-
-=for hackers
-Found in file sv.c
-
-=item sv_magicext
-X<sv_magicext>
-
-Adds magic to an SV, upgrading it if necessary. Applies the
-supplied vtable and returns a pointer to the magic added.
-
-Note that C<sv_magicext> will allow things that C<sv_magic> will not.
-In particular, you can add magic to SvREADONLY SVs, and add more than
-one instance of the same 'how'.
-
-If C<namlen> is greater than zero then a C<savepvn> I<copy> of C<name> is
-stored, if C<namlen> is zero then C<name> is stored as-is and - as another
-special case - if C<(name && namlen == HEf_SVKEY)> then C<name> is assumed
-to contain an C<SV*> and is stored as-is with its REFCNT incremented.
-
-(This is now used as a subroutine by C<sv_magic>.)
-
- MAGIC * sv_magicext(SV *const sv, SV *const obj, const int how, const MGVTBL *const vtbl, const char *const name, const I32 namlen)
-
-=for hackers
-Found in file sv.c
-
-=item sv_mortalcopy
-X<sv_mortalcopy>
-
-Creates a new SV which is a copy of the original SV (using C<sv_setsv>).
-The new SV is marked as mortal. It will be destroyed "soon", either by an
-explicit call to FREETMPS, or by an implicit call at places such as
-statement boundaries. See also C<sv_newmortal> and C<sv_2mortal>.
-
- SV* sv_mortalcopy(SV *const oldsv)
-
-=for hackers
-Found in file sv.c
-
-=item sv_newmortal
-X<sv_newmortal>
-
-Creates a new null SV which is mortal. The reference count of the SV is
-set to 1. It will be destroyed "soon", either by an explicit call to
-FREETMPS, or by an implicit call at places such as statement boundaries.
-See also C<sv_mortalcopy> and C<sv_2mortal>.
-
- SV* sv_newmortal()
-
-=for hackers
-Found in file sv.c
-
-=item sv_newref
-X<sv_newref>
-
-Increment an SV's reference count. Use the C<SvREFCNT_inc()> wrapper
-instead.
-
- SV* sv_newref(SV *const sv)
-
-=for hackers
-Found in file sv.c
-
-=item sv_pos_b2u
-X<sv_pos_b2u>
-
-Converts the value pointed to by offsetp from a count of bytes from the
-start of the string, to a count of the equivalent number of UTF-8 chars.
-Handles magic and type coercion.
-
- void sv_pos_b2u(SV *const sv, I32 *const offsetp)
-
-=for hackers
-Found in file sv.c
-
-=item sv_pos_u2b
-X<sv_pos_u2b>
-
-Converts the value pointed to by offsetp from a count of UTF-8 chars from
-the start of the string, to a count of the equivalent number of bytes; if
-lenp is non-zero, it does the same to lenp, but this time starting from
-the offset, rather than from the start of the string. Handles magic and
-type coercion.
-
- void sv_pos_u2b(SV *const sv, I32 *const offsetp, I32 *const lenp)
-
-=for hackers
-Found in file sv.c
-
-=item sv_pvbyten_force
-X<sv_pvbyten_force>
-
-The backend for the C<SvPVbytex_force> macro. Always use the macro instead.
-
- char* sv_pvbyten_force(SV *const sv, STRLEN *const lp)
-
-=for hackers
-Found in file sv.c
-
-=item sv_pvn_force
-X<sv_pvn_force>
-
-Get a sensible string out of the SV somehow.
-A private implementation of the C<SvPV_force> macro for compilers which
-can't cope with complex macro expressions. Always use the macro instead.
-
- char* sv_pvn_force(SV* sv, STRLEN* lp)
-
-=for hackers
-Found in file sv.c
-
-=item sv_pvn_force_flags
-X<sv_pvn_force_flags>
-
-Get a sensible string out of the SV somehow.
-If C<flags> has C<SV_GMAGIC> bit set, will C<mg_get> on C<sv> if
-appropriate, else not. C<sv_pvn_force> and C<sv_pvn_force_nomg> are
-implemented in terms of this function.
-You normally want to use the various wrapper macros instead: see
-C<SvPV_force> and C<SvPV_force_nomg>
-
- char* sv_pvn_force_flags(SV *const sv, STRLEN *const lp, const I32 flags)
-
-=for hackers
-Found in file sv.c
-
-=item sv_pvutf8n_force
-X<sv_pvutf8n_force>
-
-The backend for the C<SvPVutf8x_force> macro. Always use the macro instead.
-
- char* sv_pvutf8n_force(SV *const sv, STRLEN *const lp)
-
-=for hackers
-Found in file sv.c
-
-=item sv_reftype
-X<sv_reftype>
-
-Returns a string describing what the SV is a reference to.
-
- const char* sv_reftype(const SV *const sv, const int ob)
-
-=for hackers
-Found in file sv.c
-
-=item sv_replace
-X<sv_replace>
-
-Make the first argument a copy of the second, then delete the original.
-The target SV physically takes over ownership of the body of the source SV
-and inherits its flags; however, the target keeps any magic it owns,
-and any magic in the source is discarded.
-Note that this is a rather specialist SV copying operation; most of the
-time you'll want to use C<sv_setsv> or one of its many macro front-ends.
-
- void sv_replace(SV *const sv, SV *const nsv)
-
-=for hackers
-Found in file sv.c
-
-=item sv_reset
-X<sv_reset>
-
-Underlying implementation for the C<reset> Perl function.
-Note that the perl-level function is vaguely deprecated.
-
- void sv_reset(const char* s, HV *const stash)
-
-=for hackers
-Found in file sv.c
-
-=item sv_rvweaken
-X<sv_rvweaken>
-
-Weaken a reference: set the C<SvWEAKREF> flag on this RV; give the
-referred-to SV C<PERL_MAGIC_backref> magic if it hasn't already; and
-push a back-reference to this RV onto the array of backreferences
-associated with that magic. If the RV is magical, set magic will be
-called after the RV is cleared.
-
- SV* sv_rvweaken(SV *const sv)
-
-=for hackers
-Found in file sv.c
-
-=item sv_setiv
-X<sv_setiv>
-
-Copies an integer into the given SV, upgrading first if necessary.
-Does not handle 'set' magic. See also C<sv_setiv_mg>.
-
- void sv_setiv(SV *const sv, const IV num)
-
-=for hackers
-Found in file sv.c
-
-=item sv_setiv_mg
-X<sv_setiv_mg>
-
-Like C<sv_setiv>, but also handles 'set' magic.
-
- void sv_setiv_mg(SV *const sv, const IV i)
-
-=for hackers
-Found in file sv.c
-
-=item sv_setnv
-X<sv_setnv>
-
-Copies a double into the given SV, upgrading first if necessary.
-Does not handle 'set' magic. See also C<sv_setnv_mg>.
-
- void sv_setnv(SV *const sv, const NV num)
-
-=for hackers
-Found in file sv.c
-
-=item sv_setnv_mg
-X<sv_setnv_mg>
-
-Like C<sv_setnv>, but also handles 'set' magic.
-
- void sv_setnv_mg(SV *const sv, const NV num)
-
-=for hackers
-Found in file sv.c
-
-=item sv_setpv
-X<sv_setpv>
-
-Copies a string into an SV. The string must be null-terminated. Does not
-handle 'set' magic. See C<sv_setpv_mg>.
-
- void sv_setpv(SV *const sv, const char *const ptr)
-
-=for hackers
-Found in file sv.c
-
-=item sv_setpvf
-X<sv_setpvf>
-
-Works like C<sv_catpvf> but copies the text into the SV instead of
-appending it. Does not handle 'set' magic. See C<sv_setpvf_mg>.
-
- void sv_setpvf(SV *const sv, const char *const pat, ...)
-
-=for hackers
-Found in file sv.c
-
-=item sv_setpvf_mg
-X<sv_setpvf_mg>
-
-Like C<sv_setpvf>, but also handles 'set' magic.
-
- void sv_setpvf_mg(SV *const sv, const char *const pat, ...)
-
-=for hackers
-Found in file sv.c
-
-=item sv_setpviv
-X<sv_setpviv>
-
-Copies an integer into the given SV, also updating its string value.
-Does not handle 'set' magic. See C<sv_setpviv_mg>.
-
- void sv_setpviv(SV *const sv, const IV num)
-
-=for hackers
-Found in file sv.c
-
-=item sv_setpviv_mg
-X<sv_setpviv_mg>
-
-Like C<sv_setpviv>, but also handles 'set' magic.
-
- void sv_setpviv_mg(SV *const sv, const IV iv)
-
-=for hackers
-Found in file sv.c
-
-=item sv_setpvn
-X<sv_setpvn>
-
-Copies a string into an SV. The C<len> parameter indicates the number of
-bytes to be copied. If the C<ptr> argument is NULL the SV will become
-undefined. Does not handle 'set' magic. See C<sv_setpvn_mg>.
-
- void sv_setpvn(SV *const sv, const char *const ptr, const STRLEN len)
-
-=for hackers
-Found in file sv.c
-
-=item sv_setpvn_mg
-X<sv_setpvn_mg>
-
-Like C<sv_setpvn>, but also handles 'set' magic.
-
- void sv_setpvn_mg(SV *const sv, const char *const ptr, const STRLEN len)
-
-=for hackers
-Found in file sv.c
-
-=item sv_setpvs
-X<sv_setpvs>
-
-Like C<sv_setpvn>, but takes a literal string instead of a string/length pair.
-
- void sv_setpvs(SV* sv, const char* s)
-
-=for hackers
-Found in file handy.h
-
-=item sv_setpv_mg
-X<sv_setpv_mg>
-
-Like C<sv_setpv>, but also handles 'set' magic.
-
- void sv_setpv_mg(SV *const sv, const char *const ptr)
-
-=for hackers
-Found in file sv.c
-
-=item sv_setref_iv
-X<sv_setref_iv>
-
-Copies an integer into a new SV, optionally blessing the SV. The C<rv>
-argument will be upgraded to an RV. That RV will be modified to point to
-the new SV. The C<classname> argument indicates the package for the
-blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
-will have a reference count of 1, and the RV will be returned.
-
- SV* sv_setref_iv(SV *const rv, const char *const classname, const IV iv)
-
-=for hackers
-Found in file sv.c
-
-=item sv_setref_nv
-X<sv_setref_nv>
-
-Copies a double into a new SV, optionally blessing the SV. The C<rv>
-argument will be upgraded to an RV. That RV will be modified to point to
-the new SV. The C<classname> argument indicates the package for the
-blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
-will have a reference count of 1, and the RV will be returned.
-
- SV* sv_setref_nv(SV *const rv, const char *const classname, const NV nv)
-
-=for hackers
-Found in file sv.c
-
-=item sv_setref_pv
-X<sv_setref_pv>
-
-Copies a pointer into a new SV, optionally blessing the SV. The C<rv>
-argument will be upgraded to an RV. That RV will be modified to point to
-the new SV. If the C<pv> argument is NULL then C<PL_sv_undef> will be placed
-into the SV. The C<classname> argument indicates the package for the
-blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
-will have a reference count of 1, and the RV will be returned.
-
-Do not use with other Perl types such as HV, AV, SV, CV, because those
-objects will become corrupted by the pointer copy process.
-
-Note that C<sv_setref_pvn> copies the string while this copies the pointer.
-
- SV* sv_setref_pv(SV *const rv, const char *const classname, void *const pv)
-
-=for hackers
-Found in file sv.c
-
-=item sv_setref_pvn
-X<sv_setref_pvn>
-
-Copies a string into a new SV, optionally blessing the SV. The length of the
-string must be specified with C<n>. The C<rv> argument will be upgraded to
-an RV. That RV will be modified to point to the new SV. The C<classname>
-argument indicates the package for the blessing. Set C<classname> to
-C<NULL> to avoid the blessing. The new SV will have a reference count
-of 1, and the RV will be returned.
-
-Note that C<sv_setref_pv> copies the pointer while this copies the string.
-
- SV* sv_setref_pvn(SV *const rv, const char *const classname, const char *const pv, const STRLEN n)
-
-=for hackers
-Found in file sv.c
-
-=item sv_setref_uv
-X<sv_setref_uv>
-
-Copies an unsigned integer into a new SV, optionally blessing the SV. The C<rv>
-argument will be upgraded to an RV. That RV will be modified to point to
-the new SV. The C<classname> argument indicates the package for the
-blessing. Set C<classname> to C<NULL> to avoid the blessing. The new SV
-will have a reference count of 1, and the RV will be returned.
-
- SV* sv_setref_uv(SV *const rv, const char *const classname, const UV uv)
-
-=for hackers
-Found in file sv.c
-
-=item sv_setsv
-X<sv_setsv>
-
-Copies the contents of the source SV C<ssv> into the destination SV
-C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
-function if the source SV needs to be reused. Does not handle 'set' magic.
-Loosely speaking, it performs a copy-by-value, obliterating any previous
-content of the destination.
-
-You probably want to use one of the assortment of wrappers, such as
-C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
-C<SvSetMagicSV_nosteal>.
-
- void sv_setsv(SV *dstr, SV *sstr)
-
-=for hackers
-Found in file sv.c
-
-=item sv_setsv_flags
-X<sv_setsv_flags>
-
-Copies the contents of the source SV C<ssv> into the destination SV
-C<dsv>. The source SV may be destroyed if it is mortal, so don't use this
-function if the source SV needs to be reused. Does not handle 'set' magic.
-Loosely speaking, it performs a copy-by-value, obliterating any previous
-content of the destination.
-If the C<flags> parameter has the C<SV_GMAGIC> bit set, will C<mg_get> on
-C<ssv> if appropriate, else not. If the C<flags> parameter has the
-C<NOSTEAL> bit set then the buffers of temps will not be stolen. <sv_setsv>
-and C<sv_setsv_nomg> are implemented in terms of this function.
-
-You probably want to use one of the assortment of wrappers, such as
-C<SvSetSV>, C<SvSetSV_nosteal>, C<SvSetMagicSV> and
-C<SvSetMagicSV_nosteal>.
-
-This is the primary function for copying scalars, and most other
-copy-ish functions and macros use this underneath.
-
- void sv_setsv_flags(SV *dstr, SV *sstr, const I32 flags)
-
-=for hackers
-Found in file sv.c
-
-=item sv_setsv_mg
-X<sv_setsv_mg>
-
-Like C<sv_setsv>, but also handles 'set' magic.
-
- void sv_setsv_mg(SV *const dstr, SV *const sstr)
-
-=for hackers
-Found in file sv.c
-
-=item sv_setuv
-X<sv_setuv>
-
-Copies an unsigned integer into the given SV, upgrading first if necessary.
-Does not handle 'set' magic. See also C<sv_setuv_mg>.
-
- void sv_setuv(SV *const sv, const UV num)
-
-=for hackers
-Found in file sv.c
-
-=item sv_setuv_mg
-X<sv_setuv_mg>
-
-Like C<sv_setuv>, but also handles 'set' magic.
-
- void sv_setuv_mg(SV *const sv, const UV u)
-
-=for hackers
-Found in file sv.c
-
-=item sv_tainted
-X<sv_tainted>
-
-Test an SV for taintedness. Use C<SvTAINTED> instead.
- bool sv_tainted(SV *const sv)
-
-=for hackers
-Found in file sv.c
-
-=item sv_true
-X<sv_true>
-
-Returns true if the SV has a true value by Perl's rules.
-Use the C<SvTRUE> macro instead, which may call C<sv_true()> or may
-instead use an in-line version.
-
- I32 sv_true(SV *const sv)
-
-=for hackers
-Found in file sv.c
-
-=item sv_unmagic
-X<sv_unmagic>
-
-Removes all magic of type C<type> from an SV.
-
- int sv_unmagic(SV *const sv, const int type)
-
-=for hackers
-Found in file sv.c
-
-=item sv_unref_flags
-X<sv_unref_flags>
-
-Unsets the RV status of the SV, and decrements the reference count of
-whatever was being referenced by the RV. This can almost be thought of
-as a reversal of C<newSVrv>. The C<cflags> argument can contain
-C<SV_IMMEDIATE_UNREF> to force the reference count to be decremented
-(otherwise the decrementing is conditional on the reference count being
-different from one or the reference being a readonly SV).
-See C<SvROK_off>.
-
- void sv_unref_flags(SV *const ref, const U32 flags)
-
-=for hackers
-Found in file sv.c
-
-=item sv_untaint
-X<sv_untaint>
-
-Untaint an SV. Use C<SvTAINTED_off> instead.
- void sv_untaint(SV *const sv)
-
-=for hackers
-Found in file sv.c
-
-=item sv_upgrade
-X<sv_upgrade>
-
-Upgrade an SV to a more complex form. Generally adds a new body type to the
-SV, then copies across as much information as possible from the old body.
-You generally want to use the C<SvUPGRADE> macro wrapper. See also C<svtype>.
-
- void sv_upgrade(SV *const sv, svtype new_type)
-
-=for hackers
-Found in file sv.c
-
-=item sv_usepvn_flags
-X<sv_usepvn_flags>
-
-Tells an SV to use C<ptr> to find its string value. Normally the
-string is stored inside the SV but sv_usepvn allows the SV to use an
-outside string. The C<ptr> should point to memory that was allocated
-by C<malloc>. The string length, C<len>, must be supplied. By default
-this function will realloc (i.e. move) the memory pointed to by C<ptr>,
-so that pointer should not be freed or used by the programmer after
-giving it to sv_usepvn, and neither should any pointers from "behind"
-that pointer (e.g. ptr + 1) be used.
-
-If C<flags> & SV_SMAGIC is true, will call SvSETMAGIC. If C<flags> &
-SV_HAS_TRAILING_NUL is true, then C<ptr[len]> must be NUL, and the realloc
-will be skipped. (i.e. the buffer is actually at least 1 byte longer than
-C<len>, and already meets the requirements for storing in C<SvPVX>)
-
- void sv_usepvn_flags(SV *const sv, char* ptr, const STRLEN len, const U32 flags)
-
-=for hackers
-Found in file sv.c
-
-=item sv_utf8_decode
-X<sv_utf8_decode>
-
-If the PV of the SV is an octet sequence in UTF-8
-and contains a multiple-byte character, the C<SvUTF8> flag is turned on
-so that it looks like a character. If the PV contains only single-byte
-characters, the C<SvUTF8> flag stays being off.
-Scans PV for validity and returns false if the PV is invalid UTF-8.
-
-NOTE: this function is experimental and may change or be
-removed without notice.
-
- bool sv_utf8_decode(SV *const sv)
-
-=for hackers
-Found in file sv.c
-
-=item sv_utf8_downgrade
-X<sv_utf8_downgrade>
-
-Attempts to convert the PV of an SV from characters to bytes.
-If the PV contains a character that cannot fit
-in a byte, this conversion will fail;
-in this case, either returns false or, if C<fail_ok> is not
-true, croaks.
-
-This is not as a general purpose Unicode to byte encoding interface:
-use the Encode extension for that.
-
-NOTE: this function is experimental and may change or be
-removed without notice.
-
- bool sv_utf8_downgrade(SV *const sv, const bool fail_ok)
-
-=for hackers
-Found in file sv.c
-
-=item sv_utf8_encode
-X<sv_utf8_encode>
-
-Converts the PV of an SV to UTF-8, but then turns the C<SvUTF8>
-flag off so that it looks like octets again.
-
- void sv_utf8_encode(SV *const sv)
-
-=for hackers
-Found in file sv.c
-
-=item sv_utf8_upgrade
-X<sv_utf8_upgrade>
-
-Converts the PV of an SV to its UTF-8-encoded form.
-Forces the SV to string form if it is not already.
-Will C<mg_get> on C<sv> if appropriate.
-Always sets the SvUTF8 flag to avoid future validity checks even
-if the whole string is the same in UTF-8 as not.
-Returns the number of bytes in the converted string
-
-This is not as a general purpose byte encoding to Unicode interface:
-use the Encode extension for that.
-
- STRLEN sv_utf8_upgrade(SV *sv)
-
-=for hackers
-Found in file sv.c
-
-=item sv_utf8_upgrade_flags
-X<sv_utf8_upgrade_flags>
-
-Converts the PV of an SV to its UTF-8-encoded form.
-Forces the SV to string form if it is not already.
-Always sets the SvUTF8 flag to avoid future validity checks even
-if all the bytes are invariant in UTF-8. If C<flags> has C<SV_GMAGIC> bit set,
-will C<mg_get> on C<sv> if appropriate, else not.
-Returns the number of bytes in the converted string
-C<sv_utf8_upgrade> and
-C<sv_utf8_upgrade_nomg> are implemented in terms of this function.
-
-This is not as a general purpose byte encoding to Unicode interface:
-use the Encode extension for that.
-
- STRLEN sv_utf8_upgrade_flags(SV *const sv, const I32 flags)
-
-=for hackers
-Found in file sv.c
-
-=item sv_utf8_upgrade_nomg
-X<sv_utf8_upgrade_nomg>
-
-Like sv_utf8_upgrade, but doesn't do magic on C<sv>
-
- STRLEN sv_utf8_upgrade_nomg(SV *sv)
-
-=for hackers
-Found in file sv.c
-
-=item sv_vcatpvf
-X<sv_vcatpvf>
-
-Processes its arguments like C<vsprintf> and appends the formatted output
-to an SV. Does not handle 'set' magic. See C<sv_vcatpvf_mg>.
-
-Usually used via its frontend C<sv_catpvf>.
-
- void sv_vcatpvf(SV *const sv, const char *const pat, va_list *const args)
-
-=for hackers
-Found in file sv.c
-
-=item sv_vcatpvfn
-X<sv_vcatpvfn>
-
-Processes its arguments like C<vsprintf> and appends the formatted output
-to an SV. Uses an array of SVs if the C style variable argument list is
-missing (NULL). When running with taint checks enabled, indicates via
-C<maybe_tainted> if results are untrustworthy (often due to the use of
-locales).
-
-Usually used via one of its frontends C<sv_vcatpvf> and C<sv_vcatpvf_mg>.
-
- void sv_vcatpvfn(SV *const sv, const char *const pat, const STRLEN patlen, va_list *const args, SV **const svargs, const I32 svmax, bool *const maybe_tainted)
-
-=for hackers
-Found in file sv.c
-
-=item sv_vcatpvf_mg
-X<sv_vcatpvf_mg>
-
-Like C<sv_vcatpvf>, but also handles 'set' magic.
-
-Usually used via its frontend C<sv_catpvf_mg>.
-
- void sv_vcatpvf_mg(SV *const sv, const char *const pat, va_list *const args)
-
-=for hackers
-Found in file sv.c
-
-=item sv_vsetpvf
-X<sv_vsetpvf>
-
-Works like C<sv_vcatpvf> but copies the text into the SV instead of
-appending it. Does not handle 'set' magic. See C<sv_vsetpvf_mg>.
-
-Usually used via its frontend C<sv_setpvf>.
-
- void sv_vsetpvf(SV *const sv, const char *const pat, va_list *const args)
-
-=for hackers
-Found in file sv.c
-
-=item sv_vsetpvfn
-X<sv_vsetpvfn>
-
-Works like C<sv_vcatpvfn> but copies the text into the SV instead of
-appending it.
-
-Usually used via one of its frontends C<sv_vsetpvf> and C<sv_vsetpvf_mg>.
-
- void sv_vsetpvfn(SV *const sv, const char *const pat, const STRLEN patlen, va_list *const args, SV **const svargs, const I32 svmax, bool *const maybe_tainted)
-
-=for hackers
-Found in file sv.c
-
-=item sv_vsetpvf_mg
-X<sv_vsetpvf_mg>
-
-Like C<sv_vsetpvf>, but also handles 'set' magic.
-
-Usually used via its frontend C<sv_setpvf_mg>.
-
- void sv_vsetpvf_mg(SV *const sv, const char *const pat, va_list *const args)
-
-=for hackers
-Found in file sv.c
-
-
-=back
-
-=head1 Unicode Support
-
-=over 8
-
-=item bytes_from_utf8
-X<bytes_from_utf8>
-
-Converts a string C<s> of length C<len> from UTF-8 into native byte encoding.
-Unlike C<utf8_to_bytes> but like C<bytes_to_utf8>, returns a pointer to
-the newly-created string, and updates C<len> to contain the new
-length. Returns the original string if no conversion occurs, C<len>
-is unchanged. Do nothing if C<is_utf8> points to 0. Sets C<is_utf8> to
-0 if C<s> is converted or consisted entirely of characters that are invariant
-in utf8 (i.e., US-ASCII on non-EBCDIC machines).
-
-NOTE: this function is experimental and may change or be
-removed without notice.
-
- U8* bytes_from_utf8(const U8 *s, STRLEN *len, bool *is_utf8)
-
-=for hackers
-Found in file utf8.c
-
-=item bytes_to_utf8
-X<bytes_to_utf8>
-
-Converts a string C<s> of length C<len> from the native encoding into UTF-8.
-Returns a pointer to the newly-created string, and sets C<len> to
-reflect the new length.
-
-A NUL character will be written after the end of the string.
-
-If you want to convert to UTF-8 from encodings other than
-the native (Latin1 or EBCDIC),
-see sv_recode_to_utf8().
-
-NOTE: this function is experimental and may change or be
-removed without notice.
-
- U8* bytes_to_utf8(const U8 *s, STRLEN *len)
-
-=for hackers
-Found in file utf8.c
-
-=item ibcmp_utf8
-X<ibcmp_utf8>
-
-Return true if the strings s1 and s2 differ case-insensitively, false
-if not (if they are equal case-insensitively). If u1 is true, the
-string s1 is assumed to be in UTF-8-encoded Unicode. If u2 is true,
-the string s2 is assumed to be in UTF-8-encoded Unicode. If u1 or u2
-are false, the respective string is assumed to be in native 8-bit
-encoding.
-
-If the pe1 and pe2 are non-NULL, the scanning pointers will be copied
-in there (they will point at the beginning of the I<next> character).
-If the pointers behind pe1 or pe2 are non-NULL, they are the end
-pointers beyond which scanning will not continue under any
-circumstances. If the byte lengths l1 and l2 are non-zero, s1+l1 and
-s2+l2 will be used as goal end pointers that will also stop the scan,
-and which qualify towards defining a successful match: all the scans
-that define an explicit length must reach their goal pointers for
-a match to succeed).
-
-For case-insensitiveness, the "casefolding" of Unicode is used
-instead of upper/lowercasing both the characters, see
-http://www.unicode.org/unicode/reports/tr21/ (Case Mappings).
-
- I32 ibcmp_utf8(const char *s1, char **pe1, UV l1, bool u1, const char *s2, char **pe2, UV l2, bool u2)
-
-=for hackers
-Found in file utf8.c
-
-=item is_utf8_char
-X<is_utf8_char>
-
-Tests if some arbitrary number of bytes begins in a valid UTF-8
-character. Note that an INVARIANT (i.e. ASCII on non-EBCDIC machines)
-character is a valid UTF-8 character. The actual number of bytes in the UTF-8
-character will be returned if it is valid, otherwise 0.
-
- STRLEN is_utf8_char(const U8 *s)
-
-=for hackers
-Found in file utf8.c
-
-=item is_utf8_string
-X<is_utf8_string>
-
-Returns true if first C<len> bytes of the given string form a valid
-UTF-8 string, false otherwise. Note that 'a valid UTF-8 string' does
-not mean 'a string that contains code points above 0x7F encoded in UTF-8'
-because a valid ASCII string is a valid UTF-8 string.
-
-See also is_utf8_string_loclen() and is_utf8_string_loc().
-
- bool is_utf8_string(const U8 *s, STRLEN len)
-
-=for hackers
-Found in file utf8.c
-
-=item is_utf8_string_loc
-X<is_utf8_string_loc>
-
-Like is_utf8_string() but stores the location of the failure (in the
-case of "utf8ness failure") or the location s+len (in the case of
-"utf8ness success") in the C<ep>.
-
-See also is_utf8_string_loclen() and is_utf8_string().
-
- bool is_utf8_string_loc(const U8 *s, STRLEN len, const U8 **p)
-
-=for hackers
-Found in file utf8.c
-
-=item is_utf8_string_loclen
-X<is_utf8_string_loclen>
-
-Like is_utf8_string() but stores the location of the failure (in the
-case of "utf8ness failure") or the location s+len (in the case of
-"utf8ness success") in the C<ep>, and the number of UTF-8
-encoded characters in the C<el>.
-
-See also is_utf8_string_loc() and is_utf8_string().
-
- bool is_utf8_string_loclen(const U8 *s, STRLEN len, const U8 **ep, STRLEN *el)
-
-=for hackers
-Found in file utf8.c
-
-=item pv_uni_display
-X<pv_uni_display>
-
-Build to the scalar dsv a displayable version of the string spv,
-length len, the displayable version being at most pvlim bytes long
-(if longer, the rest is truncated and "..." will be appended).
-
-The flags argument can have UNI_DISPLAY_ISPRINT set to display
-isPRINT()able characters as themselves, UNI_DISPLAY_BACKSLASH
-to display the \\[nrfta\\] as the backslashed versions (like '\n')
-(UNI_DISPLAY_BACKSLASH is preferred over UNI_DISPLAY_ISPRINT for \\).
-UNI_DISPLAY_QQ (and its alias UNI_DISPLAY_REGEX) have both
-UNI_DISPLAY_BACKSLASH and UNI_DISPLAY_ISPRINT turned on.
-
-The pointer to the PV of the dsv is returned.
-
- char* pv_uni_display(SV *dsv, const U8 *spv, STRLEN len, STRLEN pvlim, UV flags)
-
-=for hackers
-Found in file utf8.c
-
-=item sv_cat_decode
-X<sv_cat_decode>
-
-The encoding is assumed to be an Encode object, the PV of the ssv is
-assumed to be octets in that encoding and decoding the input starts
-from the position which (PV + *offset) pointed to. The dsv will be
-concatenated the decoded UTF-8 string from ssv. Decoding will terminate
-when the string tstr appears in decoding output or the input ends on
-the PV of the ssv. The value which the offset points will be modified
-to the last input position on the ssv.
-
-Returns TRUE if the terminator was found, else returns FALSE.
-
- bool sv_cat_decode(SV* dsv, SV *encoding, SV *ssv, int *offset, char* tstr, int tlen)
-
-=for hackers
-Found in file sv.c
-
-=item sv_recode_to_utf8
-X<sv_recode_to_utf8>
-
-The encoding is assumed to be an Encode object, on entry the PV
-of the sv is assumed to be octets in that encoding, and the sv
-will be converted into Unicode (and UTF-8).
-
-If the sv already is UTF-8 (or if it is not POK), or if the encoding
-is not a reference, nothing is done to the sv. If the encoding is not
-an C<Encode::XS> Encoding object, bad things will happen.
-(See F<lib/encoding.pm> and L<Encode>).
-
-The PV of the sv is returned.
-
- char* sv_recode_to_utf8(SV* sv, SV *encoding)
-
-=for hackers
-Found in file sv.c
-
-=item sv_uni_display
-X<sv_uni_display>
-
-Build to the scalar dsv a displayable version of the scalar sv,
-the displayable version being at most pvlim bytes long
-(if longer, the rest is truncated and "..." will be appended).
-
-The flags argument is as in pv_uni_display().
-
-The pointer to the PV of the dsv is returned.
-
- char* sv_uni_display(SV *dsv, SV *ssv, STRLEN pvlim, UV flags)
-
-=for hackers
-Found in file utf8.c
-
-=item to_utf8_case
-X<to_utf8_case>
-
-The "p" contains the pointer to the UTF-8 string encoding
-the character that is being converted.
-
-The "ustrp" is a pointer to the character buffer to put the
-conversion result to. The "lenp" is a pointer to the length
-of the result.
-
-The "swashp" is a pointer to the swash to use.
-
-Both the special and normal mappings are stored lib/unicore/To/Foo.pl,
-and loaded by SWASHNEW, using lib/utf8_heavy.pl. The special (usually,
-but not always, a multicharacter mapping), is tried first.
-
-The "special" is a string like "utf8::ToSpecLower", which means the
-hash %utf8::ToSpecLower. The access to the hash is through
-Perl_to_utf8_case().
-
-The "normal" is a string like "ToLower" which means the swash
-%utf8::ToLower.
-
- UV to_utf8_case(const U8 *p, U8* ustrp, STRLEN *lenp, SV **swashp, const char *normal, const char *special)
-
-=for hackers
-Found in file utf8.c
-
-=item to_utf8_fold
-X<to_utf8_fold>
-
-Convert the UTF-8 encoded character at p to its foldcase version and
-store that in UTF-8 in ustrp and its length in bytes in lenp. Note
-that the ustrp needs to be at least UTF8_MAXBYTES_CASE+1 bytes since the
-foldcase version may be longer than the original character (up to
-three characters).
-
-The first character of the foldcased version is returned
-(but note, as explained above, that there may be more.)
-
- UV to_utf8_fold(const U8 *p, U8* ustrp, STRLEN *lenp)
-
-=for hackers
-Found in file utf8.c
-
-=item to_utf8_lower
-X<to_utf8_lower>
-
-Convert the UTF-8 encoded character at p to its lowercase version and
-store that in UTF-8 in ustrp and its length in bytes in lenp. Note
-that the ustrp needs to be at least UTF8_MAXBYTES_CASE+1 bytes since the
-lowercase version may be longer than the original character.
-
-The first character of the lowercased version is returned
-(but note, as explained above, that there may be more.)
-
- UV to_utf8_lower(const U8 *p, U8* ustrp, STRLEN *lenp)
-
-=for hackers
-Found in file utf8.c
-
-=item to_utf8_title
-X<to_utf8_title>
-
-Convert the UTF-8 encoded character at p to its titlecase version and
-store that in UTF-8 in ustrp and its length in bytes in lenp. Note
-that the ustrp needs to be at least UTF8_MAXBYTES_CASE+1 bytes since the
-titlecase version may be longer than the original character.
-
-The first character of the titlecased version is returned
-(but note, as explained above, that there may be more.)
-
- UV to_utf8_title(const U8 *p, U8* ustrp, STRLEN *lenp)
-
-=for hackers
-Found in file utf8.c
-
-=item to_utf8_upper
-X<to_utf8_upper>
-
-Convert the UTF-8 encoded character at p to its uppercase version and
-store that in UTF-8 in ustrp and its length in bytes in lenp. Note
-that the ustrp needs to be at least UTF8_MAXBYTES_CASE+1 bytes since
-the uppercase version may be longer than the original character.
-
-The first character of the uppercased version is returned
-(but note, as explained above, that there may be more.)
-
- UV to_utf8_upper(const U8 *p, U8* ustrp, STRLEN *lenp)
-
-=for hackers
-Found in file utf8.c
-
-=item utf8n_to_uvchr
-X<utf8n_to_uvchr>
-
-flags
-
-Returns the native character value of the first character in the string
-C<s>
-which is assumed to be in UTF-8 encoding; C<retlen> will be set to the
-length, in bytes, of that character.
-
-Allows length and flags to be passed to low level routine.
-
- UV utf8n_to_uvchr(const U8 *s, STRLEN curlen, STRLEN *retlen, U32 flags)
-
-=for hackers
-Found in file utf8.c
-
-=item utf8n_to_uvuni
-X<utf8n_to_uvuni>
-
-Bottom level UTF-8 decode routine.
-Returns the Unicode code point value of the first character in the string C<s>
-which is assumed to be in UTF-8 encoding and no longer than C<curlen>;
-C<retlen> will be set to the length, in bytes, of that character.
-
-If C<s> does not point to a well-formed UTF-8 character, the behaviour
-is dependent on the value of C<flags>: if it contains UTF8_CHECK_ONLY,
-it is assumed that the caller will raise a warning, and this function
-will silently just set C<retlen> to C<-1> and return zero. If the
-C<flags> does not contain UTF8_CHECK_ONLY, warnings about
-malformations will be given, C<retlen> will be set to the expected
-length of the UTF-8 character in bytes, and zero will be returned.
-
-The C<flags> can also contain various flags to allow deviations from
-the strict UTF-8 encoding (see F<utf8.h>).
-
-Most code should use utf8_to_uvchr() rather than call this directly.
-
- UV utf8n_to_uvuni(const U8 *s, STRLEN curlen, STRLEN *retlen, U32 flags)
-
-=for hackers
-Found in file utf8.c
-
-=item utf8_distance
-X<utf8_distance>
-
-Returns the number of UTF-8 characters between the UTF-8 pointers C<a>
-and C<b>.
-
-WARNING: use only if you *know* that the pointers point inside the
-same UTF-8 buffer.
-
- IV utf8_distance(const U8 *a, const U8 *b)
-
-=for hackers
-Found in file utf8.c
-
-=item utf8_hop
-X<utf8_hop>
-
-Return the UTF-8 pointer C<s> displaced by C<off> characters, either
-forward or backward.
-
-WARNING: do not use the following unless you *know* C<off> is within
-the UTF-8 data pointed to by C<s> *and* that on entry C<s> is aligned
-on the first byte of character or just after the last byte of a character.
-
- U8* utf8_hop(const U8 *s, I32 off)
-
-=for hackers
-Found in file utf8.c
-
-=item utf8_length
-X<utf8_length>
-
-Return the length of the UTF-8 char encoded string C<s> in characters.
-Stops at C<e> (inclusive). If C<e E<lt> s> or if the scan would end
-up past C<e>, croaks.
-
- STRLEN utf8_length(const U8* s, const U8 *e)
-
-=for hackers
-Found in file utf8.c
-
-=item utf8_to_bytes
-X<utf8_to_bytes>
-
-Converts a string C<s> of length C<len> from UTF-8 into native byte encoding.
-Unlike C<bytes_to_utf8>, this over-writes the original string, and
-updates len to contain the new length.
-Returns zero on failure, setting C<len> to -1.
-
-If you need a copy of the string, see C<bytes_from_utf8>.
-
-NOTE: this function is experimental and may change or be
-removed without notice.
-
- U8* utf8_to_bytes(U8 *s, STRLEN *len)
-
-=for hackers
-Found in file utf8.c
-
-=item utf8_to_uvchr
-X<utf8_to_uvchr>
-
-Returns the native character value of the first character in the string C<s>
-which is assumed to be in UTF-8 encoding; C<retlen> will be set to the
-length, in bytes, of that character.
-
-If C<s> does not point to a well-formed UTF-8 character, zero is
-returned and retlen is set, if possible, to -1.
-
- UV utf8_to_uvchr(const U8 *s, STRLEN *retlen)
-
-=for hackers
-Found in file utf8.c
-
-=item utf8_to_uvuni
-X<utf8_to_uvuni>
-
-Returns the Unicode code point of the first character in the string C<s>
-which is assumed to be in UTF-8 encoding; C<retlen> will be set to the
-length, in bytes, of that character.
-
-This function should only be used when the returned UV is considered
-an index into the Unicode semantic tables (e.g. swashes).
-
-If C<s> does not point to a well-formed UTF-8 character, zero is
-returned and retlen is set, if possible, to -1.
-
- UV utf8_to_uvuni(const U8 *s, STRLEN *retlen)
-
-=for hackers
-Found in file utf8.c
-
-=item uvchr_to_utf8
-X<uvchr_to_utf8>
-
-Adds the UTF-8 representation of the Native codepoint C<uv> to the end
-of the string C<d>; C<d> should be have at least C<UTF8_MAXBYTES+1> free
-bytes available. The return value is the pointer to the byte after the
-end of the new character. In other words,
-
- d = uvchr_to_utf8(d, uv);
-
-is the recommended wide native character-aware way of saying
-
- *(d++) = uv;
-
- U8* uvchr_to_utf8(U8 *d, UV uv)
-
-=for hackers
-Found in file utf8.c
-
-=item uvuni_to_utf8_flags
-X<uvuni_to_utf8_flags>
-
-Adds the UTF-8 representation of the Unicode codepoint C<uv> to the end
-of the string C<d>; C<d> should be have at least C<UTF8_MAXBYTES+1> free
-bytes available. The return value is the pointer to the byte after the
-end of the new character. In other words,
-
- d = uvuni_to_utf8_flags(d, uv, flags);
-
-or, in most cases,
-
- d = uvuni_to_utf8(d, uv);
-
-(which is equivalent to)
-
- d = uvuni_to_utf8_flags(d, uv, 0);
-
-is the recommended Unicode-aware way of saying
-
- *(d++) = uv;
-
- U8* uvuni_to_utf8_flags(U8 *d, UV uv, UV flags)
-
-=for hackers
-Found in file utf8.c
-
-
-=back
-
-=head1 Variables created by C<xsubpp> and C<xsubpp> internal functions
-
-=over 8
-
-=item ax
-X<ax>
-
-Variable which is setup by C<xsubpp> to indicate the stack base offset,
-used by the C<ST>, C<XSprePUSH> and C<XSRETURN> macros. The C<dMARK> macro
-must be called prior to setup the C<MARK> variable.
-
- I32 ax
-
-=for hackers
-Found in file XSUB.h
-
-=item CLASS
-X<CLASS>
-
-Variable which is setup by C<xsubpp> to indicate the
-class name for a C++ XS constructor. This is always a C<char*>. See C<THIS>.
-
- char* CLASS
-
-=for hackers
-Found in file XSUB.h
-
-=item dAX
-X<dAX>
-
-Sets up the C<ax> variable.
-This is usually handled automatically by C<xsubpp> by calling C<dXSARGS>.
-
- dAX;
-
-=for hackers
-Found in file XSUB.h
-
-=item dAXMARK
-X<dAXMARK>
-
-Sets up the C<ax> variable and stack marker variable C<mark>.
-This is usually handled automatically by C<xsubpp> by calling C<dXSARGS>.
-
- dAXMARK;
-
-=for hackers
-Found in file XSUB.h
-
-=item dITEMS
-X<dITEMS>
-
-Sets up the C<items> variable.
-This is usually handled automatically by C<xsubpp> by calling C<dXSARGS>.
-
- dITEMS;
-
-=for hackers
-Found in file XSUB.h
-
-=item dUNDERBAR
-X<dUNDERBAR>
-
-Sets up the C<padoff_du> variable for an XSUB that wishes to use
-C<UNDERBAR>.
-
- dUNDERBAR;
-
-=for hackers
-Found in file XSUB.h
-
-=item dXSARGS
-X<dXSARGS>
-
-Sets up stack and mark pointers for an XSUB, calling dSP and dMARK.
-Sets up the C<ax> and C<items> variables by calling C<dAX> and C<dITEMS>.
-This is usually handled automatically by C<xsubpp>.
-
- dXSARGS;
-
-=for hackers
-Found in file XSUB.h
-
-=item dXSI32
-X<dXSI32>
-
-Sets up the C<ix> variable for an XSUB which has aliases. This is usually
-handled automatically by C<xsubpp>.
-
- dXSI32;
-
-=for hackers
-Found in file XSUB.h
-
-=item items
-X<items>
-
-Variable which is setup by C<xsubpp> to indicate the number of
-items on the stack. See L<perlxs/"Variable-length Parameter Lists">.
-
- I32 items
-
-=for hackers
-Found in file XSUB.h
-
-=item ix
-X<ix>
-
-Variable which is setup by C<xsubpp> to indicate which of an
-XSUB's aliases was used to invoke it. See L<perlxs/"The ALIAS: Keyword">.
-
- I32 ix
-
-=for hackers
-Found in file XSUB.h
-
-=item newXSproto
-X<newXSproto>
-
-Used by C<xsubpp> to hook up XSUBs as Perl subs. Adds Perl prototypes to
-the subs.
-
-=for hackers
-Found in file XSUB.h
-
-=item RETVAL
-X<RETVAL>
-
-Variable which is setup by C<xsubpp> to hold the return value for an
-XSUB. This is always the proper type for the XSUB. See
-L<perlxs/"The RETVAL Variable">.
-
- (whatever) RETVAL
-
-=for hackers
-Found in file XSUB.h
-
-=item ST
-X<ST>
-
-Used to access elements on the XSUB's stack.
-
- SV* ST(int ix)
-
-=for hackers
-Found in file XSUB.h
-
-=item THIS
-X<THIS>
-
-Variable which is setup by C<xsubpp> to designate the object in a C++
-XSUB. This is always the proper type for the C++ object. See C<CLASS> and
-L<perlxs/"Using XS With C++">.
-
- (whatever) THIS
-
-=for hackers
-Found in file XSUB.h
-
-=item UNDERBAR
-X<UNDERBAR>
-
-The SV* corresponding to the $_ variable. Works even if there
-is a lexical $_ in scope.
-
-=for hackers
-Found in file XSUB.h
-
-=item XS
-X<XS>
-
-Macro to declare an XSUB and its C parameter list. This is handled by
-C<xsubpp>.
-
-=for hackers
-Found in file XSUB.h
-
-=item XS_VERSION
-X<XS_VERSION>
-
-The version identifier for an XS module. This is usually
-handled automatically by C<ExtUtils::MakeMaker>. See C<XS_VERSION_BOOTCHECK>.
-
-=for hackers
-Found in file XSUB.h
-
-=item XS_VERSION_BOOTCHECK
-X<XS_VERSION_BOOTCHECK>
-
-Macro to verify that a PM module's $VERSION variable matches the XS
-module's C<XS_VERSION> variable. This is usually handled automatically by
-C<xsubpp>. See L<perlxs/"The VERSIONCHECK: Keyword">.
-
- XS_VERSION_BOOTCHECK;
-
-=for hackers
-Found in file XSUB.h
-
-
-=back
-
-=head1 Warning and Dieing
-
-=over 8
-
-=item croak
-X<croak>
-
-This is the XSUB-writer's interface to Perl's C<die> function.
-Normally call this function the same way you call the C C<printf>
-function. Calling C<croak> returns control directly to Perl,
-sidestepping the normal C order of execution. See C<warn>.
-
-If you want to throw an exception object, assign the object to
-C<$@> and then pass C<NULL> to croak():
-
- errsv = get_sv("@", GV_ADD);
- sv_setsv(errsv, exception_object);
- croak(NULL);
-
- void croak(const char* pat, ...)
-
-=for hackers
-Found in file util.c
-
-=item warn
-X<warn>
-
-This is the XSUB-writer's interface to Perl's C<warn> function. Call this
-function the same way you call the C C<printf> function. See C<croak>.
-
- void warn(const char* pat, ...)
-
-=for hackers
-Found in file util.c
-
-
-=back
-
-=head1 AUTHORS
-
-Until May 1997, this document was maintained by Jeff Okamoto
-<okamoto@corp.hp.com>. It is now maintained as part of Perl itself.
-
-With lots of help and suggestions from Dean Roehrich, Malcolm Beattie,
-Andreas Koenig, Paul Hudson, Ilya Zakharevich, Paul Marquess, Neil
-Bowers, Matthew Green, Tim Bunce, Spider Boardman, Ulrich Pfeifer,
-Stephen McCamant, and Gurusamy Sarathy.
-
-API Listing originally by Dean Roehrich <roehrich@cray.com>.
-
-Updated to be autogenerated from comments in the source by Benjamin Stuhl.
-
-=head1 SEE ALSO
-
-perlguts(1), perlxs(1), perlxstut(1), perlintern(1)
-
-=cut
-
- ex: set ro:
diff --git a/pod/perlboot.pod b/pod/perlboot.pod
index 55317c352e..f4327a70bb 100644
--- a/pod/perlboot.pod
+++ b/pod/perlboot.pod
@@ -58,7 +58,7 @@ This results in:
a Sheep goes baaaah!
Wow. That symbolic coderef de-referencing there is pretty nasty.
-We're counting on C<no strict subs> mode, certainly not recommended
+We're counting on C<no strict refs> mode, certainly not recommended
for larger programs. And why was that necessary? Because the name of
the package seems to be inseparable from the name of the subroutine we
want to invoke within that package.
@@ -171,8 +171,8 @@ This method provides the constant text for the sound itself.
{ package Cow;
sub sound { "moooo" }
sub speak {
- my $class = shift;
- print "a $class goes ", $class->sound, "!\n";
+ my $class = shift;
+ print "a $class goes ", $class->sound, "!\n";
}
}
@@ -183,8 +183,8 @@ returns C<moooo>. But how different would this be for the C<Horse>?
{ package Horse;
sub sound { "neigh" }
sub speak {
- my $class = shift;
- print "a $class goes ", $class->sound, "!\n";
+ my $class = shift;
+ print "a $class goes ", $class->sound, "!\n";
}
}
@@ -199,8 +199,8 @@ definition for C<speak>:
{ package Animal;
sub speak {
- my $class = shift;
- print "a $class goes ", $class->sound, "!\n";
+ my $class = shift;
+ print "a $class goes ", $class->sound, "!\n";
}
}
@@ -212,7 +212,7 @@ with the animal-specific sound:
sub sound { "moooo" }
}
-Note the added C<@ISA> array. We'll get to that in a minute.
+Note the added C<@ISA> array (pronounced "is a"). We'll get to that in a minute.
But what happens when we invoke C<< Cow->speak >> now?
@@ -232,10 +232,10 @@ gets it on the first try without looking at C<@ISA>. Success!
=head2 A few notes about @ISA
-This magical C<@ISA> variable (pronounced "is a" not "ice-uh"), has
-declared that C<Cow> "is a" C<Animal>. Note that it's an array,
-not a simple single value, because on rare occasions, it makes sense
-to have more than one parent class searched for the missing methods.
+This magical C<@ISA> variable has declared that C<Cow> "is a" C<Animal>.
+Note that it's an array, not a simple single value, because on rare
+occasions, it makes sense to have more than one parent class searched
+for the missing methods.
If C<Animal> also had an C<@ISA>, then we'd check there too. The
search is recursive, depth-first, left-to-right in each C<@ISA> by
@@ -264,20 +264,14 @@ Or allow it as an implicitly named package variable:
use vars qw(@ISA);
@ISA = qw(Animal);
-If you're bringing in the class from outside, via an object-oriented
-module, you change:
-
- package Cow;
- use Animal;
- use vars qw(@ISA);
- @ISA = qw(Animal);
-
-into just:
+If the C<Animal> class comes from another (object-oriented) module, then
+just employ C<use base> to specify that C<Animal> should serve as the basis
+for the C<Cow> class:
package Cow;
use base qw(Animal);
-And that's pretty darn compact.
+Now that's pretty darn simple!
=head2 Overriding the methods
@@ -289,8 +283,8 @@ Let's add a mouse, which can barely be heard:
sub sound { "squeak" }
sub speak {
my $class = shift;
- print "a $class goes ", $class->sound, "!\n";
- print "[but you can barely hear it!]\n";
+ print "a $class goes ", $class->sound, "!\n";
+ print "[but you can barely hear it!]\n";
}
}
@@ -302,17 +296,26 @@ which results in:
[but you can barely hear it!]
Here, C<Mouse> has its own speaking routine, so C<< Mouse->speak >>
-doesn't immediately invoke C<< Animal->speak >>. This is known as
-"overriding". In fact, we didn't even need to say that a C<Mouse> was
-an C<Animal> at all, since all of the methods needed for C<speak> are
-completely defined with C<Mouse>.
-
-But we've now duplicated some of the code from C<< Animal->speak >>,
-and this can once again be a maintenance headache. So, can we avoid
-that? Can we say somehow that a C<Mouse> does everything any other
-C<Animal> does, but add in the extra comment? Sure!
-
-First, we can invoke the C<Animal::speak> method directly:
+doesn't immediately invoke C<< Animal->speak >>. This is known as
+"overriding". In fact, we don't even need to say that a C<Mouse> is
+an C<Animal> at all, because all of the methods needed for C<speak> are
+completely defined for C<Mouse>; this is known as "duck typing":
+"If it walks like a duck and quacks like a duck, I would call it a duck"
+(James Whitcomb). However, it would probably be beneficial to allow a
+closer examination to conclude that a C<Mouse> is indeed an C<Animal>,
+so it is actually better to define C<Mouse> with C<Animal> as its base
+(that is, it is better to "derive C<Mouse> from C<Animal>").
+
+Moreover, this duplication of code could become a maintenance headache
+(though code-reuse is not actually a good reason for inheritance; good
+design practices dictate that a derived class should be usable wherever
+its base class is usable, which might not be the outcome if code-reuse
+is the sole criterion for inheritance. Just remember that a C<Mouse>
+should always act like an C<Animal>).
+
+So, let's make C<Mouse> an C<Animal>!
+
+The obvious solution is to invoke C<Animal::speak> directly:
# Animal package from before
{ package Mouse;
@@ -321,33 +324,45 @@ First, we can invoke the C<Animal::speak> method directly:
sub speak {
my $class = shift;
Animal::speak($class);
- print "[but you can barely hear it!]\n";
+ print "[but you can barely hear it!]\n";
}
}
-Note that we have to include the C<$class> parameter (almost surely
-the value of C<"Mouse">) as the first parameter to C<Animal::speak>,
-since we've stopped using the method arrow. Why did we stop? Well,
-if we invoke C<< Animal->speak >> there, the first parameter to the
-method will be C<"Animal"> not C<"Mouse">, and when time comes for it
-to call for the C<sound>, it won't have the right class to come back
-to this package.
-
-Invoking C<Animal::speak> directly is a mess, however. What if
-C<Animal::speak> didn't exist before, and was being inherited from a
-class mentioned in C<@Animal::ISA>? Because we are no longer using
-the method arrow, we get one and only one chance to hit the right
-subroutine.
-
-Also note that the C<Animal> classname is now hardwired into the
-subroutine selection. This is a mess if someone maintains the code,
-changing C<@ISA> for C<Mouse> and didn't notice C<Animal> there in
-C<speak>. So, this is probably not the right way to go.
+Note that we're using C<Animal::speak>. If we were to invoke
+C<< Animal->speak >> instead, the first parameter to C<Animal::speak>
+would automatically be C<"Animal"> rather than C<"Mouse">, so that
+the call to C<< $class->sound >> in C<Animal::speak> would become
+C<< Animal->sound >> rather than C<< Mouse->sound >>.
+
+Also, without the method arrow C<< -> >>, it becomes necessary to specify
+the first parameter to C<Animal::speak> ourselves, which is why C<$class>
+is explicitly passed: C<Animal::speak($class)>.
+
+However, invoking C<Animal::speak> directly is a mess: Firstly, it assumes
+that the C<speak> method is a member of the C<Animal> class; what if C<Animal>
+actually inherits C<speak> from its own base? Because we are no longer using
+C<< -> >> to access C<speak>, the special method look up mechanism wouldn't be
+used, so C<speak> wouldn't even be found!
+
+The second problem is more subtle: C<Animal> is now hardwired into the subroutine
+selection. Let's assume that C<Animal::speak> does exist. What happens when,
+at a later time, someone expands the class hierarchy by having C<Mouse>
+inherit from C<Mus> instead of C<Animal>. Unless the invocation of C<Animal::speak>
+is also changed to an invocation of C<Mus::speak>, centuries worth of taxonomical
+classification could be obliterated!
+
+What we have here is a fragile or leaky abstraction; it is the beginning of a
+maintenance nightmare. What we need is the ability to search for the right
+method wih as few assumptions as possible.
=head2 Starting the search from a different place
-A better solution is to tell Perl to search from a higher place
-in the inheritance chain:
+A I<better> solution is to tell Perl where in the inheritance chain to begin searching
+for C<speak>. This can be achieved with a modified version of the method arrow C<< -> >>:
+
+ ClassName->FirstPlaceToLook::method
+
+So, the improved C<Mouse> class is:
# same Animal as before
{ package Mouse;
@@ -359,22 +374,20 @@ in the inheritance chain:
}
}
-Ahh. This works. Using this syntax, we start with C<Animal> to find
-C<speak>, and use all of C<Animal>'s inheritance chain if not found
-immediately. And yet the first parameter will be C<$class>, so the
-found C<speak> method will get C<Mouse> as its first entry, and
-eventually work its way back to C<Mouse::sound> for the details.
+Using this syntax, we start with C<Animal> to find C<speak>, and then
+use all of C<Animal>'s inheritance chain if it is not found immediately.
+As usual, the first parameter to C<speak> would be C<$class>, so we no
+longer need to pass C<$class> explicitly to C<speak>.
-But this isn't the best solution. We still have to keep the C<@ISA>
-and the initial search package coordinated. Worse, if C<Mouse> had
-multiple entries in C<@ISA>, we wouldn't necessarily know which one
-had actually defined C<speak>. So, is there an even better way?
+But what about the second problem? We're still hardwiring C<Animal> into
+the method lookup.
=head2 The SUPER way of doing things
-By changing the C<Animal> class to the C<SUPER> class in that
-invocation, we get a search of all of our super classes (classes
-listed in C<@ISA>) automatically:
+If C<Animal> is replaced with the special placeholder C<SUPER> in that
+invocation, then the contents of C<Mouse>'s C<@ISA> are used for the
+search, beginning with C<$ISA[0]>. So, all of the problems can be fixed
+as follows:
# same Animal as before
{ package Mouse;
@@ -386,11 +399,19 @@ listed in C<@ISA>) automatically:
}
}
-So, C<SUPER::speak> means look in the current package's C<@ISA> for
-C<speak>, invoking the first one found. Note that it does I<not> look in
-the C<@ISA> of C<$class>.
+In general, C<SUPER::speak> means look in the current package's C<@ISA>
+for a class that implements C<speak>, and invoke the first one found.
+The placeholder is called C<SUPER>, because many other languages refer
+to base classes as "I<super>classes", and Perl likes to be eclectic.
+
+Note that a call such as
+
+ $class->SUPER::method;
-=head2 Where we're at so far...
+does I<not> look in the C<@ISA> of C<$class> unless C<$class> happens to
+be the current package.
+
+=head2 Let's review...
So far, we've seen the method arrow syntax:
@@ -405,20 +426,21 @@ which constructs an argument list of:
("Class", @args)
-and attempts to invoke
+and attempts to invoke:
- Class::method("Class", @Args);
+ Class::method("Class", @args);
However, if C<Class::method> is not found, then C<@Class::ISA> is examined
-(recursively) to locate a package that does indeed contain C<method>,
+(recursively) to locate a class (a package) that does indeed contain C<method>,
and that subroutine is invoked instead.
-Using this simple syntax, we have class methods, (multiple)
-inheritance, overriding, and extending. Using just what we've seen so
-far, we've been able to factor out common code, and provide a nice way
-to reuse implementations with variations. This is at the core of what
-objects provide, but objects also provide instance data, which we
-haven't even begun to cover.
+Using this simple syntax, we have class methods, (multiple) inheritance,
+overriding, and extending. Using just what we've seen so far, we've
+been able to factor out common code (though that's never a good reason
+for inheritance!), and provide a nice way to reuse implementations with
+variations.
+
+Now, what about data?
=head2 A horse is a horse, of course of course -- or is it?
@@ -443,61 +465,61 @@ sound, and the output of:
a Horse goes neigh!
But all of our Horse objects would have to be absolutely identical.
-If I add a subroutine, all horses automatically share it. That's
+If we add a subroutine, all horses automatically share it. That's
great for making horses the same, but how do we capture the
-distinctions about an individual horse? For example, suppose I want
-to give my first horse a name. There's got to be a way to keep its
+distinctions of an individual horse? For example, suppose we want
+to give our first horse a name. There's got to be a way to keep its
name separate from the other horses.
-We can do that by drawing a new distinction, called an "instance".
-An "instance" is generally created by a class. In Perl, any reference
-can be an instance, so let's start with the simplest reference
-that can hold a horse's name: a scalar reference.
+That is to say, we want particular instances of C<Horse> to have
+different names.
+
+In Perl, any reference can be an "instance", so let's start with the
+simplest reference that can hold a horse's name: a scalar reference.
my $name = "Mr. Ed";
- my $talking = \$name;
+ my $horse = \$name;
-So now C<$talking> is a reference to what will be the instance-specific
-data (the name). The final step in turning this into a real instance
-is with a special operator called C<bless>:
+So, now C<$horse> is a reference to what will be the instance-specific
+data (the name). The final step is to turn this reference into a real
+instance of a C<Horse> by using the special operator C<bless>:
- bless $talking, Horse;
+ bless $horse, Horse;
This operator stores information about the package named C<Horse> into
the thing pointed at by the reference. At this point, we say
-C<$talking> is an instance of C<Horse>. That is, it's a specific
+C<$horse> is an instance of C<Horse>. That is, it's a specific
horse. The reference is otherwise unchanged, and can still be used
with traditional dereferencing operators.
=head2 Invoking an instance method
-The method arrow can be used on instances, as well as names of
-packages (classes). So, let's get the sound that C<$talking> makes:
+The method arrow can be used on instances, as well as classes (the names
+of packages). So, let's get the sound that C<$horse> makes:
- my $noise = $talking->sound;
+ my $noise = $horse->sound("some", "unnecessary", "args");
-To invoke C<sound>, Perl first notes that C<$talking> is a blessed
+To invoke C<sound>, Perl first notes that C<$horse> is a blessed
reference (and thus an instance). It then constructs an argument
-list, in this case from just C<($talking)>. (Later we'll see that
-arguments will take their place following the instance variable,
-just like with classes.)
+list, as per usual.
Now for the fun part: Perl takes the class in which the instance was
-blessed, in this case C<Horse>, and uses that to locate the subroutine
-to invoke the method. In this case, C<Horse::sound> is found directly
-(without using inheritance), yielding the final subroutine invocation:
+blessed, in this case C<Horse>, and uses that class to locate the
+subroutine. In this case, C<Horse::sound> is found directly (without
+using inheritance). In the end, it is as though our initial line were
+written as follows:
- Horse::sound($talking)
+ my $noise = Horse::sound($horse, "some", "unnecessary", "args");
Note that the first parameter here is still the instance, not the name
of the class as before. We'll get C<neigh> as the return value, and
that'll end up as the C<$noise> variable above.
-If Horse::sound had not been found, we'd be wandering up the
-C<@Horse::ISA> list to try to find the method in one of the
-superclasses, just as for a class method. The only difference between
-a class method and an instance method is whether the first parameter
-is an instance (a blessed reference) or a class name (a string).
+If Horse::sound had not been found, we'd be wandering up the C<@Horse::ISA>
+array, trying to find the method in one of the superclasses. The only
+difference between a class method and an instance method is whether the
+first parameter is an instance (a blessed reference) or a class name (a
+string).
=head2 Accessing the instance data
@@ -514,16 +536,22 @@ the name:
}
}
-Now we call for the name:
+Inside C<Horse::name>, the C<@_> array contains:
- print $talking->name, " says ", $talking->sound, "\n";
+ (C<$horse>, "some", "unnecessary", "args")
-Inside C<Horse::name>, the C<@_> array contains just C<$talking>,
-which the C<shift> stores into C<$self>. (It's traditional to shift
-the first parameter off into a variable named C<$self> for instance
-methods, so stay with that unless you have strong reasons otherwise.)
-Then, C<$self> gets de-referenced as a scalar ref, yielding C<Mr. Ed>,
-and we're done with that. The result is:
+so the C<shift> stores C<$horse> into C<$self>. Then, C<$self> gets
+de-referenced with C<$$self> as normal, yielding C<"Mr. Ed">.
+
+It's traditional to C<shift> the first parameter into a variable named
+C<$self> for instance methods and into a variable named C<$class> for
+class methods.
+
+Then, the following line:
+
+ print $horse->name, " says ", $horse->sound, "\n";
+
+outputs:
Mr. Ed says neigh.
@@ -533,31 +561,32 @@ Of course, if we constructed all of our horses by hand, we'd most
likely make mistakes from time to time. We're also violating one of
the properties of object-oriented programming, in that the "inside
guts" of a Horse are visible. That's good if you're a veterinarian,
-but not if you just like to own horses. So, let's let the Horse class
-build a new horse:
+but not if you just like to own horses. So, let's have the Horse
+class handle the details inside a class method:
{ package Horse;
@ISA = qw(Animal);
sub sound { "neigh" }
sub name {
- my $self = shift;
+ my $self = shift; # instance method, so use $self
$$self;
}
sub named {
- my $class = shift;
+ my $class = shift; # class method, so use $class
my $name = shift;
bless \$name, $class;
}
}
-Now with the new C<named> method, we can build a horse:
+Now with the new C<named> method, we can build a horse as follows:
- my $talking = Horse->named("Mr. Ed");
+ my $horse = Horse->named("Mr. Ed");
Notice we're back to a class method, so the two arguments to
C<Horse::named> are C<Horse> and C<Mr. Ed>. The C<bless> operator
-not only blesses C<$name>, it also returns the reference to C<$name>,
-so that's fine as a return value. And that's how to build a horse.
+not only blesses C<\$name>, it also returns that reference.
+
+This C<Horse::named> method is called a "constructor".
We've called the constructor C<named> here, so that it quickly denotes
the constructor's argument as the name for this particular C<Horse>.
@@ -574,7 +603,7 @@ right?)
But was there anything specific to C<Horse> in that method? No. Therefore,
it's also the same recipe for building anything else that inherited from
-C<Animal>, so let's put it there:
+C<Animal>, so let's put C<name> and C<named> there:
{ package Animal;
sub speak {
@@ -598,8 +627,8 @@ C<Animal>, so let's put it there:
Ahh, but what happens if we invoke C<speak> on an instance?
- my $talking = Horse->named("Mr. Ed");
- $talking->speak;
+ my $horse = Horse->named("Mr. Ed");
+ $horse->speak;
We get a debugging value:
@@ -620,9 +649,7 @@ classname). Let's modify the C<name> method first to notice the change:
sub name {
my $either = shift;
- ref $either
- ? $$either # it's an instance, return name
- : "an unnamed $either"; # it's a class, return generic
+ ref $either ? $$either : "Any $either";
}
Here, the C<?:> operator comes in handy to select either the
@@ -630,9 +657,9 @@ dereference or a derived string. Now we can use this with either an
instance or a class. Note that I've changed the first parameter
holder to C<$either> to show that this is intended:
- my $talking = Horse->named("Mr. Ed");
- print Horse->name, "\n"; # prints "an unnamed Horse\n"
- print $talking->name, "\n"; # prints "Mr Ed.\n"
+ my $horse = Horse->named("Mr. Ed");
+ print Horse->name, "\n"; # prints "Any Horse\n"
+ print $horse->name, "\n"; # prints "Mr Ed.\n"
and now we'll fix C<speak> to use this:
@@ -656,9 +683,7 @@ Let's train our animals to eat:
}
sub name {
my $either = shift;
- ref $either
- ? $$either # it's an instance, return name
- : "an unnamed $either"; # it's a class, return generic
+ ref $either ? $$either : "Any $either";
}
sub speak {
my $either = shift;
@@ -681,19 +706,19 @@ Let's train our animals to eat:
And now try it out:
- my $talking = Horse->named("Mr. Ed");
- $talking->eat("hay");
+ my $horse = Horse->named("Mr. Ed");
+ $horse->eat("hay");
Sheep->eat("grass");
which prints:
Mr. Ed eats hay.
- an unnamed Sheep eats grass.
+ Any Sheep eats grass.
An instance method with parameters gets invoked with the instance,
and then the list of parameters. So that first invocation is like:
- Animal::eat($talking, "hay");
+ Animal::eat($horse, "hay");
=head2 More interesting instances
@@ -716,42 +741,77 @@ Let's make a sheep that has a name and a color:
so C<< $bad->{Name} >> has C<Evil>, and C<< $bad->{Color} >> has
C<black>. But we want to make C<< $bad->name >> access the name, and
that's now messed up because it's expecting a scalar reference. Not
-to worry, because that's pretty easy to fix up:
+to worry, because that's pretty easy to fix up.
+
+One solution is to override C<Animal::name> and C<Animal::named> by
+defining them anew in C<Sheep>, but then any methods added later to
+C<Animal> might still mess up, and we'd have to override all of those
+too. Therefore, it's never a good idea to define the data layout in a
+way that's different from the data layout of the base classes. In fact,
+it's a good idea to use blessed hash references in all cases. Also, this
+is why it's important to have constructors do the low-level work. So,
+let's redefine C<Animal>:
## in Animal
sub name {
my $either = shift;
- ref $either ?
- $either->{Name} :
- "an unnamed $either";
+ ref $either ? $either->{Name} : "Any $either";
}
-
-And of course C<named> still builds a scalar sheep, so let's fix that
-as well:
-
- ## in Animal
sub named {
my $class = shift;
my $name = shift;
- my $self = { Name => $name, Color => $class->default_color };
+ my $self = { Name => $name };
bless $self, $class;
}
+Of course, we still need to override C<named> in order to handle
+constructing a C<Sheep> with a certain color:
+
+ ## in Sheep
+ sub named {
+ my ($class, $name) = @_;
+ my $self = $class->SUPER::named(@_);
+ $$self{Color} = $class->default_color;
+ $self
+ }
+
+(Note that C<@_> contains the parameters to C<named>.)
+
What's this C<default_color>? Well, if C<named> has only the name,
-we still need to set a color, so we'll have a class-specific initial color.
+we still need to set a color, so we'll have a class-specific default color.
For a sheep, we might define it as white:
## in Sheep
sub default_color { "white" }
-And then to keep from having to define one for each additional class,
-we'll define a "backstop" method that serves as the "default default",
-directly in C<Animal>:
+Now:
+
+ my $sheep = Sheep->named("Bad");
+ print $sheep->{Color}, "\n";
+
+outputs:
+
+ white
+
+Now, there's nothing particularly specific to C<Sheep> when it comes
+to color, so let's remove C<Sheep::named> and implement C<Animal::named>
+to handle color instead:
+
+ ## in Animal
+ sub named {
+ my ($class, $name) = @_;
+ my $self = { Name => $name, Color => $class->default_color };
+ bless $self, $class;
+ }
+
+And then to keep from having to define C<default_color> for each additional
+class, we'll define a method that serves as the "default default" directly
+in C<Animal>:
## in Animal
sub default_color { "brown" }
-Now, because C<name> and C<named> were the only methods that
+Of course, because C<name> and C<named> were the only methods that
referenced the "structure" of the object, the rest of the methods can
remain the same, so C<speak> still works as before.
@@ -773,9 +833,9 @@ in-place, rather than with a C<shift>. (This saves us a bit of time
for something that may be invoked frequently.) And now we can fix
that color for Mr. Ed:
- my $talking = Horse->named("Mr. Ed");
- $talking->set_color("black-and-white");
- print $talking->name, " is colored ", $talking->color, "\n";
+ my $horse = Horse->named("Mr. Ed");
+ $horse->set_color("black-and-white");
+ print $horse->name, " is colored ", $horse->color, "\n";
which results in:
@@ -783,14 +843,13 @@ which results in:
=head2 Summary
-So, now we have class methods, constructors, instance methods,
-instance data, and even accessors. But that's still just the
-beginning of what Perl has to offer. We haven't even begun to talk
-about accessors that double as getters and setters, destructors,
-indirect object notation, subclasses that add instance data, per-class
-data, overloading, "isa" and "can" tests, C<UNIVERSAL> class, and so
-on. That's for the rest of the Perl documentation to cover.
-Hopefully, this gets you started, though.
+So, now we have class methods, constructors, instance methods, instance
+data, and even accessors. But that's still just the beginning of what
+Perl has to offer. We haven't even begun to talk about accessors that
+double as getters and setters, destructors, indirect object notation,
+overloading, "isa" and "can" tests, the C<UNIVERSAL> class, and so on.
+That's for the rest of the Perl documentation to cover. Hopefully, this
+gets you started, though.
=head1 SEE ALSO
@@ -807,10 +866,14 @@ Class::MethodMaker and Tie::SecureHash
=head1 COPYRIGHT
Copyright (c) 1999, 2000 by Randal L. Schwartz and Stonehenge
-Consulting Services, Inc. Permission is hereby granted to distribute
-this document intact with the Perl distribution, and in accordance
-with the licenses of the Perl distribution; derived documents must
-include this copyright notice intact.
+Consulting Services, Inc.
+
+Copyright (c) 2009 by Michael F. Witten.
+
+Permission is hereby granted to distribute this document intact with
+the Perl distribution, and in accordance with the licenses of the Perl
+distribution; derived documents must include this copyright notice
+intact.
Portions of this text have been derived from Perl Training materials
originally appearing in the I<Packages, References, Objects, and
diff --git a/pod/perldiag.pod b/pod/perldiag.pod
index 70a432db11..f2a4a1a72f 100644
--- a/pod/perldiag.pod
+++ b/pod/perldiag.pod
@@ -306,6 +306,20 @@ of an array and later assigning through that reference. For example
used as an lvalue, which is pretty strange. Perhaps you forgot to
dereference it first. See L<perlfunc/substr>.
+=item Attribute "locked" is deprecated
+
+(D deprecated) You have used the attributes pragam to modify the "locked"
+attribute on a code reference. The :locked attribute is obsolete, has had no
+effect since 5005 threads were removed, and will be removed in the next major
+release of Perl 5.
+
+=item Attribute "unique" is deprecated
+
+(D deprecated) You have used the attributes pragam to modify the "unique"
+attribute on a array, hash or scalar reference. The :unique attribute is has
+had no no effect since Perl 5.8.8, and will be removed in the next major
+release of Perl 5.
+
=item Bad arg length for %s, is %d, should be %s
(F) You passed a buffer of the wrong size to one of msgctl(), semctl()
@@ -3404,24 +3418,6 @@ If instead you intended to match the word 'foo' at the end of the line
followed by whitespace and the word 'bar' on the next line then you can use
C<m/$(?)\/> (for example: C<m/foo$(?)\s+bar/>).
-=item pragma "attrs" is deprecated, use "sub NAME : ATTRS" instead
-
-(D deprecated) You have written something like this:
-
- sub doit
- {
- use attrs qw(locked);
- }
-
-You should use the new declaration syntax instead.
-
- sub doit : locked
- {
- ...
-
-The C<use attrs> pragma is now obsolete, and is only provided for
-backward-compatibility. See L<perlsub/"Subroutine Attributes">.
-
=item Precedence problem: open %s should be open(%s)
(S precedence) The old irregular construct
@@ -4661,6 +4657,11 @@ you can write it as C<push(@tied_array,())> to avoid this warning.
(F) The "use" keyword is recognized and executed at compile time, and
returns no useful value. See L<perlmod>.
+=item Use of assignment to $[ is deprecated
+
+(D deprecated) The C<$[> variable (index of the first element in an array)
+is deprecated. See L<perlvar/"$[">.
+
=item Use of bare << to mean <<"" is deprecated
(D deprecated, W syntax) You are now encouraged to use the explicitly quoted
diff --git a/pod/perldoc.pod b/pod/perldoc.pod
index 43471c9d8c..92404395c5 100644
--- a/pod/perldoc.pod
+++ b/pod/perldoc.pod
@@ -252,6 +252,9 @@ number, the more it emits.
Up to 3.14_05, the switch B<-v> was used to produce verbose
messages of B<perldoc> operation, which is now enabled by B<-D>.
+=head1 SEE ALSO
+
+L<perlpod>, L<Pod::Perldoc>
=head1 AUTHOR
diff --git a/pod/perlembed.pod b/pod/perlembed.pod
index 39364eb429..36da54f7fe 100644
--- a/pod/perlembed.pod
+++ b/pod/perlembed.pod
@@ -196,11 +196,20 @@ version of I<miniperlmain.c> containing the essentials of embedding:
Notice that we don't use the C<env> pointer. Normally handed to
C<perl_parse> as its final argument, C<env> here is replaced by
-C<NULL>, which means that the current environment will be used. The macros
-PERL_SYS_INIT3() and PERL_SYS_TERM() provide system-specific tune up
-of the C runtime environment necessary to run Perl interpreters; since
-PERL_SYS_INIT3() may change C<env>, it may be more appropriate to provide
-C<env> as an argument to perl_parse().
+C<NULL>, which means that the current environment will be used.
+
+The macros PERL_SYS_INIT3() and PERL_SYS_TERM() provide system-specific
+tune up of the C runtime environment necessary to run Perl interpreters;
+they should only be called once regardless of how many interpreters you
+create or destroy. Call PERL_SYS_INIT3() before you create your first
+interpreter, and PERL_SYS_TERM() after you free your last interpreter.
+
+Since PERL_SYS_INIT3() may change C<env>, it may be more appropriate to
+provide C<env> as an argument to perl_parse().
+
+Also notice that no matter what arguments you pass to perl_parse(),
+PERL_SYS_INIT3() must be invoked on the C main() argc, argv and env and
+only once.
Now compile this program (I'll call it I<interp.c>) into an executable:
diff --git a/pod/perlfaq9.pod b/pod/perlfaq9.pod
index 609f898485..8ac3d0e4f8 100644
--- a/pod/perlfaq9.pod
+++ b/pod/perlfaq9.pod
@@ -433,7 +433,8 @@ This I<just> matches the address itself:
my $dot_atom = qr{$atom(?:\.$atom)*};
my $quoted = qr{"(?:\\[^\r\n]|[^\\"])*"};
my $local = qr{(?:$dot_atom|$quoted)};
- my $domain_lit = qr{\[(?:\\\S|[\x21-\x5a\x5e-\x7e])*\]};
+ my $quotedpair = qr{\\[\x00-\x09\x0B-\x0c\x0e-\x7e]};
+ my $domain_lit = qr{\[(?:$quotedpair|[\x21-\x5a\x5e-\x7e])*\]};
my $domain = qr{(?:$dot_atom|$domain_lit)};
my $addr_spec = qr{$local\@$domain};
diff --git a/pod/perlfunc.pod b/pod/perlfunc.pod
index f8d2282d51..826df27ef0 100644
--- a/pod/perlfunc.pod
+++ b/pod/perlfunc.pod
@@ -982,7 +982,7 @@ X<decrypt> X<cryptography> X<passwd> X<encrypt>
Creates a digest string exactly like the crypt(3) function in the C
library (assuming that you actually have a version there that has not
-been extirpated as a potential munitions).
+been extirpated as a potential munition).
crypt() is a one-way hash function. The PLAINTEXT and SALT is turned
into a short string, called a digest, which is returned. The same
@@ -1012,7 +1012,7 @@ digest matter.
Traditionally the result is a string of 13 bytes: two first bytes of
the salt, followed by 11 bytes from the set C<[./0-9A-Za-z]>, and only
-the first eight bytes of the digest string mattered, but alternative
+the first eight bytes of PLAINTEXT mattered. But alternative
hashing schemes (like MD5), higher level security schemes (like C2),
and implementations on non-UNIX platforms may produce different
strings.
diff --git a/pod/perlintern.pod b/pod/perlintern.pod
deleted file mode 100644
index 4107d5e63f..0000000000
--- a/pod/perlintern.pod
+++ /dev/null
@@ -1,1100 +0,0 @@
--*- buffer-read-only: t -*-
-
-!!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-This file is built by autodoc.pl extracting documentation from the C source
-files.
-
-=head1 NAME
-
-perlintern - autogenerated documentation of purely B<internal>
- Perl functions
-
-=head1 DESCRIPTION
-X<internal Perl functions> X<interpreter functions>
-
-This file is the autogenerated documentation of functions in the
-Perl interpreter that are documented using Perl's internal documentation
-format but are not marked as part of the Perl API. In other words,
-B<they are not for use in extensions>!
-
-
-=head1 CV reference counts and CvOUTSIDE
-
-=over 8
-
-=item CvWEAKOUTSIDE
-X<CvWEAKOUTSIDE>
-
-Each CV has a pointer, C<CvOUTSIDE()>, to its lexically enclosing
-CV (if any). Because pointers to anonymous sub prototypes are
-stored in C<&> pad slots, it is a possible to get a circular reference,
-with the parent pointing to the child and vice-versa. To avoid the
-ensuing memory leak, we do not increment the reference count of the CV
-pointed to by C<CvOUTSIDE> in the I<one specific instance> that the parent
-has a C<&> pad slot pointing back to us. In this case, we set the
-C<CvWEAKOUTSIDE> flag in the child. This allows us to determine under what
-circumstances we should decrement the refcount of the parent when freeing
-the child.
-
-There is a further complication with non-closure anonymous subs (i.e. those
-that do not refer to any lexicals outside that sub). In this case, the
-anonymous prototype is shared rather than being cloned. This has the
-consequence that the parent may be freed while there are still active
-children, eg
-
- BEGIN { $a = sub { eval '$x' } }
-
-In this case, the BEGIN is freed immediately after execution since there
-are no active references to it: the anon sub prototype has
-C<CvWEAKOUTSIDE> set since it's not a closure, and $a points to the same
-CV, so it doesn't contribute to BEGIN's refcount either. When $a is
-executed, the C<eval '$x'> causes the chain of C<CvOUTSIDE>s to be followed,
-and the freed BEGIN is accessed.
-
-To avoid this, whenever a CV and its associated pad is freed, any
-C<&> entries in the pad are explicitly removed from the pad, and if the
-refcount of the pointed-to anon sub is still positive, then that
-child's C<CvOUTSIDE> is set to point to its grandparent. This will only
-occur in the single specific case of a non-closure anon prototype
-having one or more active references (such as C<$a> above).
-
-One other thing to consider is that a CV may be merely undefined
-rather than freed, eg C<undef &foo>. In this case, its refcount may
-not have reached zero, but we still delete its pad and its C<CvROOT> etc.
-Since various children may still have their C<CvOUTSIDE> pointing at this
-undefined CV, we keep its own C<CvOUTSIDE> for the time being, so that
-the chain of lexical scopes is unbroken. For example, the following
-should print 123:
-
- my $x = 123;
- sub tmp { sub { eval '$x' } }
- my $a = tmp();
- undef &tmp;
- print $a->();
-
- bool CvWEAKOUTSIDE(CV *cv)
-
-=for hackers
-Found in file cv.h
-
-
-=back
-
-=head1 Functions in file pad.h
-
-
-=over 8
-
-=item CX_CURPAD_SAVE
-X<CX_CURPAD_SAVE>
-
-Save the current pad in the given context block structure.
-
- void CX_CURPAD_SAVE(struct context)
-
-=for hackers
-Found in file pad.h
-
-=item CX_CURPAD_SV
-X<CX_CURPAD_SV>
-
-Access the SV at offset po in the saved current pad in the given
-context block structure (can be used as an lvalue).
-
- SV * CX_CURPAD_SV(struct context, PADOFFSET po)
-
-=for hackers
-Found in file pad.h
-
-=item PAD_BASE_SV
-X<PAD_BASE_SV>
-
-Get the value from slot C<po> in the base (DEPTH=1) pad of a padlist
-
- SV * PAD_BASE_SV(PADLIST padlist, PADOFFSET po)
-
-=for hackers
-Found in file pad.h
-
-=item PAD_CLONE_VARS
-X<PAD_CLONE_VARS>
-
-Clone the state variables associated with running and compiling pads.
-
- void PAD_CLONE_VARS(PerlInterpreter *proto_perl, CLONE_PARAMS* param)
-
-=for hackers
-Found in file pad.h
-
-=item PAD_COMPNAME_FLAGS
-X<PAD_COMPNAME_FLAGS>
-
-Return the flags for the current compiling pad name
-at offset C<po>. Assumes a valid slot entry.
-
- U32 PAD_COMPNAME_FLAGS(PADOFFSET po)
-
-=for hackers
-Found in file pad.h
-
-=item PAD_COMPNAME_GEN
-X<PAD_COMPNAME_GEN>
-
-The generation number of the name at offset C<po> in the current
-compiling pad (lvalue). Note that C<SvUVX> is hijacked for this purpose.
-
- STRLEN PAD_COMPNAME_GEN(PADOFFSET po)
-
-=for hackers
-Found in file pad.h
-
-=item PAD_COMPNAME_GEN_set
-X<PAD_COMPNAME_GEN_set>
-
-Sets the generation number of the name at offset C<po> in the current
-ling pad (lvalue) to C<gen>. Note that C<SvUV_set> is hijacked for this purpose.
-
- STRLEN PAD_COMPNAME_GEN_set(PADOFFSET po, int gen)
-
-=for hackers
-Found in file pad.h
-
-=item PAD_COMPNAME_OURSTASH
-X<PAD_COMPNAME_OURSTASH>
-
-Return the stash associated with an C<our> variable.
-Assumes the slot entry is a valid C<our> lexical.
-
- HV * PAD_COMPNAME_OURSTASH(PADOFFSET po)
-
-=for hackers
-Found in file pad.h
-
-=item PAD_COMPNAME_PV
-X<PAD_COMPNAME_PV>
-
-Return the name of the current compiling pad name
-at offset C<po>. Assumes a valid slot entry.
-
- char * PAD_COMPNAME_PV(PADOFFSET po)
-
-=for hackers
-Found in file pad.h
-
-=item PAD_COMPNAME_TYPE
-X<PAD_COMPNAME_TYPE>
-
-Return the type (stash) of the current compiling pad name at offset
-C<po>. Must be a valid name. Returns null if not typed.
-
- HV * PAD_COMPNAME_TYPE(PADOFFSET po)
-
-=for hackers
-Found in file pad.h
-
-=item PAD_DUP
-X<PAD_DUP>
-
-Clone a padlist.
-
- void PAD_DUP(PADLIST dstpad, PADLIST srcpad, CLONE_PARAMS* param)
-
-=for hackers
-Found in file pad.h
-
-=item PAD_RESTORE_LOCAL
-X<PAD_RESTORE_LOCAL>
-
-Restore the old pad saved into the local variable opad by PAD_SAVE_LOCAL()
-
- void PAD_RESTORE_LOCAL(PAD *opad)
-
-=for hackers
-Found in file pad.h
-
-=item PAD_SAVE_LOCAL
-X<PAD_SAVE_LOCAL>
-
-Save the current pad to the local variable opad, then make the
-current pad equal to npad
-
- void PAD_SAVE_LOCAL(PAD *opad, PAD *npad)
-
-=for hackers
-Found in file pad.h
-
-=item PAD_SAVE_SETNULLPAD
-X<PAD_SAVE_SETNULLPAD>
-
-Save the current pad then set it to null.
-
- void PAD_SAVE_SETNULLPAD()
-
-=for hackers
-Found in file pad.h
-
-=item PAD_SETSV
-X<PAD_SETSV>
-
-Set the slot at offset C<po> in the current pad to C<sv>
-
- SV * PAD_SETSV(PADOFFSET po, SV* sv)
-
-=for hackers
-Found in file pad.h
-
-=item PAD_SET_CUR
-X<PAD_SET_CUR>
-
-Set the current pad to be pad C<n> in the padlist, saving
-the previous current pad. NB currently this macro expands to a string too
-long for some compilers, so it's best to replace it with
-
- SAVECOMPPAD();
- PAD_SET_CUR_NOSAVE(padlist,n);
-
-
- void PAD_SET_CUR(PADLIST padlist, I32 n)
-
-=for hackers
-Found in file pad.h
-
-=item PAD_SET_CUR_NOSAVE
-X<PAD_SET_CUR_NOSAVE>
-
-like PAD_SET_CUR, but without the save
-
- void PAD_SET_CUR_NOSAVE(PADLIST padlist, I32 n)
-
-=for hackers
-Found in file pad.h
-
-=item PAD_SV
-X<PAD_SV>
-
-Get the value at offset C<po> in the current pad
-
- void PAD_SV(PADOFFSET po)
-
-=for hackers
-Found in file pad.h
-
-=item PAD_SVl
-X<PAD_SVl>
-
-Lightweight and lvalue version of C<PAD_SV>.
-Get or set the value at offset C<po> in the current pad.
-Unlike C<PAD_SV>, does not print diagnostics with -DX.
-For internal use only.
-
- SV * PAD_SVl(PADOFFSET po)
-
-=for hackers
-Found in file pad.h
-
-=item SAVECLEARSV
-X<SAVECLEARSV>
-
-Clear the pointed to pad value on scope exit. (i.e. the runtime action of 'my')
-
- void SAVECLEARSV(SV **svp)
-
-=for hackers
-Found in file pad.h
-
-=item SAVECOMPPAD
-X<SAVECOMPPAD>
-
-save PL_comppad and PL_curpad
-
-
-
-
-
- void SAVECOMPPAD()
-
-=for hackers
-Found in file pad.h
-
-=item SAVEPADSV
-X<SAVEPADSV>
-
-Save a pad slot (used to restore after an iteration)
-
-XXX DAPM it would make more sense to make the arg a PADOFFSET
- void SAVEPADSV(PADOFFSET po)
-
-=for hackers
-Found in file pad.h
-
-
-=back
-
-=head1 GV Functions
-
-=over 8
-
-=item is_gv_magical_sv
-X<is_gv_magical_sv>
-
-Returns C<TRUE> if given the name of a magical GV.
-
-Currently only useful internally when determining if a GV should be
-created even in rvalue contexts.
-
-C<flags> is not used at present but available for future extension to
-allow selecting particular classes of magical variable.
-
-Currently assumes that C<name> is NUL terminated (as well as len being valid).
-This assumption is met by all callers within the perl core, which all pass
-pointers returned by SvPV.
-
- bool is_gv_magical_sv(SV *const name_sv, U32 flags)
-
-=for hackers
-Found in file gv.c
-
-
-=back
-
-=head1 Hash Manipulation Functions
-
-=over 8
-
-=item refcounted_he_chain_2hv
-X<refcounted_he_chain_2hv>
-
-Generates and returns a C<HV *> by walking up the tree starting at the passed
-in C<struct refcounted_he *>.
-
- HV * refcounted_he_chain_2hv(const struct refcounted_he *c)
-
-=for hackers
-Found in file hv.c
-
-=item refcounted_he_free
-X<refcounted_he_free>
-
-Decrements the reference count of the passed in C<struct refcounted_he *>
-by one. If the reference count reaches zero the structure's memory is freed,
-and C<refcounted_he_free> iterates onto the parent node.
-
- void refcounted_he_free(struct refcounted_he *he)
-
-=for hackers
-Found in file hv.c
-
-=item refcounted_he_new
-X<refcounted_he_new>
-
-Creates a new C<struct refcounted_he>. As S<key> is copied, and value is
-stored in a compact form, all references remain the property of the caller.
-The C<struct refcounted_he> is returned with a reference count of 1.
-
- struct refcounted_he * refcounted_he_new(struct refcounted_he *const parent, SV *const key, SV *const value)
-
-=for hackers
-Found in file hv.c
-
-
-=back
-
-=head1 IO Functions
-
-=over 8
-
-=item start_glob
-X<start_glob>
-
-Function called by C<do_readline> to spawn a glob (or do the glob inside
-perl on VMS). This code used to be inline, but now perl uses C<File::Glob>
-this glob starter is only used by miniperl during the build process.
-Moving it away shrinks pp_hot.c; shrinking pp_hot.c helps speed perl up.
-
- PerlIO* start_glob(SV *tmpglob, IO *io)
-
-=for hackers
-Found in file doio.c
-
-
-=back
-
-=head1 Magical Functions
-
-=over 8
-
-=item magic_clearhint
-X<magic_clearhint>
-
-Triggered by a delete from %^H, records the key to
-C<PL_compiling.cop_hints_hash>.
-
- int magic_clearhint(SV* sv, MAGIC* mg)
-
-=for hackers
-Found in file mg.c
-
-=item magic_sethint
-X<magic_sethint>
-
-Triggered by a store to %^H, records the key/value pair to
-C<PL_compiling.cop_hints_hash>. It is assumed that hints aren't storing
-anything that would need a deep copy. Maybe we should warn if we find a
-reference.
-
- int magic_sethint(SV* sv, MAGIC* mg)
-
-=for hackers
-Found in file mg.c
-
-=item mg_localize
-X<mg_localize>
-
-Copy some of the magic from an existing SV to new localized version of that
-SV. Container magic (eg %ENV, $1, tie) gets copied, value magic doesn't (eg
-taint, pos).
-
-If setmagic is false then no set magic will be called on the new (empty) SV.
-This typically means that assignment will soon follow (e.g. 'local $x = $y'),
-and that will handle the magic.
-
- void mg_localize(SV* sv, SV* nsv, bool setmagic)
-
-=for hackers
-Found in file mg.c
-
-
-=back
-
-=head1 MRO Functions
-
-=over 8
-
-=item mro_get_linear_isa_dfs
-X<mro_get_linear_isa_dfs>
-
-Returns the Depth-First Search linearization of @ISA
-the given stash. The return value is a read-only AV*.
-C<level> should be 0 (it is used internally in this
-function's recursion).
-
-You are responsible for C<SvREFCNT_inc()> on the
-return value if you plan to store it anywhere
-semi-permanently (otherwise it might be deleted
-out from under you the next time the cache is
-invalidated).
-
- AV* mro_get_linear_isa_dfs(HV* stash, U32 level)
-
-=for hackers
-Found in file mro.c
-
-=item mro_isa_changed_in
-X<mro_isa_changed_in>
-
-Takes the necessary steps (cache invalidations, mostly)
-when the @ISA of the given package has changed. Invoked
-by the C<setisa> magic, should not need to invoke directly.
-
- void mro_isa_changed_in(HV* stash)
-
-=for hackers
-Found in file mro.c
-
-
-=back
-
-=head1 Pad Data Structures
-
-=over 8
-
-=item CvPADLIST
-X<CvPADLIST>
-
-CV's can have CvPADLIST(cv) set to point to an AV.
-
-For these purposes "forms" are a kind-of CV, eval""s are too (except they're
-not callable at will and are always thrown away after the eval"" is done
-executing). Require'd files are simply evals without any outer lexical
-scope.
-
-XSUBs don't have CvPADLIST set - dXSTARG fetches values from PL_curpad,
-but that is really the callers pad (a slot of which is allocated by
-every entersub).
-
-The CvPADLIST AV has does not have AvREAL set, so REFCNT of component items
-is managed "manual" (mostly in pad.c) rather than normal av.c rules.
-The items in the AV are not SVs as for a normal AV, but other AVs:
-
-0'th Entry of the CvPADLIST is an AV which represents the "names" or rather
-the "static type information" for lexicals.
-
-The CvDEPTH'th entry of CvPADLIST AV is an AV which is the stack frame at that
-depth of recursion into the CV.
-The 0'th slot of a frame AV is an AV which is @_.
-other entries are storage for variables and op targets.
-
-During compilation:
-C<PL_comppad_name> is set to the names AV.
-C<PL_comppad> is set to the frame AV for the frame CvDEPTH == 1.
-C<PL_curpad> is set to the body of the frame AV (i.e. AvARRAY(PL_comppad)).
-
-During execution, C<PL_comppad> and C<PL_curpad> refer to the live
-frame of the currently executing sub.
-
-Iterating over the names AV iterates over all possible pad
-items. Pad slots that are SVs_PADTMP (targets/GVs/constants) end up having
-&PL_sv_undef "names" (see pad_alloc()).
-
-Only my/our variable (SVs_PADMY/SVs_PADOUR) slots get valid names.
-The rest are op targets/GVs/constants which are statically allocated
-or resolved at compile time. These don't have names by which they
-can be looked up from Perl code at run time through eval"" like
-my/our variables can be. Since they can't be looked up by "name"
-but only by their index allocated at compile time (which is usually
-in PL_op->op_targ), wasting a name SV for them doesn't make sense.
-
-The SVs in the names AV have their PV being the name of the variable.
-xlow+1..xhigh inclusive in the NV union is a range of cop_seq numbers for
-which the name is valid. For typed lexicals name SV is SVt_PVMG and SvSTASH
-points at the type. For C<our> lexicals, the type is also SVt_PVMG, with the
-SvOURSTASH slot pointing at the stash of the associated global (so that
-duplicate C<our> declarations in the same package can be detected). SvUVX is
-sometimes hijacked to store the generation number during compilation.
-
-If SvFAKE is set on the name SV, then that slot in the frame AV is
-a REFCNT'ed reference to a lexical from "outside". In this case,
-the name SV does not use xlow and xhigh to store a cop_seq range, since it is
-in scope throughout. Instead xhigh stores some flags containing info about
-the real lexical (is it declared in an anon, and is it capable of being
-instantiated multiple times?), and for fake ANONs, xlow contains the index
-within the parent's pad where the lexical's value is stored, to make
-cloning quicker.
-
-If the 'name' is '&' the corresponding entry in frame AV
-is a CV representing a possible closure.
-(SvFAKE and name of '&' is not a meaningful combination currently but could
-become so if C<my sub foo {}> is implemented.)
-
-Note that formats are treated as anon subs, and are cloned each time
-write is called (if necessary).
-
-The flag SVf_PADSTALE is cleared on lexicals each time the my() is executed,
-and set on scope exit. This allows the 'Variable $x is not available' warning
-to be generated in evals, such as
-
- { my $x = 1; sub f { eval '$x'} } f();
-
-For state vars, SVf_PADSTALE is overloaded to mean 'not yet initialised'
-
- AV * CvPADLIST(CV *cv)
-
-=for hackers
-Found in file pad.c
-
-=item cv_clone
-X<cv_clone>
-
-Clone a CV: make a new CV which points to the same code etc, but which
-has a newly-created pad built by copying the prototype pad and capturing
-any outer lexicals.
-
- CV* cv_clone(CV* proto)
-
-=for hackers
-Found in file pad.c
-
-=item cv_dump
-X<cv_dump>
-
-dump the contents of a CV
-
- void cv_dump(const CV *cv, const char *title)
-
-=for hackers
-Found in file pad.c
-
-=item do_dump_pad
-X<do_dump_pad>
-
-Dump the contents of a padlist
-
- void do_dump_pad(I32 level, PerlIO *file, PADLIST *padlist, int full)
-
-=for hackers
-Found in file pad.c
-
-=item intro_my
-X<intro_my>
-
-"Introduce" my variables to visible status.
-
- U32 intro_my()
-
-=for hackers
-Found in file pad.c
-
-=item pad_add_anon
-X<pad_add_anon>
-
-Add an anon code entry to the current compiling pad
-
- PADOFFSET pad_add_anon(SV* sv, OPCODE op_type)
-
-=for hackers
-Found in file pad.c
-
-=item pad_add_name
-X<pad_add_name>
-
-Create a new name and associated PADMY SV in the current pad; return the
-offset.
-If C<typestash> is valid, the name is for a typed lexical; set the
-name's stash to that value.
-If C<ourstash> is valid, it's an our lexical, set the name's
-SvOURSTASH to that value
-
-If fake, it means we're cloning an existing entry
-
- PADOFFSET pad_add_name(const char *name, HV* typestash, HV* ourstash, bool clone, bool state)
-
-=for hackers
-Found in file pad.c
-
-=item pad_alloc
-X<pad_alloc>
-
-Allocate a new my or tmp pad entry. For a my, simply push a null SV onto
-the end of PL_comppad, but for a tmp, scan the pad from PL_padix upwards
-for a slot which has no name and no active value.
-
- PADOFFSET pad_alloc(I32 optype, U32 tmptype)
-
-=for hackers
-Found in file pad.c
-
-=item pad_block_start
-X<pad_block_start>
-
-Update the pad compilation state variables on entry to a new block
-
- void pad_block_start(int full)
-
-=for hackers
-Found in file pad.c
-
-=item pad_check_dup
-X<pad_check_dup>
-
-Check for duplicate declarations: report any of:
- * a my in the current scope with the same name;
- * an our (anywhere in the pad) with the same name and the same stash
- as C<ourstash>
-C<is_our> indicates that the name to check is an 'our' declaration
-
- void pad_check_dup(const char* name, bool is_our, const HV* ourstash)
-
-=for hackers
-Found in file pad.c
-
-=item pad_findlex
-X<pad_findlex>
-
-Find a named lexical anywhere in a chain of nested pads. Add fake entries
-in the inner pads if it's found in an outer one.
-
-Returns the offset in the bottom pad of the lex or the fake lex.
-cv is the CV in which to start the search, and seq is the current cop_seq
-to match against. If warn is true, print appropriate warnings. The out_*
-vars return values, and so are pointers to where the returned values
-should be stored. out_capture, if non-null, requests that the innermost
-instance of the lexical is captured; out_name_sv is set to the innermost
-matched namesv or fake namesv; out_flags returns the flags normally
-associated with the IVX field of a fake namesv.
-
-Note that pad_findlex() is recursive; it recurses up the chain of CVs,
-then comes back down, adding fake entries as it goes. It has to be this way
-because fake namesvs in anon protoypes have to store in xlow the index into
-the parent pad.
-
- PADOFFSET pad_findlex(const char *name, const CV* cv, U32 seq, int warn, SV** out_capture, SV** out_name_sv, int *out_flags)
-
-=for hackers
-Found in file pad.c
-
-=item pad_findmy
-X<pad_findmy>
-
-Given a lexical name, try to find its offset, first in the current pad,
-or failing that, in the pads of any lexically enclosing subs (including
-the complications introduced by eval). If the name is found in an outer pad,
-then a fake entry is added to the current pad.
-Returns the offset in the current pad, or NOT_IN_PAD on failure.
-
- PADOFFSET pad_findmy(const char* name)
-
-=for hackers
-Found in file pad.c
-
-=item pad_fixup_inner_anons
-X<pad_fixup_inner_anons>
-
-For any anon CVs in the pad, change CvOUTSIDE of that CV from
-old_cv to new_cv if necessary. Needed when a newly-compiled CV has to be
-moved to a pre-existing CV struct.
-
- void pad_fixup_inner_anons(PADLIST *padlist, CV *old_cv, CV *new_cv)
-
-=for hackers
-Found in file pad.c
-
-=item pad_free
-X<pad_free>
-
-Free the SV at offset po in the current pad.
-
- void pad_free(PADOFFSET po)
-
-=for hackers
-Found in file pad.c
-
-=item pad_leavemy
-X<pad_leavemy>
-
-Cleanup at end of scope during compilation: set the max seq number for
-lexicals in this scope and warn of any lexicals that never got introduced.
-
- void pad_leavemy()
-
-=for hackers
-Found in file pad.c
-
-=item pad_new
-X<pad_new>
-
-Create a new compiling padlist, saving and updating the various global
-vars at the same time as creating the pad itself. The following flags
-can be OR'ed together:
-
- padnew_CLONE this pad is for a cloned CV
- padnew_SAVE save old globals
- padnew_SAVESUB also save extra stuff for start of sub
-
- PADLIST* pad_new(int flags)
-
-=for hackers
-Found in file pad.c
-
-=item pad_push
-X<pad_push>
-
-Push a new pad frame onto the padlist, unless there's already a pad at
-this depth, in which case don't bother creating a new one. Then give
-the new pad an @_ in slot zero.
-
- void pad_push(PADLIST *padlist, int depth)
-
-=for hackers
-Found in file pad.c
-
-=item pad_reset
-X<pad_reset>
-
-Mark all the current temporaries for reuse
-
- void pad_reset()
-
-=for hackers
-Found in file pad.c
-
-=item pad_setsv
-X<pad_setsv>
-
-Set the entry at offset po in the current pad to sv.
-Use the macro PAD_SETSV() rather than calling this function directly.
-
- void pad_setsv(PADOFFSET po, SV* sv)
-
-=for hackers
-Found in file pad.c
-
-=item pad_swipe
-X<pad_swipe>
-
-Abandon the tmp in the current pad at offset po and replace with a
-new one.
-
- void pad_swipe(PADOFFSET po, bool refadjust)
-
-=for hackers
-Found in file pad.c
-
-=item pad_tidy
-X<pad_tidy>
-
-Tidy up a pad after we've finished compiling it:
- * remove most stuff from the pads of anonsub prototypes;
- * give it a @_;
- * mark tmps as such.
-
- void pad_tidy(padtidy_type type)
-
-=for hackers
-Found in file pad.c
-
-=item pad_undef
-X<pad_undef>
-
-Free the padlist associated with a CV.
-If parts of it happen to be current, we null the relevant
-PL_*pad* global vars so that we don't have any dangling references left.
-We also repoint the CvOUTSIDE of any about-to-be-orphaned
-inner subs to the outer of this cv.
-
-(This function should really be called pad_free, but the name was already
-taken)
-
- void pad_undef(CV* cv)
-
-=for hackers
-Found in file pad.c
-
-
-=back
-
-=head1 Per-Interpreter Variables
-
-=over 8
-
-=item PL_DBsingle
-X<PL_DBsingle>
-
-When Perl is run in debugging mode, with the B<-d> switch, this SV is a
-boolean which indicates whether subs are being single-stepped.
-Single-stepping is automatically turned on after every step. This is the C
-variable which corresponds to Perl's $DB::single variable. See
-C<PL_DBsub>.
-
- SV * PL_DBsingle
-
-=for hackers
-Found in file intrpvar.h
-
-=item PL_DBsub
-X<PL_DBsub>
-
-When Perl is run in debugging mode, with the B<-d> switch, this GV contains
-the SV which holds the name of the sub being debugged. This is the C
-variable which corresponds to Perl's $DB::sub variable. See
-C<PL_DBsingle>.
-
- GV * PL_DBsub
-
-=for hackers
-Found in file intrpvar.h
-
-=item PL_DBtrace
-X<PL_DBtrace>
-
-Trace variable used when Perl is run in debugging mode, with the B<-d>
-switch. This is the C variable which corresponds to Perl's $DB::trace
-variable. See C<PL_DBsingle>.
-
- SV * PL_DBtrace
-
-=for hackers
-Found in file intrpvar.h
-
-=item PL_dowarn
-X<PL_dowarn>
-
-The C variable which corresponds to Perl's $^W warning variable.
-
- bool PL_dowarn
-
-=for hackers
-Found in file intrpvar.h
-
-=item PL_last_in_gv
-X<PL_last_in_gv>
-
-The GV which was last used for a filehandle input operation. (C<< <FH> >>)
-
- GV* PL_last_in_gv
-
-=for hackers
-Found in file intrpvar.h
-
-=item PL_ofsgv
-X<PL_ofsgv>
-
-The glob containing the output field separator - C<*,> in Perl space.
-
- GV* PL_ofsgv
-
-=for hackers
-Found in file intrpvar.h
-
-=item PL_rs
-X<PL_rs>
-
-The input record separator - C<$/> in Perl space.
-
- SV* PL_rs
-
-=for hackers
-Found in file intrpvar.h
-
-
-=back
-
-=head1 Stack Manipulation Macros
-
-=over 8
-
-=item djSP
-X<djSP>
-
-Declare Just C<SP>. This is actually identical to C<dSP>, and declares
-a local copy of perl's stack pointer, available via the C<SP> macro.
-See C<SP>. (Available for backward source code compatibility with the
-old (Perl 5.005) thread model.)
-
- djSP;
-
-=for hackers
-Found in file pp.h
-
-=item LVRET
-X<LVRET>
-
-True if this op will be the return value of an lvalue subroutine
-
-=for hackers
-Found in file pp.h
-
-
-=back
-
-=head1 SV Manipulation Functions
-
-=over 8
-
-=item sv_add_arena
-X<sv_add_arena>
-
-Given a chunk of memory, link it to the head of the list of arenas,
-and split it into a list of free SVs.
-
- void sv_add_arena(char *const ptr, const U32 size, const U32 flags)
-
-=for hackers
-Found in file sv.c
-
-=item sv_clean_all
-X<sv_clean_all>
-
-Decrement the refcnt of each remaining SV, possibly triggering a
-cleanup. This function may have to be called multiple times to free
-SVs which are in complex self-referential hierarchies.
-
- I32 sv_clean_all()
-
-=for hackers
-Found in file sv.c
-
-=item sv_clean_objs
-X<sv_clean_objs>
-
-Attempt to destroy all objects not yet freed
-
- void sv_clean_objs()
-
-=for hackers
-Found in file sv.c
-
-=item sv_free_arenas
-X<sv_free_arenas>
-
-Deallocate the memory used by all arenas. Note that all the individual SV
-heads and bodies within the arenas must already have been freed.
-
- void sv_free_arenas()
-
-=for hackers
-Found in file sv.c
-
-
-=back
-
-=head1 SV-Body Allocation
-
-=over 8
-
-=item sv_2num
-X<sv_2num>
-
-Return an SV with the numeric value of the source SV, doing any necessary
-reference or overload conversion. You must use the C<SvNUM(sv)> macro to
-access this function.
-
- SV* sv_2num(SV *const sv)
-
-=for hackers
-Found in file sv.c
-
-
-=back
-
-=head1 Unicode Support
-
-=over 8
-
-=item find_uninit_var
-X<find_uninit_var>
-
-Find the name of the undefined variable (if any) that caused the operator o
-to issue a "Use of uninitialized value" warning.
-If match is true, only return a name if it's value matches uninit_sv.
-So roughly speaking, if a unary operator (such as OP_COS) generates a
-warning, then following the direct child of the op may yield an
-OP_PADSV or OP_GV that gives the name of the undefined variable. On the
-other hand, with OP_ADD there are two branches to follow, so we only print
-the variable name if we get an exact match.
-
-The name is returned as a mortal SV.
-
-Assumes that PL_op is the op that originally triggered the error, and that
-PL_comppad/PL_curpad points to the currently executing pad.
-
- SV* find_uninit_var(const OP *const obase, const SV *const uninit_sv, bool top)
-
-=for hackers
-Found in file sv.c
-
-=item report_uninit
-X<report_uninit>
-
-Print appropriate "Use of uninitialized variable" warning
-
- void report_uninit(const SV *uninit_sv)
-
-=for hackers
-Found in file sv.c
-
-
-=back
-
-=head1 AUTHORS
-
-The autodocumentation system was originally added to the Perl core by
-Benjamin Stuhl. Documentation is by whoever was kind enough to
-document their functions.
-
-=head1 SEE ALSO
-
-perlguts(1), perlapi(1)
-
-=cut
-
- ex: set ro:
diff --git a/pod/perlobj.pod b/pod/perlobj.pod
index 44ae4535ab..6d335e5410 100644
--- a/pod/perlobj.pod
+++ b/pod/perlobj.pod
@@ -460,6 +460,15 @@ object destruction, or for ensuring that destructors in the base classes
of your choosing get called. Explicitly calling DESTROY is also possible,
but is usually never needed.
+DESTROY is subject to AUTOLOAD lookup, just like any other method. Hence, if
+your class has an AUTOLOAD method, but does not need any DESTROY actions,
+you probably want to provide a DESTROY method anyway, to prevent an
+expensive call to AUTOLOAD each time an object is freed. As this technique
+makes empty DESTROY methods common, the implementation is optimised so that
+a DESTROY method that is an empty or constant subroutine, and hence could
+have no side effects anyway, is not actually called.
+X<AUTOLOAD> X<DESTROY>
+
Do not confuse the previous discussion with how objects I<CONTAINED> in the current
one are destroyed. Such objects will be freed and destroyed automatically
when the current object is freed, provided no other references to them exist
diff --git a/pod/perlothrtut.pod b/pod/perlothrtut.pod
deleted file mode 100644
index e0d69c5059..0000000000
--- a/pod/perlothrtut.pod
+++ /dev/null
@@ -1,1067 +0,0 @@
-=head1 NAME
-
-perlothrtut - old tutorial on threads in Perl
-
-=head1 DESCRIPTION
-
-B<WARNING>:
-This tutorial describes the old-style thread model that was introduced in
-release 5.005. This model is deprecated, and has been removed
-for version 5.10. The interfaces described here were considered
-experimental, and are likely to be buggy.
-
-For information about the new interpreter threads ("ithreads") model, see
-the F<perlthrtut> tutorial, and the L<threads> and L<threads::shared>
-modules.
-
-You are strongly encouraged to migrate any existing threads code to the
-new model as soon as possible.
-
-=head1 What Is A Thread Anyway?
-
-A thread is a flow of control through a program with a single
-execution point.
-
-Sounds an awful lot like a process, doesn't it? Well, it should.
-Threads are one of the pieces of a process. Every process has at least
-one thread and, up until now, every process running Perl had only one
-thread. With 5.005, though, you can create extra threads. We're going
-to show you how, when, and why.
-
-=head1 Threaded Program Models
-
-There are three basic ways that you can structure a threaded
-program. Which model you choose depends on what you need your program
-to do. For many non-trivial threaded programs you'll need to choose
-different models for different pieces of your program.
-
-=head2 Boss/Worker
-
-The boss/worker model usually has one `boss' thread and one or more
-`worker' threads. The boss thread gathers or generates tasks that need
-to be done, then parcels those tasks out to the appropriate worker
-thread.
-
-This model is common in GUI and server programs, where a main thread
-waits for some event and then passes that event to the appropriate
-worker threads for processing. Once the event has been passed on, the
-boss thread goes back to waiting for another event.
-
-The boss thread does relatively little work. While tasks aren't
-necessarily performed faster than with any other method, it tends to
-have the best user-response times.
-
-=head2 Work Crew
-
-In the work crew model, several threads are created that do
-essentially the same thing to different pieces of data. It closely
-mirrors classical parallel processing and vector processors, where a
-large array of processors do the exact same thing to many pieces of
-data.
-
-This model is particularly useful if the system running the program
-will distribute multiple threads across different processors. It can
-also be useful in ray tracing or rendering engines, where the
-individual threads can pass on interim results to give the user visual
-feedback.
-
-=head2 Pipeline
-
-The pipeline model divides up a task into a series of steps, and
-passes the results of one step on to the thread processing the
-next. Each thread does one thing to each piece of data and passes the
-results to the next thread in line.
-
-This model makes the most sense if you have multiple processors so two
-or more threads will be executing in parallel, though it can often
-make sense in other contexts as well. It tends to keep the individual
-tasks small and simple, as well as allowing some parts of the pipeline
-to block (on I/O or system calls, for example) while other parts keep
-going. If you're running different parts of the pipeline on different
-processors you may also take advantage of the caches on each
-processor.
-
-This model is also handy for a form of recursive programming where,
-rather than having a subroutine call itself, it instead creates
-another thread. Prime and Fibonacci generators both map well to this
-form of the pipeline model. (A version of a prime number generator is
-presented later on.)
-
-=head1 Native threads
-
-There are several different ways to implement threads on a system. How
-threads are implemented depends both on the vendor and, in some cases,
-the version of the operating system. Often the first implementation
-will be relatively simple, but later versions of the OS will be more
-sophisticated.
-
-While the information in this section is useful, it's not necessary,
-so you can skip it if you don't feel up to it.
-
-There are three basic categories of threads-user-mode threads, kernel
-threads, and multiprocessor kernel threads.
-
-User-mode threads are threads that live entirely within a program and
-its libraries. In this model, the OS knows nothing about threads. As
-far as it's concerned, your process is just a process.
-
-This is the easiest way to implement threads, and the way most OSes
-start. The big disadvantage is that, since the OS knows nothing about
-threads, if one thread blocks they all do. Typical blocking activities
-include most system calls, most I/O, and things like sleep().
-
-Kernel threads are the next step in thread evolution. The OS knows
-about kernel threads, and makes allowances for them. The main
-difference between a kernel thread and a user-mode thread is
-blocking. With kernel threads, things that block a single thread don't
-block other threads. This is not the case with user-mode threads,
-where the kernel blocks at the process level and not the thread level.
-
-This is a big step forward, and can give a threaded program quite a
-performance boost over non-threaded programs. Threads that block
-performing I/O, for example, won't block threads that are doing other
-things. Each process still has only one thread running at once,
-though, regardless of how many CPUs a system might have.
-
-Since kernel threading can interrupt a thread at any time, they will
-uncover some of the implicit locking assumptions you may make in your
-program. For example, something as simple as C<$a = $a + 2> can behave
-unpredictably with kernel threads if $a is visible to other
-threads, as another thread may have changed $a between the time it
-was fetched on the right hand side and the time the new value is
-stored.
-
-Multiprocessor Kernel Threads are the final step in thread
-support. With multiprocessor kernel threads on a machine with multiple
-CPUs, the OS may schedule two or more threads to run simultaneously on
-different CPUs.
-
-This can give a serious performance boost to your threaded program,
-since more than one thread will be executing at the same time. As a
-tradeoff, though, any of those nagging synchronization issues that
-might not have shown with basic kernel threads will appear with a
-vengeance.
-
-In addition to the different levels of OS involvement in threads,
-different OSes (and different thread implementations for a particular
-OS) allocate CPU cycles to threads in different ways.
-
-Cooperative multitasking systems have running threads give up control
-if one of two things happen. If a thread calls a yield function, it
-gives up control. It also gives up control if the thread does
-something that would cause it to block, such as perform I/O. In a
-cooperative multitasking implementation, one thread can starve all the
-others for CPU time if it so chooses.
-
-Preemptive multitasking systems interrupt threads at regular intervals
-while the system decides which thread should run next. In a preemptive
-multitasking system, one thread usually won't monopolize the CPU.
-
-On some systems, there can be cooperative and preemptive threads
-running simultaneously. (Threads running with realtime priorities
-often behave cooperatively, for example, while threads running at
-normal priorities behave preemptively.)
-
-=head1 What kind of threads are perl threads?
-
-If you have experience with other thread implementations, you might
-find that things aren't quite what you expect. It's very important to
-remember when dealing with Perl threads that Perl Threads Are Not X
-Threads, for all values of X. They aren't POSIX threads, or
-DecThreads, or Java's Green threads, or Win32 threads. There are
-similarities, and the broad concepts are the same, but if you start
-looking for implementation details you're going to be either
-disappointed or confused. Possibly both.
-
-This is not to say that Perl threads are completely different from
-everything that's ever come before--they're not. Perl's threading
-model owes a lot to other thread models, especially POSIX. Just as
-Perl is not C, though, Perl threads are not POSIX threads. So if you
-find yourself looking for mutexes, or thread priorities, it's time to
-step back a bit and think about what you want to do and how Perl can
-do it.
-
-=head1 Threadsafe Modules
-
-The addition of threads has changed Perl's internals
-substantially. There are implications for people who write
-modules--especially modules with XS code or external libraries. While
-most modules won't encounter any problems, modules that aren't
-explicitly tagged as thread-safe should be tested before being used in
-production code.
-
-Not all modules that you might use are thread-safe, and you should
-always assume a module is unsafe unless the documentation says
-otherwise. This includes modules that are distributed as part of the
-core. Threads are a beta feature, and even some of the standard
-modules aren't thread-safe.
-
-If you're using a module that's not thread-safe for some reason, you
-can protect yourself by using semaphores and lots of programming
-discipline to control access to the module. Semaphores are covered
-later in the article. Perl Threads Are Different
-
-=head1 Thread Basics
-
-The core Thread module provides the basic functions you need to write
-threaded programs. In the following sections we'll cover the basics,
-showing you what you need to do to create a threaded program. After
-that, we'll go over some of the features of the Thread module that
-make threaded programming easier.
-
-=head2 Basic Thread Support
-
-Thread support is a Perl compile-time option-it's something that's
-turned on or off when Perl is built at your site, rather than when
-your programs are compiled. If your Perl wasn't compiled with thread
-support enabled, then any attempt to use threads will fail.
-
-Remember that the threading support in 5.005 is in beta release, and
-should be treated as such. You should expect that it may not function
-entirely properly, and the thread interface may well change some
-before it is a fully supported, production release. The beta version
-shouldn't be used for mission-critical projects. Having said that,
-threaded Perl is pretty nifty, and worth a look.
-
-Your programs can use the Config module to check whether threads are
-enabled. If your program can't run without them, you can say something
-like:
-
- $Config{usethreads} or die "Recompile Perl with threads to run this program.";
-
-A possibly-threaded program using a possibly-threaded module might
-have code like this:
-
- use Config;
- use MyMod;
-
- if ($Config{usethreads}) {
- # We have threads
- require MyMod_threaded;
- import MyMod_threaded;
- } else {
- require MyMod_unthreaded;
- import MyMod_unthreaded;
- }
-
-Since code that runs both with and without threads is usually pretty
-messy, it's best to isolate the thread-specific code in its own
-module. In our example above, that's what MyMod_threaded is, and it's
-only imported if we're running on a threaded Perl.
-
-=head2 Creating Threads
-
-The Thread package provides the tools you need to create new
-threads. Like any other module, you need to tell Perl you want to use
-it; use Thread imports all the pieces you need to create basic
-threads.
-
-The simplest, straightforward way to create a thread is with new():
-
- use Thread;
-
- $thr = Thread->new( \&sub1 );
-
- sub sub1 {
- print "In the thread\n";
- }
-
-The new() method takes a reference to a subroutine and creates a new
-thread, which starts executing in the referenced subroutine. Control
-then passes both to the subroutine and the caller.
-
-If you need to, your program can pass parameters to the subroutine as
-part of the thread startup. Just include the list of parameters as
-part of the C<Thread::new> call, like this:
-
- use Thread;
- $Param3 = "foo";
- $thr = Thread->new( \&sub1, "Param 1", "Param 2", $Param3 );
- $thr = Thread->new( \&sub1, @ParamList );
- $thr = Thread->new( \&sub1, qw(Param1 Param2 $Param3) );
-
- sub sub1 {
- my @InboundParameters = @_;
- print "In the thread\n";
- print "got parameters >", join("<>", @InboundParameters), "<\n";
- }
-
-
-The subroutine runs like a normal Perl subroutine, and the call to new
-Thread returns whatever the subroutine returns.
-
-The last example illustrates another feature of threads. You can spawn
-off several threads using the same subroutine. Each thread executes
-the same subroutine, but in a separate thread with a separate
-environment and potentially separate arguments.
-
-The other way to spawn a new thread is with async(), which is a way to
-spin off a chunk of code like eval(), but into its own thread:
-
- use Thread qw(async);
-
- $LineCount = 0;
-
- $thr = async {
- while(<>) {$LineCount++}
- print "Got $LineCount lines\n";
- };
-
- print "Waiting for the linecount to end\n";
- $thr->join;
- print "All done\n";
-
-You'll notice we did a use Thread qw(async) in that example. async is
-not exported by default, so if you want it, you'll either need to
-import it before you use it or fully qualify it as
-Thread::async. You'll also note that there's a semicolon after the
-closing brace. That's because async() treats the following block as an
-anonymous subroutine, so the semicolon is necessary.
-
-Like eval(), the code executes in the same context as it would if it
-weren't spun off. Since both the code inside and after the async start
-executing, you need to be careful with any shared resources. Locking
-and other synchronization techniques are covered later.
-
-=head2 Giving up control
-
-There are times when you may find it useful to have a thread
-explicitly give up the CPU to another thread. Your threading package
-might not support preemptive multitasking for threads, for example, or
-you may be doing something compute-intensive and want to make sure
-that the user-interface thread gets called frequently. Regardless,
-there are times that you might want a thread to give up the processor.
-
-Perl's threading package provides the yield() function that does
-this. yield() is pretty straightforward, and works like this:
-
- use Thread qw(yield async);
- async {
- my $foo = 50;
- while ($foo--) { print "first async\n" }
- yield;
- $foo = 50;
- while ($foo--) { print "first async\n" }
- };
- async {
- my $foo = 50;
- while ($foo--) { print "second async\n" }
- yield;
- $foo = 50;
- while ($foo--) { print "second async\n" }
- };
-
-=head2 Waiting For A Thread To Exit
-
-Since threads are also subroutines, they can return values. To wait
-for a thread to exit and extract any scalars it might return, you can
-use the join() method.
-
- use Thread;
- $thr = Thread->new( \&sub1 );
-
- @ReturnData = $thr->join;
- print "Thread returned @ReturnData";
-
- sub sub1 { return "Fifty-six", "foo", 2; }
-
-In the example above, the join() method returns as soon as the thread
-ends. In addition to waiting for a thread to finish and gathering up
-any values that the thread might have returned, join() also performs
-any OS cleanup necessary for the thread. That cleanup might be
-important, especially for long-running programs that spawn lots of
-threads. If you don't want the return values and don't want to wait
-for the thread to finish, you should call the detach() method
-instead. detach() is covered later in the article.
-
-=head2 Errors In Threads
-
-So what happens when an error occurs in a thread? Any errors that
-could be caught with eval() are postponed until the thread is
-joined. If your program never joins, the errors appear when your
-program exits.
-
-Errors deferred until a join() can be caught with eval():
-
- use Thread qw(async);
- $thr = async {$b = 3/0}; # Divide by zero error
- $foo = eval {$thr->join};
- if ($@) {
- print "died with error $@\n";
- } else {
- print "Hey, why aren't you dead?\n";
- }
-
-eval() passes any results from the joined thread back unmodified, so
-if you want the return value of the thread, this is your only chance
-to get them.
-
-=head2 Ignoring A Thread
-
-join() does three things: it waits for a thread to exit, cleans up
-after it, and returns any data the thread may have produced. But what
-if you're not interested in the thread's return values, and you don't
-really care when the thread finishes? All you want is for the thread
-to get cleaned up after when it's done.
-
-In this case, you use the detach() method. Once a thread is detached,
-it'll run until it's finished, then Perl will clean up after it
-automatically.
-
- use Thread;
- $thr = Thread->new( \&sub1 ); # Spawn the thread
-
- $thr->detach; # Now we officially don't care any more
-
- sub sub1 {
- $a = 0;
- while (1) {
- $a++;
- print "\$a is $a\n";
- sleep 1;
- }
- }
-
-
-Once a thread is detached, it may not be joined, and any output that
-it might have produced (if it was done and waiting for a join) is
-lost.
-
-=head1 Threads And Data
-
-Now that we've covered the basics of threads, it's time for our next
-topic: data. Threading introduces a couple of complications to data
-access that non-threaded programs never need to worry about.
-
-=head2 Shared And Unshared Data
-
-The single most important thing to remember when using threads is that
-all threads potentially have access to all the data anywhere in your
-program. While this is true with a nonthreaded Perl program as well,
-it's especially important to remember with a threaded program, since
-more than one thread can be accessing this data at once.
-
-Perl's scoping rules don't change because you're using threads. If a
-subroutine (or block, in the case of async()) could see a variable if
-you weren't running with threads, it can see it if you are. This is
-especially important for the subroutines that create, and makes C<my>
-variables even more important. Remember--if your variables aren't
-lexically scoped (declared with C<my>) you're probably sharing them
-between threads.
-
-=head2 Thread Pitfall: Races
-
-While threads bring a new set of useful tools, they also bring a
-number of pitfalls. One pitfall is the race condition:
-
- use Thread;
- $a = 1;
- $thr1 = Thread->new(\&sub1);
- $thr2 = Thread->new(\&sub2);
-
- sleep 10;
- print "$a\n";
-
- sub sub1 { $foo = $a; $a = $foo + 1; }
- sub sub2 { $bar = $a; $a = $bar + 1; }
-
-What do you think $a will be? The answer, unfortunately, is "it
-depends." Both sub1() and sub2() access the global variable $a, once
-to read and once to write. Depending on factors ranging from your
-thread implementation's scheduling algorithm to the phase of the moon,
-$a can be 2 or 3.
-
-Race conditions are caused by unsynchronized access to shared
-data. Without explicit synchronization, there's no way to be sure that
-nothing has happened to the shared data between the time you access it
-and the time you update it. Even this simple code fragment has the
-possibility of error:
-
- use Thread qw(async);
- $a = 2;
- async{ $b = $a; $a = $b + 1; };
- async{ $c = $a; $a = $c + 1; };
-
-Two threads both access $a. Each thread can potentially be interrupted
-at any point, or be executed in any order. At the end, $a could be 3
-or 4, and both $b and $c could be 2 or 3.
-
-Whenever your program accesses data or resources that can be accessed
-by other threads, you must take steps to coordinate access or risk
-data corruption and race conditions.
-
-=head2 Controlling access: lock()
-
-The lock() function takes a variable (or subroutine, but we'll get to
-that later) and puts a lock on it. No other thread may lock the
-variable until the locking thread exits the innermost block containing
-the lock. Using lock() is straightforward:
-
- use Thread qw(async);
- $a = 4;
- $thr1 = async {
- $foo = 12;
- {
- lock ($a); # Block until we get access to $a
- $b = $a;
- $a = $b * $foo;
- }
- print "\$foo was $foo\n";
- };
- $thr2 = async {
- $bar = 7;
- {
- lock ($a); # Block until we can get access to $a
- $c = $a;
- $a = $c * $bar;
- }
- print "\$bar was $bar\n";
- };
- $thr1->join;
- $thr2->join;
- print "\$a is $a\n";
-
-lock() blocks the thread until the variable being locked is
-available. When lock() returns, your thread can be sure that no other
-thread can lock that variable until the innermost block containing the
-lock exits.
-
-It's important to note that locks don't prevent access to the variable
-in question, only lock attempts. This is in keeping with Perl's
-longstanding tradition of courteous programming, and the advisory file
-locking that flock() gives you. Locked subroutines behave differently,
-however. We'll cover that later in the article.
-
-You may lock arrays and hashes as well as scalars. Locking an array,
-though, will not block subsequent locks on array elements, just lock
-attempts on the array itself.
-
-Finally, locks are recursive, which means it's okay for a thread to
-lock a variable more than once. The lock will last until the outermost
-lock() on the variable goes out of scope.
-
-=head2 Thread Pitfall: Deadlocks
-
-Locks are a handy tool to synchronize access to data. Using them
-properly is the key to safe shared data. Unfortunately, locks aren't
-without their dangers. Consider the following code:
-
- use Thread qw(async yield);
- $a = 4;
- $b = "foo";
- async {
- lock($a);
- yield;
- sleep 20;
- lock ($b);
- };
- async {
- lock($b);
- yield;
- sleep 20;
- lock ($a);
- };
-
-This program will probably hang until you kill it. The only way it
-won't hang is if one of the two async() routines acquires both locks
-first. A guaranteed-to-hang version is more complicated, but the
-principle is the same.
-
-The first thread spawned by async() will grab a lock on $a then, a
-second or two later, try to grab a lock on $b. Meanwhile, the second
-thread grabs a lock on $b, then later tries to grab a lock on $a. The
-second lock attempt for both threads will block, each waiting for the
-other to release its lock.
-
-This condition is called a deadlock, and it occurs whenever two or
-more threads are trying to get locks on resources that the others
-own. Each thread will block, waiting for the other to release a lock
-on a resource. That never happens, though, since the thread with the
-resource is itself waiting for a lock to be released.
-
-There are a number of ways to handle this sort of problem. The best
-way is to always have all threads acquire locks in the exact same
-order. If, for example, you lock variables $a, $b, and $c, always lock
-$a before $b, and $b before $c. It's also best to hold on to locks for
-as short a period of time to minimize the risks of deadlock.
-
-=head2 Queues: Passing Data Around
-
-A queue is a special thread-safe object that lets you put data in one
-end and take it out the other without having to worry about
-synchronization issues. They're pretty straightforward, and look like
-this:
-
- use Thread qw(async);
- use Thread::Queue;
-
- my $DataQueue = Thread::Queue->new();
- $thr = async {
- while ($DataElement = $DataQueue->dequeue) {
- print "Popped $DataElement off the queue\n";
- }
- };
-
- $DataQueue->enqueue(12);
- $DataQueue->enqueue("A", "B", "C");
- sleep 10;
- $DataQueue->enqueue(undef);
-
-You create the queue with C<< Thread::Queue->new >>. Then you can add
-lists of scalars onto the end with enqueue(), and pop scalars off the
-front of it with dequeue(). A queue has no fixed size, and can grow as
-needed to hold everything pushed on to it.
-
-If a queue is empty, dequeue() blocks until another thread enqueues
-something. This makes queues ideal for event loops and other
-communications between threads.
-
-=head1 Threads And Code
-
-In addition to providing thread-safe access to data via locks and
-queues, threaded Perl also provides general-purpose semaphores for
-coarser synchronization than locks provide and thread-safe access to
-entire subroutines.
-
-=head2 Semaphores: Synchronizing Data Access
-
-Semaphores are a kind of generic locking mechanism. Unlike lock, which
-gets a lock on a particular scalar, Perl doesn't associate any
-particular thing with a semaphore so you can use them to control
-access to anything you like. In addition, semaphores can allow more
-than one thread to access a resource at once, though by default
-semaphores only allow one thread access at a time.
-
-=over 4
-
-=item Basic semaphores
-
-Semaphores have two methods, down and up. down decrements the resource
-count, while up increments it. down calls will block if the
-semaphore's current count would decrement below zero. This program
-gives a quick demonstration:
-
- use Thread qw(yield);
- use Thread::Semaphore;
- my $semaphore = Thread::Semaphore->new();
- $GlobalVariable = 0;
-
- $thr1 = Thread->new( \&sample_sub, 1 );
- $thr2 = Thread->new( \&sample_sub, 2 );
- $thr3 = Thread->new( \&sample_sub, 3 );
-
- sub sample_sub {
- my $SubNumber = shift @_;
- my $TryCount = 10;
- my $LocalCopy;
- sleep 1;
- while ($TryCount--) {
- $semaphore->down;
- $LocalCopy = $GlobalVariable;
- print "$TryCount tries left for sub $SubNumber (\$GlobalVariable is $GlobalVariable)\n";
- yield;
- sleep 2;
- $LocalCopy++;
- $GlobalVariable = $LocalCopy;
- $semaphore->up;
- }
- }
-
-The three invocations of the subroutine all operate in sync. The
-semaphore, though, makes sure that only one thread is accessing the
-global variable at once.
-
-=item Advanced Semaphores
-
-By default, semaphores behave like locks, letting only one thread
-down() them at a time. However, there are other uses for semaphores.
-
-Each semaphore has a counter attached to it. down() decrements the
-counter and up() increments the counter. By default, semaphores are
-created with the counter set to one, down() decrements by one, and
-up() increments by one. If down() attempts to decrement the counter
-below zero, it blocks until the counter is large enough. Note that
-while a semaphore can be created with a starting count of zero, any
-up() or down() always changes the counter by at least
-one. $semaphore->down(0) is the same as $semaphore->down(1).
-
-The question, of course, is why would you do something like this? Why
-create a semaphore with a starting count that's not one, or why
-decrement/increment it by more than one? The answer is resource
-availability. Many resources that you want to manage access for can be
-safely used by more than one thread at once.
-
-For example, let's take a GUI driven program. It has a semaphore that
-it uses to synchronize access to the display, so only one thread is
-ever drawing at once. Handy, but of course you don't want any thread
-to start drawing until things are properly set up. In this case, you
-can create a semaphore with a counter set to zero, and up it when
-things are ready for drawing.
-
-Semaphores with counters greater than one are also useful for
-establishing quotas. Say, for example, that you have a number of
-threads that can do I/O at once. You don't want all the threads
-reading or writing at once though, since that can potentially swamp
-your I/O channels, or deplete your process' quota of filehandles. You
-can use a semaphore initialized to the number of concurrent I/O
-requests (or open files) that you want at any one time, and have your
-threads quietly block and unblock themselves.
-
-Larger increments or decrements are handy in those cases where a
-thread needs to check out or return a number of resources at once.
-
-=back
-
-=head2 Attributes: Restricting Access To Subroutines
-
-In addition to synchronizing access to data or resources, you might
-find it useful to synchronize access to subroutines. You may be
-accessing a singular machine resource (perhaps a vector processor), or
-find it easier to serialize calls to a particular subroutine than to
-have a set of locks and semaphores.
-
-One of the additions to Perl 5.005 is subroutine attributes. The
-Thread package uses these to provide several flavors of
-serialization. It's important to remember that these attributes are
-used in the compilation phase of your program so you can't change a
-subroutine's behavior while your program is actually running.
-
-=head2 Subroutine Locks
-
-The basic subroutine lock looks like this:
-
- sub test_sub :locked {
- }
-
-This ensures that only one thread will be executing this subroutine at
-any one time. Once a thread calls this subroutine, any other thread
-that calls it will block until the thread in the subroutine exits
-it. A more elaborate example looks like this:
-
- use Thread qw(yield);
-
- Thread->new(\&thread_sub, 1);
- Thread->new(\&thread_sub, 2);
- Thread->new(\&thread_sub, 3);
- Thread->new(\&thread_sub, 4);
-
- sub sync_sub :locked {
- my $CallingThread = shift @_;
- print "In sync_sub for thread $CallingThread\n";
- yield;
- sleep 3;
- print "Leaving sync_sub for thread $CallingThread\n";
- }
-
- sub thread_sub {
- my $ThreadID = shift @_;
- print "Thread $ThreadID calling sync_sub\n";
- sync_sub($ThreadID);
- print "$ThreadID is done with sync_sub\n";
- }
-
-The C<locked> attribute tells perl to lock sync_sub(), and if you run
-this, you can see that only one thread is in it at any one time.
-
-=head2 Methods
-
-Locking an entire subroutine can sometimes be overkill, especially
-when dealing with Perl objects. When calling a method for an object,
-for example, you want to serialize calls to a method, so that only one
-thread will be in the subroutine for a particular object, but threads
-calling that subroutine for a different object aren't blocked. The
-method attribute indicates whether the subroutine is really a method.
-
- use Thread;
-
- sub tester {
- my $thrnum = shift @_;
- my $bar = Foo->new();
- foreach (1..10) {
- print "$thrnum calling per_object\n";
- $bar->per_object($thrnum);
- print "$thrnum out of per_object\n";
- yield;
- print "$thrnum calling one_at_a_time\n";
- $bar->one_at_a_time($thrnum);
- print "$thrnum out of one_at_a_time\n";
- yield;
- }
- }
-
- foreach my $thrnum (1..10) {
- Thread->new(\&tester, $thrnum);
- }
-
- package Foo;
- sub new {
- my $class = shift @_;
- return bless [@_], $class;
- }
-
- sub per_object :locked :method {
- my ($class, $thrnum) = @_;
- print "In per_object for thread $thrnum\n";
- yield;
- sleep 2;
- print "Exiting per_object for thread $thrnum\n";
- }
-
- sub one_at_a_time :locked {
- my ($class, $thrnum) = @_;
- print "In one_at_a_time for thread $thrnum\n";
- yield;
- sleep 2;
- print "Exiting one_at_a_time for thread $thrnum\n";
- }
-
-As you can see from the output (omitted for brevity; it's 800 lines)
-all the threads can be in per_object() simultaneously, but only one
-thread is ever in one_at_a_time() at once.
-
-=head2 Locking A Subroutine
-
-You can lock a subroutine as you would lock a variable. Subroutine locks
-work the same as specifying a C<locked> attribute for the subroutine,
-and block all access to the subroutine for other threads until the
-lock goes out of scope. When the subroutine isn't locked, any number
-of threads can be in it at once, and getting a lock on a subroutine
-doesn't affect threads already in the subroutine. Getting a lock on a
-subroutine looks like this:
-
- lock(\&sub_to_lock);
-
-Simple enough. Unlike the C<locked> attribute, which is a compile time
-option, locking and unlocking a subroutine can be done at runtime at your
-discretion. There is some runtime penalty to using lock(\&sub) instead
-of the C<locked> attribute, so make sure you're choosing the proper
-method to do the locking.
-
-You'd choose lock(\&sub) when writing modules and code to run on both
-threaded and unthreaded Perl, especially for code that will run on
-5.004 or earlier Perls. In that case, it's useful to have subroutines
-that should be serialized lock themselves if they're running threaded,
-like so:
-
- package Foo;
- use Config;
- $Running_Threaded = 0;
-
- BEGIN { $Running_Threaded = $Config{'usethreads'} }
-
- sub sub1 { lock(\&sub1) if $Running_Threaded }
-
-
-This way you can ensure single-threadedness regardless of which
-version of Perl you're running.
-
-=head1 General Thread Utility Routines
-
-We've covered the workhorse parts of Perl's threading package, and
-with these tools you should be well on your way to writing threaded
-code and packages. There are a few useful little pieces that didn't
-really fit in anyplace else.
-
-=head2 What Thread Am I In?
-
-The Thread->self method provides your program with a way to get an
-object representing the thread it's currently in. You can use this
-object in the same way as the ones returned from the thread creation.
-
-=head2 Thread IDs
-
-tid() is a thread object method that returns the thread ID of the
-thread the object represents. Thread IDs are integers, with the main
-thread in a program being 0. Currently Perl assigns a unique tid to
-every thread ever created in your program, assigning the first thread
-to be created a tid of 1, and increasing the tid by 1 for each new
-thread that's created.
-
-=head2 Are These Threads The Same?
-
-The equal() method takes two thread objects and returns true
-if the objects represent the same thread, and false if they don't.
-
-=head2 What Threads Are Running?
-
-Thread->list returns a list of thread objects, one for each thread
-that's currently running. Handy for a number of things, including
-cleaning up at the end of your program:
-
- # Loop through all the threads
- foreach $thr (Thread->list) {
- # Don't join the main thread or ourselves
- if ($thr->tid && !Thread::equal($thr, Thread->self)) {
- $thr->join;
- }
- }
-
-The example above is just for illustration. It isn't strictly
-necessary to join all the threads you create, since Perl detaches all
-the threads before it exits.
-
-=head1 A Complete Example
-
-Confused yet? It's time for an example program to show some of the
-things we've covered. This program finds prime numbers using threads.
-
- 1 #!/usr/bin/perl -w
- 2 # prime-pthread, courtesy of Tom Christiansen
- 3
- 4 use strict;
- 5
- 6 use Thread;
- 7 use Thread::Queue;
- 8
- 9 my $stream = Thread::Queue->new();
- 10 my $kid = Thread->new(\&check_num, $stream, 2);
- 11
- 12 for my $i ( 3 .. 1000 ) {
- 13 $stream->enqueue($i);
- 14 }
- 15
- 16 $stream->enqueue(undef);
- 17 $kid->join();
- 18
- 19 sub check_num {
- 20 my ($upstream, $cur_prime) = @_;
- 21 my $kid;
- 22 my $downstream = Thread::Queue->new();
- 23 while (my $num = $upstream->dequeue) {
- 24 next unless $num % $cur_prime;
- 25 if ($kid) {
- 26 $downstream->enqueue($num);
- 27 } else {
- 28 print "Found prime $num\n";
- 29 $kid = Thread->new(\&check_num, $downstream, $num);
- 30 }
- 31 }
- 32 $downstream->enqueue(undef) if $kid;
- 33 $kid->join() if $kid;
- 34 }
-
-This program uses the pipeline model to generate prime numbers. Each
-thread in the pipeline has an input queue that feeds numbers to be
-checked, a prime number that it's responsible for, and an output queue
-that it funnels numbers that have failed the check into. If the thread
-has a number that's failed its check and there's no child thread, then
-the thread must have found a new prime number. In that case, a new
-child thread is created for that prime and stuck on the end of the
-pipeline.
-
-This probably sounds a bit more confusing than it really is, so lets
-go through this program piece by piece and see what it does. (For
-those of you who might be trying to remember exactly what a prime
-number is, it's a number that's only evenly divisible by itself and 1)
-
-The bulk of the work is done by the check_num() subroutine, which
-takes a reference to its input queue and a prime number that it's
-responsible for. After pulling in the input queue and the prime that
-the subroutine's checking (line 20), we create a new queue (line 22)
-and reserve a scalar for the thread that we're likely to create later
-(line 21).
-
-The while loop from lines 23 to line 31 grabs a scalar off the input
-queue and checks against the prime this thread is responsible
-for. Line 24 checks to see if there's a remainder when we modulo the
-number to be checked against our prime. If there is one, the number
-must not be evenly divisible by our prime, so we need to either pass
-it on to the next thread if we've created one (line 26) or create a
-new thread if we haven't.
-
-The new thread creation is line 29. We pass on to it a reference to
-the queue we've created, and the prime number we've found.
-
-Finally, once the loop terminates (because we got a 0 or undef in the
-queue, which serves as a note to die), we pass on the notice to our
-child and wait for it to exit if we've created a child (Lines 32 and
-37).
-
-Meanwhile, back in the main thread, we create a queue (line 9) and the
-initial child thread (line 10), and pre-seed it with the first prime:
-2. Then we queue all the numbers from 3 to 1000 for checking (lines
-12-14), then queue a die notice (line 16) and wait for the first child
-thread to terminate (line 17). Because a child won't die until its
-child has died, we know that we're done once we return from the join.
-
-That's how it works. It's pretty simple; as with many Perl programs,
-the explanation is much longer than the program.
-
-=head1 Conclusion
-
-A complete thread tutorial could fill a book (and has, many times),
-but this should get you well on your way. The final authority on how
-Perl's threads behave is the documentation bundled with the Perl
-distribution, but with what we've covered in this article, you should
-be well on your way to becoming a threaded Perl expert.
-
-=head1 Bibliography
-
-Here's a short bibliography courtesy of Jürgen Christoffel:
-
-=head2 Introductory Texts
-
-Birrell, Andrew D. An Introduction to Programming with
-Threads. Digital Equipment Corporation, 1989, DEC-SRC Research Report
-#35 online as
-http://www.research.digital.com/SRC/staff/birrell/bib.html (highly
-recommended)
-
-Robbins, Kay. A., and Steven Robbins. Practical Unix Programming: A
-Guide to Concurrency, Communication, and
-Multithreading. Prentice-Hall, 1996.
-
-Lewis, Bill, and Daniel J. Berg. Multithreaded Programming with
-Pthreads. Prentice Hall, 1997, ISBN 0-13-443698-9 (a well-written
-introduction to threads).
-
-Nelson, Greg (editor). Systems Programming with Modula-3. Prentice
-Hall, 1991, ISBN 0-13-590464-1.
-
-Nichols, Bradford, Dick Buttlar, and Jacqueline Proulx Farrell.
-Pthreads Programming. O'Reilly & Associates, 1996, ISBN 156592-115-1
-(covers POSIX threads).
-
-=head2 OS-Related References
-
-Boykin, Joseph, David Kirschen, Alan Langerman, and Susan
-LoVerso. Programming under Mach. Addison-Wesley, 1994, ISBN
-0-201-52739-1.
-
-Tanenbaum, Andrew S. Distributed Operating Systems. Prentice Hall,
-1995, ISBN 0-13-219908-4 (great textbook).
-
-Silberschatz, Abraham, and Peter B. Galvin. Operating System Concepts,
-4th ed. Addison-Wesley, 1995, ISBN 0-201-59292-4
-
-=head2 Other References
-
-Arnold, Ken and James Gosling. The Java Programming Language, 2nd
-ed. Addison-Wesley, 1998, ISBN 0-201-31006-6.
-
-Le Sergent, T. and B. Berthomieu. "Incremental MultiThreaded Garbage
-Collection on Virtually Shared Memory Architectures" in Memory
-Management: Proc. of the International Workshop IWMM 92, St. Malo,
-France, September 1992, Yves Bekkers and Jacques Cohen, eds. Springer,
-1992, ISBN 3540-55940-X (real-life thread applications).
-
-=head1 Acknowledgements
-
-Thanks (in no particular order) to Chaim Frenkel, Steve Fink, Gurusamy
-Sarathy, Ilya Zakharevich, Benjamin Sugars, Jürgen Christoffel, Joshua
-Pritikin, and Alan Burlison, for their help in reality-checking and
-polishing this article. Big thanks to Tom Christiansen for his rewrite
-of the prime number generator.
-
-=head1 AUTHOR
-
-Dan Sugalski E<lt>sugalskd@ous.eduE<gt>
-
-=head1 Copyrights
-
-This article originally appeared in The Perl Journal #10, and is
-copyright 1998 The Perl Journal. It appears courtesy of Jon Orwant and
-The Perl Journal. This document may be distributed under the same terms
-as Perl itself.
-
-
diff --git a/pod/perlpod.pod b/pod/perlpod.pod
index 9fc7bed663..827548b8eb 100644
--- a/pod/perlpod.pod
+++ b/pod/perlpod.pod
@@ -300,7 +300,9 @@ module. Examples:
=back
-And don't forget, when using any command, that the command lasts up
+C<=encoding> affects the whole document, and must occur only once.
+
+And don't forget, when using any other command, that the command lasts up
until the end of its I<paragraph>, not its line. So in the
examples below, you can see that every command needs the blank
line after it, to end its paragraph.
diff --git a/pod/perlport.pod b/pod/perlport.pod
index 39a7441956..9920a83e85 100644
--- a/pod/perlport.pod
+++ b/pod/perlport.pod
@@ -1600,9 +1600,11 @@ C<-x>, C<-o>. (S<Mac OS>, Win32, VMS, S<RISC OS>)
C<-b>, C<-c>, C<-k>, C<-g>, C<-p>, C<-u>, C<-A> are not implemented.
(S<Mac OS>)
-C<-g>, C<-k>, C<-l>, C<-p>, C<-u>, C<-A> are not particularly meaningful.
+C<-g>, C<-k>, C<-l>, C<-u>, C<-A> are not particularly meaningful.
(Win32, VMS, S<RISC OS>)
+C<-p> is not particularly meaningful. (VMS, S<RISC OS>)
+
C<-d> is true if passed a device spec without an explicit directory.
(VMS)
diff --git a/pod/perlrecharclass.pod b/pod/perlrecharclass.pod
index 4af2c9793d..c86a2c35f8 100644
--- a/pod/perlrecharclass.pod
+++ b/pod/perlrecharclass.pod
@@ -471,7 +471,7 @@ Some examples:
Perl will recognize the POSIX character classes C<[=class=]>, and
C<[.class.]>, but does not (yet?) support this construct. Use of
-such a constructs will lead to an error.
+such a construct will lead to an error.
=head4 Examples
diff --git a/pod/perlreftut.pod b/pod/perlreftut.pod
index 82ad80e3a6..7898b6db53 100644
--- a/pod/perlreftut.pod
+++ b/pod/perlreftut.pod
@@ -67,11 +67,11 @@ entire hash (or to just about anything else). Names are one kind of
reference that you're already familiar with. Think of the President
of the United States: a messy, inconvenient bag of blood and bones.
But to talk about him, or to represent him in a computer program, all
-you need is the easy, convenient scalar string "George Bush".
+you need is the easy, convenient scalar string "Barack Obama".
References in Perl are like names for arrays and hashes. They're
Perl's private, internal names, so you can be sure they're
-unambiguous. Unlike "George Bush", a reference only refers to one
+unambiguous. Unlike "Barack Obama", a reference only refers to one
thing, and you always know what it refers to. If you have a reference
to an array, you can recover the entire array from it. If you have a
reference to a hash, you can recover the entire hash. But the
diff --git a/pod/perlretut.pod b/pod/perlretut.pod
index 67e06700d4..71317693bd 100644
--- a/pod/perlretut.pod
+++ b/pod/perlretut.pod
@@ -2133,8 +2133,8 @@ example is
This style of commenting has been largely superseded by the raw,
freeform commenting that is allowed with the C<//x> modifier.
-The modifiers C<//i>, C<//m>, C<//s>, C<//x> and C<//k> (or any
-combination thereof) can also embedded in
+The modifiers C<//i>, C<//m>, C<//s> and C<//x> (or any
+combination thereof) can also be embedded in
a regexp using C<(?i)>, C<(?m)>, C<(?s)>, and C<(?x)>. For instance,
/(?i)yes/; # match 'yes' case insensitively
@@ -2159,7 +2159,7 @@ that must have different modifiers:
}
}
-The second advantage is that embedded modifiers (except C<//k>, which
+The second advantage is that embedded modifiers (except C<//p>, which
modifies the entire regexp) only affect the regexp
inside the group the embedded modifier is contained in. So grouping
can be used to localize the modifier's effects:
@@ -2420,9 +2420,9 @@ containing just one word character is a palindrome. Otherwise it must
have a word character up front and the same at its end, with another
palindrome in between.
- /(?: (\w) (?...Here be a palindrome...) \{-1} | \w? )/x
+ /(?: (\w) (?...Here be a palindrome...) \g{-1} | \w? )/x
-Adding C<\W*> at either end to eliminate was is to be ignored, we already
+Adding C<\W*> at either end to eliminate what is to be ignored, we already
have the full pattern:
my $pp = qr/^(\W* (?: (\w) (?1) \g{-1} | \w? ) \W*)$/ix;
diff --git a/pod/perlrun.pod b/pod/perlrun.pod
index d8e718ef1b..c3b30c8ad7 100644
--- a/pod/perlrun.pod
+++ b/pod/perlrun.pod
@@ -13,7 +13,7 @@ B<perl> S<[ B<-sTtuUWX> ]>
S<[ B<-S> ]>
S<[ B<-x>[I<dir>] ]>
S<[ B<-i>[I<extension>] ]>
- S<[ B<-eE> I<'command'> ] [ B<--> ] [ I<programfile> ] [ I<argument> ]...>
+ S<[ [B<-e>|B<-E>] I<'command'> ] [ B<--> ] [ I<programfile> ] [ I<argument> ]...>
=head1 DESCRIPTION
@@ -974,7 +974,7 @@ is used. The program should instead say:
X<PERL5OPT>
Command-line options (switches). Switches in this variable are taken
-as if they were on every Perl command line. Only the B<-[CDIMUdmtw]>
+as if they were on every Perl command line. Only the B<-[CDIMUdmtwW]>
switches are allowed. When running taint checks (because the program
was running setuid or setgid, or the B<-T> switch was used), this
variable is ignored. If PERL5OPT begins with B<-T>, tainting will be
diff --git a/pod/perlsyn.pod b/pod/perlsyn.pod
index 8b448505c1..9f964e001f 100644
--- a/pod/perlsyn.pod
+++ b/pod/perlsyn.pod
@@ -117,7 +117,7 @@ is treated as 0.
=head2 Statement Modifiers
X<statement modifier> X<modifier> X<if> X<unless> X<while>
-X<until> X<foreach> X<for>
+X<until> X<when> X<foreach> X<for>
Any simple statement may optionally be followed by a I<SINGLE> modifier,
just before the terminating semicolon (or block ending). The possible
@@ -127,6 +127,8 @@ modifiers are:
unless EXPR
while EXPR
until EXPR
+ when EXPR
+ for LIST
foreach LIST
The C<EXPR> following the modifier is referred to as the "condition".
@@ -139,6 +141,22 @@ the condition is true (i.e., if the condition is false).
print "Basset hounds got long ears" if length $ear >= 10;
go_outside() and play() unless $is_raining;
+C<when> executes the statement I<when> C<$_> smart matches C<EXPR>, and
+then either C<break>s out if it's enclosed in a C<given> scope or skips
+to the C<next> element when it lies directly inside a C<for> loop.
+See also L</"Switch statements">.
+
+ given ($something) {
+ $abc = 1 when /^abc/;
+ $just_a = 1 when /^a/;
+ $other = 1;
+ }
+
+ for (@names) {
+ admin($_) when [ qw/Alice Bob/ ];
+ regular($_) when [ qw/Chris David Ellen/ ];
+ }
+
The C<foreach> modifier is an iterator: it executes the statement once
for each item in the LIST (with C<$_> aliased to each item in turn).
@@ -738,7 +756,8 @@ underlying structure).
The Perl 5 smart match and C<given>/C<when> constructs are not
absolutely identical to their Perl 6 analogues. The most visible
difference is that, in Perl 5, parentheses are required around
-the argument to C<given()> and C<when()>. Parentheses in Perl 6
+the argument to C<given()> and C<when()> (except when this last
+one is used as a statement modifier). Parentheses in Perl 6
are always optional in a control construct such as C<if()>,
C<while()>, or C<when()>; they can't be made optional in Perl
5 without a great deal of potential confusion, because Perl 5
diff --git a/pod/perltoc.pod b/pod/perltoc.pod
deleted file mode 100644
index 1d57ee1149..0000000000
--- a/pod/perltoc.pod
+++ /dev/null
@@ -1,36909 +0,0 @@
-
-# !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
-# This file is autogenerated by buildtoc from all the other pods.
-# Edit those files and run buildtoc --build-toc to effect changes.
-
-=head1 NAME
-
-perltoc - perl documentation table of contents
-
-=head1 DESCRIPTION
-
-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
-
-=head2 perl - Practical Extraction and Report Language
-
-=over 4
-
-=item SYNOPSIS
-
-=over 4
-
-=item Overview
-
-=item Tutorials
-
-=item Reference Manual
-
-=item Internals and C Language Interface
-
-=item Miscellaneous
-
-=item Language-Specific
-
-=item Platform-Specific
-
-=back
-
-=item DESCRIPTION
-
-=item AVAILABILITY
-
-=item ENVIRONMENT
-
-=item AUTHOR
-
-=item FILES
-
-=item SEE ALSO
-
-=item DIAGNOSTICS
-
-=item BUGS
-
-=item NOTES
-
-=back
-
-=head2 perlintro -- a brief introduction and overview of Perl
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item What is Perl?
-
-=item Running Perl programs
-
-=item Safety net
-
-=item Basic syntax overview
-
-=item Perl variable types
-
-Scalars, Arrays, Hashes
-
-=item Variable scoping
-
-=item Conditional and looping constructs
-
-if, while, for, foreach
-
-=item Builtin operators and functions
-
-Arithmetic, Numeric comparison, String comparison, Boolean logic,
-Miscellaneous
-
-=item Files and I/O
-
-=item Regular expressions
-
-Simple matching, Simple substitution, More complex regular expressions,
-Parentheses for capturing, Other regexp features
-
-=item Writing subroutines
-
-=item OO Perl
-
-=item Using Perl modules
-
-=back
-
-=item AUTHOR
-
-=back
-
-=head2 perlreftut - Mark's very short tutorial about references
-
-=over 4
-
-=item DESCRIPTION
-
-=item Who Needs Complicated Data Structures?
-
-=item The Solution
-
-=item Syntax
-
-=over 4
-
-=item Making References
-
-=item Using References
-
-=item An Example
-
-=item Arrow Rule
-
-=back
-
-=item Solution
-
-=item The Rest
-
-=item Summary
-
-=item Credits
-
-=over 4
-
-=item Distribution Conditions
-
-=back
-
-=back
-
-=head2 perldsc - Perl Data Structures Cookbook
-
-=over 4
-
-=item DESCRIPTION
-
-arrays of arrays, hashes of arrays, arrays of hashes, hashes of hashes,
-more elaborate constructs
-
-=item REFERENCES
-X<reference> X<dereference> X<dereferencing> X<pointer>
-
-=item COMMON MISTAKES
-
-=item CAVEAT ON PRECEDENCE
-X<dereference, precedence> X<dereferencing, precedence>
-
-=item WHY YOU SHOULD ALWAYS C<use strict>
-
-=item DEBUGGING
-X<data structure, debugging> X<complex data structure, debugging>
-X<AoA, debugging> X<HoA, debugging> X<AoH, debugging> X<HoH, debugging>
-X<array of arrays, debugging> X<hash of arrays, debugging>
-X<array of hashes, debugging> X<hash of hashes, debugging>
-
-=item CODE EXAMPLES
-
-=item ARRAYS OF ARRAYS
-X<array of arrays> X<AoA>
-
-=over 4
-
-=item Declaration of an ARRAY OF ARRAYS
-
-=item Generation of an ARRAY OF ARRAYS
-
-=item Access and Printing of an ARRAY OF ARRAYS
-
-=back
-
-=item HASHES OF ARRAYS
-X<hash of arrays> X<HoA>
-
-=over 4
-
-=item Declaration of a HASH OF ARRAYS
-
-=item Generation of a HASH OF ARRAYS
-
-=item Access and Printing of a HASH OF ARRAYS
-
-=back
-
-=item ARRAYS OF HASHES
-X<array of hashes> X<AoH>
-
-=over 4
-
-=item Declaration of an ARRAY OF HASHES
-
-=item Generation of an ARRAY OF HASHES
-
-=item Access and Printing of an ARRAY OF HASHES
-
-=back
-
-=item HASHES OF HASHES
-X<hass of hashes> X<HoH>
-
-=over 4
-
-=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
-X<record> X<structure> X<struct>
-
-=over 4
-
-=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
-
-=item AUTHOR
-
-=back
-
-=head2 perllol - Manipulating Arrays of Arrays in Perl
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Declaration and Access of Arrays of Arrays
-
-=item Growing Your Own
-
-=item Access and Printing
-
-=item Slices
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=back
-
-=head2 perlrequick - Perl regular expressions quick start
-
-=over 4
-
-=item DESCRIPTION
-
-=item The Guide
-
-=over 4
-
-=item Simple word matching
-
-=item Using character classes
-
-=item Matching this or that
-
-=item Grouping things and hierarchical matching
-
-=item Extracting matches
-
-=item Matching repetitions
-
-=item More matching
-
-=item Search and replace
-
-=item The split operator
-
-=back
-
-=item BUGS
-
-=item SEE ALSO
-
-=item AUTHOR AND COPYRIGHT
-
-=over 4
-
-=item Acknowledgments
-
-=back
-
-=back
-
-=head2 perlretut - Perl regular expressions tutorial
-
-=over 4
-
-=item DESCRIPTION
-
-=item Part 1: The basics
-
-=over 4
-
-=item Simple word matching
-
-=item Using character classes
-
-=item Matching this or that
-
-=item Grouping things and hierarchical matching
-
-=item Extracting matches
-
-=item Backreferences
-
-=item Relative backreferences
-
-=item Named backreferences
-
-=item Alternative capture group numbering
-
-=item Position information
-
-=item Non-capturing groupings
-
-=item Matching repetitions
-
-=item Possessive quantifiers
-
-=item Building a regexp
-
-=item Using regular expressions in Perl
-
-=back
-
-=item Part 2: Power tools
-
-=over 4
-
-=item More on characters, strings, and character classes
-
-=item Compiling and saving regular expressions
-
-=item Composing regular expressions at runtime
-
-=item Embedding comments and modifiers in a regular expression
-
-=item Looking ahead and looking behind
-
-=item Using independent subexpressions to prevent backtracking
-
-=item Conditional expressions
-
-=item Defining named patterns
-
-=item Recursive patterns
-
-=item A bit of magic: executing Perl code in a regular expression
-
-=item Backtracking control verbs
-
-=item Pragmas and debugging
-
-=back
-
-=item BUGS
-
-=item SEE ALSO
-
-=item AUTHOR AND COPYRIGHT
-
-=over 4
-
-=item Acknowledgments
-
-=back
-
-=back
-
-=head2 perlboot - Beginner's Object-Oriented Tutorial
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item If we could talk to the animals...
-
-=item Introducing the method invocation arrow
-
-=item Invoking a barnyard
-
-=item The extra parameter of method invocation
-
-=item Calling a second method to simplify things
-
-=item Inheriting the windpipes
-
-=item A few notes about @ISA
-
-=item Overriding the methods
-
-=item Starting the search from a different place
-
-=item The SUPER way of doing things
-
-=item Where we're at so far...
-
-=item A horse is a horse, of course of course -- or is it?
-
-=item Invoking an instance method
-
-=item Accessing the instance data
-
-=item How to build a horse
-
-=item Inheriting the constructor
-
-=item Making a method work with either classes or instances
-
-=item Adding parameters to a method
-
-=item More interesting instances
-
-=item A horse of a different color
-
-=item Summary
-
-=back
-
-=item SEE ALSO
-
-=item COPYRIGHT
-
-=back
-
-=head2 perltoot - Tom's object-oriented tutorial for perl
-
-=over 4
-
-=item DESCRIPTION
-
-=item Creating a Class
-
-=over 4
-
-=item Object Representation
-
-=item Class Interface
-
-=item Constructors and Instance Methods
-
-=item Planning for the Future: Better Constructors
-
-=item Destructors
-
-=item Other Object Methods
-
-=back
-
-=item Class Data
-
-=over 4
-
-=item Accessing Class Data
-
-=item Debugging Methods
-
-=item Class Destructors
-
-=item Documenting the Interface
-
-=back
-
-=item Aggregation
-
-=item Inheritance
-
-=over 4
-
-=item Overridden Methods
-
-=item Multiple Inheritance
-
-=item UNIVERSAL: The Root of All Objects
-
-=item Deeper UNIVERSAL details
-
-=back
-
-=item Alternate Object Representations
-
-=over 4
-
-=item Arrays as Objects
-
-=item Closures as Objects
-
-=back
-
-=item AUTOLOAD: Proxy Methods
-
-=over 4
-
-=item Autoloaded Data Methods
-
-=item Inherited Autoloaded Data Methods
-
-=back
-
-=item Metaclassical Tools
-
-=over 4
-
-=item Class::Struct
-
-=item Data Members as Variables
-
-=back
-
-=item NOTES
-
-=over 4
-
-=item Object Terminology
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR AND COPYRIGHT
-
-=item COPYRIGHT
-
-=over 4
-
-=item Acknowledgments
-
-=back
-
-=back
-
-=head2 perltooc - Tom's OO Tutorial for Class Data in Perl
-
-=over 4
-
-=item DESCRIPTION
-
-=item Class Data in a Can
-
-=item Class Data as Package Variables
-
-=over 4
-
-=item Putting All Your Eggs in One Basket
-
-=item Inheritance Concerns
-
-=item The Eponymous Meta-Object
-
-=item Indirect References to Class Data
-
-=item Monadic Classes
-
-=item Translucent Attributes
-
-=back
-
-=item Class Data as Lexical Variables
-
-=over 4
-
-=item Privacy and Responsibility
-
-=item File-Scoped Lexicals
-
-=item More Inheritance Concerns
-
-=item Locking the Door and Throwing Away the Key
-
-=item Translucency Revisited
-
-=back
-
-=item NOTES
-
-=item SEE ALSO
-
-=item AUTHOR AND COPYRIGHT
-
-=item ACKNOWLEDGEMENTS
-
-=item HISTORY
-
-=back
-
-=head2 perlbot - Bag'o Object Tricks (the BOT)
-
-=over 4
-
-=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
-
-=item SEE ALSO
-
-=back
-
-=head2 perlperf - Perl Performance and Optimization Techniques
-
-=over 4
-
-=item DESCRIPTION
-
-=item OVERVIEW
-
-=over 4
-
-=item ONE STEP SIDEWAYS
-
-=item ONE STEP FORWARD
-
-=item ANOTHER STEP SIDEWAYS
-
-=back
-
-=item GENERAL GUIDELINES
-
-=item BENCHMARKS
-
-=over 4
-
-=item Assigning and Dereferencing Variables.
-
-=item Search and replace or tr
-
-=back
-
-=item PROFILING TOOLS
-
-=over 4
-
-=item Devel::DProf
-
-=item Devel::Profiler
-
-=item Devel::SmallProf
-
-=item Devel::FastProf
-
-=item Devel::NYTProf
-
-=back
-
-=item SORTING
-
-Elapsed Real Time, User CPU Time, System CPU Time
-
-=item LOGGING
-
-=over 4
-
-=item Logging if DEBUG (constant)
-
-=back
-
-=item POSTSCRIPT
-
-=item SEE ALSO
-
-=over 4
-
-=item PERLDOCS
-
-=item MAN PAGES
-
-=item MODULES
-
-=item URLS
-
-=back
-
-=item AUTHOR
-
-=back
-
-=head2 perlstyle - Perl style guide
-
-=over 4
-
-=item DESCRIPTION
-
-=back
-
-=head2 perlcheat - Perl 5 Cheat Sheet
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item The sheet
-
-=back
-
-=item ACKNOWLEDGEMENTS
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 perltrap - Perl traps for the unwary
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Awk Traps
-
-=item C/C++ Traps
-
-=item Sed Traps
-
-=item Shell Traps
-
-=item Perl Traps
-
-=item Perl4 to Perl5 Traps
-
-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
-
-Symbols starting with "_" no longer forced into main, Double-colon valid
-package separator in variable name, 2nd and 3rd args to C<splice()> are now
-in scalar context, Can't do C<goto> into a block that is optimized away,
-Can't use whitespace as variable name or quote delimiter, C<while/if BLOCK
-BLOCK> gone, C<**> binds tighter than unary minus, C<foreach> changed when
-iterating over a list, C<split> with no args behavior changed, B<-e>
-behavior fixed, C<push> returns number of elements in resulting list, Some
-error messages differ, C<split()> honors subroutine args, Bugs removed
-
-=item Parsing Traps
-
-Space between . and = triggers syntax error, Better parsing in perl 5,
-Function parsing, String interpolation of C<$#array> differs, Perl guesses
-on C<map>, C<grep> followed by C<{> if it starts BLOCK or hash ref
-
-=item Numerical Traps
-
-Formatted output and significant digits, Auto-increment operator over
-signed int limit deleted, Assignment of return values from numeric equality
-tests doesn't work, Bitwise string ops
-
-=item General data type traps
-
-Negative array subscripts now count from the end of array, Setting
-C<$#array> lower now discards array elements, Hashes get defined before
-use, Glob assignment from localized variable to variable, Assigning
-C<undef> to glob, Changes in unary negation (of strings), Modifying of
-constants prohibited, C<defined $var> behavior changed, Variable Suicide
-
-=item Context Traps - scalar, list contexts
-
-Elements of argument lists for formats evaluated in list context,
-C<caller()> returns false value in scalar context if no caller present,
-Comma operator in scalar context gives scalar context to args, C<sprintf()>
-prototyped as C<($;@)>
-
-=item Precedence Traps
-
-LHS vs. RHS of any assignment operator, Semantic errors introduced due to
-precedence, Precedence of assignment operators same as the precedence of
-assignment, C<open> requires parentheses around filehandle, C<$:>
-precedence over C<$::> gone, Precedence of file test operators documented,
-C<keys>, C<each>, C<values> are regular named unary operators
-
-=item General Regular Expression Traps using s///, etc.
-
-C<s'$lhs'$rhs'> interpolates on either side, C<m//g> attaches its state to
-the searched string, C<m//o> used within an anonymous sub, C<$+> isn't set
-to whole match, Substitution now returns null string if it fails,
-C<s`lhs`rhs`> is now a normal substitution, Stricter parsing of variables
-in regular expressions, C<m?x?> matches only once, Failed matches don't
-reset the match variables
-
-=item Subroutine, Signal, Sorting Traps
-
-Barewords that used to look like strings look like subroutine calls,
-Reverse is no longer allowed as the name of a sort subroutine, C<warn()>
-won't let you specify a filehandle
-
-=item OS Traps
-
-SysV resets signal handler correctly, SysV C<seek()> appends correctly
-
-=item Interpolation Traps
-
-C<@> always interpolates an array in double-quotish strings, Double-quoted
-strings may no longer end with an unescaped $, Arbitrary expressions are
-evaluated inside braces within double quotes, C<$$x> now tries to
-dereference $x, Creation of hashes on the fly with C<eval "EXPR"> requires
-protection, Bugs in earlier perl versions, Array and hash brackets during
-interpolation, Interpolation of C<\$$foo{bar}>, C<qq()> string passed to
-C<eval> will not find string terminator
-
-=item DBM Traps
-
-Perl5 must have been linked with same dbm/ndbm as the default for
-C<dbmopen()>, DBM exceeding limit on the key/value size will cause perl5 to
-exit immediately
-
-=item Unclassified Traps
-
-C<require>/C<do> trap using returned value, C<split> on empty string with
-LIMIT specified
-
-=back
-
-=back
-
-=head2 perldebtut - Perl debugging tutorial
-
-=over 4
-
-=item DESCRIPTION
-
-=item use strict
-
-=item Looking at data and -w and v
-
-=item help
-
-=item Stepping through code
-
-=item Placeholder for a, w, t, T
-
-=item REGULAR EXPRESSIONS
-
-=item OUTPUT TIPS
-
-=item CGI
-
-=item GUIs
-
-=item SUMMARY
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item CONTRIBUTORS
-
-=back
-
-=head2 perlfaq - frequently asked questions about Perl
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Where to get the perlfaq
-
-=item How to contribute to the perlfaq
-
-=item What will happen if you mail your Perl programming problems to the
-authors?
-
-=back
-
-=item CREDITS
-
-=item AUTHOR AND COPYRIGHT
-
-=item Table of Contents
-
-perlfaq - this document, perlfaq1 - General Questions About Perl, perlfaq2
-- Obtaining and Learning about Perl, perlfaq3 - Programming Tools, perlfaq4
-- Data Manipulation, perlfaq5 - Files and Formats, perlfaq6 - Regular
-Expressions, perlfaq7 - General Perl Language Issues, perlfaq8 - System
-Interaction, perlfaq9 - Networking
-
-=item The Questions
-
-=over 4
-
-=item L<perlfaq1>: General Questions About Perl
-
-=item L<perlfaq2>: Obtaining and Learning about Perl
-
-=item L<perlfaq3>: Programming Tools
-
-=item L<perlfaq4>: Data Manipulation
-
-=item L<perlfaq5>: Files and Formats
-
-=item L<perlfaq6>: Regular Expressions
-
-=item L<perlfaq7>: General Perl Language Issues
-
-=item L<perlfaq8>: System Interaction
-
-=item L<perlfaq9>: Networking
-
-=back
-
-=back
-
-=head2 perlfaq1 - General Questions About Perl
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item What is Perl?
-
-=item Who supports Perl? Who develops it? Why is it free?
-
-=item Which version of Perl should I use?
-
-=item What are Perl 4, Perl 5, or Perl 6?
-
-=item What was Ponie?
-
-=item What is Perl 6?
-
-=item How stable is Perl?
-
-=item Is Perl difficult to learn?
-
-=item How does Perl compare with other languages like Java, Python, REXX,
-Scheme, or Tcl?
-
-=item Can I do [task] in Perl?
-
-=item When shouldn't I program in Perl?
-
-=item What's the difference between "perl" and "Perl"?
-
-=item Is it a Perl program or a Perl script?
-
-=item What is a JAPH?
-
-=item Where can I get a list of Larry Wall witticisms?
-
-=item How can I convince others to use Perl?
-
-http://perltraining.com.au/whyperl.html,
-http://www.perl.org/advocacy/whyperl.html
-
-=back
-
-=item REVISION
-
-=item AUTHOR AND COPYRIGHT
-
-=back
-
-=head2 perlfaq2 - Obtaining and Learning about Perl
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item What machines support perl? Where do I get it?
-
-=item How can I get a binary version of perl?
-
-=item I don't have a C compiler. How can I build my own Perl interpreter?
-
-=item I copied the perl binary from one machine to another, but scripts
-don't work.
-
-=item I grabbed the sources and tried to compile but gdbm/dynamic
-loading/malloc/linking/... failed. How do I make it work?
-
-=item What modules and extensions are available for Perl? What is CPAN?
-What does CPAN/src/... mean?
-
-=item Is there an ISO or ANSI certified version of Perl?
-
-=item Where can I get information on Perl?
-
-=item What are the Perl newsgroups on Usenet? Where do I post questions?
-
-=item Where should I post source code?
-
-=item Perl Books
-
-References, Tutorials, Task-Oriented, Special Topics
-
-=item Which magazines have Perl content?
-
-=item What mailing lists are there for Perl?
-
-=item Where are the archives for comp.lang.perl.misc?
-
-=item Where can I buy a commercial version of perl?
-
-=item Where do I send bug reports?
-
-=item What is perl.com? Perl Mongers? pm.org? perl.org? cpan.org?
-
-=back
-
-=item REVISION
-
-=item AUTHOR AND COPYRIGHT
-
-=back
-
-=head2 perlfaq3 - Programming Tools
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item How do I do (anything)?
-
-=item How can I use Perl interactively?
-
-=item Is there a Perl shell?
-
-=item How do I find which modules are installed on my system?
-
-=item How do I debug my Perl programs?
-
-=item How do I profile my Perl programs?
-
-=item How do I cross-reference my Perl programs?
-
-=item Is there a pretty-printer (formatter) for Perl?
-
-=item Is there a ctags for Perl?
-
-=item Is there an IDE or Windows Perl Editor?
-
-Eclipse, Enginsite, Komodo, Open Perl IDE, OptiPerl, PerlBuilder,
-visiPerl+, Visual Perl, Zeus, GNU Emacs, MicroEMACS, XEmacs, Jed, Elvis,
-Vile, Vim, Codewright, MultiEdit, SlickEdit, Bash, Ksh, Tcsh, Zsh, Affrus,
-Alpha, BBEdit and BBEdit Lite
-
-=item Where can I get Perl macros for vi?
-
-=item Where can I get perl-mode for emacs?
-
-=item How can I use curses with Perl?
-
-=item How can I write a GUI (X, Tk, Gtk, etc.) in Perl?
-X<GUI> X<Tk> X<Wx> X<WxWidgets> X<Gtk> X<Gtk2> X<CamelBones> X<Qt>
-
-Tk, Wx, Gtk and Gtk2, Win32::GUI, CamelBones, Qt, Athena
-
-=item How can I make my Perl program run faster?
-
-=item How can I make my Perl program take less memory?
-
-Don't slurp!, Use map and grep selectively, Avoid unnecessary quotes and
-stringification, Pass by reference, Tie large variables to disk
-
-=item Is it safe to return a reference to local or lexical data?
-
-=item How can I free an array or hash so my program shrinks?
-
-=item How can I make my CGI script more efficient?
-
-=item How can I hide the source for my Perl program?
-
-=item How can I compile my Perl program into byte code or C?
-
-=item How can I get C<#!perl> to work on [MS-DOS,NT,...]?
-
-=item Can I write useful Perl programs on the command line?
-
-=item Why don't Perl one-liners work on my DOS/Mac/VMS system?
-
-=item Where can I learn about CGI or Web programming in Perl?
-
-=item Where can I learn about object-oriented Perl programming?
-
-=item Where can I learn about linking C with Perl?
-
-=item I've read perlembed, perlguts, etc., but I can't embed perl in my C
-program; what am I doing wrong?
-
-=item When I tried to run my script, I got this message. What does it mean?
-
-=item What's MakeMaker?
-
-=back
-
-=item REVISION
-
-=item AUTHOR AND COPYRIGHT
-
-=back
-
-=head2 perlfaq4 - Data Manipulation
-
-=over 4
-
-=item DESCRIPTION
-
-=item Data: Numbers
-
-=over 4
-
-=item Why am I getting long decimals (eg, 19.9499999999999) instead of the
-numbers I should be getting (eg, 19.95)?
-
-=item Why is int() broken?
-
-=item Why isn't my octal data interpreted correctly?
-
-=item Does Perl have a round() function? What about ceil() and floor()?
-Trig functions?
-
-=item How do I convert between numeric representations/bases/radixes?
-
-How do I convert hexadecimal into decimal, How do I convert from decimal to
-hexadecimal, How do I convert from octal to decimal, How do I convert from
-decimal to octal, How do I convert from binary to decimal, How do I convert
-from decimal to binary
-
-=item Why doesn't & work the way I want it to?
-
-=item How do I multiply matrices?
-
-=item How do I perform an operation on a series of integers?
-
-=item How can I output Roman numerals?
-
-=item Why aren't my random numbers random?
-
-=item How do I get a random number between X and Y?
-
-=back
-
-=item Data: Dates
-
-=over 4
-
-=item How do I find the day or week of the year?
-
-=item How do I find the current century or millennium?
-
-=item How can I compare two dates and find the difference?
-
-=item How can I take a string and turn it into epoch seconds?
-
-=item How can I find the Julian Day?
-
-=item How do I find yesterday's date?
-
-=item Does Perl have a Year 2000 problem? Is Perl Y2K compliant?
-
-=back
-
-=item Data: Strings
-
-=over 4
-
-=item How do I validate input?
-
-=item How do I unescape a string?
-
-=item How do I remove consecutive pairs of characters?
-
-=item How do I expand function calls in a string?
-
-=item How do I find matching/nesting anything?
-
-=item How do I reverse a string?
-
-=item How do I expand tabs in a string?
-
-=item How do I reformat a paragraph?
-
-=item How can I access or change N characters of a string?
-
-=item How do I change the Nth occurrence of something?
-
-=item How can I count the number of occurrences of a substring within a
-string?
-
-=item How do I capitalize all the words on one line?
-
-=item How can I split a [character] delimited string except when inside
-[character]?
-
-=item How do I strip blank space from the beginning/end of a string?
-
-=item How do I pad a string with blanks or pad a number with zeroes?
-
-=item How do I extract selected columns from a string?
-
-=item How do I find the soundex value of a string?
-
-=item How can I expand variables in text strings?
-
-=item What's wrong with always quoting "$vars"?
-
-=item Why don't my E<lt>E<lt>HERE documents work?
-
-There must be no space after the E<lt>E<lt> part, There (probably) should
-be a semicolon at the end, You can't (easily) have any space in front of
-the tag
-
-=back
-
-=item Data: Arrays
-
-=over 4
-
-=item What is the difference between a list and an array?
-
-=item What is the difference between $array[1] and @array[1]?
-
-=item How can I remove duplicate elements from a list or array?
-
-=item How can I tell whether a certain element is contained in a list or
-array?
-
-=item How do I compute the difference of two arrays? How do I compute the
-intersection of two arrays?
-
-=item How do I test whether two arrays or hashes are equal?
-
-=item How do I find the first array element for which a condition is true?
-
-=item How do I handle linked lists?
-
-=item How do I handle circular lists?
-
-=item How do I shuffle an array randomly?
-
-=item How do I process/modify each element of an array?
-
-=item How do I select a random element from an array?
-
-=item How do I permute N elements of a list?
-X<List::Permuter> X<permute> X<Algorithm::Loops> X<Knuth>
-X<The Art of Computer Programming> X<Fischer-Krause>
-
-=item How do I sort an array by (anything)?
-
-=item How do I manipulate arrays of bits?
-
-=item Why does defined() return true on empty arrays and hashes?
-
-=back
-
-=item Data: Hashes (Associative Arrays)
-
-=over 4
-
-=item How do I process an entire hash?
-
-=item What happens if I add or remove keys from a hash while iterating over
-it?
-
-=item How do I look up a hash element by value?
-
-=item How can I know how many entries are in a hash?
-
-=item How do I sort a hash (optionally by value instead of key)?
-
-=item How can I always keep my hash sorted?
-X<hash tie sort DB_File Tie::IxHash>
-
-=item What's the difference between "delete" and "undef" with hashes?
-
-=item Why don't my tied hashes make the defined/exists distinction?
-
-=item How do I reset an each() operation part-way through?
-
-=item How can I get the unique keys from two hashes?
-
-=item How can I store a multidimensional array in a DBM file?
-
-=item How can I make my hash remember the order I put elements into it?
-
-=item Why does passing a subroutine an undefined element in a hash create
-it?
-
-=item How can I make the Perl equivalent of a C structure/C++ class/hash or
-array of hashes or arrays?
-
-=item How can I use a reference as a hash key?
-
-=back
-
-=item Data: Misc
-
-=over 4
-
-=item How do I handle binary data correctly?
-
-=item How do I determine whether a scalar is a number/whole/integer/float?
-
-=item How do I keep persistent data across program calls?
-
-=item How do I print out or copy a recursive data structure?
-
-=item How do I define methods for every class/object?
-
-=item How do I verify a credit card checksum?
-
-=item How do I pack arrays of doubles or floats for XS code?
-
-=back
-
-=item REVISION
-
-=item AUTHOR AND COPYRIGHT
-
-=back
-
-=head2 perlfaq5 - Files and Formats
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item How do I flush/unbuffer an output filehandle? Why must I do this?
-X<flush> X<buffer> X<unbuffer> X<autoflush>
-
-=item How do I change, delete, or insert a line in a file, or append to the
-beginning of a file?
-X<file, editing>
-
-=item How do I count the number of lines in a file?
-X<file, counting lines> X<lines> X<line>
-
-=item How can I use Perl's C<-i> option from within a program?
-X<-i> X<in-place>
-
-=item How can I copy a file?
-X<copy> X<file, copy>
-
-=item How do I make a temporary file name?
-X<file, temporary>
-
-=item How can I manipulate fixed-record-length files?
-X<fixed-length> X<file, fixed-length records>
-
-=item How can I make a filehandle local to a subroutine? How do I pass
-filehandles between subroutines? How do I make an array of filehandles?
-X<filehandle, local> X<filehandle, passing> X<filehandle, reference>
-
-=item How can I use a filehandle indirectly?
-X<filehandle, indirect>
-
-=item How can I set up a footer format to be used with write()?
-X<footer>
-
-=item How can I write() into a string?
-X<write, into a string>
-
-=item How can I open a filehandle to a string?
-X<string>, X<open>, X<IO::Scalar>, X<filehandle>
-
-=item How can I output my numbers with commas added?
-X<number, commify>
-
-=item How can I translate tildes (~) in a filename?
-X<tilde> X<tilde expansion>
-
-=item How come when I open a file read-write it wipes it out?
-X<clobber> X<read-write> X<clobbering> X<truncate> X<truncating>
-
-=item Why do I sometimes get an "Argument list too long" when I use
-E<lt>*E<gt>?
-X<argument list too long>
-
-=item Is there a leak/bug in glob()?
-X<glob>
-
-=item How can I open a file with a leading ">" or trailing blanks?
-X<filename, special characters>
-
-=item How can I reliably rename a file?
-X<rename> X<mv> X<move> X<file, rename> X<ren>
-
-=item How can I lock a file?
-X<lock> X<file, lock> X<flock>
-
-=item Why can't I just open(FH, "E<gt>file.lock")?
-X<lock, lockfile race condition>
-
-=item I still don't get locking. I just want to increment the number in
-the file. How can I do this?
-X<counter> X<file, counter>
-
-=item All I want to do is append a small amount of text to the end of a
-file. Do I still have to use locking?
-X<append> X<file, append>
-
-=item How do I randomly update a binary file?
-X<file, binary patch>
-
-=item How do I get a file's timestamp in perl?
-X<timestamp> X<file, timestamp>
-
-=item How do I set a file's timestamp in perl?
-X<timestamp> X<file, timestamp>
-
-=item How do I print to more than one file at once?
-X<print, to multiple files>
-
-=item How can I read in an entire file all at once?
-X<slurp> X<file, slurping>
-
-=item How can I read in a file by paragraphs?
-X<file, reading by paragraphs>
-
-=item How can I read a single character from a file? From the keyboard?
-X<getc> X<file, reading one character at a time>
-
-=item How can I tell whether there's a character waiting on a filehandle?
-
-=item How do I do a C<tail -f> in perl?
-X<tail> X<IO::Handle> X<File::Tail> X<clearerr>
-
-=item How do I dup() a filehandle in Perl?
-X<dup>
-
-=item How do I close a file descriptor by number?
-X<file, closing file descriptors> X<POSIX> X<close>
-
-=item Why can't I use "C:\temp\foo" in DOS paths? Why doesn't
-`C:\temp\foo.exe` work?
-X<filename, DOS issues>
-
-=item Why doesn't glob("*.*") get all the files?
-X<glob>
-
-=item Why does Perl let me delete read-only files? Why does C<-i> clobber
-protected files? Isn't this a bug in Perl?
-
-=item How do I select a random line from a file?
-X<file, selecting a random line>
-
-=item Why do I get weird spaces when I print an array of lines?
-
-=back
-
-=item REVISION
-
-=item AUTHOR AND COPYRIGHT
-
-=back
-
-=head2 perlfaq6 - Regular Expressions
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item How can I hope to use regular expressions without creating illegible
-and unmaintainable code?
-X<regex, legibility> X<regexp, legibility>
-X<regular expression, legibility> X</x>
-
-Comments Outside the Regex, Comments Inside the Regex, Different Delimiters
-
-=item I'm having trouble matching over more than one line. What's wrong?
-X<regex, multiline> X<regexp, multiline> X<regular expression, multiline>
-
-=item How can I pull out lines between two patterns that are themselves on
-different lines?
-X<..>
-
-=item I put a regular expression into $/ but it didn't work. What's wrong?
-X<$/, regexes in> X<$INPUT_RECORD_SEPARATOR, regexes in>
-X<$RS, regexes in>
-
-=item How do I substitute case insensitively on the LHS while preserving
-case on the RHS?
-X<replace, case preserving> X<substitute, case preserving>
-X<substitution, case preserving> X<s, case preserving>
-
-=item How can I make C<\w> match national character sets?
-X<\w>
-
-=item How can I match a locale-smart version of C</[a-zA-Z]/>?
-X<alpha>
-
-=item How can I quote a variable to use in a regex?
-X<regex, escaping> X<regexp, escaping> X<regular expression, escaping>
-
-=item What is C</o> really for?
-X</o, regular expressions> X<compile, regular expressions>
-
-=item How do I use a regular expression to strip C style comments from a
-file?
-
-=item Can I use Perl regular expressions to match balanced text?
-X<regex, matching balanced test> X<regexp, matching balanced test>
-X<regular expression, matching balanced test>
-
-=item What does it mean that regexes are greedy? How can I get around it?
-X<greedy> X<greediness>
-
-=item How do I process each word on each line?
-X<word>
-
-=item How can I print out a word-frequency or line-frequency summary?
-
-=item How can I do approximate matching?
-X<match, approximate> X<matching, approximate>
-
-=item How do I efficiently match many regular expressions at once?
-X<regex, efficiency> X<regexp, efficiency>
-X<regular expression, efficiency>
-
-=item Why don't word-boundary searches with C<\b> work for me?
-X<\b>
-
-=item Why does using $&, $`, or $' slow my program down?
-X<$MATCH> X<$&> X<$POSTMATCH> X<$'> X<$PREMATCH> X<$`>
-
-=item What good is C<\G> in a regular expression?
-X<\G>
-
-=item Are Perl regexes DFAs or NFAs? Are they POSIX compliant?
-X<DFA> X<NFA> X<POSIX>
-
-=item What's wrong with using grep in a void context?
-X<grep>
-
-=item How can I match strings with multibyte characters?
-X<regex, and multibyte characters> X<regexp, and multibyte characters>
-X<regular expression, and multibyte characters> X<martian> X<encoding,
-Martian>
-
-=item How do I match a regular expression that's in a variable?
-X<regex, in variable> X<eval> X<regex> X<quotemeta> X<\Q, regex>
-X<\E, regex>, X<qr//>
-
-=back
-
-=item REVISION
-
-=item AUTHOR AND COPYRIGHT
-
-=back
-
-=head2 perlfaq7 - General Perl Language Issues
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Can I get a BNF/yacc/RE for the Perl language?
-
-=item What are all these $@%&* punctuation signs, and how do I know when to
-use them?
-
-=item Do I always/never have to quote my strings or use semicolons and
-commas?
-
-=item How do I skip some return values?
-
-=item How do I temporarily block warnings?
-
-=item What's an extension?
-
-=item Why do Perl operators have different precedence than C operators?
-
-=item How do I declare/create a structure?
-
-=item How do I create a module?
-
-=item How do I adopt or take over a module already on CPAN?
-
-=item How do I create a class?
-
-=item How can I tell if a variable is tainted?
-
-=item What's a closure?
-
-=item What is variable suicide and how can I prevent it?
-
-=item How can I pass/return a {Function, FileHandle, Array, Hash, Method,
-Regex}?
-
-Passing Variables and Functions, Passing Filehandles, Passing Regexes,
-Passing Methods
-
-=item How do I create a static variable?
-
-=item What's the difference between dynamic and lexical (static) scoping?
-Between local() and my()?
-
-=item How can I access a dynamic variable while a similarly named lexical
-is in scope?
-
-=item What's the difference between deep and shallow binding?
-
-=item Why doesn't "my($foo) = E<lt>FILEE<gt>;" work right?
-
-=item How do I redefine a builtin function, operator, or method?
-
-=item What's the difference between calling a function as &foo and foo()?
-
-=item How do I create a switch or case statement?
-
-=item How can I catch accesses to undefined variables, functions, or
-methods?
-
-=item Why can't a method included in this same file be found?
-
-=item How can I find out my current package?
-
-=item How can I comment out a large block of perl code?
-
-=item How do I clear a package?
-
-=item How can I use a variable as a variable name?
-
-=item What does "bad interpreter" mean?
-
-=back
-
-=item REVISION
-
-=item AUTHOR AND COPYRIGHT
-
-=back
-
-=head2 perlfaq8 - System Interaction
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item How do I find out which operating system I'm running under?
-
-=item How come exec() doesn't return?
-
-=item How do I do fancy stuff with the keyboard/screen/mouse?
-
-Keyboard, Screen, Mouse
-
-=item How do I print something out in color?
-
-=item How do I read just one key without waiting for a return key?
-
-=item How do I check whether input is ready on the keyboard?
-
-=item How do I clear the screen?
-
-=item How do I get the screen size?
-
-=item How do I ask the user for a password?
-
-=item How do I read and write the serial port?
-
-lockfiles, open mode, end of line, flushing output, non-blocking input
-
-=item How do I decode encrypted password files?
-
-=item How do I start a process in the background?
-
-STDIN, STDOUT, and STDERR are shared, Signals, Zombies
-
-=item How do I trap control characters/signals?
-
-=item How do I modify the shadow password file on a Unix system?
-
-=item How do I set the time and date?
-
-=item How can I sleep() or alarm() for under a second?
-X<Time::HiRes> X<BSD::Itimer> X<sleep> X<select>
-
-=item How can I measure time under a second?
-X<Time::HiRes> X<BSD::Itimer> X<sleep> X<select>
-
-=item How can I do an atexit() or setjmp()/longjmp()? (Exception handling)
-
-=item Why doesn't my sockets program work under System V (Solaris)? What
-does the error message "Protocol not supported" mean?
-
-=item How can I call my system's unique C functions from Perl?
-
-=item Where do I get the include files to do ioctl() or syscall()?
-
-=item Why do setuid perl scripts complain about kernel problems?
-
-=item How can I open a pipe both to and from a command?
-
-=item Why can't I get the output of a command with system()?
-
-=item How can I capture STDERR from an external command?
-
-=item Why doesn't open() return an error when a pipe open fails?
-
-=item What's wrong with using backticks in a void context?
-
-=item How can I call backticks without shell processing?
-
-=item Why can't my script read from STDIN after I gave it EOF (^D on Unix,
-^Z on MS-DOS)?
-
-=item How can I convert my shell script to perl?
-
-=item Can I use perl to run a telnet or ftp session?
-
-=item How can I write expect in Perl?
-
-=item Is there a way to hide perl's command line from programs such as
-"ps"?
-
-=item I {changed directory, modified my environment} in a perl script. How
-come the change disappeared when I exited the script? How do I get my
-changes to be visible?
-
-Unix
-
-=item How do I close a process's filehandle without waiting for it to
-complete?
-
-=item How do I fork a daemon process?
-
-=item How do I find out if I'm running interactively or not?
-
-=item How do I timeout a slow event?
-
-=item How do I set CPU limits?
-X<BSD::Resource> X<limit> X<CPU>
-
-=item How do I avoid zombies on a Unix system?
-
-=item How do I use an SQL database?
-
-=item How do I make a system() exit on control-C?
-
-=item How do I open a file without blocking?
-
-=item How do I tell the difference between errors from the shell and perl?
-
-=item How do I install a module from CPAN?
-
-=item What's the difference between require and use?
-
-=item How do I keep my own module/library directory?
-
-=item How do I add the directory my program lives in to the module/library
-search path?
-
-=item How do I add a directory to my include path (@INC) at runtime?
-
-the PERLLIB environment variable, the PERL5LIB environment variable, the
-perl -Idir command line flag, the use lib pragma:
-
-=item What is socket.ph and where do I get it?
-
-=back
-
-=item REVISION
-
-=item AUTHOR AND COPYRIGHT
-
-=back
-
-=head2 perlfaq9 - Networking
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item What is the correct form of response from a CGI script?
-
-=item My CGI script runs from the command line but not the browser. (500
-Server Error)
-
-=item How can I get better error messages from a CGI program?
-
-=item How do I remove HTML from a string?
-
-=item How do I extract URLs?
-
-=item How do I download a file from the user's machine? How do I open a
-file on another machine?
-
-=item How do I make an HTML pop-up menu with Perl?
-
-=item How do I fetch an HTML file?
-
-=item How do I automate an HTML form submission?
-
-=item How do I decode or create those %-encodings on the web?
-
-=item How do I redirect to another page?
-
-=item How do I put a password on my web pages?
-
-=item How do I edit my .htpasswd and .htgroup files with Perl?
-
-=item How do I make sure users can't enter values into a form that cause my
-CGI script to do bad things?
-
-=item How do I parse a mail header?
-
-=item How do I decode a CGI form?
-
-=item How do I check a valid mail address?
-
-=item How do I decode a MIME/BASE64 string?
-
-=item How do I return the user's mail address?
-
-=item How do I send mail?
-
-=item How do I use MIME to make an attachment to a mail message?
-
-=item How do I read mail?
-
-=item How do I find out my hostname, domainname, or IP address?
-X<hostname, domainname, IP address, host, domain, hostfqdn, inet_ntoa,
-gethostbyname, Socket, Net::Domain, Sys::Hostname>
-
-=item How do I fetch a news article or the active newsgroups?
-
-=item How do I fetch/put an FTP file?
-
-=item How can I do RPC in Perl?
-
-=back
-
-=item REVISION
-
-=item AUTHOR AND COPYRIGHT
-
-=back
-
-=head2 perlsyn - Perl syntax
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Declarations
-X<declaration> X<undef> X<undefined> X<uninitialized>
-
-=item Comments
-X<comment> X<#>
-
-=item Simple Statements
-X<statement> X<semicolon> X<expression> X<;>
-
-=item Truth and Falsehood
-X<truth> X<falsehood> X<true> X<false> X<!> X<not> X<negation> X<0>
-
-=item Statement Modifiers
-X<statement modifier> X<modifier> X<if> X<unless> X<while>
-X<until> X<foreach> X<for>
-
-=item Compound Statements
-X<statement, compound> X<block> X<bracket, curly> X<curly bracket> X<brace>
-X<{> X<}> X<if> X<unless> X<while> X<until> X<foreach> X<for> X<continue>
-
-=item Loop Control
-X<loop control> X<loop, control> X<next> X<last> X<redo> X<continue>
-
-=item For Loops
-X<for> X<foreach>
-
-=item Foreach Loops
-X<for> X<foreach>
-
-=item Basic BLOCKs
-X<block>
-
-=item Switch statements
-X<switch> X<case> X<given> X<when> X<default>
-
-o, o
-
-=item Goto
-X<goto>
-
-=item PODs: Embedded Documentation
-X<POD> X<documentation>
-
-=item Plain Old Comments (Not!)
-X<comment> X<line> X<#> X<preprocessor> X<eval>
-
-=back
-
-=back
-
-=head2 perldata - Perl data types
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Variable names
-X<variable, name> X<variable name> X<data type> X<type>
-
-=item Context
-X<context> X<scalar context> X<list context>
-
-=item Scalar values
-X<scalar> X<number> X<string> X<reference>
-
-=item Scalar value constructors
-X<scalar, literal> X<scalar, constant>
-
-=item List value constructors
-X<list>
-
-=item Subscripts
-
-=item Slices
-X<slice> X<array, slice> X<hash, slice>
-
-=item Typeglobs and Filehandles
-X<typeglob> X<filehandle> X<*>
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 perlop - Perl operators and precedence
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Operator Precedence and Associativity
-X<operator, precedence> X<precedence> X<associativity>
-
-=item Terms and List Operators (Leftward)
-X<list operator> X<operator, list> X<term>
-
-=item The Arrow Operator
-X<arrow> X<dereference> X<< -> >>
-
-=item Auto-increment and Auto-decrement
-X<increment> X<auto-increment> X<++> X<decrement> X<auto-decrement> X<-->
-
-=item Exponentiation
-X<**> X<exponentiation> X<power>
-
-=item Symbolic Unary Operators
-X<unary operator> X<operator, unary>
-
-=item Binding Operators
-X<binding> X<operator, binding> X<=~> X<!~>
-
-=item Multiplicative Operators
-X<operator, multiplicative>
-
-=item Additive Operators
-X<operator, additive>
-
-=item Shift Operators
-X<shift operator> X<operator, shift> X<<< << >>>
-X<<< >> >>> X<right shift> X<left shift> X<bitwise shift>
-X<shl> X<shr> X<shift, right> X<shift, left>
-
-=item Named Unary Operators
-X<operator, named unary>
-
-=item Relational Operators
-X<relational operator> X<operator, relational>
-
-=item Equality Operators
-X<equality> X<equal> X<equals> X<operator, equality>
-
-=item Bitwise And
-X<operator, bitwise, and> X<bitwise and> X<&>
-
-=item Bitwise Or and Exclusive Or
-X<operator, bitwise, or> X<bitwise or> X<|> X<operator, bitwise, xor>
-X<bitwise xor> X<^>
-
-=item C-style Logical And
-X<&&> X<logical and> X<operator, logical, and>
-
-=item C-style Logical Or
-X<||> X<operator, logical, or>
-
-=item C-style Logical Defined-Or
-X<//> X<operator, logical, defined-or>
-
-=item Range Operators
-X<operator, range> X<range> X<..> X<...>
-
-=item Conditional Operator
-X<operator, conditional> X<operator, ternary> X<ternary> X<?:>
-
-=item Assignment Operators
-X<assignment> X<operator, assignment> X<=> X<**=> X<+=> X<*=> X<&=>
-X<<< <<= >>> X<&&=> X<-=> X</=> X<|=> X<<< >>= >>> X<||=> X<//=> X<.=>
-X<%=> X<^=> X<x=>
-
-=item Comma Operator
-X<comma> X<operator, comma> X<,>
-
-=item Yada Yada Operators
-X<...> X<... operator> X<!!!> X<!!! operator> X<???> X<??? operator>
-X<yada yada operator>
-
-=item List Operators (Rightward)
-X<operator, list, rightward> X<list operator>
-
-=item Logical Not
-X<operator, logical, not> X<not>
-
-=item Logical And
-X<operator, logical, and> X<and>
-
-=item Logical or, Defined or, and Exclusive Or
-X<operator, logical, or> X<operator, logical, xor>
-X<operator, logical, defined or> X<operator, logical, exclusive or>
-X<or> X<xor>
-
-=item C Operators Missing From Perl
-X<operator, missing from perl> X<&> X<*>
-X<typecasting> X<(TYPE)>
-
-unary &, unary *, (TYPE)
-
-=item Quote and Quote-like Operators
-X<operator, quote> X<operator, quote-like> X<q> X<qq> X<qx> X<qw> X<m>
-X<qr> X<s> X<tr> X<'> X<''> X<"> X<""> X<//> X<`> X<``> X<<< << >>>
-X<escape sequence> X<escape>
-
-=item Regexp Quote-Like Operators
-X<operator, regexp>
-
-qr/STRING/msixpo X<qr> X</i> X</m> X</o> X</s> X</x> X</p>,
-m/PATTERN/msixpogc X<m> X<operator, match> X<regexp, options> X<regexp>
-X<regex, options> X<regex> X</m> X</s> X</i> X</x> X</p> X</o> X</g> X</c>,
-/PATTERN/msixpogc, The empty pattern //, Matching in list context, \G
-assertion, ?PATTERN? X<?>, s/PATTERN/REPLACEMENT/msixpogce X<substitute>
-X<substitution> X<replace> X<regexp, replace> X<regexp, substitute> X</m>
-X</s> X</i> X</x> X</p> X</o> X</g> X</c> X</e>
-
-=item Quote-Like Operators
-X<operator, quote-like>
-
-q/STRING/ X<q> X<quote, single> X<'> X<''>, 'STRING', qq/STRING/ X<qq>
-X<quote, double> X<"> X<"">, "STRING", qx/STRING/ X<qx> X<`> X<``>
-X<backtick>, `STRING`, qw/STRING/ X<qw> X<quote, list> X<quote, words>,
-tr/SEARCHLIST/REPLACEMENTLIST/cds X<tr> X<y> X<transliterate> X</c> X</d>
-X</s>, y/SEARCHLIST/REPLACEMENTLIST/cds, <<EOF X<here-doc> X<heredoc>
-X<here-document> X<<< << >>>, Double Quotes, Single Quotes, Backticks
-
-=item Gory details of parsing quoted constructs
-X<quote, gory details>
-
-Finding the end, Interpolation X<interpolation>, C<<<'EOF'>, C<m''>, the
-pattern of C<s'''>, C<''>, C<q//>, C<tr'''>, C<y'''>, the replacement of
-C<s'''>, C<tr///>, C<y///>, C<"">, C<``>, C<qq//>, C<qx//>, C<< <file*glob>
->>, C<<<"EOF">, the replacement of C<s///>, C<RE> in C<?RE?>, C</RE/>,
-C<m/RE/>, C<s/RE/foo/>,, parsing regular expressions X<regexp, parse>,
-Optimization of regular expressions X<regexp, optimization>
-
-=item I/O Operators
-X<operator, i/o> X<operator, io> X<io> X<while> X<filehandle>
-X<< <> >> X<@ARGV>
-
-=item Constant Folding
-X<constant folding> X<folding>
-
-=item No-ops
-X<no-op> X<nop>
-
-=item Bitwise String Operators
-X<operator, bitwise, string>
-
-=item Integer Arithmetic
-X<integer>
-
-=item Floating-point Arithmetic
-X<floating-point> X<floating point> X<float> X<real>
-
-=item Bigger Numbers
-X<number, arbitrary precision>
-
-=back
-
-=back
-
-=head2 perlsub - Perl subroutines
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Private Variables via my()
-X<my> X<variable, lexical> X<lexical> X<lexical variable> X<scope, lexical>
-X<lexical scope> X<attributes, my>
-
-=item Persistent Private Variables
-X<state> X<state variable> X<static> X<variable, persistent> X<variable,
-static> X<closure>
-
-=item Temporary Values via local()
-X<local> X<scope, dynamic> X<dynamic scope> X<variable, local>
-X<variable, temporary>
-
-=item Lvalue subroutines
-X<lvalue> X<subroutine, lvalue>
-
-Lvalue subroutines are EXPERIMENTAL
-
-=item Passing Symbol Table Entries (typeglobs)
-X<typeglob> X<*>
-
-=item When to Still Use local()
-X<local> X<variable, local>
-
-=item Pass by Reference
-X<pass by reference> X<pass-by-reference> X<reference>
-
-=item Prototypes
-X<prototype> X<subroutine, prototype>
-
-=item Constant Functions
-X<constant>
-
-=item Overriding Built-in Functions
-X<built-in> X<override> X<CORE> X<CORE::GLOBAL>
-
-=item Autoloading
-X<autoloading> X<AUTOLOAD>
-
-=item Subroutine Attributes
-X<attribute> X<subroutine, attribute> X<attrs>
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 perlfunc - Perl builtin functions
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Perl Functions by Category
-X<function>
-
-Functions for SCALARs or strings X<scalar> X<string> X<character>, Regular
-expressions and pattern matching X<regular expression> X<regex> X<regexp>,
-Numeric functions X<numeric> X<number> X<trigonometric> X<trigonometry>,
-Functions for real @ARRAYs X<array>, Functions for list data X<list>,
-Functions for real %HASHes X<hash>, Input and output functions X<I/O>
-X<input> X<output> X<dbm>, Functions for fixed length data or records,
-Functions for filehandles, files, or directories X<file> X<filehandle>
-X<directory> X<pipe> X<link> X<symlink>, Keywords related to the control
-flow of your Perl program X<control flow>, Keywords related to switch,
-Keywords related to scoping, Miscellaneous functions, Functions for
-processes and process groups X<process> X<pid> X<process id>, Keywords
-related to perl modules X<module>, Keywords related to classes and
-object-orientation X<object> X<class> X<package>, Low-level socket
-functions X<socket> X<sock>, System V interprocess communication functions
-X<IPC> X<System V> X<semaphore> X<shared memory> X<memory> X<message>,
-Fetching user and group info X<user> X<group> X<password> X<uid> X<gid>
-X<passwd> X</etc/passwd>, Fetching network info X<network> X<protocol>
-X<host> X<hostname> X<IP> X<address> X<service>, Time-related functions
-X<time> X<date>, Functions new in perl5 X<perl5>, Functions obsoleted in
-perl5
-
-=item Portability
-X<portability> X<Unix> X<portable>
-
-=item Alphabetical Listing of Perl Functions
-
--I<X> FILEHANDLE
-X<-r>X<-w>X<-x>X<-o>X<-R>X<-W>X<-X>X<-O>X<-e>X<-z>X<-s>X<-f>X<-d>X<-l>X<-p>
-X<-S>X<-b>X<-c>X<-t>X<-u>X<-g>X<-k>X<-T>X<-B>X<-M>X<-A>X<-C>, -I<X> EXPR,
--I<X> DIRHANDLE, -I<X>, abs VALUE X<abs> X<absolute>, abs, accept
-NEWSOCKET,GENERICSOCKET X<accept>, alarm SECONDS X<alarm> X<SIGALRM>
-X<timer>, alarm, atan2 Y,X X<atan2> X<arctangent> X<tan> X<tangent>, bind
-SOCKET,NAME X<bind>, binmode FILEHANDLE, LAYER X<binmode> X<binary> X<text>
-X<DOS> X<Windows>, binmode FILEHANDLE, bless REF,CLASSNAME X<bless>, bless
-REF, break, caller EXPR X<caller> X<call stack> X<stack> X<stack trace>,
-caller, chdir EXPR X<chdir> X<cd> X<directory, change>, chdir FILEHANDLE,
-chdir DIRHANDLE, chdir, chmod LIST X<chmod> X<permission> X<mode>, chomp
-VARIABLE X<chomp> X<INPUT_RECORD_SEPARATOR> X<$/> X<newline> X<eol>, chomp(
-LIST ), chomp, chop VARIABLE X<chop>, chop( LIST ), chop, chown LIST
-X<chown> X<owner> X<user> X<group>, chr NUMBER X<chr> X<character> X<ASCII>
-X<Unicode>, chr, chroot FILENAME X<chroot> X<root>, chroot, close
-FILEHANDLE X<close>, close, closedir DIRHANDLE X<closedir>, connect
-SOCKET,NAME X<connect>, continue BLOCK X<continue>, continue, cos EXPR
-X<cos> X<cosine> X<acos> X<arccosine>, cos, crypt PLAINTEXT,SALT X<crypt>
-X<digest> X<hash> X<salt> X<plaintext> X<password> X<decrypt>
-X<cryptography> X<passwd> X<encrypt>, dbmclose HASH X<dbmclose>, dbmopen
-HASH,DBNAME,MASK X<dbmopen> X<dbm> X<ndbm> X<sdbm> X<gdbm>, defined EXPR
-X<defined> X<undef> X<undefined>, defined, delete EXPR X<delete>, die LIST
-X<die> X<throw> X<exception> X<raise> X<$@> X<abort>, do BLOCK X<do>
-X<block>, do SUBROUTINE(LIST) X<do>, do EXPR X<do>, dump LABEL X<dump>
-X<core> X<undump>, dump, each HASH X<each> X<hash, iterator>, each ARRAY
-X<array, iterator>, eof FILEHANDLE X<eof> X<end of file> X<end-of-file>,
-eof (), eof, eval EXPR X<eval> X<try> X<catch> X<evaluate> X<parse>
-X<execute> X<error, handling> X<exception, handling>, eval BLOCK, eval,
-exec LIST X<exec> X<execute>, exec PROGRAM LIST, exists EXPR X<exists>
-X<autovivification>, exit EXPR X<exit> X<terminate> X<abort>, exit, exp
-EXPR X<exp> X<exponential> X<antilog> X<antilogarithm> X<e>, exp, fcntl
-FILEHANDLE,FUNCTION,SCALAR X<fcntl>, fileno FILEHANDLE X<fileno>, flock
-FILEHANDLE,OPERATION X<flock> X<lock> X<locking>, fork X<fork> X<child>
-X<parent>, format X<format>, formline PICTURE,LIST X<formline>, getc
-FILEHANDLE X<getc> X<getchar> X<character> X<file, read>, getc, getlogin
-X<getlogin> X<login>, getpeername SOCKET X<getpeername> X<peer>, getpgrp
-PID X<getpgrp> X<group>, getppid X<getppid> X<parent> X<pid>, getpriority
-WHICH,WHO X<getpriority> X<priority> X<nice>, getpwnam NAME X<getpwnam>
-X<getgrnam> X<gethostbyname> X<getnetbyname> X<getprotobyname> X<getpwuid>
-X<getgrgid> X<getservbyname> X<gethostbyaddr> X<getnetbyaddr>
-X<getprotobynumber> X<getservbyport> X<getpwent> X<getgrent> X<gethostent>
-X<getnetent> X<getprotoent> X<getservent> X<setpwent> X<setgrent>
-X<sethostent> X<setnetent> X<setprotoent> X<setservent> X<endpwent>
-X<endgrent> X<endhostent> X<endnetent> X<endprotoent> X<endservent>,
-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
-X<getsockname>, getsockopt SOCKET,LEVEL,OPTNAME X<getsockopt>, glob EXPR
-X<glob> X<wildcard> X<filename, expansion> X<expand>, glob, gmtime EXPR
-X<gmtime> X<UTC> X<Greenwich>, gmtime, goto LABEL X<goto> X<jump> X<jmp>,
-goto EXPR, goto &NAME, grep BLOCK LIST X<grep>, grep EXPR,LIST, hex EXPR
-X<hex> X<hexadecimal>, hex, import LIST X<import>, index
-STR,SUBSTR,POSITION X<index> X<indexOf> X<InStr>, index STR,SUBSTR, int
-EXPR X<int> X<integer> X<truncate> X<trunc> X<floor>, int, ioctl
-FILEHANDLE,FUNCTION,SCALAR X<ioctl>, join EXPR,LIST X<join>, keys HASH
-X<keys> X<key>, keys ARRAY, kill SIGNAL, LIST X<kill> X<signal>, last LABEL
-X<last> X<break>, last, lc EXPR X<lc> X<lowercase>, lc, lcfirst EXPR
-X<lcfirst> X<lowercase>, lcfirst, length EXPR X<length> X<size>, length,
-link OLDFILE,NEWFILE X<link>, listen SOCKET,QUEUESIZE X<listen>, local EXPR
-X<local>, localtime EXPR X<localtime> X<ctime>, localtime, lock THING
-X<lock>, log EXPR X<log> X<logarithm> X<e> X<ln> X<base>, log, lstat EXPR
-X<lstat>, lstat, m//, map BLOCK LIST X<map>, map EXPR,LIST, mkdir
-FILENAME,MASK X<mkdir> X<md> X<directory, create>, mkdir FILENAME, mkdir,
-msgctl ID,CMD,ARG X<msgctl>, msgget KEY,FLAGS X<msgget>, msgrcv
-ID,VAR,SIZE,TYPE,FLAGS X<msgrcv>, msgsnd ID,MSG,FLAGS X<msgsnd>, my EXPR
-X<my>, my TYPE EXPR, my EXPR : ATTRS, my TYPE EXPR : ATTRS, next LABEL
-X<next> X<continue>, next, no Module VERSION LIST X<no>, no Module VERSION,
-no Module LIST, no Module, no VERSION, oct EXPR X<oct> X<octal> X<hex>
-X<hexadecimal> X<binary> X<bin>, oct, open FILEHANDLE,EXPR X<open> X<pipe>
-X<file, open> X<fopen>, open FILEHANDLE,MODE,EXPR, open
-FILEHANDLE,MODE,EXPR,LIST, open FILEHANDLE,MODE,REFERENCE, open FILEHANDLE,
-opendir DIRHANDLE,EXPR X<opendir>, ord EXPR X<ord> X<encoding>, ord, our
-EXPR X<our> X<global>, our TYPE EXPR, our EXPR : ATTRS, our TYPE EXPR :
-ATTRS, pack TEMPLATE,LIST X<pack>, package NAMESPACE X<package> X<module>
-X<namespace>, package, pipe READHANDLE,WRITEHANDLE X<pipe>, pop ARRAY
-X<pop> X<stack>, pop, pos SCALAR X<pos> X<match, position>, pos, print
-FILEHANDLE LIST X<print>, print LIST, print, printf FILEHANDLE FORMAT, LIST
-X<printf>, printf FORMAT, LIST, prototype FUNCTION X<prototype>, push
-ARRAY,LIST X<push> X<stack>, q/STRING/, qq/STRING/, qx/STRING/, qw/STRING/,
-qr/STRING/, quotemeta EXPR X<quotemeta> X<metacharacter>, quotemeta, rand
-EXPR X<rand> X<random>, rand, read FILEHANDLE,SCALAR,LENGTH,OFFSET X<read>
-X<file, read>, read FILEHANDLE,SCALAR,LENGTH, readdir DIRHANDLE X<readdir>,
-readline EXPR, readline X<readline> X<gets> X<fgets>, readlink EXPR
-X<readlink>, readlink, readpipe EXPR, readpipe X<readpipe>, recv
-SOCKET,SCALAR,LENGTH,FLAGS X<recv>, redo LABEL X<redo>, redo, ref EXPR
-X<ref> X<reference>, ref, rename OLDNAME,NEWNAME X<rename> X<move> X<mv>
-X<ren>, require VERSION X<require>, require EXPR, require, reset EXPR
-X<reset>, reset, return EXPR X<return>, return, reverse LIST X<reverse>
-X<rev> X<invert>, rewinddir DIRHANDLE X<rewinddir>, rindex
-STR,SUBSTR,POSITION X<rindex>, rindex STR,SUBSTR, rmdir FILENAME X<rmdir>
-X<rd> X<directory, remove>, rmdir, s///, say FILEHANDLE LIST X<say>, say
-LIST, say, scalar EXPR X<scalar> X<context>, seek
-FILEHANDLE,POSITION,WHENCE X<seek> X<fseek> X<filehandle, position>,
-seekdir DIRHANDLE,POS X<seekdir>, select FILEHANDLE X<select> X<filehandle,
-default>, select, select RBITS,WBITS,EBITS,TIMEOUT X<select>, semctl
-ID,SEMNUM,CMD,ARG X<semctl>, semget KEY,NSEMS,FLAGS X<semget>, semop
-KEY,OPSTRING X<semop>, send SOCKET,MSG,FLAGS,TO X<send>, send
-SOCKET,MSG,FLAGS, setpgrp PID,PGRP X<setpgrp> X<group>, setpriority
-WHICH,WHO,PRIORITY X<setpriority> X<priority> X<nice> X<renice>, setsockopt
-SOCKET,LEVEL,OPTNAME,OPTVAL X<setsockopt>, shift ARRAY X<shift>, shift,
-shmctl ID,CMD,ARG X<shmctl>, shmget KEY,SIZE,FLAGS X<shmget>, shmread
-ID,VAR,POS,SIZE X<shmread> X<shmwrite>, shmwrite ID,STRING,POS,SIZE,
-shutdown SOCKET,HOW X<shutdown>, sin EXPR X<sin> X<sine> X<asin>
-X<arcsine>, sin, sleep EXPR X<sleep> X<pause>, sleep, socket
-SOCKET,DOMAIN,TYPE,PROTOCOL X<socket>, socketpair
-SOCKET1,SOCKET2,DOMAIN,TYPE,PROTOCOL X<socketpair>, sort SUBNAME LIST
-X<sort> X<qsort> X<quicksort> X<mergesort>, sort BLOCK LIST, sort LIST,
-splice ARRAY,OFFSET,LENGTH,LIST X<splice>, splice ARRAY,OFFSET,LENGTH,
-splice ARRAY,OFFSET, splice ARRAY, split /PATTERN/,EXPR,LIMIT X<split>,
-split /PATTERN/,EXPR, split /PATTERN/, split, sprintf FORMAT, LIST
-X<sprintf>, format parameter index, flags, vector flag, (minimum) width,
-precision, or maximum width X<precision>, size, order of arguments, sqrt
-EXPR X<sqrt> X<root> X<square root>, sqrt, srand EXPR X<srand> X<seed>
-X<randseed>, srand, stat FILEHANDLE X<stat> X<file, status> X<ctime>, stat
-EXPR, stat DIRHANDLE, stat, state EXPR X<state>, state TYPE EXPR, state
-EXPR : ATTRS, state TYPE EXPR : ATTRS, study SCALAR X<study>, study, sub
-NAME BLOCK X<sub>, sub NAME (PROTO) BLOCK, sub NAME : ATTRS BLOCK, sub NAME
-(PROTO) : ATTRS BLOCK, substr EXPR,OFFSET,LENGTH,REPLACEMENT X<substr>
-X<substring> X<mid> X<left> X<right>, substr EXPR,OFFSET,LENGTH, substr
-EXPR,OFFSET, symlink OLDFILE,NEWFILE X<symlink> X<link> X<symbolic link>
-X<link, symbolic>, syscall NUMBER, LIST X<syscall> X<system call>, sysopen
-FILEHANDLE,FILENAME,MODE X<sysopen>, sysopen
-FILEHANDLE,FILENAME,MODE,PERMS, sysread FILEHANDLE,SCALAR,LENGTH,OFFSET
-X<sysread>, sysread FILEHANDLE,SCALAR,LENGTH, sysseek
-FILEHANDLE,POSITION,WHENCE X<sysseek> X<lseek>, system LIST X<system>
-X<shell>, system PROGRAM LIST, syswrite FILEHANDLE,SCALAR,LENGTH,OFFSET
-X<syswrite>, syswrite FILEHANDLE,SCALAR,LENGTH, syswrite FILEHANDLE,SCALAR,
-tell FILEHANDLE X<tell>, tell, telldir DIRHANDLE X<telldir>, tie
-VARIABLE,CLASSNAME,LIST X<tie>, tied VARIABLE X<tied>, time X<time>
-X<epoch>, times X<times>, tr///, truncate FILEHANDLE,LENGTH X<truncate>,
-truncate EXPR,LENGTH, uc EXPR X<uc> X<uppercase> X<toupper>, uc, ucfirst
-EXPR X<ucfirst> X<uppercase>, ucfirst, umask EXPR X<umask>, umask, undef
-EXPR X<undef> X<undefine>, undef, unlink LIST X<unlink> X<delete> X<remove>
-X<rm> X<del>, unlink, unpack TEMPLATE,EXPR X<unpack>, unpack TEMPLATE,
-untie VARIABLE X<untie>, unshift ARRAY,LIST X<unshift>, use Module VERSION
-LIST X<use> X<module> X<import>, use Module VERSION, use Module LIST, use
-Module, use VERSION, utime LIST X<utime>, values HASH X<values>, values
-ARRAY, vec EXPR,OFFSET,BITS X<vec> X<bit> X<bit vector>, wait X<wait>,
-waitpid PID,FLAGS X<waitpid>, wantarray X<wantarray> X<context>, warn LIST
-X<warn> X<warning> X<STDERR>, write FILEHANDLE X<write>, write EXPR, write,
-y///
-
-=back
-
-=back
-
-=head2 perlopentut - tutorial on opening things in Perl
-
-=over 4
-
-=item DESCRIPTION
-
-=item Open E<agrave> la shell
-
-=over 4
-
-=item Simple Opens
-
-=item Indirect Filehandles
-
-=item Pipe Opens
-
-=item The Minus File
-
-=item Mixing Reads and Writes
-
-=item Filters
-
-=back
-
-=item Open E<agrave> la C
-
-=over 4
-
-=item Permissions E<agrave> la mode
-
-=back
-
-=item Obscure Open Tricks
-
-=over 4
-
-=item Re-Opening Files (dups)
-
-=item Dispelling the Dweomer
-
-=item Paths as Opens
-
-=item Single Argument Open
-
-=item Playing with STDIN and STDOUT
-
-=back
-
-=item Other I/O Issues
-
-=over 4
-
-=item Opening Non-File Files
-
-=item Opening Named Pipes
-
-=item Opening Sockets
-
-=item Binary Files
-
-=item File Locking
-
-=item IO Layers
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR and COPYRIGHT
-
-=item HISTORY
-
-=back
-
-=head2 perlpacktut - tutorial on C<pack> and C<unpack>
-
-=over 4
-
-=item DESCRIPTION
-
-=item The Basic Principle
-
-=item Packing Text
-
-=item Packing Numbers
-
-=over 4
-
-=item Integers
-
-=item Unpacking a Stack Frame
-
-=item How to Eat an Egg on a Net
-
-=item Byte-order modifiers
-
-=item Floating point Numbers
-
-=back
-
-=item Exotic Templates
-
-=over 4
-
-=item Bit Strings
-
-=item Uuencoding
-
-=item Doing Sums
-
-=item Unicode
-
-=item Another Portable Binary Encoding
-
-=back
-
-=item Template Grouping
-
-=item Lengths and Widths
-
-=over 4
-
-=item String Lengths
-
-=item Dynamic Templates
-
-=item Counting Repetitions
-
-=back
-
-=item Packing and Unpacking C Structures
-
-=over 4
-
-=item The Alignment Pit
-
-=item Dealing with Endian-ness
-
-=item Alignment, Take 2
-
-=item Alignment, Take 3
-
-=item Pointers for How to Use Them
-
-=back
-
-=item Pack Recipes
-
-=item Funnies Section
-
-=item Authors
-
-=back
-
-=head2 perlpod - the Plain Old Documentation format
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Ordinary Paragraph
-X<POD, ordinary paragraph>
-
-=item Verbatim Paragraph
-X<POD, verbatim paragraph> X<verbatim>
-
-=item Command Paragraph
-X<POD, command>
-
-C<=head1 I<Heading Text>> X<=head1> X<=head2> X<=head3> X<=head4> X<head1>
-X<head2> X<head3> X<head4>, C<=head2 I<Heading Text>>, C<=head3 I<Heading
-Text>>, C<=head4 I<Heading Text>>, C<=over I<indentlevel>> X<=over>
-X<=item> X<=back> X<over> X<item> X<back>, C<=item I<stuff...>>, C<=back>,
-C<=cut> X<=cut> X<cut>, C<=pod> X<=pod> X<pod>, C<=begin I<formatname>>
-X<=begin> X<=end> X<=for> X<begin> X<end> X<for>, C<=end I<formatname>>,
-C<=for I<formatname> I<text...>>, C<=encoding I<encodingname>> X<=encoding>
-X<encoding>
-
-=item Formatting Codes
-X<POD, formatting code> X<formatting code>
-X<POD, interior sequence> X<interior sequence>
-
-C<IE<lt>textE<gt>> -- italic text X<I> X<< IZ<><> >> X<POD, formatting
-code, italic> X<italic>, C<BE<lt>textE<gt>> -- bold text X<B> X<< BZ<><> >>
-X<POD, formatting code, bold> X<bold>, C<CE<lt>codeE<gt>> -- code text X<C>
-X<< CZ<><> >> X<POD, formatting code, code> X<code>, C<LE<lt>nameE<gt>> --
-a hyperlink X<L> X<< LZ<><> >> X<POD, formatting code, hyperlink>
-X<hyperlink>, C<EE<lt>escapeE<gt>> -- a character escape X<E> X<< EZ<><> >>
-X<POD, formatting code, escape> X<escape>, C<FE<lt>filenameE<gt>> -- used
-for filenames X<F> X<< FZ<><> >> X<POD, formatting code, filename>
-X<filename>, C<SE<lt>textE<gt>> -- text contains non-breaking spaces X<S>
-X<< SZ<><> >> X<POD, formatting code, non-breaking space> X<non-breaking
-space>, C<XE<lt>topic nameE<gt>> -- an index entry X<X> X<< XZ<><> >>
-X<POD, formatting code, index entry> X<index entry>, C<ZE<lt>E<gt>> -- a
-null (zero-effect) formatting code X<Z> X<< ZZ<><> >> X<POD, formatting
-code, null> X<null>
-
-=item The Intent
-X<POD, intent of>
-
-=item Embedding Pods in Perl Modules
-X<POD, embedding>
-
-=item Hints for Writing Pod
-
-X<podchecker> X<POD, validating>
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=back
-
-=head2 perlpodspec - Plain Old Documentation: format specification and
-notes
-
-=over 4
-
-=item DESCRIPTION
-
-=item Pod Definitions
-
-=item Pod Commands
-
-"=head1", "=head2", "=head3", "=head4", "=pod", "=cut", "=over", "=item",
-"=back", "=begin formatname", "=end formatname", "=for formatname text...",
-"=encoding encodingname"
-
-=item Pod Formatting Codes
-
-C<IE<lt>textE<gt>> -- italic text, C<BE<lt>textE<gt>> -- bold text,
-C<CE<lt>codeE<gt>> -- code text, C<FE<lt>filenameE<gt>> -- style for
-filenames, C<XE<lt>topic nameE<gt>> -- an index entry, C<ZE<lt>E<gt>> -- a
-null (zero-effect) formatting code, C<LE<lt>nameE<gt>> -- a hyperlink,
-C<EE<lt>escapeE<gt>> -- a character escape, C<SE<lt>textE<gt>> -- text
-contains non-breaking spaces
-
-=item Notes on Implementing Pod Processors
-
-=item About LE<lt>...E<gt> Codes
-
-First:, Second:, Third:, Fourth:, Fifth:, Sixth:
-
-=item About =over...=back Regions
-
-=item About Data Paragraphs and "=begin/=end" Regions
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=back
-
-=head2 perlrun - how to execute the Perl interpreter
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item #! and quoting on non-Unix systems
-X<hashbang> X<#!>
-
-OS/2, MS-DOS, Win95/NT, Macintosh, VMS
-
-=item Location of Perl
-X<perl, location of interpreter>
-
-=item Command Switches
-X<perl, command switches> X<command switches>
-
-B<-0>[I<octal/hexadecimal>] X<-0> X<$/>, B<-a> X<-a> X<autosplit>, B<-C
-[I<number/list>]> X<-C>, B<-c> X<-c>, B<-d> X<-d> X<-dt>, B<-dt>,
-B<-d:>I<foo[=bar,baz]> X<-d> X<-dt>, B<-dt:>I<foo[=bar,baz]>,
-B<-D>I<letters> X<-D> X<DEBUGGING> X<-DDEBUGGING>, B<-D>I<number>, B<-e>
-I<commandline> X<-e>, B<-E> I<commandline> X<-E>, B<-f> X<-f>,
-B<-F>I<pattern> X<-F>, B<-h> X<-h>, B<-i>[I<extension>] X<-i> X<in-place>,
-B<-I>I<directory> X<-I> X<@INC>, B<-l>[I<octnum>] X<-l> X<$/> X<$\>,
-B<-m>[B<->]I<module> X<-m> X<-M>, B<-M>[B<->]I<module>,
-B<-M>[B<->]I<'module ...'>, B<-[mM]>[B<->]I<module=arg[,arg]...>, B<-n>
-X<-n>, B<-p> X<-p>, B<-s> X<-s>, B<-S> X<-S>, B<-t> X<-t>, B<-T> X<-T>,
-B<-u> X<-u>, B<-U> X<-U>, B<-v> X<-v>, B<-V> X<-V>, B<-V:>I<configvar>,
-B<-w> X<-w>, B<-W> X<-W>, B<-X> X<-X>, B<-x> X<-x>, B<-x>I<directory>
-
-=back
-
-=item ENVIRONMENT
-X<perl, environment variables>
-
-HOME X<HOME>, LOGDIR X<LOGDIR>, PATH X<PATH>, PERL5LIB X<PERL5LIB>,
-PERL5OPT X<PERL5OPT>, PERLIO X<PERLIO>, :bytes X<:bytes>, :crlf X<:crlf>,
-:mmap X<:mmap>, :perlio X<:perlio>, :pop X<:pop>, :raw X<:raw>, :stdio
-X<:stdio>, :unix X<:unix>, :utf8 X<:utf8>, :win32 X<:win32>, PERLIO_DEBUG
-X<PERLIO_DEBUG>, PERLLIB X<PERLLIB>, PERL5DB X<PERL5DB>, PERL5DB_THREADED
-X<PERL5DB_THREADED>, PERL5SHELL (specific to the Win32 port) X<PERL5SHELL>,
-PERL_ALLOW_NON_IFS_LSP (specific to the Win32 port)
-X<PERL_ALLOW_NON_IFS_LSP>, PERL_DEBUG_MSTATS X<PERL_DEBUG_MSTATS>,
-PERL_DESTRUCT_LEVEL X<PERL_DESTRUCT_LEVEL>, PERL_DL_NONLAZY
-X<PERL_DL_NONLAZY>, PERL_ENCODING X<PERL_ENCODING>, PERL_HASH_SEED
-X<PERL_HASH_SEED>, PERL_HASH_SEED_DEBUG X<PERL_HASH_SEED_DEBUG>, PERL_ROOT
-(specific to the VMS port) X<PERL_ROOT>, PERL_SIGNALS X<PERL_SIGNALS>,
-PERL_UNICODE X<PERL_UNICODE>, SYS$LOGIN (specific to the VMS port)
-X<SYS$LOGIN>
-
-=back
-
-=head2 perldiag - various Perl diagnostics
-
-=over 4
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=back
-
-=head2 perllexwarn - Perl Lexical Warnings
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Default Warnings and Optional Warnings
-
-=item What's wrong with B<-w> and C<$^W>
-
-=item Controlling Warnings from the Command Line
-
-B<-w> X<-w>, B<-W> X<-W>, B<-X> X<-X>
-
-=item Backward Compatibility
-
-=item Category Hierarchy
-X<warning, categories>
-
-=item Fatal Warnings
-X<warning, fatal>
-
-=item Reporting Warnings from a Module
-X<warning, reporting> X<warning, registering>
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=back
-
-=head2 perldebug - Perl debugging
-
-=over 4
-
-=item DESCRIPTION
-
-=item The Perl Debugger
-
-=over 4
-
-=item Calling the debugger
-
-perl -d program_name, perl -d -e 0, perl -d:Ptkdb program_name, perl -dt
-threaded_program_name
-
-=item Debugger Commands
-
-h X<debugger command, h>, h [command], h h, p expr X<debugger command, p>,
-x [maxdepth] expr X<debugger command, x>, V [pkg [vars]] X<debugger
-command, V>, X [vars] X<debugger command, X>, y [level [vars]] X<debugger
-command, y>, T X<debugger command, T> X<backtrace> X<stack, backtrace>, s
-[expr] X<debugger command, s> X<step>, n [expr] X<debugger command, n>, r
-X<debugger command, r>, <CR>, c [line|sub] X<debugger command, c>, l
-X<debugger command, l>, l min+incr, l min-max, l line, l subname, -
-X<debugger command, ->, v [line] X<debugger command, v>, . X<debugger
-command, .>, f filename X<debugger command, f>, /pattern/, ?pattern?, L
-[abw] X<debugger command, L>, S [[!]regex] X<debugger command, S>, t
-X<debugger command, t>, t expr X<debugger command, t>, b X<breakpoint>
-X<debugger command, b>, b [line] [condition] X<breakpoint> X<debugger
-command, b>, b subname [condition] X<breakpoint> X<debugger command, b>, b
-postpone subname [condition] X<breakpoint> X<debugger command, b>, b load
-filename X<breakpoint> X<debugger command, b>, b compile subname
-X<breakpoint> X<debugger command, b>, B line X<breakpoint> X<debugger
-command, B>, B * X<breakpoint> X<debugger command, B>, a [line] command
-X<debugger command, a>, A line X<debugger command, A>, A * X<debugger
-command, A>, w expr X<debugger command, w>, W expr X<debugger command, W>,
-W * X<debugger command, W>, o X<debugger command, o>, o booloption ...
-X<debugger command, o>, o anyoption? ... X<debugger command, o>, o
-option=value ... X<debugger command, o>, < ? X<< debugger command, < >>, <
-[ command ] X<< debugger command, < >>, < * X<< debugger command, < >>, <<
-command X<< debugger command, << >>, > ? X<< debugger command, > >>, >
-command X<< debugger command, > >>, > * X<< debugger command, > >>, >>
-command X<<< debugger command, >> >>>, { ? X<debugger command, {>, { [
-command ], { * X<debugger command, {>, {{ command X<debugger command, {{>,
-! number X<debugger command, !>, ! -number X<debugger command, !>, !
-pattern X<debugger command, !>, !! cmd X<debugger command, !!>, source file
-X<debugger command, source>, H -number X<debugger command, H>, q or ^D
-X<debugger command, q> X<debugger command, ^D>, R X<debugger command, R>,
-|dbcmd X<debugger command, |>, ||dbcmd X<debugger command, ||>, command, m
-expr X<debugger command, m>, M X<debugger command, M>, man [manpage]
-X<debugger command, man>
-
-=item Configurable Options
-
-C<recallCommand>, C<ShellBang> X<debugger option, recallCommand> X<debugger
-option, ShellBang>, C<pager> X<debugger option, pager>, C<tkRunning>
-X<debugger option, tkRunning>, C<signalLevel>, C<warnLevel>, C<dieLevel>
-X<debugger option, signalLevel> X<debugger option, warnLevel> X<debugger
-option, dieLevel>, C<AutoTrace> X<debugger option, AutoTrace>, C<LineInfo>
-X<debugger option, LineInfo>, C<inhibit_exit> X<debugger option,
-inhibit_exit>, C<PrintRet> X<debugger option, PrintRet>, C<ornaments>
-X<debugger option, ornaments>, C<frame> X<debugger option, frame>,
-C<maxTraceLen> X<debugger option, maxTraceLen>, C<windowSize> X<debugger
-option, windowSize>, C<arrayDepth>, C<hashDepth> X<debugger option,
-arrayDepth> X<debugger option, hashDepth>, C<dumpDepth> X<debugger option,
-dumpDepth>, C<compactDump>, C<veryCompact> X<debugger option, compactDump>
-X<debugger option, veryCompact>, C<globPrint> X<debugger option,
-globPrint>, C<DumpDBFiles> X<debugger option, DumpDBFiles>, C<DumpPackages>
-X<debugger option, DumpPackages>, C<DumpReused> X<debugger option,
-DumpReused>, C<quote>, C<HighBit>, C<undefPrint> X<debugger option, quote>
-X<debugger option, HighBit> X<debugger option, undefPrint>, C<UsageOnly>
-X<debugger option, UsageOnly>, C<TTY> X<debugger option, TTY>, C<noTTY>
-X<debugger option, noTTY>, C<ReadLine> X<debugger option, ReadLine>,
-C<NonStop> X<debugger option, NonStop>
-
-=item Debugger input/output
-
-Prompt, Multiline commands, Stack backtrace X<backtrace> X<stack,
-backtrace>, Line Listing Format, Frame listing
-
-=item Debugging compile-time statements
-
-=item Debugger Customization
-
-=item Readline Support
-
-=item Editor Support for Debugging
-
-=item The Perl Profiler
-X<profile> X<profiling> X<profiler>
-
-=back
-
-=item Debugging regular expressions
-X<regular expression, debugging>
-X<regex, debugging> X<regexp, debugging>
-
-=item Debugging memory usage
-X<memory usage>
-
-=item SEE ALSO
-
-=item BUGS
-
-=back
-
-=head2 perlvar - Perl predefined variables
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Predefined Names
-
-$ARG, $_ X<$_> X<$ARG>, $a, $b X<$a> X<$b>, $<I<digits>> X<$1> X<$2> X<$3>,
-$MATCH, $& X<$&> X<$MATCH>, ${^MATCH} X<${^MATCH}>, $PREMATCH, $` X<$`>
-X<$PREMATCH>, ${^PREMATCH} X<${^PREMATCH}>, $POSTMATCH, $' X<$'>
-X<$POSTMATCH>, ${^POSTMATCH} X<${^POSTMATCH}>, $LAST_PAREN_MATCH, $+ X<$+>
-X<$LAST_PAREN_MATCH>, $LAST_SUBMATCH_RESULT, $^N X<$^N>, @LAST_MATCH_END,
-@+ X<@+> X<@LAST_MATCH_END>, %+ X<%+>, HANDLE->input_line_number(EXPR),
-$INPUT_LINE_NUMBER, $NR, $. X<$.> X<$NR> X<$INPUT_LINE_NUMBER> X<line
-number>, IO::Handle->input_record_separator(EXPR), $INPUT_RECORD_SEPARATOR,
-$RS, $/ X<$/> X<$RS> X<$INPUT_RECORD_SEPARATOR>, HANDLE->autoflush(EXPR),
-$OUTPUT_AUTOFLUSH, $| X<$|> X<autoflush> X<flush> X<$OUTPUT_AUTOFLUSH>,
-IO::Handle->output_field_separator EXPR, $OUTPUT_FIELD_SEPARATOR, $OFS, $,
-X<$,> X<$OFS> X<$OUTPUT_FIELD_SEPARATOR>,
-IO::Handle->output_record_separator EXPR, $OUTPUT_RECORD_SEPARATOR, $ORS,
-$\ X<$\> X<$ORS> X<$OUTPUT_RECORD_SEPARATOR>, $LIST_SEPARATOR, $" X<$">
-X<$LIST_SEPARATOR>, $SUBSCRIPT_SEPARATOR, $SUBSEP, $; X<$;> X<$SUBSEP>
-X<SUBSCRIPT_SEPARATOR>, HANDLE->format_page_number(EXPR),
-$FORMAT_PAGE_NUMBER, $% X<$%> X<$FORMAT_PAGE_NUMBER>,
-HANDLE->format_lines_per_page(EXPR), $FORMAT_LINES_PER_PAGE, $= X<$=>
-X<$FORMAT_LINES_PER_PAGE>, HANDLE->format_lines_left(EXPR),
-$FORMAT_LINES_LEFT, $- X<$-> X<$FORMAT_LINES_LEFT>, @LAST_MATCH_START, @-
-X<@-> X<@LAST_MATCH_START>, C<$`> is the same as C<substr($var, 0, $-[0])>,
-C<$&> is the same as C<substr($var, $-[0], $+[0] - $-[0])>, C<$'> is the
-same as C<substr($var, $+[0])>, C<$1> is the same as C<substr($var, $-[1],
-$+[1] - $-[1])>, C<$2> is the same as C<substr($var, $-[2], $+[2] -
-$-[2])>, C<$3> is the same as C<substr($var, $-[3], $+[3] - $-[3])>, %-
-X<%->, HANDLE->format_name(EXPR), $FORMAT_NAME, $~ X<$~> X<$FORMAT_NAME>,
-HANDLE->format_top_name(EXPR), $FORMAT_TOP_NAME, $^ X<$^>
-X<$FORMAT_TOP_NAME>, IO::Handle->format_line_break_characters EXPR,
-$FORMAT_LINE_BREAK_CHARACTERS, $: X<$:> X<FORMAT_LINE_BREAK_CHARACTERS>,
-IO::Handle->format_formfeed EXPR, $FORMAT_FORMFEED, $^L X<$^L>
-X<$FORMAT_FORMFEED>, $ACCUMULATOR, $^A X<$^A> X<$ACCUMULATOR>,
-$CHILD_ERROR, $? X<$?> X<$CHILD_ERROR>, ${^CHILD_ERROR_NATIVE}
-X<$^CHILD_ERROR_NATIVE>, ${^ENCODING} X<$^ENCODING>, $OS_ERROR, $ERRNO, $!
-X<$!> X<$ERRNO> X<$OS_ERROR>, %OS_ERROR, %ERRNO, %! X<%!>,
-$EXTENDED_OS_ERROR, $^E X<$^E> X<$EXTENDED_OS_ERROR>, $EVAL_ERROR, $@ X<$@>
-X<$EVAL_ERROR>, $PROCESS_ID, $PID, $$ X<$$> X<$PID> X<$PROCESS_ID>,
-$REAL_USER_ID, $UID, $< X<< $< >> X<$UID> X<$REAL_USER_ID>,
-$EFFECTIVE_USER_ID, $EUID, $> X<< $> >> X<$EUID> X<$EFFECTIVE_USER_ID>,
-$REAL_GROUP_ID, $GID, $( X<$(> X<$GID> X<$REAL_GROUP_ID>,
-$EFFECTIVE_GROUP_ID, $EGID, $) X<$)> X<$EGID> X<$EFFECTIVE_GROUP_ID>,
-$PROGRAM_NAME, $0 X<$0> X<$PROGRAM_NAME>, $[ X<$[>, $] X<$]>, $COMPILING,
-$^C X<$^C> X<$COMPILING>, $DEBUGGING, $^D X<$^D> X<$DEBUGGING>,
-${^RE_DEBUG_FLAGS}, ${^RE_TRIE_MAXBUF}, $SYSTEM_FD_MAX, $^F X<$^F>
-X<$SYSTEM_FD_MAX>, $^H, %^H, $INPLACE_EDIT, $^I X<$^I> X<$INPLACE_EDIT>,
-$^M X<$^M>, $OSNAME, $^O X<$^O> X<$OSNAME>, ${^OPEN}, $PERLDB, $^P X<$^P>
-X<$PERLDB>, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200,
-0x400, $LAST_REGEXP_CODE_RESULT, $^R X<$^R> X<$LAST_REGEXP_CODE_RESULT>,
-$EXCEPTIONS_BEING_CAUGHT, $^S X<$^S> X<$EXCEPTIONS_BEING_CAUGHT>,
-$BASETIME, $^T X<$^T> X<$BASETIME>, ${^TAINT}, ${^UNICODE}, ${^UTF8CACHE},
-${^UTF8LOCALE}, $PERL_VERSION, $^V X<$^V> X<$PERL_VERSION>, $WARNING, $^W
-X<$^W> X<$WARNING>, ${^WARNING_BITS}, ${^WIN32_SLOPPY_STAT},
-$EXECUTABLE_NAME, $^X X<$^X> X<$EXECUTABLE_NAME>, ARGV X<ARGV>, $ARGV
-X<$ARGV>, @ARGV X<@ARGV>, ARGVOUT X<ARGVOUT>, @F X<@F>, @INC X<@INC>, @ARG,
-@_ X<@_> X<@ARG>, %INC X<%INC>, %ENV, $ENV{expr} X<%ENV>, %SIG, $SIG{expr}
-X<%SIG>
-
-=item Error Indicators
-X<error> X<exception>
-
-=item Technical Note on the Syntax of Variable Names
-
-=back
-
-=item BUGS
-
-=back
-
-=head2 perlre - Perl regular expressions
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Modifiers
-
-m X</m> X<regex, multiline> X<regexp, multiline> X<regular expression,
-multiline>, s X</s> X<regex, single-line> X<regexp, single-line> X<regular
-expression, single-line>, i X</i> X<regex, case-insensitive> X<regexp,
-case-insensitive> X<regular expression, case-insensitive>, x X</x>, p X</p>
-X<regex, preserve> X<regexp, preserve>, g and c X</g> X</c>
-
-=item Regular Expressions
-
-[1], [2], [3], [1], [2], [3], C<$>, C<+> C<< < >> C<=> C<< > >> C<|> C<~>,
-C<^> C<`>, cntrl X<cntrl>, graph X<graph>, print X<print>, punct X<punct>,
-xdigit X<xdigit>
-
-=item Extended Patterns
-
-C<(?#text)> X<(?#)>, C<(?pimsx-imsx)> X<(?)>, C<(?:pattern)> X<(?:)>,
-C<(?imsx-imsx:pattern)>, C<(?|pattern)> X<(?|)> X<Branch reset>,
-Look-Around Assertions X<look-around assertion> X<lookaround assertion>
-X<look-around> X<lookaround>, C<(?=pattern)> X<(?=)> X<look-ahead,
-positive> X<lookahead, positive>, C<(?!pattern)> X<(?!)> X<look-ahead,
-negative> X<lookahead, negative>, C<(?<=pattern)> C<\K> X<(?<=)>
-X<look-behind, positive> X<lookbehind, positive> X<\K>, C<(?<!pattern)>
-X<(?<!)> X<look-behind, negative> X<lookbehind, negative>,
-C<(?'NAME'pattern)>, C<< (?<NAME>pattern) >> X<< (?<NAME>) >> X<(?'NAME')>
-X<named capture> X<capture>, C<< \k<NAME> >>, C<< \k'NAME' >>, C<(?{ code
-})> X<(?{})> X<regex, code in> X<regexp, code in> X<regular expression,
-code in>, C<(??{ code })> X<(??{})> X<regex, postponed> X<regexp,
-postponed> X<regular expression, postponed>, C<(?PARNO)> C<(?-PARNO)>
-C<(?+PARNO)> C<(?R)> C<(?0)> X<(?PARNO)> X<(?1)> X<(?R)> X<(?0)> X<(?-1)>
-X<(?+1)> X<(?-PARNO)> X<(?+PARNO)> X<regex, recursive> X<regexp, recursive>
-X<regular expression, recursive> X<regex, relative recursion>, C<(?&NAME)>
-X<(?&NAME)>, C<(?(condition)yes-pattern|no-pattern)> X<(?()>,
-C<(?(condition)yes-pattern)>, (1) (2) .., (<NAME>) ('NAME'), (?{ CODE }),
-(R), (R1) (R2) .., (R&NAME), (DEFINE), C<< (?>pattern) >> X<backtrack>
-X<backtracking> X<atomic> X<possessive>
-
-=item Special Backtracking Control Verbs
-
-Verbs that take an argument, C<(*PRUNE)> C<(*PRUNE:NAME)> X<(*PRUNE)>
-X<(*PRUNE:NAME)>, C<(*SKIP)> C<(*SKIP:NAME)> X<(*SKIP)>, C<(*MARK:NAME)>
-C<(*:NAME)> X<(*MARK)> C<(*MARK:NAME)> C<(*:NAME)>, C<(*THEN)>
-C<(*THEN:NAME)>, C<(*COMMIT)> X<(*COMMIT)>, Verbs without an argument,
-C<(*FAIL)> C<(*F)> X<(*FAIL)> X<(*F)>, C<(*ACCEPT)> X<(*ACCEPT)>
-
-=item Backtracking
-X<backtrack> X<backtracking>
-
-=item Version 8 Regular Expressions
-X<regular expression, version 8> X<regex, version 8> X<regexp, version 8>
-
-=item Warning on \1 Instead of $1
-
-=item Repeated Patterns Matching a Zero-length Substring
-
-=item Combining RE Pieces
-
-C<ST>, C<S|T>, C<S{REPEAT_COUNT}>, C<S{min,max}>, C<S{min,max}?>, C<S?>,
-C<S*>, C<S+>, C<S??>, C<S*?>, C<S+?>, C<< (?>S) >>, C<(?=S)>, C<(?<=S)>,
-C<(?!S)>, C<(?<!S)>, C<(??{ EXPR })>, C<(?PARNO)>,
-C<(?(condition)yes-pattern|no-pattern)>
-
-=item Creating Custom RE Engines
-
-=back
-
-=item PCRE/Python Support
-
-C<< (?PE<lt>NAMEE<gt>pattern) >>, C<< (?P=NAME) >>, C<< (?P>NAME) >>
-
-=item BUGS
-
-=item SEE ALSO
-
-=back
-
-=head2 perlrebackslash - Perl Regular Expression Backslash Sequences and
-Escapes
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item The backslash
-
-[1]
-
-=item All the sequences and escapes
-
-=item Character Escapes
-
-[1], [2]
-
-=item Modifiers
-
-=item Character classes
-
-=item Referencing
-
-=item Assertions
-
-\A, \z, \Z, \G, \b, \B
-
-=item Misc
-
-\C, \K, \R, \X
-
-=back
-
-=back
-
-=head2 perlrecharclass - Perl Regular Expression Character Classes
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item The dot
-
-=item Backslashed sequences
-
-[1]
-
-=item Bracketed Character Classes
-
-cntrl, graph, print, punct
-
-=item Locale, Unicode and UTF-8
-
-=back
-
-=back
-
-=head2 perlreref - Perl Regular Expressions Reference
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item OPERATORS
-
-=item SYNTAX
-
-=item ESCAPE SEQUENCES
-
-=item CHARACTER CLASSES
-
-=item ANCHORS
-
-=item QUANTIFIERS
-
-=item EXTENDED CONSTRUCTS
-
-=item VARIABLES
-
-=item FUNCTIONS
-
-=item TERMINOLOGY
-
-=back
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=item THANKS
-
-=back
-
-=head2 perlref - Perl references and nested data structures
-
-=over 4
-
-=item NOTE
-
-=item DESCRIPTION
-
-=over 4
-
-=item Making References
-X<reference, creation> X<referencing>
-
-1. X<\> X<backslash>, 2. X<array, anonymous> X<[> X<[]> X<square bracket>
-X<bracket, square> X<arrayref> X<array reference> X<reference, array>, 3.
-X<hash, anonymous> X<{> X<{}> X<curly bracket> X<bracket, curly> X<brace>
-X<hashref> X<hash reference> X<reference, hash>, 4. X<subroutine,
-anonymous> X<subroutine, reference> X<reference, subroutine> X<scope,
-lexical> X<closure> X<lexical> X<lexical scope>, 5. X<constructor> X<new>,
-6. X<autovivification>, 7. X<*foo{THING}> X<*>
-
-=item Using References
-X<reference, use> X<dereferencing> X<dereference>
-
-=item Symbolic references
-X<reference, symbolic> X<reference, soft>
-X<symbolic reference> X<soft reference>
-
-=item Not-so-symbolic references
-
-=item Pseudo-hashes: Using an array as a hash
-X<pseudo-hash> X<pseudo hash> X<pseudohash>
-
-=item Function Templates
-X<scope, lexical> X<closure> X<lexical> X<lexical scope>
-X<subroutine, nested> X<sub, nested> X<subroutine, local> X<sub, local>
-
-=back
-
-=item WARNING
-X<reference, string context> X<reference, use as hash key>
-
-=item SEE ALSO
-
-=back
-
-=head2 perlform - Perl formats
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Text Fields
-X<format, text field>
-
-=item Numeric Fields
-X<#> X<format, numeric field>
-
-=item The Field @* for Variable Width Multi-Line Text
-X<@*>
-
-=item The Field ^* for Variable Width One-line-at-a-time Text
-X<^*>
-
-=item Specifying Values
-X<format, specifying values>
-
-=item Using Fill Mode
-X<format, fill mode>
-
-=item Suppressing Lines Where All Fields Are Void
-X<format, suppressing lines>
-
-=item Repeating Format Lines
-X<format, repeating lines>
-
-=item Top of Form Processing
-X<format, top of form> X<top> X<header>
-
-=item Format Variables
-X<format variables>
-X<format, variables>
-
-=back
-
-=item NOTES
-
-=over 4
-
-=item Footers
-X<format, footer> X<footer>
-
-=item Accessing Formatting Internals
-X<format, internals>
-
-=back
-
-=item WARNINGS
-
-=back
-
-=head2 perlobj - Perl objects
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item An Object is Simply a Reference
-X<object> X<bless> X<constructor> X<new>
-
-=item A Class is Simply a Package
-X<class> X<package> X<@ISA> X<inheritance>
-
-=item A Method is Simply a Subroutine
-X<method>
-
-=item Method Invocation
-X<invocation> X<method> X<arrow> X<< -> >>
-
-=item Indirect Object Syntax
-X<indirect object syntax> X<invocation, indirect> X<indirect>
-
-=item Default UNIVERSAL methods
-X<UNIVERSAL>
-
-isa(CLASS) X<isa>, DOES(ROLE), can(METHOD) X<can>, VERSION( [NEED] )
-X<VERSION>
-
-=item Destructors
-X<destructor> X<DESTROY>
-
-=item Summary
-
-=item Two-Phased Garbage Collection
-X<garbage collection> X<GC> X<circular reference>
-X<reference, circular> X<DESTROY> X<destructor>
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 perltie - how to hide an object class in a simple variable
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Tying Scalars
-X<scalar, tying>
-
-TIESCALAR classname, LIST X<TIESCALAR>, FETCH this X<FETCH>, STORE this,
-value X<STORE>, UNTIE this X<UNTIE>, DESTROY this X<DESTROY>
-
-=item Tying Arrays
-X<array, tying>
-
-TIEARRAY classname, LIST X<TIEARRAY>, FETCH this, index X<FETCH>, STORE
-this, index, value X<STORE>, FETCHSIZE this X<FETCHSIZE>, STORESIZE this,
-count X<STORESIZE>, EXTEND this, count X<EXTEND>, EXISTS this, key
-X<EXISTS>, DELETE this, key X<DELETE>, CLEAR this X<CLEAR>, PUSH this, LIST
- X<PUSH>, POP this X<POP>, SHIFT this X<SHIFT>, UNSHIFT this, LIST
-X<UNSHIFT>, SPLICE this, offset, length, LIST X<SPLICE>, UNTIE this
-X<UNTIE>, DESTROY this X<DESTROY>
-
-=item Tying Hashes
-X<hash, tying>
-
-USER, HOME, CLOBBER, LIST, TIEHASH classname, LIST X<TIEHASH>, FETCH this,
-key X<FETCH>, STORE this, key, value X<STORE>, DELETE this, key X<DELETE>,
-CLEAR this X<CLEAR>, EXISTS this, key X<EXISTS>, FIRSTKEY this X<FIRSTKEY>,
-NEXTKEY this, lastkey X<NEXTKEY>, SCALAR this X<SCALAR>, UNTIE this
-X<UNTIE>, DESTROY this X<DESTROY>
-
-=item Tying FileHandles
-X<filehandle, tying>
-
-TIEHANDLE classname, LIST X<TIEHANDLE>, WRITE this, LIST X<WRITE>, PRINT
-this, LIST X<PRINT>, PRINTF this, LIST X<PRINTF>, READ this, LIST X<READ>,
-READLINE this X<READLINE>, GETC this X<GETC>, EOF this X<EOF>, CLOSE this
-X<CLOSE>, UNTIE this X<UNTIE>, DESTROY this X<DESTROY>
-
-=item UNTIE this
-X<UNTIE>
-
-=item The C<untie> Gotcha
-X<untie>
-
-=back
-
-=item SEE ALSO
-
-=item BUGS
-
-=item AUTHOR
-
-=back
-
-=head2 perldbmfilter - Perl DBM Filters
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-B<filter_store_key>, B<filter_store_value>, B<filter_fetch_key>,
-B<filter_fetch_value>
-
-=over 4
-
-=item The Filter
-
-=item An Example -- the NULL termination problem.
-
-=item Another Example -- Key is a C int.
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=back
-
-=head2 perlipc - Perl interprocess communication (signals, fifos, pipes,
-safe subprocesses, sockets, and semaphores)
-
-=over 4
-
-=item DESCRIPTION
-
-=item Signals
-
-=over 4
-
-=item Handling the SIGHUP Signal in Daemons
-
-=back
-
-=item Named Pipes
-
-=over 4
-
-=item Deferred Signals (Safe Signals)
-
-Long-running opcodes, Interrupting IO, Restartable system calls, Signals as
-"faults", Signals triggered by operating system state
-
-=back
-
-=item Using open() for IPC
-
-=over 4
-
-=item Filehandles
-
-=item Background Processes
-
-=item Complete Dissociation of Child from Parent
-
-=item Safe Pipe Opens
-
-=item Bidirectional Communication with Another Process
-
-=item Bidirectional Communication with Yourself
-
-=back
-
-=item Sockets: Client/Server Communication
-
-=over 4
-
-=item Internet Line Terminators
-
-=item Internet TCP Clients and Servers
-
-=item Unix-Domain TCP Clients and Servers
-
-=back
-
-=item TCP Clients with IO::Socket
-
-=over 4
-
-=item A Simple Client
-
-C<Proto>, C<PeerAddr>, C<PeerPort>
-
-=item A Webget Client
-
-=item Interactive Client with IO::Socket
-
-=back
-
-=item TCP Servers with IO::Socket
-
-Proto, LocalPort, Listen, Reuse
-
-=item UDP: Message Passing
-
-=item SysV IPC
-
-=item NOTES
-
-=item BUGS
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 perlfork - Perl's fork() emulation
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Behavior of other Perl features in forked pseudo-processes
-
-$$ or $PROCESS_ID, %ENV, chdir() and all other builtins that accept
-filenames, wait() and waitpid(), kill(), exec(), exit(), Open handles to
-files, directories and network sockets
-
-=item Resource limits
-
-=item Killing the parent process
-
-=item Lifetime of the parent process and pseudo-processes
-
-=item CAVEATS AND LIMITATIONS
-
-BEGIN blocks, Open filehandles, Forking pipe open() not yet implemented,
-Global state maintained by XSUBs, Interpreter embedded in larger
-application, Thread-safety of extensions
-
-=back
-
-=item BUGS
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 perlnumber - semantics of numbers and numeric operations in Perl
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Storing numbers
-
-=item Numeric operators and numeric conversions
-
-=item Flavors of Perl numeric operations
-
-Arithmetic operators, ++, Arithmetic operators during C<use integer>, Other
-mathematical operators, Bitwise operators, Bitwise operators during C<use
-integer>, Operators which expect an integer, Operators which expect a
-string
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 perlthrtut - Tutorial on threads in Perl
-
-=over 4
-
-=item DESCRIPTION
-
-=item What Is A Thread Anyway?
-
-=item Threaded Program Models
-
-=over 4
-
-=item Boss/Worker
-
-=item Work Crew
-
-=item Pipeline
-
-=back
-
-=item What kind of threads are Perl threads?
-
-=item Thread-Safe Modules
-
-=item Thread Basics
-
-=over 4
-
-=item Basic Thread Support
-
-=item A Note about the Examples
-
-=item Creating Threads
-
-=item Waiting For A Thread To Exit
-
-=item Ignoring A Thread
-
-=item Process and Thread Termination
-
-=back
-
-=item Threads And Data
-
-=over 4
-
-=item Shared And Unshared Data
-
-=item Thread Pitfalls: Races
-
-=back
-
-=item Synchronization and control
-
-=over 4
-
-=item Controlling access: lock()
-
-=item A Thread Pitfall: Deadlocks
-
-=item Queues: Passing Data Around
-
-=item Semaphores: Synchronizing Data Access
-
-=item Basic semaphores
-
-=item Advanced Semaphores
-
-=item Waiting for a Condition
-
-=item Giving up control
-
-=back
-
-=item General Thread Utility Routines
-
-=over 4
-
-=item What Thread Am I In?
-
-=item Thread IDs
-
-=item Are These Threads The Same?
-
-=item What Threads Are Running?
-
-=back
-
-=item A Complete Example
-
-=item Different implementations of threads
-
-=item Performance considerations
-
-=item Process-scope Changes
-
-=item Thread-Safety of System Libraries
-
-=item Conclusion
-
-=item SEE ALSO
-
-=item Bibliography
-
-=over 4
-
-=item Introductory Texts
-
-=item OS-Related References
-
-=item Other References
-
-=back
-
-=item Acknowledgements
-
-=item AUTHOR
-
-=item Copyrights
-
-=back
-
-=head2 perlothrtut - old tutorial on threads in Perl
-
-=over 4
-
-=item DESCRIPTION
-
-=item What Is A Thread Anyway?
-
-=item Threaded Program Models
-
-=over 4
-
-=item Boss/Worker
-
-=item Work Crew
-
-=item Pipeline
-
-=back
-
-=item Native threads
-
-=item What kind of threads are perl threads?
-
-=item Threadsafe Modules
-
-=item Thread Basics
-
-=over 4
-
-=item Basic Thread Support
-
-=item Creating Threads
-
-=item Giving up control
-
-=item Waiting For A Thread To Exit
-
-=item Errors In Threads
-
-=item Ignoring A Thread
-
-=back
-
-=item Threads And Data
-
-=over 4
-
-=item Shared And Unshared Data
-
-=item Thread Pitfall: Races
-
-=item Controlling access: lock()
-
-=item Thread Pitfall: Deadlocks
-
-=item Queues: Passing Data Around
-
-=back
-
-=item Threads And Code
-
-=over 4
-
-=item Semaphores: Synchronizing Data Access
-
-Basic semaphores, Advanced Semaphores
-
-=item Attributes: Restricting Access To Subroutines
-
-=item Subroutine Locks
-
-=item Methods
-
-=item Locking A Subroutine
-
-=back
-
-=item General Thread Utility Routines
-
-=over 4
-
-=item What Thread Am I In?
-
-=item Thread IDs
-
-=item Are These Threads The Same?
-
-=item What Threads Are Running?
-
-=back
-
-=item A Complete Example
-
-=item Conclusion
-
-=item Bibliography
-
-=over 4
-
-=item Introductory Texts
-
-=item OS-Related References
-
-=item Other References
-
-=back
-
-=item Acknowledgements
-
-=item AUTHOR
-
-=item Copyrights
-
-=back
-
-=head2 perlport - Writing portable Perl
-
-=over 4
-
-=item DESCRIPTION
-
-Not all Perl programs have to be portable, Nearly all of Perl already I<is>
-portable
-
-=item ISSUES
-
-=over 4
-
-=item Newlines
-
-=item Numbers endianness and Width
-
-=item Files and Filesystems
-
-=item System Interaction
-
-=item Command names versus file pathnames
-
-=item Networking
-
-=item Interprocess Communication (IPC)
-
-=item External Subroutines (XS)
-
-=item Standard Modules
-
-=item Time and Date
-
-=item Character sets and character encoding
-
-=item Internationalisation
-
-=item System Resources
-
-=item Security
-
-=item Style
-
-=back
-
-=item CPAN Testers
-
-=item PLATFORMS
-
-=over 4
-
-=item Unix
-
-=item DOS and Derivatives
-
-=item S<Mac OS>
-
-=item VMS
-
-=item VOS
-
-=item EBCDIC Platforms
-
-=item Acorn RISC OS
-
-=item Other perls
-
-=back
-
-=item FUNCTION IMPLEMENTATIONS
-
-=over 4
-
-=item Alphabetical Listing of Perl Functions
-
--I<X>, atan2, binmode, chmod, chown, chroot, crypt, dbmclose, dbmopen,
-dump, exec, exit, fcntl, flock, fork, getlogin, getpgrp, getppid,
-getpriority, getpwnam, getgrnam, getnetbyname, getpwuid, getgrgid,
-getnetbyaddr, getprotobynumber, getservbyport, getpwent, getgrent,
-gethostbyname, gethostent, getnetent, getprotoent, getservent, sethostent,
-setnetent, setprotoent, setservent, endpwent, endgrent, endhostent,
-endnetent, endprotoent, endservent, getsockopt SOCKET,LEVEL,OPTNAME, glob,
-gmtime, ioctl FILEHANDLE,FUNCTION,SCALAR, kill, link, localtime, lstat,
-msgctl, msgget, msgsnd, msgrcv, open, pipe, readlink, rename, select,
-semctl, semget, semop, setgrent, setpgrp, setpriority, setpwent,
-setsockopt, shmctl, shmget, shmread, shmwrite, sockatmark, socketpair,
-stat, symlink, syscall, sysopen, system, times, truncate, umask, utime,
-wait, waitpid
-
-=back
-
-=item Supported Platforms
-
-=item SEE ALSO
-
-=item AUTHORS / CONTRIBUTORS
-
-=back
-
-=head2 perllocale - Perl locale handling (internationalization and
-localization)
-
-=over 4
-
-=item DESCRIPTION
-
-=item PREPARING TO USE LOCALES
-
-=item USING LOCALES
-
-=over 4
-
-=item The use locale pragma
-
-=item The setlocale function
-
-=item Finding locales
-
-=item LOCALE PROBLEMS
-
-=item Temporarily fixing locale problems
-
-=item Permanently fixing locale problems
-
-=item Permanently fixing your system's locale configuration
-
-=item Fixing system locale configuration
-
-=item The localeconv function
-
-=item I18N::Langinfo
-
-=back
-
-=item LOCALE CATEGORIES
-
-=over 4
-
-=item Category LC_COLLATE: Collation
-
-=item Category LC_CTYPE: Character Types
-
-=item Category LC_NUMERIC: Numeric Formatting
-
-=item Category LC_MONETARY: Formatting of monetary amounts
-
-=item LC_TIME
-
-=item Other categories
-
-=back
-
-=item SECURITY
-
-=item ENVIRONMENT
-
-PERL_BADLANG, LC_ALL, LANGUAGE, LC_CTYPE, LC_COLLATE, LC_MONETARY,
-LC_NUMERIC, LC_TIME, LANG
-
-=over 4
-
-=item Examples
-
-=back
-
-=item NOTES
-
-=over 4
-
-=item Backward compatibility
-
-=item I18N:Collate obsolete
-
-=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 Unicode and UTF-8
-
-=item BUGS
-
-=over 4
-
-=item Broken systems
-
-=back
-
-=item SEE ALSO
-
-=item HISTORY
-
-=back
-
-=head2 perluniintro - Perl Unicode introduction
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Unicode
-
-=item Perl's Unicode Support
-
-=item Perl's Unicode Model
-
-=item Unicode and EBCDIC
-
-=item Creating Unicode
-
-=item Handling Unicode
-
-=item Legacy Encodings
-
-=item Unicode I/O
-
-=item Displaying Unicode As Text
-
-=item Special Cases
-
-=item Advanced Topics
-
-=item Miscellaneous
-
-=item Questions With Answers
-
-=item Hexadecimal Notation
-
-=item Further Resources
-
-=back
-
-=item UNICODE IN OLDER PERLS
-
-=item SEE ALSO
-
-=item ACKNOWLEDGMENTS
-
-=item AUTHOR, COPYRIGHT, AND LICENSE
-
-=back
-
-=head2 perlunicode - Unicode support in Perl
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Important Caveats
-
-Input and Output Layers, Regular Expressions, C<use utf8> still needed to
-enable UTF-8/UTF-EBCDIC in scripts, BOM-marked scripts and UTF-16 scripts
-autodetected, C<use encoding> needed to upgrade non-Latin-1 byte strings
-
-=item Byte and Character Semantics
-
-=item Effects of Character Semantics
-
-=item Unicode Character Properties
-
-General Category, Bidirectional Character Types, Scripts, Extended property
-classes, Use of "Is" Prefix, Blocks
-
-=item User-Defined Character Properties
-
-=item User-Defined Case Mappings
-
-=item Character Encodings for Input and Output
-
-=item Unicode Regular Expression Support Level
-
-=item Unicode Encodings
-
-=item Security Implications of Unicode
-
-=item Unicode in Perl on EBCDIC
-
-=item Locales
-
-=item When Unicode Does Not Happen
-
-=item Forcing Unicode in Perl (Or Unforcing Unicode in Perl)
-
-=item Using Unicode in XS
-
-=back
-
-=item BUGS
-
-=over 4
-
-=item Interaction with Locales
-
-=item Problems with characters whose ordinal numbers are in the range 128 -
-255 with no Locale specified
-
-=item Interaction with Extensions
-
-=item Speed
-
-=item Porting code from perl-5.6.X
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 perlunifaq - Perl Unicode FAQ
-
-=over 4
-
-=item Q and A
-
-=over 4
-
-=item perlunitut isn't really a Unicode tutorial, is it?
-
-=item What character encodings does Perl support?
-
-=item Which version of perl should I use?
-
-=item What about binary data, like images?
-
-=item When should I decode or encode?
-
-=item What if I don't decode?
-
-=item What if I don't encode?
-
-=item Is there a way to automatically decode or encode?
-
-=item What if I don't know which encoding was used?
-
-=item Can I use Unicode in my Perl sources?
-
-=item Data::Dumper doesn't restore the UTF8 flag; is it broken?
-
-=item Why do regex character classes sometimes match only in the ASCII
-range?
-
-=item Why do some characters not uppercase or lowercase correctly?
-
-=item How can I determine if a string is a text string or a binary string?
-
-=item How do I convert from encoding FOO to encoding BAR?
-
-=item What are C<decode_utf8> and C<encode_utf8>?
-
-=item What is a "wide character"?
-
-=back
-
-=item INTERNALS
-
-=over 4
-
-=item What is "the UTF8 flag"?
-
-=item What about the C<use bytes> pragma?
-
-=item What about the C<use encoding> pragma?
-
-=item What is the difference between C<:encoding> and C<:utf8>?
-
-=item What's the difference between C<UTF-8> and C<utf8>?
-
-=item I lost track; what encoding is the internal format really?
-
-=back
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 perlunitut - Perl Unicode Tutorial
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Definitions
-
-=item Your new toolkit
-
-=item I/O flow (the actual 5 minute tutorial)
-
-=back
-
-=item SUMMARY
-
-=item Q and A (or FAQ)
-
-=item ACKNOWLEDGEMENTS
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 perlebcdic - Considerations for running Perl on EBCDIC platforms
-
-=over 4
-
-=item DESCRIPTION
-
-=item COMMON CHARACTER CODE SETS
-
-=over 4
-
-=item ASCII
-
-=item ISO 8859
-
-=item Latin 1 (ISO 8859-1)
-
-=item EBCDIC
-
-=item 13 variant characters
-
-=item 0037
-
-=item 1047
-
-=item POSIX-BC
-
-=item Unicode code points versus EBCDIC code points
-
-=item Remaining Perl Unicode problems in EBCDIC
-
-=item Unicode and UTF
-
-=item Using Encode
-
-=back
-
-=item SINGLE OCTET TABLES
-
-recipe 0, recipe 1, recipe 2, recipe 3, recipe 4, recipe 5, recipe 6
-
-=item IDENTIFYING CHARACTER CODE SETS
-
-=item CONVERSIONS
-
-=over 4
-
-=item tr///
-
-=item iconv
-
-=item C RTL
-
-=back
-
-=item OPERATOR DIFFERENCES
-
-=item FUNCTION DIFFERENCES
-
-chr(), ord(), pack(), print(), printf(), sort(), sprintf(), unpack()
-
-=item REGULAR EXPRESSION DIFFERENCES
-
-=item SOCKETS
-
-=item SORTING
-
-=over 4
-
-=item Ignore ASCII vs. EBCDIC sort differences.
-
-=item MONO CASE then sort data.
-
-=item Convert, sort data, then re convert.
-
-=item Perform sorting on one type of platform only.
-
-=back
-
-=item TRANSFORMATION FORMATS
-
-=over 4
-
-=item URL decoding and encoding
-
-=item uu encoding and decoding
-
-=item Quoted-Printable encoding and decoding
-
-=item Caesarian ciphers
-
-=back
-
-=item Hashing order and checksums
-
-=item I18N AND L10N
-
-=item MULTI OCTET CHARACTER SETS
-
-=item OS ISSUES
-
-=over 4
-
-=item OS/400
-
-PASE, IFS access
-
-=item OS/390, z/OS
-
-chcp, dataset access, OS/390, z/OS iconv, locales
-
-=item VM/ESA?
-
-=item POSIX-BC?
-
-=back
-
-=item BUGS
-
-=item SEE ALSO
-
-=item REFERENCES
-
-=item HISTORY
-
-=item AUTHOR
-
-=back
-
-=head2 perlsec - Perl security
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Laundering and Detecting Tainted Data
-
-=item Switches On the "#!" Line
-
-=item Taint mode and @INC
-
-=item Cleaning Up Your Path
-
-=item Security Bugs
-
-=item Protecting Your Programs
-
-=item Unicode
-
-=item Algorithmic Complexity Attacks
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 perlmod - Perl modules (packages and symbol tables)
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Packages
-X<package> X<namespace> X<variable, global> X<global variable> X<global>
-
-=item Symbol Tables
-X<symbol table> X<stash> X<%::> X<%main::> X<typeglob> X<glob> X<alias>
-
-=item BEGIN, UNITCHECK, CHECK, INIT and END
-X<BEGIN> X<UNITCHECK> X<CHECK> X<INIT> X<END>
-
-=item Perl Classes
-X<class> X<@ISA>
-
-=item Perl Modules
-X<module>
-
-=item Making your module threadsafe
-X<threadsafe> X<thread safe>
-X<module, threadsafe> X<module, thread safe>
-X<CLONE> X<CLONE_SKIP> X<thread> X<threads> X<ithread>
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 perlmodlib - constructing new Perl modules and finding existing ones
-
-=over 4
-
-=item THE PERL MODULE LIBRARY
-
-=over 4
-
-=item Pragmatic Modules
-
-attributes, attrs, autodie, autouse, base, bigint, bignum, bigrat, blib,
-bytes, charnames, constant, diagnostics, encoding, encoding::warnings,
-feature, fields, filetest, if, integer, less, lib, locale, mro, open, ops,
-overload, parent, re, sigtrap, sort, strict, subs, threads,
-threads::shared, utf8, vars, version, vmsish, warnings, warnings::register
-
-=item Standard Modules
-
-AnyDBM_File, App::Prove, App::Prove::State, Archive::Extract, Archive::Tar,
-Archive::Tar::File, Attribute::Handlers, AutoLoader, AutoSplit, B,
-B::Concise, B::Debug, B::Deparse, B::Lint, B::Lint::Debug, B::Showlex,
-B::Terse, B::Xref, Benchmark, CGI, CGI::Apache, CGI::Carp, CGI::Cookie,
-CGI::Fast, CGI::Pretty, CGI::Push, CGI::Switch, CGI::Util, CORE, CPAN,
-CPAN::API::HOWTO, CPAN::FirstTime, CPAN::Kwalify, CPAN::Nox, CPAN::Version,
-CPANPLUS, CPANPLUS::Dist::Base, CPANPLUS::Dist::Sample,
-CPANPLUS::Shell::Classic, CPANPLUS::Shell::Default::Plugins::HOWTO, Carp,
-Carp::Heavy, Class::ISA, Class::Struct, Compress::Raw::Zlib,
-Compress::Zlib, Config, Cwd, DB, DBM_Filter, DBM_Filter::compress,
-DBM_Filter::encode, DBM_Filter::int32, DBM_Filter::null, DBM_Filter::utf8,
-DB_File, Data::Dumper, Devel::DProf, Devel::InnerPackage, Devel::Peek,
-Devel::SelfStubber, Digest, Digest::MD5, Digest::SHA, Digest::base,
-Digest::file, DirHandle, Dumpvalue, DynaLoader, Encode, Encode::Alias,
-Encode::Byte, Encode::CJKConstants, Encode::CN, Encode::CN::HZ,
-Encode::Config, Encode::EBCDIC, Encode::Encoder, Encode::Encoding,
-Encode::GSM0338, Encode::Guess, Encode::JP, Encode::JP::H2Z,
-Encode::JP::JIS7, Encode::KR, Encode::KR::2022_KR, Encode::MIME::Header,
-Encode::MIME::Name, Encode::PerlIO, Encode::Supported, Encode::Symbol,
-Encode::TW, Encode::Unicode, Encode::Unicode::UTF7, English, Env, Errno,
-Exporter, Exporter::Heavy, ExtUtils::CBuilder,
-ExtUtils::CBuilder::Platform::Windows, ExtUtils::Command,
-ExtUtils::Command::MM, ExtUtils::Constant, ExtUtils::Constant::Base,
-ExtUtils::Constant::Utils, ExtUtils::Constant::XS, ExtUtils::Embed,
-ExtUtils::Install, ExtUtils::Installed, ExtUtils::Liblist, ExtUtils::MM,
-ExtUtils::MM_AIX, ExtUtils::MM_Any, ExtUtils::MM_BeOS, ExtUtils::MM_Cygwin,
-ExtUtils::MM_DOS, ExtUtils::MM_Darwin, ExtUtils::MM_MacOS,
-ExtUtils::MM_NW5, ExtUtils::MM_OS2, ExtUtils::MM_QNX, ExtUtils::MM_UWIN,
-ExtUtils::MM_Unix, ExtUtils::MM_VMS, ExtUtils::MM_VOS, ExtUtils::MM_Win32,
-ExtUtils::MM_Win95, ExtUtils::MY, ExtUtils::MakeMaker,
-ExtUtils::MakeMaker::Config, ExtUtils::MakeMaker::FAQ,
-ExtUtils::MakeMaker::Tutorial, ExtUtils::MakeMaker::bytes,
-ExtUtils::MakeMaker::vmsish, ExtUtils::Manifest, ExtUtils::Mkbootstrap,
-ExtUtils::Mksymlists, ExtUtils::Packlist, ExtUtils::ParseXS,
-ExtUtils::testlib, Fatal, Fcntl, File::Basename, File::CheckTree,
-File::Compare, File::Copy, File::DosGlob, File::Fetch, File::Find,
-File::Glob, File::GlobMapper, File::Path, File::Spec, File::Spec::Cygwin,
-File::Spec::Epoc, File::Spec::Functions, File::Spec::Mac, File::Spec::OS2,
-File::Spec::Unix, File::Spec::VMS, File::Spec::Win32, File::Temp,
-File::stat, FileCache, FileHandle, Filter::Simple, Filter::Util::Call,
-FindBin, GDBM_File, Getopt::Long, Getopt::Std, Hash::Util,
-Hash::Util::FieldHash, I18N::Collate, I18N::LangTags,
-I18N::LangTags::Detect, I18N::LangTags::List, I18N::Langinfo, IO,
-IO::Compress::Base, IO::Compress::Deflate, IO::Compress::Gzip,
-IO::Compress::RawDeflate, IO::Compress::Zip, IO::Dir, IO::File, IO::Handle,
-IO::Pipe, IO::Poll, IO::Seekable, IO::Select, IO::Socket, IO::Socket::INET,
-IO::Socket::UNIX, IO::Uncompress::AnyInflate,
-IO::Uncompress::AnyUncompress, IO::Uncompress::Base,
-IO::Uncompress::Gunzip, IO::Uncompress::Inflate,
-IO::Uncompress::RawInflate, IO::Uncompress::Unzip, IO::Zlib, IPC::Cmd,
-IPC::Msg, IPC::Open2, IPC::Open3, IPC::Semaphore, IPC::SharedMem,
-IPC::SysV, List::Util, Locale::Constants, Locale::Country,
-Locale::Currency, Locale::Language, Locale::Maketext,
-Locale::Maketext::Simple, Locale::Maketext::TPJ13, Locale::Script,
-Log::Message, Log::Message::Config, Log::Message::Handlers,
-Log::Message::Item, MIME::Base64, MIME::QuotedPrint, Math::BigFloat,
-Math::BigInt, Math::BigInt::Calc, Math::BigInt::CalcEmu,
-Math::BigInt::FastCalc, Math::BigRat, Math::Complex, Math::Trig, Memoize,
-Memoize::AnyDBM_File, Memoize::Expire, Memoize::ExpireFile,
-Memoize::ExpireTest, Memoize::NDBM_File, Memoize::SDBM_File,
-Memoize::Storable, Module::Build, Module::Build::API,
-Module::Build::Authoring, Module::Build::Base, Module::Build::Compat,
-Module::Build::ConfigData, Module::Build::Cookbook,
-Module::Build::ModuleInfo, Module::Build::Notes, Module::Build::PPMMaker,
-Module::Build::Platform::Amiga, Module::Build::Platform::Default,
-Module::Build::Platform::EBCDIC, Module::Build::Platform::MPEiX,
-Module::Build::Platform::MacOS, Module::Build::Platform::RiscOS,
-Module::Build::Platform::Unix, Module::Build::Platform::VMS,
-Module::Build::Platform::VOS, Module::Build::Platform::Windows,
-Module::Build::Platform::aix, Module::Build::Platform::cygwin,
-Module::Build::Platform::darwin, Module::Build::Platform::os2,
-Module::Build::YAML, Module::CoreList, Module::Load,
-Module::Load::Conditional, Module::Loaded, Module::Pluggable,
-Module::Pluggable::Object, NDBM_File, NEXT, Net::Cmd, Net::Config,
-Net::Domain, Net::FTP, Net::NNTP, Net::Netrc, Net::POP3, Net::Ping,
-Net::SMTP, Net::Time, Net::hostent, Net::libnetFAQ, Net::netent,
-Net::protoent, Net::servent, O, ODBM_File, Opcode, POSIX,
-Package::Constants, Params::Check, PerlIO, PerlIO::encoding,
-PerlIO::scalar, PerlIO::via, PerlIO::via::QuotedPrint, Pod::Checker,
-Pod::Escapes, Pod::Find, Pod::Functions, Pod::Html, Pod::InputObjects,
-Pod::LaTeX, Pod::Man, Pod::ParseLink, Pod::ParseUtils, Pod::Parser,
-Pod::Perldoc::ToChecker, Pod::Perldoc::ToMan, Pod::Perldoc::ToNroff,
-Pod::Perldoc::ToPod, Pod::Perldoc::ToRtf, Pod::Perldoc::ToText,
-Pod::Perldoc::ToTk, Pod::Perldoc::ToXml, Pod::PlainText, Pod::Plainer,
-Pod::Select, Pod::Simple, Pod::Simple::Checker, Pod::Simple::Debug,
-Pod::Simple::DumpAsText, Pod::Simple::DumpAsXML, Pod::Simple::HTML,
-Pod::Simple::HTMLBatch, Pod::Simple::LinkSection, Pod::Simple::Methody,
-Pod::Simple::PullParser, Pod::Simple::PullParserEndToken,
-Pod::Simple::PullParserStartToken, Pod::Simple::PullParserTextToken,
-Pod::Simple::PullParserToken, Pod::Simple::RTF, Pod::Simple::Search,
-Pod::Simple::SimpleTree, Pod::Simple::Subclassing, Pod::Simple::Text,
-Pod::Simple::TextContent, Pod::Simple::XMLOutStream, Pod::Text,
-Pod::Text::Color, Pod::Text::Overstrike, Pod::Text::Termcap, Pod::Usage,
-SDBM_File, Safe, Scalar::Util, Search::Dict, SelectSaver, SelfLoader,
-Shell, Socket, Storable, Switch, Symbol, Sys::Hostname, Sys::Syslog,
-Sys::Syslog::win32::Win32, TAP::Base, TAP::Formatter::Color,
-TAP::Formatter::Console, TAP::Formatter::Console::ParallelSession,
-TAP::Formatter::Console::Session, TAP::Harness, TAP::Parser,
-TAP::Parser::Aggregator, TAP::Parser::Grammar, TAP::Parser::Iterator,
-TAP::Parser::Iterator::Array, TAP::Parser::Iterator::Process,
-TAP::Parser::Iterator::Stream, TAP::Parser::Multiplexer,
-TAP::Parser::Result, TAP::Parser::Result::Bailout,
-TAP::Parser::Result::Comment, TAP::Parser::Result::Plan,
-TAP::Parser::Result::Pragma, TAP::Parser::Result::Test,
-TAP::Parser::Result::Unknown, TAP::Parser::Result::Version,
-TAP::Parser::Result::YAML, TAP::Parser::Source, TAP::Parser::Source::Perl,
-TAP::Parser::Utils, TAP::Parser::YAMLish::Reader,
-TAP::Parser::YAMLish::Writer, Term::ANSIColor, Term::Cap, Term::Complete,
-Term::ReadLine, Term::UI, Test, Test::Builder, Test::Builder::Module,
-Test::Builder::Tester, Test::Builder::Tester::Color, Test::Harness,
-Test::More, Test::Simple, Test::Tutorial, Text::Abbrev, Text::Balanced,
-Text::ParseWords, Text::Soundex, Text::Tabs, Text::Wrap, Thread,
-Thread::Queue, Thread::Semaphore, Tie::Array, Tie::File, Tie::Handle,
-Tie::Hash, Tie::Hash::NamedCapture, Tie::Memoize, Tie::RefHash,
-Tie::Scalar, Tie::SubstrHash, Time::HiRes, Time::Local, Time::Piece,
-Time::Piece::Seconds, Time::gmtime, Time::localtime, Time::tm, UNIVERSAL,
-Unicode::Collate, Unicode::Normalize, Unicode::UCD, User::grent,
-User::pwent, Win32, Win32API::File, Win32CORE, XS::APItest, XS::Typemap,
-XSLoader
-
-=item Extension Modules
-
-=back
-
-=item CPAN
-
-=over 4
-
-=item Africa
-
-South Africa
-
-=item Asia
-
-China, Indonesia, Israel, Japan, Malaysia, Russian Federation, Saudi
-Arabia, Singapore, South Korea, Taiwan, Thailand
-
-=item Central America
-
-Costa Rica
-
-=item Europe
-
-Austria, Belgium, Bosnia and Herzegovina, Bulgaria, Croatia, Czech
-Republic, Denmark, Estonia, Finland, France, Germany, Greece, Hungary,
-Iceland, Ireland, Italy, Latvia, Lithuania, Netherlands, Norway, Poland,
-Portugal, Romania, Russia, Slovakia, Slovenia, Spain, Sweden, Switzerland,
-Turkey, Ukraine, United Kingdom
-
-=item North America
-
-Canada, Alberta, Manitoba, Nova Scotia, Ontario, Mexico, United States,
-Alabama, California, Colorado, Delaware, District of Columbia, Florida,
-Indiana, Kentucky, Massachusetts, Michigan, Nevada, New Jersey, New York,
-North Carolina, Oklahoma, Oregon, Pennsylvania, Tennessee, Texas, Utah,
-Virginia, Washington, Wisconsin
-
-=item Oceania
-
-Australia, New Zealand, United States
-
-=item South America
-
-Argentina, Brazil, Chile
-
-=item RSYNC Mirrors
-
-=back
-
-=item Modules: Creation, Use, and Abuse
-
-=over 4
-
-=item Guidelines for Module Creation
-
-=item Guidelines for Converting Perl 4 Library Scripts into Modules
-
-=item Guidelines for Reusing Application Code
-
-=back
-
-=item NOTE
-
-=back
-
-=head2 perlmodstyle - Perl module style guide
-
-=over 4
-
-=item INTRODUCTION
-
-=item QUICK CHECKLIST
-
-=over 4
-
-=item Before you start
-
-=item The API
-
-=item Stability
-
-=item Documentation
-
-=item Release considerations
-
-=back
-
-=item BEFORE YOU START WRITING A MODULE
-
-=over 4
-
-=item Has it been done before?
-
-=item Do one thing and do it well
-
-=item What's in a name?
-
-=back
-
-=item DESIGNING AND WRITING YOUR MODULE
-
-=over 4
-
-=item To OO or not to OO?
-
-=item Designing your API
-
-Write simple routines to do simple things, Separate functionality from
-output, Provide sensible shortcuts and defaults, Naming conventions,
-Parameter passing
-
-=item Strictness and warnings
-
-=item Backwards compatibility
-
-=item Error handling and messages
-
-=back
-
-=item DOCUMENTING YOUR MODULE
-
-=over 4
-
-=item POD
-
-=item README, INSTALL, release notes, changelogs
-
-perl Makefile.PL, make, make test, make install, perl Build.PL, perl Build,
-perl Build test, perl Build install
-
-=back
-
-=item RELEASE CONSIDERATIONS
-
-=over 4
-
-=item Version numbering
-
-=item Pre-requisites
-
-=item Testing
-
-=item Packaging
-
-=item Licensing
-
-=back
-
-=item COMMON PITFALLS
-
-=over 4
-
-=item Reinventing the wheel
-
-=item Trying to do too much
-
-=item Inappropriate documentation
-
-=back
-
-=item SEE ALSO
-
-L<perlstyle>, L<perlnewmod>, L<perlpod>, L<podchecker>, Packaging Tools,
-Testing tools, http://pause.perl.org/, Any good book on software
-engineering
-
-=item AUTHOR
-
-=back
-
-=head2 perlmodinstall - Installing CPAN Modules
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item PREAMBLE
-
-B<DECOMPRESS> the file, B<UNPACK> the file into a directory, B<BUILD> the
-module (sometimes unnecessary), B<INSTALL> the module
-
-=back
-
-=item PORTABILITY
-
-=item HEY
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 perlnewmod - preparing a new module for distribution
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Warning
-
-=item What should I make into a module?
-
-=item Step-by-step: Preparing the ground
-
-Look around, Check it's new, Discuss the need, Choose a name, Check again
-
-=item Step-by-step: Making the module
-
-Start with F<module-starter> or F<h2xs>, Use L<strict|strict> and
-L<warnings|warnings>, Use L<Carp|Carp>, Use L<Exporter|Exporter> - wisely!,
-Use L<plain old documentation|perlpod>, Write tests, Write the README
-
-=item Step-by-step: Distributing your module
-
-Get a CPAN user ID, C<perl Makefile.PL; make test; make dist>, Upload the
-tarball, Announce to the modules list, Announce to clpa, Fix bugs!
-
-=back
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 perlpragma - how to write a user pragma
-
-=over 4
-
-=item DESCRIPTION
-
-=item A basic example
-
-=item Implementation details
-
-=back
-
-=head2 perlutil - utilities packaged with the Perl distribution
-
-=over 4
-
-=item DESCRIPTION
-
-=item LIST OF UTILITIES
-
-=over 4
-
-=item Documentation
-
-L<perldoc|perldoc>, L<pod2man|pod2man> and L<pod2text|pod2text>,
-L<pod2html|pod2html> and L<pod2latex|pod2latex>, L<pod2usage|pod2usage>,
-L<podselect|podselect>, L<podchecker|podchecker>, L<splain|splain>,
-L<roffitall|roffitall>
-
-=item Convertors
-
-L<a2p|a2p>, L<s2p|s2p> and L<psed>, L<find2perl|find2perl>
-
-=item Administration
-
-L<config_data|config_data>, L<libnetcfg|libnetcfg>, L<perlivp>
-
-=item Development
-
-L<perlbug|perlbug>, L<perlthanks|perlthanks>, L<h2ph|h2ph>, L<c2ph|c2ph>
-and L<pstruct|pstruct>, L<h2xs|h2xs>, L<enc2xs>, L<xsubpp>,
-L<dprofpp|dprofpp>, L<prove>, L<corelist>
-
-=item General tools
-
-L<piconv>, L<ptar>, L<ptardiff>, L<shasum>
-
-=item Installation
-
-L<cpan>, L<cpanp>, L<cpan2dist>, L<instmodsh>
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 perlcompile - Introduction to the Perl Compiler-Translator
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Layout
-
-B::Lint, B::Deparse, B::Xref
-
-=back
-
-=item Using The Back Ends
-
-=over 4
-
-=item The Cross Referencing Back End
-
-i, &, s, r
-
-=item The Decompiling Back End
-
-=item The Lint Back End
-
-=back
-
-=item Module List for the Compiler Suite
-
-B, O, B::Concise, B::Debug, B::Deparse, B::Lint, B::Showlex, B::Terse,
-B::Xref
-
-=item KNOWN PROBLEMS
-
-=item AUTHOR
-
-=back
-
-=head2 perlfilter - Source Filters
-
-=over 4
-
-=item DESCRIPTION
-
-=item CONCEPTS
-
-=item USING FILTERS
-
-=item WRITING A SOURCE FILTER
-
-=item WRITING A SOURCE FILTER IN C
-
-B<Decryption Filters>
-
-=item CREATING A SOURCE FILTER AS A SEPARATE EXECUTABLE
-
-=item WRITING A SOURCE FILTER IN PERL
-
-=item USING CONTEXT: THE DEBUG FILTER
-
-=item CONCLUSION
-
-=item THINGS TO LOOK OUT FOR
-
-Some Filters Clobber the C<DATA> Handle
-
-=item REQUIREMENTS
-
-=item AUTHOR
-
-=item Copyrights
-
-=back
-
-=head2 perlglossary - Perl Glossary
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item A
-
-accessor methods, actual arguments, address operator, algorithm, alias,
-alternatives, anonymous, architecture, argument, ARGV, arithmetical
-operator, array, array context, ASCII, assertion, assignment, assignment
-operator, associative array, associativity, asynchronous, atom, atomic
-operation, attribute, autogeneration, autoincrement, autoload, autosplit,
-autovivification, AV, awk
-
-=item B
-
-backreference, backtracking, backward compatibility, bareword, base class,
-big-endian, binary, binary operator, bind, bit, bit shift, bit string,
-bless, block, BLOCK, block buffering, Boolean, Boolean context, breakpoint,
-broadcast, BSD, bucket, buffer, built-in, bundle, byte, bytecode
-
-=item C
-
-C, C preprocessor, call by reference, call by value, callback, canonical,
-capturing, character, character class, character property, circumfix
-operator, class, class method, client, cloister, closure, cluster, CODE,
-code generator, code subpattern, collating sequence, command, command
-buffering, command name, command-line arguments, comment, compilation unit,
-compile phase, compile time, compiler, composer, concatenation,
-conditional, connection, construct, constructor, context, continuation,
-core dump, CPAN, cracker, current package, current working directory,
-currently selected output channel, CV
-
-=item D
-
-dangling statement, data structure, data type, datagram, DBM, declaration,
-decrement, default, defined, delimiter, deprecated modules and features,
-dereference, derived class, descriptor, destroy, destructor, device,
-directive, directory, directory handle, dispatch, distribution, (to be)
-dropped modules, dweomer, dwimmer, dynamic scoping
-
-=item E
-
-eclectic, element, embedding, empty subclass test, en passant,
-encapsulation, endian, environment, environment variable, EOF, errno,
-error, escape sequence, exception, exception handling, exec, executable
-file, execute, execute bit, exit status, export, expression, extension
-
-=item F
-
-false, FAQ, fatal error, field, FIFO, file, file descriptor, file test
-operator, fileglob, filehandle, filename, filesystem, filter, flag,
-floating point, flush, FMTEYEWTK, fork, formal arguments, format, freely
-available, freely redistributable, freeware, function, funny character,
-garbage collection
-
-=item G
-
-GID, glob, global, global destruction, glue language, granularity, greedy,
-grep, group, GV
-
-=item H
-
-hacker, handler, hard reference, hash, hash table, header file, here
-document, hexadecimal, home directory, host, hubris, HV
-
-=item I
-
-identifier, impatience, implementation, import, increment, indexing,
-indirect filehandle, indirect object, indirect object slot, indirection,
-infix, inheritance, instance, instance variable, integer, interface,
-interpolation, interpreter, invocant, invocation, I/O, IO, IP, IPC, is-a,
-iteration, iterator, IV
-
-=item J
-
-JAPH
-
-=item K
-
-key, keyword
-
-=item L
-
-label, laziness, left shift, leftmost longest, lexeme, lexer, lexical
-analysis, lexical scoping, lexical variable, library, LIFO, line, line
-buffering, line number, link, LIST, list, list context, list operator, list
-value, literal, little-endian, local, logical operator, lookahead,
-lookbehind, loop, loop control statement, loop label, lvaluable, lvalue,
-lvalue modifier
-
-=item M
-
-magic, magical increment, magical variables, Makefile, man, manpage,
-matching, member data, memory, metacharacter, metasymbol, method,
-minimalism, mode, modifier, module, modulus, monger, mortal,
-multidimensional array, multiple inheritance
-
-=item N
-
-named pipe, namespace, network address, newline, NFS, null character, null
-list, null string, numeric context, NV, nybble
-
-=item O
-
-object, octal, offset, one-liner, open source software, operand, operating
-system, operator, operator overloading, options, overloading, overriding,
-owner
-
-=item P
-
-package, pad, parameter, parent class, parse tree, parsing, patch, PATH,
-pathname, pattern, pattern matching, permission bits, Pern, pipe, pipeline,
-platform, pod, pointer, polymorphism, port, portable, porter, POSIX,
-postfix, pp, pragma, precedence, prefix, preprocessing, procedure, process,
-program generator, progressive matching, property, protocol, prototype,
-pseudofunction, pseudohash, pseudoliteral, public domain, pumpkin,
-pumpking, PV
-
-=item Q
-
-qualified, quantifier
-
-=item R
-
-readable, reaping, record, recursion, reference, referent, regex, regular
-expression, regular expression modifier, regular file, relational operator,
-reserved words, return value, RFC, right shift, root, RTFM, run phase, run
-time, run-time pattern, RV, rvalue
-
-=item S
-
-scalar, scalar context, scalar literal, scalar value, scalar variable,
-scope, scratchpad, script, script kiddie, sed, semaphore, separator,
-serialization, server, service, setgid, setuid, shared memory, shebang,
-shell, side effects, signal, signal handler, single inheritance, slice,
-slurp, socket, soft reference, source filter, stack, standard, standard
-error, standard I/O, standard input, standard output, stat structure,
-statement, statement modifier, static, static method, static scoping,
-static variable, status, STDERR, STDIN, STDIO, STDOUT, stream, string,
-string context, stringification, struct, structure, subclass, subpattern,
-subroutine, subscript, substitution, substring, superclass, superuser, SV,
-switch, switch cluster, switch statement, symbol, symbol table, symbolic
-debugger, symbolic link, symbolic reference, synchronous, syntactic sugar,
-syntax, syntax tree, syscall
-
-=item T
-
-tainted, TCP, term, terminator, ternary, text, thread, tie, TMTOWTDI,
-token, tokener, tokenizing, toolbox approach, transliterate, trigger,
-trinary, troff, true, truncating, type, type casting, typed lexical,
-typedef, typeglob, typemap
-
-=item U
-
-UDP, UID, umask, unary operator, Unicode, Unix
-
-=item V
-
-value, variable, variable interpolation, variadic, vector, virtual, void
-context, v-string
-
-=item W
-
-warning, watch expression, whitespace, word, working directory, wrapper,
-WYSIWYG
-
-=item X
-
-XS, XSUB
-
-=item Y
-
-yacc
-
-=item Z
-
-zero width, zombie
-
-=back
-
-=item AUTHOR AND COPYRIGHT
-
-=back
-
-=head2 perlembed - how to embed perl in your C program
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=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 ROADMAP
-
-=item Compiling your C program
-
-=item Adding a Perl interpreter to your C program
-
-=item Calling a Perl subroutine from your C program
-
-=item Evaluating a Perl statement from your C program
-
-=item Performing Perl pattern matches and substitutions from your C program
-
-=item Fiddling with the Perl stack from your C program
-
-=item Maintaining a persistent interpreter
-
-=item Execution of END blocks
-
-=item $0 assignments
-
-=item Maintaining multiple interpreter instances
-
-=item Using Perl modules, which themselves use C libraries, from your C
-program
-
-=back
-
-=item Embedding Perl under Win32
-
-=item Hiding Perl_
-
-=item MORAL
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 perldebguts - Guts of Perl debugging
-
-=over 4
-
-=item DESCRIPTION
-
-=item Debugger Internals
-
-=over 4
-
-=item Writing Your Own Debugger
-
-=back
-
-=item Frame Listing Output Examples
-
-=item Debugging regular expressions
-
-=over 4
-
-=item Compile-time output
-
-C<anchored> I<STRING> C<at> I<POS>, C<floating> I<STRING> C<at>
-I<POS1..POS2>, C<matching floating/anchored>, C<minlen>, C<stclass>
-I<TYPE>, C<noscan>, C<isall>, C<GPOS>, C<plus>, C<implicit>, C<with eval>,
-C<anchored(TYPE)>
-
-=item Types of nodes
-
-=item Run-time output
-
-=back
-
-=item Debugging Perl memory usage
-
-=over 4
-
-=item Using C<$ENV{PERL_DEBUG_MSTATS}>
-
-C<buckets SMALLEST(APPROX)..GREATEST(APPROX)>, Free/Used, C<Total sbrk():
-SBRKed/SBRKs:CONTINUOUS>, C<pad: 0>, C<heads: 2192>, C<chain: 0>, C<tail:
-6144>
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 perlxstut, perlXStut - Tutorial for writing XSUBs
-
-=over 4
-
-=item DESCRIPTION
-
-=item SPECIAL NOTES
-
-=over 4
-
-=item make
-
-=item Version caveat
-
-=item Dynamic Loading versus Static Loading
-
-=back
-
-=item TUTORIAL
-
-=over 4
-
-=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 Program
-
-=item The TYPEMAP file
-
-=item Warning about Output Arguments
-
-=item EXAMPLE 4
-
-=item What has happened here?
-
-=item Anatomy of .xs file
-
-=item Getting the fat out of XSUBs
-
-=item More about XSUB arguments
-
-=item The Argument Stack
-
-=item Extending your Extension
-
-=item Documenting your Extension
-
-=item Installing your Extension
-
-=item EXAMPLE 5
-
-=item New Things in this Example
-
-=item EXAMPLE 6
-
-=item New Things in this Example
-
-=item EXAMPLE 7 (Coming Soon)
-
-=item EXAMPLE 8 (Coming Soon)
-
-=item EXAMPLE 9 Passing open files to XSes
-
-=item Troubleshooting these Examples
-
-=back
-
-=item See also
-
-=item Author
-
-=over 4
-
-=item Last Changed
-
-=back
-
-=back
-
-=head2 perlxs - XS language reference manual
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Introduction
-
-=item On The Road
-
-=item The Anatomy of an XSUB
-
-=item The Argument Stack
-
-=item The RETVAL Variable
-
-=item Returning SVs, AVs and HVs through RETVAL
-
-=item The MODULE Keyword
-
-=item The PACKAGE Keyword
-
-=item The PREFIX Keyword
-
-=item The OUTPUT: Keyword
-
-=item The NO_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 The IN/OUTLIST/IN_OUTLIST/OUT/IN_OUT Keywords
-
-=item The C<length(NAME)> Keyword
-
-=item Variable-length Parameter Lists
-
-=item The C_ARGS: Keyword
-
-=item The PPCODE: Keyword
-
-=item Returning Undef And Empty Lists
-
-=item The REQUIRE: Keyword
-
-=item The CLEANUP: Keyword
-
-=item The POSTCALL: Keyword
-
-=item The BOOT: Keyword
-
-=item The VERSIONCHECK: Keyword
-
-=item The PROTOTYPES: Keyword
-
-=item The PROTOTYPE: Keyword
-
-=item The ALIAS: Keyword
-
-=item The OVERLOAD: Keyword
-
-=item The FALLBACK: Keyword
-
-=item The INTERFACE: Keyword
-
-=item The INTERFACE_MACRO: Keyword
-
-=item The INCLUDE: Keyword
-
-=item The CASE: Keyword
-
-=item The & Unary Operator
-
-=item Inserting POD, Comments and C Preprocessor Directives
-
-=item Using XS With C++
-
-=item Interface Strategy
-
-=item Perl Objects And C Structures
-
-=item The Typemap
-
-=item Safely Storing Static Data in XS
-
-MY_CXT_KEY, typedef my_cxt_t, START_MY_CXT, MY_CXT_INIT, dMY_CXT, MY_CXT,
-aMY_CXT/pMY_CXT, MY_CXT_CLONE, MY_CXT_INIT_INTERP(my_perl),
-dMY_CXT_INTERP(my_perl)
-
-=item Thread-aware system interfaces
-
-=back
-
-=item EXAMPLES
-
-=item XS VERSION
-
-=item AUTHOR
-
-=back
-
-=head2 perlclib - Internal replacements for standard C library functions
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Conventions
-
-C<t>, C<p>, C<n>, C<s>
-
-=item File Operations
-
-=item File Input and Output
-
-=item File Positioning
-
-=item Memory Management and String Handling
-
-=item Character Class Tests
-
-=item F<stdlib.h> functions
-
-=item Miscellaneous functions
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 perlguts - Introduction to the Perl API
-
-=over 4
-
-=item DESCRIPTION
-
-=item Variables
-
-=over 4
-
-=item Datatypes
-
-=item What is an "IV"?
-
-=item Working with SVs
-
-=item Offsets
-
-=item What's Really Stored in an SV?
-
-=item Working with AVs
-
-=item Working with HVs
-
-=item Hash API Extensions
-
-=item AVs, HVs and undefined values
-
-=item References
-
-=item Blessed References and Class Objects
-
-=item Creating New Variables
-
-GV_ADDMULTI, GV_ADDWARN
-
-=item Reference Counts and Mortality
-
-=item Stashes and Globs
-
-=item Double-Typed SVs
-
-=item Magic Variables
-
-=item Assigning Magic
-
-=item Magic Virtual Tables
-
-=item Finding Magic
-
-=item Understanding the Magic of Tied Hashes and Arrays
-
-=item Localizing changes
-
-C<SAVEINT(int i)>, C<SAVEIV(IV i)>, C<SAVEI32(I32 i)>, C<SAVELONG(long i)>,
-C<SAVESPTR(s)>, C<SAVEPPTR(p)>, C<SAVEFREESV(SV *sv)>, C<SAVEMORTALIZESV(SV
-*sv)>, C<SAVEFREEOP(OP *op)>, C<SAVEFREEPV(p)>, C<SAVECLEARSV(SV *sv)>,
-C<SAVEDELETE(HV *hv, char *key, I32 length)>,
-C<SAVEDESTRUCTOR(DESTRUCTORFUNC_NOCONTEXT_t f, void *p)>,
-C<SAVEDESTRUCTOR_X(DESTRUCTORFUNC_t f, void *p)>, C<SAVESTACK_POS()>, C<SV*
-save_scalar(GV *gv)>, C<AV* save_ary(GV *gv)>, C<HV* save_hash(GV *gv)>,
-C<void save_item(SV *item)>, C<void save_list(SV **sarg, I32 maxsarg)>,
-C<SV* save_svref(SV **sptr)>, C<void save_aptr(AV **aptr)>, C<void
-save_hptr(HV **hptr)>
-
-=back
-
-=item Subroutines
-
-=over 4
-
-=item XSUBs and the Argument Stack
-
-=item Calling Perl Routines from within C Programs
-
-=item Memory Allocation
-
-=item PerlIO
-
-=item Putting a C value on Perl stack
-
-=item Scratchpads
-
-=item Scratchpads and recursion
-
-=back
-
-=item Compiled code
-
-=over 4
-
-=item Code tree
-
-=item Examining the tree
-
-=item Compile pass 1: check routines
-
-=item Compile pass 1a: constant folding
-
-=item Compile pass 2: context propagation
-
-=item Compile pass 3: peephole optimization
-
-=item Pluggable runops
-
-=back
-
-=item Examining internal data structures with the C<dump> functions
-
-=item How multiple interpreters and concurrency are supported
-
-=over 4
-
-=item Background and PERL_IMPLICIT_CONTEXT
-
-=item So what happened to dTHR?
-
-=item How do I use all this in extensions?
-
-=item Should I do anything special if I call perl from multiple threads?
-
-=item Future Plans and PERL_IMPLICIT_SYS
-
-=back
-
-=item Internal Functions
-
-A, p, d, s, n, r, f, M, o, x, m, X, E, b, others
-
-=over 4
-
-=item Formatted Printing of IVs, UVs, and NVs
-
-=item Pointer-To-Integer and Integer-To-Pointer
-
-=item Exception Handling
-
-=item Source Documentation
-
-=item Backwards compatibility
-
-=back
-
-=item Unicode Support
-
-=over 4
-
-=item What B<is> Unicode, anyway?
-
-=item How can I recognise a UTF-8 string?
-
-=item How does UTF-8 represent Unicode characters?
-
-=item How does Perl store UTF-8 strings?
-
-=item How do I convert a string to UTF-8?
-
-=item Is there anything else I need to know?
-
-=back
-
-=item Custom Operators
-
-=item AUTHORS
-
-=item SEE ALSO
-
-=back
-
-=head2 perlcall - Perl calling conventions from C
-
-=over 4
-
-=item DESCRIPTION
-
-An Error Handler, An Event Driven Program
-
-=item THE CALL_ FUNCTIONS
-
-call_sv, call_pv, call_method, call_argv
-
-=item FLAG VALUES
-
-=over 4
-
-=item G_VOID
-
-=item G_SCALAR
-
-=item G_ARRAY
-
-=item G_DISCARD
-
-=item G_NOARGS
-
-=item G_EVAL
-
-=item G_KEEPERR
-
-=item Determining the Context
-
-=back
-
-=item EXAMPLES
-
-=over 4
-
-=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 call_sv
-
-=item Using call_argv
-
-=item Using call_method
-
-=item Using GIMME_V
-
-=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
-
-=item Creating and calling an anonymous subroutine in C
-
-=back
-
-=item LIGHTWEIGHT CALLBACKS
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item DATE
-
-=back
-
-=head2 perlreapi - perl regular expression plugin interface
-
-=over 4
-
-=item DESCRIPTION
-
-=item Callbacks
-
-=over 4
-
-=item comp
-
-C</m> - RXf_PMf_MULTILINE, C</s> - RXf_PMf_SINGLELINE, C</i> -
-RXf_PMf_FOLD, C</x> - RXf_PMf_EXTENDED, C</p> - RXf_PMf_KEEPCOPY,
-RXf_PMf_LOCALE, RXf_UTF8, RXf_SPLIT, RXf_SKIPWHITE, RXf_START_ONLY,
-RXf_WHITE, RXf_NULL
-
-=item exec
-
-=item intuit
-
-=item checkstr
-
-=item free
-
-=item Numbered capture callbacks
-
-=item Named capture callbacks
-
-=item qr_package
-
-=item dupe
-
-=back
-
-=item The REGEXP structure
-
-=over 4
-
-=item C<engine>
-
-=item C<mother_re>
-
-=item C<extflags>
-
-=item C<minlen> C<minlenret>
-
-=item C<gofs>
-
-=item C<substrs>
-
-=item C<nparens>, C<lasparen>, and C<lastcloseparen>
-
-=item C<intflags>
-
-=item C<pprivate>
-
-=item C<swap>
-
-=item C<offs>
-
-=item C<precomp> C<prelen>
-
-=item C<paren_names>
-
-=item C<substrs>
-
-=item C<subbeg> C<sublen> C<saved_copy>
-
-=item C<wrapped> C<wraplen>
-
-=item C<seen_evals>
-
-=item C<refcnt>
-
-=back
-
-=item HISTORY
-
-=item AUTHORS
-
-=item LICENSE
-
-=back
-
-=head2 perlreguts - Description of the Perl regular expression engine.
-
-=over 4
-
-=item DESCRIPTION
-
-=item OVERVIEW
-
-=over 4
-
-=item A quick note on terms
-
-=item What is a regular expression engine?
-
-=item Structure of a Regexp Program
-
-C<regnode_1>, C<regnode_2>, C<regnode_string>, C<regnode_charclass>,
-C<regnode_charclass_class>
-
-=back
-
-=item Process Overview
-
-A. Compilation, 1. Parsing for size, 2. Parsing for construction, 3.
-Peep-hole optimisation and analysis, B. Execution, 4. Start position and
-no-match optimisations, 5. Program execution
-
-=over 4
-
-=item Compilation
-
-anchored fixed strings, floating fixed strings, minimum and maximum length
-requirements, start class, Beginning/End of line positions
-
-=item Execution
-
-=back
-
-=item MISCELLANEOUS
-
-=over 4
-
-=item Unicode and Localisation Support
-
-=item Base Structures
-
-C<swap>, C<offsets>, C<regstclass>, C<data>, C<program>
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item LICENCE
-
-=item REFERENCES
-
-=back
-
-=head2 perlapi - autogenerated documentation for the perl public API
-
-=over 4
-
-=item DESCRIPTION
-X<Perl API> X<API> X<api>
-
-=item "Gimme" Values
-
-GIMME X<GIMME>, GIMME_V X<GIMME_V>, G_ARRAY X<G_ARRAY>, G_DISCARD
-X<G_DISCARD>, G_EVAL X<G_EVAL>, G_NOARGS X<G_NOARGS>, G_SCALAR X<G_SCALAR>,
-G_VOID X<G_VOID>
-
-=item Array Manipulation Functions
-
-AvFILL X<AvFILL>, av_clear X<av_clear>, av_create_and_push
-X<av_create_and_push>, av_create_and_unshift_one
-X<av_create_and_unshift_one>, av_delete X<av_delete>, av_exists
-X<av_exists>, av_extend X<av_extend>, av_fetch X<av_fetch>, av_fill
-X<av_fill>, av_len X<av_len>, av_make X<av_make>, av_pop X<av_pop>, av_push
-X<av_push>, av_shift X<av_shift>, av_store X<av_store>, av_undef
-X<av_undef>, av_unshift X<av_unshift>, get_av X<get_av>, newAV X<newAV>,
-sortsv X<sortsv>, sortsv_flags X<sortsv_flags>
-
-=item Callback Functions
-
-call_argv X<call_argv>, call_method X<call_method>, call_pv X<call_pv>,
-call_sv X<call_sv>, ENTER X<ENTER>, eval_pv X<eval_pv>, eval_sv X<eval_sv>,
-FREETMPS X<FREETMPS>, LEAVE X<LEAVE>, SAVETMPS X<SAVETMPS>
-
-=item Character classes
-
-isALNUM X<isALNUM>, isALPHA X<isALPHA>, isDIGIT X<isDIGIT>, isLOWER
-X<isLOWER>, isSPACE X<isSPACE>, isUPPER X<isUPPER>, toLOWER X<toLOWER>,
-toUPPER X<toUPPER>
-
-=item Cloning an interpreter
-
-perl_clone X<perl_clone>
-
-=item CV Manipulation Functions
-
-CvSTASH X<CvSTASH>, get_cv X<get_cv>, get_cvn_flags X<get_cvn_flags>
-
-=item Embedding Functions
-
-cv_undef X<cv_undef>, load_module X<load_module>, nothreadhook
-X<nothreadhook>, perl_alloc X<perl_alloc>, perl_construct
-X<perl_construct>, perl_destruct X<perl_destruct>, perl_free X<perl_free>,
-perl_parse X<perl_parse>, perl_run X<perl_run>, require_pv X<require_pv>
-
-=item Functions in file dump.c
-
-pv_display X<pv_display>, pv_escape X<pv_escape>, pv_pretty X<pv_pretty>
-
-=item Functions in file mathoms.c
-
-gv_fetchmethod X<gv_fetchmethod>, pack_cat X<pack_cat>, sv_2pvbyte_nolen
-X<sv_2pvbyte_nolen>, sv_2pvutf8_nolen X<sv_2pvutf8_nolen>, sv_2pv_nolen
-X<sv_2pv_nolen>, sv_catpvn_mg X<sv_catpvn_mg>, sv_catsv_mg X<sv_catsv_mg>,
-sv_force_normal X<sv_force_normal>, sv_iv X<sv_iv>, sv_nolocking
-X<sv_nolocking>, sv_nounlocking X<sv_nounlocking>, sv_nv X<sv_nv>, sv_pv
-X<sv_pv>, sv_pvbyte X<sv_pvbyte>, sv_pvbyten X<sv_pvbyten>, sv_pvn
-X<sv_pvn>, sv_pvutf8 X<sv_pvutf8>, sv_pvutf8n X<sv_pvutf8n>, sv_taint
-X<sv_taint>, sv_unref X<sv_unref>, sv_usepvn X<sv_usepvn>, sv_usepvn_mg
-X<sv_usepvn_mg>, sv_uv X<sv_uv>, unpack_str X<unpack_str>
-
-=item Functions in file pp_ctl.c
-
-find_runcv X<find_runcv>
-
-=item Functions in file pp_pack.c
-
-packlist X<packlist>, unpackstring X<unpackstring>
-
-=item Functions in file pp_sys.c
-
-setdefout X<setdefout>
-
-=item GV Functions
-
-GvSV X<GvSV>, gv_const_sv X<gv_const_sv>, gv_fetchmeth X<gv_fetchmeth>,
-gv_fetchmethod_autoload X<gv_fetchmethod_autoload>, gv_fetchmeth_autoload
-X<gv_fetchmeth_autoload>, gv_stashpv X<gv_stashpv>, gv_stashpvn
-X<gv_stashpvn>, gv_stashpvs X<gv_stashpvs>, gv_stashsv X<gv_stashsv>
-
-=item Handy Values
-
-Nullav X<Nullav>, Nullch X<Nullch>, Nullcv X<Nullcv>, Nullhv X<Nullhv>,
-Nullsv X<Nullsv>
-
-=item Hash Manipulation Functions
-
-get_hv X<get_hv>, HEf_SVKEY X<HEf_SVKEY>, HeHASH X<HeHASH>, HeKEY X<HeKEY>,
-HeKLEN X<HeKLEN>, HePV X<HePV>, HeSVKEY X<HeSVKEY>, HeSVKEY_force
-X<HeSVKEY_force>, HeSVKEY_set X<HeSVKEY_set>, HeUTF8 X<HeUTF8>, HeVAL
-X<HeVAL>, HvNAME X<HvNAME>, hv_assert X<hv_assert>, hv_clear X<hv_clear>,
-hv_clear_placeholders X<hv_clear_placeholders>, hv_delete X<hv_delete>,
-hv_delete_ent X<hv_delete_ent>, hv_exists X<hv_exists>, hv_exists_ent
-X<hv_exists_ent>, hv_fetch X<hv_fetch>, hv_fetchs X<hv_fetchs>,
-hv_fetch_ent X<hv_fetch_ent>, hv_iterinit X<hv_iterinit>, hv_iterkey
-X<hv_iterkey>, hv_iterkeysv X<hv_iterkeysv>, hv_iternext X<hv_iternext>,
-hv_iternextsv X<hv_iternextsv>, hv_iternext_flags X<hv_iternext_flags>,
-hv_iterval X<hv_iterval>, hv_magic X<hv_magic>, hv_scalar X<hv_scalar>,
-hv_store X<hv_store>, hv_stores X<hv_stores>, hv_store_ent X<hv_store_ent>,
-hv_undef X<hv_undef>, newHV X<newHV>
-
-=item Magical Functions
-
-mg_clear X<mg_clear>, mg_copy X<mg_copy>, mg_find X<mg_find>, mg_free
-X<mg_free>, mg_get X<mg_get>, mg_length X<mg_length>, mg_magical
-X<mg_magical>, mg_set X<mg_set>, SvGETMAGIC X<SvGETMAGIC>, SvLOCK
-X<SvLOCK>, SvSETMAGIC X<SvSETMAGIC>, SvSetMagicSV X<SvSetMagicSV>,
-SvSetMagicSV_nosteal X<SvSetMagicSV_nosteal>, SvSetSV X<SvSetSV>,
-SvSetSV_nosteal X<SvSetSV_nosteal>, SvSHARE X<SvSHARE>, SvUNLOCK
-X<SvUNLOCK>
-
-=item Memory Management
-
-Copy X<Copy>, CopyD X<CopyD>, Move X<Move>, MoveD X<MoveD>, Newx X<Newx>,
-Newxc X<Newxc>, Newxz X<Newxz>, Poison X<Poison>, PoisonFree X<PoisonFree>,
-PoisonNew X<PoisonNew>, PoisonWith X<PoisonWith>, Renew X<Renew>, Renewc
-X<Renewc>, Safefree X<Safefree>, savepv X<savepv>, savepvn X<savepvn>,
-savepvs X<savepvs>, savesharedpv X<savesharedpv>, savesharedpvn
-X<savesharedpvn>, savesvpv X<savesvpv>, StructCopy X<StructCopy>, Zero
-X<Zero>, ZeroD X<ZeroD>
-
-=item Miscellaneous Functions
-
-fbm_compile X<fbm_compile>, fbm_instr X<fbm_instr>, form X<form>, getcwd_sv
-X<getcwd_sv>, my_snprintf X<my_snprintf>, my_sprintf X<my_sprintf>,
-my_vsnprintf X<my_vsnprintf>, new_version X<new_version>, scan_version
-X<scan_version>, strEQ X<strEQ>, strGE X<strGE>, strGT X<strGT>, strLE
-X<strLE>, strLT X<strLT>, strNE X<strNE>, strnEQ X<strnEQ>, strnNE
-X<strnNE>, sv_destroyable X<sv_destroyable>, sv_nosharing X<sv_nosharing>,
-upg_version X<upg_version>, vcmp X<vcmp>, vnormal X<vnormal>, vnumify
-X<vnumify>, vstringify X<vstringify>, vverify X<vverify>
-
-=item MRO Functions
-
-mro_get_linear_isa X<mro_get_linear_isa>, mro_method_changed_in
-X<mro_method_changed_in>
-
-=item Multicall Functions
-
-dMULTICALL X<dMULTICALL>, MULTICALL X<MULTICALL>, POP_MULTICALL
-X<POP_MULTICALL>, PUSH_MULTICALL X<PUSH_MULTICALL>
-
-=item Numeric functions
-
-grok_bin X<grok_bin>, grok_hex X<grok_hex>, grok_number X<grok_number>,
-grok_numeric_radix X<grok_numeric_radix>, grok_oct X<grok_oct>,
-Perl_signbit X<Perl_signbit>, scan_bin X<scan_bin>, scan_hex X<scan_hex>,
-scan_oct X<scan_oct>
-
-=item Optree Manipulation Functions
-
-cv_const_sv X<cv_const_sv>, newCONSTSUB X<newCONSTSUB>, newXS X<newXS>
-
-=item Pad Data Structures
-
-pad_sv X<pad_sv>
-
-=item Per-Interpreter Variables
-
-PL_modglobal X<PL_modglobal>, PL_na X<PL_na>, PL_sv_no X<PL_sv_no>,
-PL_sv_undef X<PL_sv_undef>, PL_sv_yes X<PL_sv_yes>
-
-=item REGEXP Functions
-
-SvRX X<SvRX>, SvRXOK X<SvRXOK>
-
-=item Simple Exception Handling Macros
-
-dXCPT X<dXCPT>, XCPT_CATCH X<XCPT_CATCH>, XCPT_RETHROW X<XCPT_RETHROW>,
-XCPT_TRY_END X<XCPT_TRY_END>, XCPT_TRY_START X<XCPT_TRY_START>
-
-=item Stack Manipulation Macros
-
-dMARK X<dMARK>, dORIGMARK X<dORIGMARK>, dSP X<dSP>, EXTEND X<EXTEND>, MARK
-X<MARK>, mPUSHi X<mPUSHi>, mPUSHn X<mPUSHn>, mPUSHp X<mPUSHp>, mPUSHs
-X<mPUSHs>, mPUSHu X<mPUSHu>, mXPUSHi X<mXPUSHi>, mXPUSHn X<mXPUSHn>,
-mXPUSHp X<mXPUSHp>, mXPUSHs X<mXPUSHs>, mXPUSHu X<mXPUSHu>, ORIGMARK
-X<ORIGMARK>, POPi X<POPi>, POPl X<POPl>, POPn X<POPn>, POPp X<POPp>,
-POPpbytex X<POPpbytex>, POPpx X<POPpx>, POPs X<POPs>, PUSHi X<PUSHi>,
-PUSHMARK X<PUSHMARK>, PUSHmortal X<PUSHmortal>, PUSHn X<PUSHn>, PUSHp
-X<PUSHp>, PUSHs X<PUSHs>, PUSHu X<PUSHu>, PUTBACK X<PUTBACK>, SP X<SP>,
-SPAGAIN X<SPAGAIN>, XPUSHi X<XPUSHi>, XPUSHmortal X<XPUSHmortal>, XPUSHn
-X<XPUSHn>, XPUSHp X<XPUSHp>, XPUSHs X<XPUSHs>, XPUSHu X<XPUSHu>, XSRETURN
-X<XSRETURN>, XSRETURN_EMPTY X<XSRETURN_EMPTY>, XSRETURN_IV X<XSRETURN_IV>,
-XSRETURN_NO X<XSRETURN_NO>, XSRETURN_NV X<XSRETURN_NV>, XSRETURN_PV
-X<XSRETURN_PV>, XSRETURN_UNDEF X<XSRETURN_UNDEF>, XSRETURN_UV
-X<XSRETURN_UV>, XSRETURN_YES X<XSRETURN_YES>, XST_mIV X<XST_mIV>, XST_mNO
-X<XST_mNO>, XST_mNV X<XST_mNV>, XST_mPV X<XST_mPV>, XST_mUNDEF
-X<XST_mUNDEF>, XST_mYES X<XST_mYES>
-
-=item SV Flags
-
-svtype X<svtype>, SVt_IV X<SVt_IV>, SVt_NV X<SVt_NV>, SVt_PV X<SVt_PV>,
-SVt_PVAV X<SVt_PVAV>, SVt_PVCV X<SVt_PVCV>, SVt_PVHV X<SVt_PVHV>, SVt_PVMG
-X<SVt_PVMG>
-
-=item SV Manipulation Functions
-
-croak_xs_usage X<croak_xs_usage>, get_sv X<get_sv>, newRV_inc X<newRV_inc>,
-newSVpvn_utf8 X<newSVpvn_utf8>, SvCUR X<SvCUR>, SvCUR_set X<SvCUR_set>,
-SvEND X<SvEND>, SvGAMAGIC X<SvGAMAGIC>, SvGROW X<SvGROW>, SvIOK X<SvIOK>,
-SvIOKp X<SvIOKp>, SvIOK_notUV X<SvIOK_notUV>, SvIOK_off X<SvIOK_off>,
-SvIOK_on X<SvIOK_on>, SvIOK_only X<SvIOK_only>, SvIOK_only_UV
-X<SvIOK_only_UV>, SvIOK_UV X<SvIOK_UV>, SvIsCOW X<SvIsCOW>,
-SvIsCOW_shared_hash X<SvIsCOW_shared_hash>, SvIV X<SvIV>, SvIVX X<SvIVX>,
-SvIVx X<SvIVx>, SvIV_nomg X<SvIV_nomg>, SvIV_set X<SvIV_set>, SvLEN
-X<SvLEN>, SvLEN_set X<SvLEN_set>, SvMAGIC_set X<SvMAGIC_set>, SvNIOK
-X<SvNIOK>, SvNIOKp X<SvNIOKp>, SvNIOK_off X<SvNIOK_off>, SvNOK X<SvNOK>,
-SvNOKp X<SvNOKp>, SvNOK_off X<SvNOK_off>, SvNOK_on X<SvNOK_on>, SvNOK_only
-X<SvNOK_only>, SvNV X<SvNV>, SvNVX X<SvNVX>, SvNVx X<SvNVx>, SvNV_set
-X<SvNV_set>, SvOK X<SvOK>, SvOOK X<SvOOK>, SvOOK_offset X<SvOOK_offset>,
-SvPOK X<SvPOK>, SvPOKp X<SvPOKp>, SvPOK_off X<SvPOK_off>, SvPOK_on
-X<SvPOK_on>, SvPOK_only X<SvPOK_only>, SvPOK_only_UTF8 X<SvPOK_only_UTF8>,
-SvPV X<SvPV>, SvPVbyte X<SvPVbyte>, SvPVbytex X<SvPVbytex>, SvPVbytex_force
-X<SvPVbytex_force>, SvPVbyte_force X<SvPVbyte_force>, SvPVbyte_nolen
-X<SvPVbyte_nolen>, SvPVutf8 X<SvPVutf8>, SvPVutf8x X<SvPVutf8x>,
-SvPVutf8x_force X<SvPVutf8x_force>, SvPVutf8_force X<SvPVutf8_force>,
-SvPVutf8_nolen X<SvPVutf8_nolen>, SvPVX X<SvPVX>, SvPVx X<SvPVx>,
-SvPV_force X<SvPV_force>, SvPV_force_nomg X<SvPV_force_nomg>, SvPV_nolen
-X<SvPV_nolen>, SvPV_nomg X<SvPV_nomg>, SvPV_set X<SvPV_set>, SvREFCNT
-X<SvREFCNT>, SvREFCNT_dec X<SvREFCNT_dec>, SvREFCNT_inc X<SvREFCNT_inc>,
-SvREFCNT_inc_NN X<SvREFCNT_inc_NN>, SvREFCNT_inc_simple
-X<SvREFCNT_inc_simple>, SvREFCNT_inc_simple_NN X<SvREFCNT_inc_simple_NN>,
-SvREFCNT_inc_simple_void X<SvREFCNT_inc_simple_void>,
-SvREFCNT_inc_simple_void_NN X<SvREFCNT_inc_simple_void_NN>,
-SvREFCNT_inc_void X<SvREFCNT_inc_void>, SvREFCNT_inc_void_NN
-X<SvREFCNT_inc_void_NN>, SvROK X<SvROK>, SvROK_off X<SvROK_off>, SvROK_on
-X<SvROK_on>, SvRV X<SvRV>, SvRV_set X<SvRV_set>, SvSTASH X<SvSTASH>,
-SvSTASH_set X<SvSTASH_set>, SvTAINT X<SvTAINT>, SvTAINTED X<SvTAINTED>,
-SvTAINTED_off X<SvTAINTED_off>, SvTAINTED_on X<SvTAINTED_on>, SvTRUE
-X<SvTRUE>, SvTYPE X<SvTYPE>, SvUOK X<SvUOK>, SvUPGRADE X<SvUPGRADE>, SvUTF8
-X<SvUTF8>, SvUTF8_off X<SvUTF8_off>, SvUTF8_on X<SvUTF8_on>, SvUV X<SvUV>,
-SvUVX X<SvUVX>, SvUVx X<SvUVx>, SvUV_nomg X<SvUV_nomg>, SvUV_set
-X<SvUV_set>, SvVOK X<SvVOK>, sv_catpvn_nomg X<sv_catpvn_nomg>,
-sv_catsv_nomg X<sv_catsv_nomg>, sv_derived_from X<sv_derived_from>, sv_does
-X<sv_does>, sv_report_used X<sv_report_used>, sv_setsv_nomg
-X<sv_setsv_nomg>, sv_utf8_upgrade_nomg X<sv_utf8_upgrade_nomg>
-
-=item SV-Body Allocation
-
-looks_like_number X<looks_like_number>, newRV_noinc X<newRV_noinc>, newSV
-X<newSV>, newSVhek X<newSVhek>, newSViv X<newSViv>, newSVnv X<newSVnv>,
-newSVpv X<newSVpv>, newSVpvf X<newSVpvf>, newSVpvn X<newSVpvn>,
-newSVpvn_flags X<newSVpvn_flags>, newSVpvn_share X<newSVpvn_share>,
-newSVpvs X<newSVpvs>, newSVpvs_flags X<newSVpvs_flags>, newSVpvs_share
-X<newSVpvs_share>, newSVrv X<newSVrv>, newSVsv X<newSVsv>, newSVuv
-X<newSVuv>, newSV_type X<newSV_type>, sv_2bool X<sv_2bool>, sv_2cv
-X<sv_2cv>, sv_2io X<sv_2io>, sv_2iv_flags X<sv_2iv_flags>, sv_2mortal
-X<sv_2mortal>, sv_2nv X<sv_2nv>, sv_2pvbyte X<sv_2pvbyte>, sv_2pvutf8
-X<sv_2pvutf8>, sv_2pv_flags X<sv_2pv_flags>, sv_2uv_flags X<sv_2uv_flags>,
-sv_backoff X<sv_backoff>, sv_bless X<sv_bless>, sv_catpv X<sv_catpv>,
-sv_catpvf X<sv_catpvf>, sv_catpvf_mg X<sv_catpvf_mg>, sv_catpvn
-X<sv_catpvn>, sv_catpvn_flags X<sv_catpvn_flags>, sv_catpvs X<sv_catpvs>,
-sv_catpv_mg X<sv_catpv_mg>, sv_catsv X<sv_catsv>, sv_catsv_flags
-X<sv_catsv_flags>, sv_chop X<sv_chop>, sv_clear X<sv_clear>, sv_cmp
-X<sv_cmp>, sv_cmp_locale X<sv_cmp_locale>, sv_collxfrm X<sv_collxfrm>,
-sv_copypv X<sv_copypv>, sv_dec X<sv_dec>, sv_eq X<sv_eq>,
-sv_force_normal_flags X<sv_force_normal_flags>, sv_free X<sv_free>, sv_gets
-X<sv_gets>, sv_grow X<sv_grow>, sv_inc X<sv_inc>, sv_insert X<sv_insert>,
-sv_insert_flags X<sv_insert_flags>, sv_isa X<sv_isa>, sv_isobject
-X<sv_isobject>, sv_len X<sv_len>, sv_len_utf8 X<sv_len_utf8>, sv_magic
-X<sv_magic>, sv_magicext X<sv_magicext>, sv_mortalcopy X<sv_mortalcopy>,
-sv_newmortal X<sv_newmortal>, sv_newref X<sv_newref>, sv_pos_b2u
-X<sv_pos_b2u>, sv_pos_u2b X<sv_pos_u2b>, sv_pvbyten_force
-X<sv_pvbyten_force>, sv_pvn_force X<sv_pvn_force>, sv_pvn_force_flags
-X<sv_pvn_force_flags>, sv_pvutf8n_force X<sv_pvutf8n_force>, sv_reftype
-X<sv_reftype>, sv_replace X<sv_replace>, sv_reset X<sv_reset>, sv_rvweaken
-X<sv_rvweaken>, sv_setiv X<sv_setiv>, sv_setiv_mg X<sv_setiv_mg>, sv_setnv
-X<sv_setnv>, sv_setnv_mg X<sv_setnv_mg>, sv_setpv X<sv_setpv>, sv_setpvf
-X<sv_setpvf>, sv_setpvf_mg X<sv_setpvf_mg>, sv_setpviv X<sv_setpviv>,
-sv_setpviv_mg X<sv_setpviv_mg>, sv_setpvn X<sv_setpvn>, sv_setpvn_mg
-X<sv_setpvn_mg>, sv_setpvs X<sv_setpvs>, sv_setpv_mg X<sv_setpv_mg>,
-sv_setref_iv X<sv_setref_iv>, sv_setref_nv X<sv_setref_nv>, sv_setref_pv
-X<sv_setref_pv>, sv_setref_pvn X<sv_setref_pvn>, sv_setref_uv
-X<sv_setref_uv>, sv_setsv X<sv_setsv>, sv_setsv_flags X<sv_setsv_flags>,
-sv_setsv_mg X<sv_setsv_mg>, sv_setuv X<sv_setuv>, sv_setuv_mg
-X<sv_setuv_mg>, sv_tainted X<sv_tainted>, sv_true X<sv_true>, sv_unmagic
-X<sv_unmagic>, sv_unref_flags X<sv_unref_flags>, sv_untaint X<sv_untaint>,
-sv_upgrade X<sv_upgrade>, sv_usepvn_flags X<sv_usepvn_flags>,
-sv_utf8_decode X<sv_utf8_decode>, sv_utf8_downgrade X<sv_utf8_downgrade>,
-sv_utf8_encode X<sv_utf8_encode>, sv_utf8_upgrade X<sv_utf8_upgrade>,
-sv_utf8_upgrade_flags X<sv_utf8_upgrade_flags>, sv_vcatpvf X<sv_vcatpvf>,
-sv_vcatpvfn X<sv_vcatpvfn>, sv_vcatpvf_mg X<sv_vcatpvf_mg>, sv_vsetpvf
-X<sv_vsetpvf>, sv_vsetpvfn X<sv_vsetpvfn>, sv_vsetpvf_mg X<sv_vsetpvf_mg>
-
-=item Unicode Support
-
-bytes_from_utf8 X<bytes_from_utf8>, bytes_to_utf8 X<bytes_to_utf8>,
-ibcmp_utf8 X<ibcmp_utf8>, is_utf8_char X<is_utf8_char>, is_utf8_string
-X<is_utf8_string>, is_utf8_string_loc X<is_utf8_string_loc>,
-is_utf8_string_loclen X<is_utf8_string_loclen>, pv_uni_display
-X<pv_uni_display>, sv_cat_decode X<sv_cat_decode>, sv_recode_to_utf8
-X<sv_recode_to_utf8>, sv_uni_display X<sv_uni_display>, to_utf8_case
-X<to_utf8_case>, to_utf8_fold X<to_utf8_fold>, to_utf8_lower
-X<to_utf8_lower>, to_utf8_title X<to_utf8_title>, to_utf8_upper
-X<to_utf8_upper>, utf8n_to_uvchr X<utf8n_to_uvchr>, utf8n_to_uvuni
-X<utf8n_to_uvuni>, utf8_distance X<utf8_distance>, utf8_hop X<utf8_hop>,
-utf8_length X<utf8_length>, utf8_to_bytes X<utf8_to_bytes>, utf8_to_uvchr
-X<utf8_to_uvchr>, utf8_to_uvuni X<utf8_to_uvuni>, uvchr_to_utf8
-X<uvchr_to_utf8>, uvuni_to_utf8_flags X<uvuni_to_utf8_flags>
-
-=item Variables created by C<xsubpp> and C<xsubpp> internal functions
-
-ax X<ax>, CLASS X<CLASS>, dAX X<dAX>, dAXMARK X<dAXMARK>, dITEMS X<dITEMS>,
-dUNDERBAR X<dUNDERBAR>, dXSARGS X<dXSARGS>, dXSI32 X<dXSI32>, items
-X<items>, ix X<ix>, newXSproto X<newXSproto>, RETVAL X<RETVAL>, ST X<ST>,
-THIS X<THIS>, UNDERBAR X<UNDERBAR>, XS X<XS>, XS_VERSION X<XS_VERSION>,
-XS_VERSION_BOOTCHECK X<XS_VERSION_BOOTCHECK>
-
-=item Warning and Dieing
-
-croak X<croak>, warn X<warn>
-
-=item AUTHORS
-
-=item SEE ALSO
-
-=back
-
-=head2 perlintern - autogenerated documentation of purely B<internal>
- Perl functions
-
-=over 4
-
-=item DESCRIPTION
-X<internal Perl functions> X<interpreter functions>
-
-=item CV reference counts and CvOUTSIDE
-
-CvWEAKOUTSIDE X<CvWEAKOUTSIDE>
-
-=item Functions in file pad.h
-
-CX_CURPAD_SAVE X<CX_CURPAD_SAVE>, CX_CURPAD_SV X<CX_CURPAD_SV>, PAD_BASE_SV
-X<PAD_BASE_SV>, PAD_CLONE_VARS X<PAD_CLONE_VARS>, PAD_COMPNAME_FLAGS
-X<PAD_COMPNAME_FLAGS>, PAD_COMPNAME_GEN X<PAD_COMPNAME_GEN>,
-PAD_COMPNAME_GEN_set X<PAD_COMPNAME_GEN_set>, PAD_COMPNAME_OURSTASH
-X<PAD_COMPNAME_OURSTASH>, PAD_COMPNAME_PV X<PAD_COMPNAME_PV>,
-PAD_COMPNAME_TYPE X<PAD_COMPNAME_TYPE>, PAD_DUP X<PAD_DUP>,
-PAD_RESTORE_LOCAL X<PAD_RESTORE_LOCAL>, PAD_SAVE_LOCAL X<PAD_SAVE_LOCAL>,
-PAD_SAVE_SETNULLPAD X<PAD_SAVE_SETNULLPAD>, PAD_SETSV X<PAD_SETSV>,
-PAD_SET_CUR X<PAD_SET_CUR>, PAD_SET_CUR_NOSAVE X<PAD_SET_CUR_NOSAVE>,
-PAD_SV X<PAD_SV>, PAD_SVl X<PAD_SVl>, SAVECLEARSV X<SAVECLEARSV>,
-SAVECOMPPAD X<SAVECOMPPAD>, SAVEPADSV X<SAVEPADSV>
-
-=item GV Functions
-
-is_gv_magical_sv X<is_gv_magical_sv>
-
-=item Hash Manipulation Functions
-
-refcounted_he_chain_2hv X<refcounted_he_chain_2hv>, refcounted_he_free
-X<refcounted_he_free>, refcounted_he_new X<refcounted_he_new>
-
-=item IO Functions
-
-start_glob X<start_glob>
-
-=item Magical Functions
-
-magic_clearhint X<magic_clearhint>, magic_sethint X<magic_sethint>,
-mg_localize X<mg_localize>
-
-=item MRO Functions
-
-mro_get_linear_isa_c3 X<mro_get_linear_isa_c3>, mro_get_linear_isa_dfs
-X<mro_get_linear_isa_dfs>, mro_isa_changed_in X<mro_isa_changed_in>
-
-=item Pad Data Structures
-
-CvPADLIST X<CvPADLIST>, cv_clone X<cv_clone>, cv_dump X<cv_dump>,
-do_dump_pad X<do_dump_pad>, intro_my X<intro_my>, pad_add_anon
-X<pad_add_anon>, pad_add_name X<pad_add_name>, pad_alloc X<pad_alloc>,
-pad_block_start X<pad_block_start>, pad_check_dup X<pad_check_dup>,
-pad_findlex X<pad_findlex>, pad_findmy X<pad_findmy>, pad_fixup_inner_anons
-X<pad_fixup_inner_anons>, pad_free X<pad_free>, pad_leavemy X<pad_leavemy>,
-pad_new X<pad_new>, pad_push X<pad_push>, pad_reset X<pad_reset>, pad_setsv
-X<pad_setsv>, pad_swipe X<pad_swipe>, pad_tidy X<pad_tidy>, pad_undef
-X<pad_undef>
-
-=item Per-Interpreter Variables
-
-PL_DBsingle X<PL_DBsingle>, PL_DBsub X<PL_DBsub>, PL_DBtrace X<PL_DBtrace>,
-PL_dowarn X<PL_dowarn>, PL_last_in_gv X<PL_last_in_gv>, PL_ofsgv
-X<PL_ofsgv>, PL_rs X<PL_rs>
-
-=item Stack Manipulation Macros
-
-djSP X<djSP>, LVRET X<LVRET>
-
-=item SV Manipulation Functions
-
-sv_add_arena X<sv_add_arena>, sv_clean_all X<sv_clean_all>, sv_clean_objs
-X<sv_clean_objs>, sv_free_arenas X<sv_free_arenas>
-
-=item SV-Body Allocation
-
-sv_2num X<sv_2num>
-
-=item Unicode Support
-
-find_uninit_var X<find_uninit_var>, report_uninit X<report_uninit>
-
-=item AUTHORS
-
-=item SEE ALSO
-
-=back
-
-=head2 perliol - C API for Perl's implementation of IO in Layers.
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item History and Background
-
-=item Basic Structure
-
-=item Layers vs Disciplines
-
-=item Data Structures
-
-=item Functions and Attributes
-
-=item Per-instance Data
-
-=item Layers in action.
-
-=item Per-instance flag bits
-
-PERLIO_F_EOF, PERLIO_F_CANWRITE, PERLIO_F_CANREAD, PERLIO_F_ERROR,
-PERLIO_F_TRUNCATE, PERLIO_F_APPEND, PERLIO_F_CRLF, PERLIO_F_UTF8,
-PERLIO_F_UNBUF, PERLIO_F_WRBUF, PERLIO_F_RDBUF, PERLIO_F_LINEBUF,
-PERLIO_F_TEMP, PERLIO_F_OPEN, PERLIO_F_FASTGETS
-
-=item Methods in Detail
-
-fsize, name, size, kind, PERLIO_K_BUFFERED, PERLIO_K_RAW, PERLIO_K_CANCRLF,
-PERLIO_K_FASTGETS, PERLIO_K_MULTIARG, Pushed, Popped, Open, Binmode,
-Getarg, Fileno, Dup, Read, Write, Seek, Tell, Close, Flush, Fill, Eof,
-Error, Clearerr, Setlinebuf, Get_base, Get_bufsiz, Get_ptr, Get_cnt,
-Set_ptrcnt
-
-=item Utilities
-
-=item Implementing PerlIO Layers
-
-C implementations, Perl implementations
-
-=item Core Layers
-
-"unix", "perlio", "stdio", "crlf", "mmap", "pending", "raw", "utf8"
-
-=item Extension Layers
-
-":encoding", ":scalar", ":via"
-
-=back
-
-=item TODO
-
-=back
-
-=head2 perlapio - perl's IO abstraction interface.
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-1. USE_STDIO, 2. USE_SFIO, 3. USE_PERLIO, B<PerlIO_stdin()>,
-B<PerlIO_stdout()>, B<PerlIO_stderr()>, B<PerlIO_open(path, mode)>,
-B<PerlIO_fdopen(fd,mode)>, B<PerlIO_reopen(path,mode,f)>,
-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(f,s)>,
-B<PerlIO_putc(f,c)>, B<PerlIO_ungetc(f,c)>, 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_seek(f,offset,whence)>,
-B<PerlIO_tell(f)>, B<PerlIO_getpos(f,p)>, B<PerlIO_setpos(f,p)>,
-B<PerlIO_rewind(f)>, B<PerlIO_tmpfile()>, B<PerlIO_setlinebuf(f)>
-
-=over 4
-
-=item Co-existence with stdio
-
-B<PerlIO_importFILE(f,mode)>, B<PerlIO_exportFILE(f,mode)>,
-B<PerlIO_releaseFILE(p,f)>, B<PerlIO_findFILE(f)>
-
-=item "Fast gets" Functions
-
-B<PerlIO_fast_gets(f)>, B<PerlIO_has_cntptr(f)>, B<PerlIO_get_cnt(f)>,
-B<PerlIO_get_ptr(f)>, B<PerlIO_set_ptrcnt(f,p,c)>, B<PerlIO_canset_cnt(f)>,
-B<PerlIO_set_cnt(f,c)>, B<PerlIO_has_base(f)>, B<PerlIO_get_base(f)>,
-B<PerlIO_get_bufsiz(f)>
-
-=item Other Functions
-
-PerlIO_apply_layers(f,mode,layers), PerlIO_binmode(f,ptype,imode,layers),
-'E<lt>' read, 'E<gt>' write, '+' read/write, PerlIO_debug(fmt,...)
-
-=back
-
-=back
-
-=head2 perlhack - How to hack at the Perl internals
-
-=over 4
-
-=item DESCRIPTION
-
-Does concept match the general goals of Perl?, Where is the
-implementation?, Backwards compatibility, Could it be a module instead?, Is
-the feature generic enough?, Does it potentially introduce new bugs?, Does
-it preclude other desirable features?, Is the implementation robust?, Is
-the implementation generic enough to be portable?, Is the implementation
-tested?, Is there enough documentation?, Is there another way to do it?,
-Does it create too much work?, Patches speak louder than words
-
-=over 4
-
-=item Keeping in sync
-
-rsync'ing the source tree, Using rsync over the LAN, Using pushing over the
-NFS, rsync'ing the patches
-
-=item Why rsync the source tree
-
-It's easier to rsync the source tree, It's more reliable
-
-=item Why rsync the patches
-
-It's easier to rsync the patches, It's a good reference, Finding a start
-point, Finding how to fix a bug, Finding the source of misbehaviour
-
-=item Working with the source
-
-=item Perlbug administration
-
-=item Submitting patches
-
-L<perlguts>, L<perlxstut> and L<perlxs>, L<perlapi>,
-F<Porting/pumpkin.pod>, The perl5-porters FAQ
-
-=item Finding Your Way Around
-
-Core modules, Tests, Documentation, Configure, Interpreter
-
-=item Elements of the interpreter
-
-Startup, Parsing, Optimization, Running, Exception handing
-
-=item Internal Variable Types
-
-=item Op Trees
-
-=item Stacks
-
-Argument stack, Mark stack, Save stack
-
-=item Millions of Macros
-
-=item The .i Targets
-
-=back
-
-=item SOURCE CODE STATIC ANALYSIS
-
-=over 4
-
-=item lint, splint
-
-=item Coverity
-
-=item cpd (cut-and-paste detector)
-
-=item gcc warnings
-
-=item Warnings of other C compilers
-
-=item DEBUGGING
-
-=item Poking at Perl
-
-=item Using a source-level debugger
-
-run [args], break function_name, break source.c:xxx, step, next, continue,
-finish, 'enter', print
-
-=item gdb macro support
-
-=item Dumping Perl Data Structures
-
-=item Patching
-
-=item Patching a core module
-
-=item Adding a new function to the core
-
-=item Writing a test
-
-F<t/base/>, F<t/cmd/>, F<t/comp/>, F<t/io/>, F<t/lib/>, F<t/mro/>,
-F<t/op/>, F<t/pod/>, F<t/run/>, F<t/uni/>, F<t/win32/>, F<t/x2p>, t/base
-t/comp, t/cmd t/run t/io t/op, t/lib ext lib
-
-=item Special Make Test Targets
-
-coretest, test.deparse, test.taintwarn, minitest, test.valgrind
-check.valgrind utest.valgrind ucheck.valgrind, test.third check.third
-utest.third ucheck.third, test.torture torturetest, utest ucheck test.utf8
-check.utf8, minitest.utf16 test.utf16, test_harness, test-notty test_notty
-
-=item Running tests by hand
-
--v, -torture, -re=PATTERN, -re LIST OF PATTERNS, PERL_CORE=1,
-PERL_DESTRUCT_LEVEL=2, PERL, PERL_SKIP_TTY_TEST, PERL_TEST_Net_Ping,
-PERL_TEST_NOVREXX, PERL_TEST_NUMCONVERTS
-
-=item Common problems when patching Perl source code
-
-=item Perl environment problems
-
-=item Portability problems
-
-=item Problematic System Interfaces
-
-=item Security problems
-
-=back
-
-=item EXTERNAL TOOLS FOR DEBUGGING PERL
-
-=over 4
-
-=item Rational Software's Purify
-
-=item Purify on Unix
-
--Accflags=-DPURIFY, -Doptimize='-g', -Uusemymalloc, -Dusemultiplicity
-
-=item Purify on NT
-
-DEFINES, USE_MULTI = define, #PERL_MALLOC = define, CFG = Debug
-
-=item valgrind
-
-=item Compaq's/Digital's/HP's Third Degree
-
-=item PERL_DESTRUCT_LEVEL
-
-=item PERL_MEM_LOG
-
-=item Profiling
-
-=item Gprof Profiling
-
--a, -b, -e routine, -f routine, -s, -z
-
-=item GCC gcov Profiling
-
-=item Pixie Profiling
-
--h, -l, -p[rocedures], -h[eavy], -i[nvocations], -l[ines], -testcoverage,
--z[ero]
-
-=item Miscellaneous tricks
-
-=back
-
-=item CONCLUSION
-
-I<The Road goes ever on and on, down from the door where it began.>
-
-=over 4
-
-=item Metaphoric Quotations
-
-=back
-
-=item AUTHOR
-
-=back
-
-=head2 perlrepository - Using the Perl source repository
-
-=over 4
-
-=item SYNOPSIS
-
-=item GETTING ACCESS TO THE REPOSITORY
-
-=over 4
-
-=item READ ACCESS VIA THE WEB
-
-=item READ ACCESS VIA GIT
-
-=item WRITE ACCESS TO THE REPOSITORY
-
-=back
-
-=item OVERVIEW OF THE REPOSITORY
-
-=over 4
-
-=item FINDING OUT YOUR STATUS
-
-=back
-
-=item SUBMITTING A PATCH
-
-=item ACCEPTING A PATCH
-
-=back
-
-=head2 perlbook - Perl book information
-
-=over 4
-
-=item DESCRIPTION
-
-=back
-
-=head2 perlcommunity - a brief overview of the Perl community
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Where to find the community
-
-=item Mailing lists and Newsgroups
-
-=item IRC
-
-=item Websites
-
-L<http://perl.com/>, L<http://use.perl.org/>, L<http://www.perlmonks.org/>
-
-=item User Groups
-
-=item Workshops
-
-=item Hackathons
-
-=item Conventions
-
-=item Calendar of Perl Events
-
-=back
-
-=item AUTHOR
-
-=back
-
-=head2 perltodo - Perl TO-DO List
-
-=over 4
-
-=item DESCRIPTION
-
-=item Tasks that only need Perl knowledge
-
-=over 4
-
-=item Smartmatch design issues
-
-=item Remove duplication of test setup.
-
-=item POD -E<gt> HTML conversion in the core still sucks
-
-=item merge checkpods and podchecker
-
-=item Parallel testing
-
-=item Make Schwern poorer
-
-=item Improve the coverage of the core tests
-
-=item test B
-
-=item A decent benchmark
-
-=item fix tainting bugs
-
-=item Dual life everything
-
-=item Bundle dual life modules in ext/
-
-=item POSIX memory footprint
-
-=item embed.pl/makedef.pl
-
-=item use strict; and AutoLoad
-
-=item profile installman
-
-=back
-
-=item Tasks that need a little sysadmin-type knowledge
-
-=over 4
-
-=item make HTML install work
-
-=item compressed man pages
-
-=item Add a code coverage target to the Makefile
-
-=item Make Config.pm cope with differences between built and installed perl
-
-=item linker specification files
-
-=item Cross-compile support
-
-=item roffitall
-
-=item Split "linker" from "compiler"
-
-C<cc> (in F<cc.U>), C<ld> (in F<dlsrc.U>)
-
-=back
-
-=item Tasks that need a little C knowledge
-
-=over 4
-
-=item Weed out needless PERL_UNUSED_ARG
-
-=item Modernize the order of directories in @INC
-
-=item -Duse32bit*
-
-=item Make it clear from -v if this is the exact official release
-
-=item Profile Perl - am I hot or not?
-
-=item Allocate OPs from arenas
-
-=item Improve win32/wince.c
-
-=item Use secure CRT functions when building with VC8 on Win32
-
-=item Fix POSIX::access() and chdir() on Win32
-
-=item strcat(), strcpy(), strncat(), strncpy(), sprintf(), vsprintf()
-
-=item -D_FORTIFY_SOURCE=2, -fstack-protector
-
-=item Arenas for GPs? For MAGIC?
-
-=item Shared arenas
-
-=back
-
-=item Tasks that need a knowledge of XS
-
-=over 4
-
-=item safely supporting POSIX SA_SIGINFO
-
-=item autovivification
-
-=item Unicode in Filenames
-
-=item Unicode in %ENV
-
-=item Unicode and glob()
-
-=item Unicode and lc/uc operators
-
-=item use less 'memory'
-
-=item Re-implement C<:unique> in a way that is actually thread-safe
-
-=item Make tainting consistent
-
-=item readpipe(LIST)
-
-=item Audit the code for destruction ordering assumptions
-
-=item Extend PerlIO and PerlIO::Scalar
-
-=item -C on the #! line
-
-=item Organize error messages
-
-=back
-
-=item Tasks that need a knowledge of the interpreter
-
-=over 4
-
-=item error reporting of [$a ; $b]
-
-=item lexicals used only once
-
-=item UTF-8 revamp
-
-=item Properly Unicode safe tokeniser and pads.
-
-=item state variable initialization in list context
-
-=item Implement $value ~~ 0 .. $range
-
-=item A does() built-in
-
-=item Tied filehandles and write() don't mix
-
-=item Attach/detach debugger from running program
-
-=item Optimize away empty destructors
-
-=item LVALUE functions for lists
-
-=item regexp optimiser optional
-
-=item delete &function
-
-=item C</w> regex modifier
-
-=item optional optimizer
-
-=item You WANT *how* many
-
-=item lexical aliases
-
-=item entersub XS vs Perl
-
-=item Self-ties
-
-=item Optimize away @_
-
-=item Virtualize operating system access
-
-=item Investigate PADTMP hash pessimisation
-
-=item Store the current pad in the OP slab allocator
-
-=item repack the optree
-
-=item eliminate incorrect line numbers in warnings
-
-=item optimize tail-calls
-
-=back
-
-=item Big projects
-
-=over 4
-
-=item make ithreads more robust
-
-=item iCOW
-
-=item (?{...}) closures in regexps
-
-=item A re-entrant regexp engine
-
-=item Add class set operations to regexp engine
-
-=back
-
-=back
-
-=head2 perldoc - Look up Perl documentation in Pod format.
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item OPTIONS
-
-B<-h>, B<-D>, B<-t>, B<-u>, B<-m> I<module>, B<-l>, B<-F>, B<-f>
-I<perlfunc>, B<-q> I<perlfaq-search-regexp>, B<-v> I<perlvar>, B<-T>, B<-d>
-I<destination-filename>, B<-o> I<output-formatname>, B<-M> I<module-name>,
-B<-w> I<option:value> or B<-w> I<option>, B<-X>, B<-L> I<language_code>,
-B<PageName|ModuleName|ProgramName>, B<-n> I<some-formatter>, B<-r>, B<-i>,
-B<-V>
-
-=item SECURITY
-
-=item ENVIRONMENT
-
-=item CHANGES
-
-=item AUTHOR
-
-=back
-
-=head2 perlhist - the Perl history records
-
-=over 4
-
-=item DESCRIPTION
-
-=item INTRODUCTION
-
-=item THE KEEPERS OF THE PUMPKIN
-
-=over 4
-
-=item PUMPKIN?
-
-=back
-
-=item THE RECORDS
-
-=over 4
-
-=item SELECTED RELEASE SIZES
-
-=item SELECTED PATCH SIZES
-
-=back
-
-=item THE KEEPERS OF THE RECORDS
-
-=back
-
-=head2 perldelta - what is new for perl v5.11.0
-
-=over 4
-
-=item DESCRIPTION
-
-=item Incompatible Changes
-
-=item Core Enhancements
-
-=item Modules and Pragmata
-
-=item Utility Changes
-
-=item Documentation
-
-=item Performance Enhancements
-
-=item Installation and Configuration Improvements
-
-=item Selected Bug Fixes
-
-=item New or Changed Diagnostics
-
-=item Changed Internals
-
-=item Known Problems
-
-=over 4
-
-=item Platform Specific Problems
-
-=back
-
-=item Reporting Bugs
-
-=item SEE ALSO
-
-=back
-
-=head2 perl5110delta, perldelta - what is new for perl v5.11.0
-
-=over 4
-
-=item DESCRIPTION
-
-=item Incompatible Changes
-
-=item Core Enhancements
-
-=item Modules and Pragmata
-
-=item Utility Changes
-
-=item Documentation
-
-=item Performance Enhancements
-
-=item Installation and Configuration Improvements
-
-=item Selected Bug Fixes
-
-=item New or Changed Diagnostics
-
-=item Changed Internals
-
-=item Known Problems
-
-=over 4
-
-=item Platform Specific Problems
-
-=back
-
-=item Reporting Bugs
-
-=item SEE ALSO
-
-=back
-
-=head2 perl5100delta - what is new for perl 5.10.0
-
-=over 4
-
-=item DESCRIPTION
-
-=item Core Enhancements
-
-=over 4
-
-=item The C<feature> pragma
-
-=item New B<-E> command-line switch
-
-=item Defined-or operator
-
-=item Switch and Smart Match operator
-
-=item Regular expressions
-
-Recursive Patterns, Named Capture Buffers, Possessive Quantifiers,
-Backtracking control verbs, Relative backreferences, C<\K> escape, Vertical
-and horizontal whitespace, and linebreak
-
-=item C<say()>
-
-=item Lexical C<$_>
-
-=item The C<_> prototype
-
-=item UNITCHECK blocks
-
-=item New Pragma, C<mro>
-
-=item readdir() may return a "short filename" on Windows
-
-=item readpipe() is now overridable
-
-=item Default argument for readline()
-
-=item state() variables
-
-=item Stacked filetest operators
-
-=item UNIVERSAL::DOES()
-
-=item Formats
-
-=item Byte-order modifiers for pack() and unpack()
-
-=item C<no VERSION>
-
-=item C<chdir>, C<chmod> and C<chown> on filehandles
-
-=item OS groups
-
-=item Recursive sort subs
-
-=item Exceptions in constant folding
-
-=item Source filters in @INC
-
-=item New internal variables
-
-C<${^RE_DEBUG_FLAGS}>, C<${^CHILD_ERROR_NATIVE}>, C<${^RE_TRIE_MAXBUF}>,
-C<${^WIN32_SLOPPY_STAT}>
-
-=item Miscellaneous
-
-=item UCD 5.0.0
-
-=item MAD
-
-=item kill() on Windows
-
-=back
-
-=item Incompatible Changes
-
-=over 4
-
-=item Packing and UTF-8 strings
-
-=item Byte/character count feature in unpack()
-
-=item The C<$*> and C<$#> variables have been removed
-
-=item substr() lvalues are no longer fixed-length
-
-=item Parsing of C<-f _>
-
-=item C<:unique>
-
-=item Effect of pragmas in eval
-
-=item chdir FOO
-
-=item Handling of .pmc files
-
-=item $^V is now a C<version> object instead of a v-string
-
-=item @- and @+ in patterns
-
-=item $AUTOLOAD can now be tainted
-
-=item Tainting and printf
-
-=item undef and signal handlers
-
-=item strictures and dereferencing in defined()
-
-=item C<(?p{})> has been removed
-
-=item Pseudo-hashes have been removed
-
-=item Removal of the bytecode compiler and of perlcc
-
-=item Removal of the JPL
-
-=item Recursive inheritance detected earlier
-
-=back
-
-=item Modules and Pragmata
-
-=over 4
-
-=item Upgrading individual core modules
-
-=item Pragmata Changes
-
-C<feature>, C<mro>, Scoping of the C<sort> pragma, Scoping of C<bignum>,
-C<bigint>, C<bigrat>, C<base>, C<strict> and C<warnings>, C<version>,
-C<warnings>, C<less>
-
-=item New modules
-
-=item Selected Changes to Core Modules
-
-C<Attribute::Handlers>, C<B::Lint>, C<B>, C<Thread>
-
-=back
-
-=item Utility Changes
-
-perl -d, ptar, ptardiff, shasum, corelist, h2ph and h2xs, perlivp,
-find2perl, config_data, cpanp, cpan2dist, pod2html
-
-=item New Documentation
-
-=item Performance Enhancements
-
-=over 4
-
-=item In-place sorting
-
-=item Lexical array access
-
-=item XS-assisted SWASHGET
-
-=item Constant subroutines
-
-=item C<PERL_DONT_CREATE_GVSV>
-
-=item Weak references are cheaper
-
-=item sort() enhancements
-
-=item Memory optimisations
-
-=item UTF-8 cache optimisation
-
-=item Sloppy stat on Windows
-
-=item Regular expressions optimisations
-
-Engine de-recursivised, Single char char-classes treated as literals, Trie
-optimisation of literal string alternations, Aho-Corasick start-point
-optimisation
-
-=back
-
-=item Installation and Configuration Improvements
-
-=over 4
-
-=item Configuration improvements
-
-C<-Dusesitecustomize>, Relocatable installations, strlcat() and strlcpy(),
-C<d_pseudofork> and C<d_printf_format_null>, Configure help
-
-=item Compilation improvements
-
-Parallel build, Borland's compilers support, Static build on Windows,
-ppport.h files, C++ compatibility, Support for Microsoft 64-bit compiler,
-Visual C++, Win32 builds
-
-=item Installation improvements
-
-Module auxiliary files
-
-=item New Or Improved Platforms
-
-=back
-
-=item Selected Bug Fixes
-
-strictures in regexp-eval blocks, Calling CORE::require(), Subscripts of
-slices, C<no warnings 'category'> works correctly with -w, threads
-improvements, chr() and negative values, PERL5SHELL and tainting, Using
-*FILE{IO}, Overloading and reblessing, Overloading and UTF-8, eval memory
-leaks fixed, Random device on Windows, PERLIO_DEBUG, PerlIO::scalar and
-read-only scalars, study() and UTF-8, Critical signals, @INC-hook fix,
-C<-t> switch fix, Duping UTF-8 filehandles, Localisation of hash elements
-
-=item New or Changed Diagnostics
-
-Use of uninitialized value, Deprecated use of my() in false conditional,
-!=~ should be !~, Newline in left-justified string, Too late for "-T"
-option, "%s" variable %s masks earlier declaration,
-readdir()/closedir()/etc. attempted on invalid dirhandle, Opening
-dirhandle/filehandle %s also as a file/directory, Use of -P is deprecated,
-v-string in use/require is non-portable, perl -V
-
-=item Changed Internals
-
-=over 4
-
-=item Reordering of SVt_* constants
-
-=item Elimination of SVt_PVBM
-
-=item New type SVt_BIND
-
-=item Removal of CPP symbols
-
-=item Less space is used by ops
-
-=item New parser
-
-=item Use of C<const>
-
-=item Mathoms
-
-=item C<AvFLAGS> has been removed
-
-=item C<av_*> changes
-
-=item $^H and %^H
-
-=item B:: modules inheritance changed
-
-=item Anonymous hash and array constructors
-
-=back
-
-=item Known Problems
-
-=over 4
-
-=item UTF-8 problems
-
-=back
-
-=item Platform Specific Problems
-
-=item Reporting Bugs
-
-=item SEE ALSO
-
-=back
-
-=head2 perl595delta - what is new for perl v5.9.5
-
-=over 4
-
-=item DESCRIPTION
-
-=item Incompatible Changes
-
-=over 4
-
-=item Tainting and printf
-
-=item undef and signal handlers
-
-=item strictures and array/hash dereferencing in defined()
-
-=item C<(?p{})> has been removed
-
-=item Pseudo-hashes have been removed
-
-=item Removal of the bytecode compiler and of perlcc
-
-=item Removal of the JPL
-
-=item Recursive inheritance detected earlier
-
-=back
-
-=item Core Enhancements
-
-=over 4
-
-=item Regular expressions
-
-Recursive Patterns, Named Capture Buffers, Possessive Quantifiers,
-Backtracking control verbs, Relative backreferences, C<\K> escape, Vertical
-and horizontal whitespace, and linebreak
-
-=item The C<_> prototype
-
-=item UNITCHECK blocks
-
-=item readpipe() is now overridable
-
-=item default argument for readline()
-
-=item UCD 5.0.0
-
-=item Smart match
-
-=item Implicit loading of C<feature>
-
-=back
-
-=item Modules and Pragmas
-
-=over 4
-
-=item New Pragma, C<mro>
-
-=item bignum, bigint, bigrat
-
-=item Math::BigInt/Math::BigFloat
-
-config(), import(), roundmode common, bpi(), bcos(), bsin(), batan(),
-batan2(), bmuladd(), bexp(), bnok(), from_hex(), from_oct(), and
-from_bin(), as_oct()
-
-=item New Core Modules
-
-=item Module changes
-
-C<assertions>, C<base>, C<strict> and C<warnings>, C<warnings>, C<less>,
-C<Attribute::Handlers>, C<B::Lint>, C<B>, C<Thread>
-
-=back
-
-=item Utility Changes
-
-=over 4
-
-=item C<cpanp>
-
-=item C<cpan2dist>
-
-=item C<pod2html>
-
-=back
-
-=item Documentation
-
-=over 4
-
-=item New manpage, perlunifaq
-
-=back
-
-=item Performance Enhancements
-
-=item Installation and Configuration Improvements
-
-=over 4
-
-=item C++ compatibility
-
-=item Visual C++
-
-=item Static build on Win32
-
-=item win32 builds
-
-=item C<d_pseudofork> and C<d_printf_format_null>
-
-=item Help
-
-=item 64bit systems
-
-=item Ports
-
-=back
-
-=item Selected Bug Fixes
-
-=item New or Changed Diagnostics
-
-=over 4
-
-=item Deprecations
-
-=back
-
-=item Changed Internals
-
-=item Known Problems
-
-=over 4
-
-=item Platform Specific Problems
-
-=back
-
-=item Reporting Bugs
-
-=item SEE ALSO
-
-=back
-
-=head2 perl594delta - what is new for perl v5.9.4
-
-=over 4
-
-=item DESCRIPTION
-
-=item Incompatible Changes
-
-=over 4
-
-=item chdir FOO
-
-=item Handling of pmc files
-
-=item @- and @+ in patterns
-
-=item $AUTOLOAD can now be tainted
-
-=back
-
-=item Core Enhancements
-
-=over 4
-
-=item state() variables
-
-=item UNIVERSAL::DOES()
-
-=item Exceptions in constant folding
-
-=item Source filters in @INC
-
-=item MAD
-
-=back
-
-=item Modules and Pragmas
-
-=over 4
-
-=item New Core Modules
-
-=back
-
-=item Utility Changes
-
-=over 4
-
-=item config_data
-
-=back
-
-=item Documentation
-
-=over 4
-
-=item New manpage, perlpragma
-
-=item New manpage, perlreguts
-
-=item New manpage, perlunitut
-
-=back
-
-=item Performance Enhancements
-
-=over 4
-
-=item Memory optimisations
-
-=item UTF-8 cache optimisation
-
-=item Regular expressions
-
-Engine de-recursivised, Single char char-classes treated as literals, Trie
-optimisation of literal string alternations, Aho-Corasick start-point
-optimisation
-
-=item Sloppy stat on Windows
-
-=back
-
-=item Installation and Configuration Improvements
-
-=over 4
-
-=item Relocatable installations
-
-=item Ports
-
-=item Compilation improvements
-
-=item New probes
-
-=item Windows build improvements
-
-Building XS extensions, Support for 64-bit compiler
-
-=back
-
-=item Selected Bug Fixes
-
-=over 4
-
-=item PERL5SHELL and tainting
-
-=item Using *FILE{IO}
-
-=item Overloading and reblessing
-
-=item Overloading and UTF-8
-
-=item eval memory leaks fixed
-
-=item Random device on Windows
-
-=back
-
-=item New or Changed Diagnostics
-
-State variable %s will be reinitialized
-
-=item Changed Internals
-
-=item Known Problems
-
-=item Reporting Bugs
-
-=item SEE ALSO
-
-=back
-
-=head2 perl593delta - what is new for perl v5.9.3
-
-=over 4
-
-=item DESCRIPTION
-
-=item Incompatible Changes
-
-=over 4
-
-=item Parsing of C<-f _>
-
-=item C<mkdir()>
-
-=item Magic goto and eval
-
-=item C<$#> has been removed
-
-=item C<:unique>
-
-=item Scoping of the C<sort> pragma
-
-=back
-
-=item Core Enhancements
-
-=over 4
-
-=item The C<feature> pragma
-
-=item Switch and Smart Match operator
-
-=item C<say()>
-
-=item C<CLONE_SKIP()>
-
-=item C<${^CHILD_ERROR_NATIVE}>
-
-=item Assertions
-
-=item Unicode Character Database 4.1.0
-
-=item C<no VERSION>
-
-=item Recursive sort subs
-
-=item Effect of pragmas in eval
-
-=item New B<-E> command-line switch
-
-=item C<chdir>, C<chmod> and C<chown> on filehandles
-
-=item OS groups
-
-=back
-
-=item Modules and Pragmata
-
-=over 4
-
-=item New Core Modules
-
-=back
-
-=item Utility Changes
-
-=over 4
-
-=item C<ptar>
-
-=item C<ptardiff>
-
-=item C<shasum>
-
-=item C<h2xs> enhancements
-
-=item C<perlivp> enhancements
-
-=back
-
-=item Documentation
-
-=over 4
-
-=item Perl Glossary
-
-=back
-
-=item Performance Enhancements
-
-=over 4
-
-=item XS-assisted SWASHGET
-
-=item Constant subroutines
-
-=item C<PERL_DONT_CREATE_GVSV>
-
-=item Weak references are cheaper
-
-=item sort() enhancements
-
-=back
-
-=item Installation and Configuration Improvements
-
-=over 4
-
-=item Compilation improvements
-
-=item New Or Improved Platforms
-
-=item New probes
-
-=item Module auxiliary files
-
-=back
-
-=item Selected Bug Fixes
-
-=over 4
-
-=item C<defined $$x>
-
-=item Calling CORE::require()
-
-=item Subscripts of slices
-
-=item Remove over-optimisation
-
-=item sprintf() fixes
-
-=item no warnings 'category' works correctly with -w
-
-=item Smaller fixes
-
-=item More Unicode Fixes
-
-=back
-
-=item New or Changed Diagnostics
-
-=over 4
-
-=item Attempt to set length of freed array
-
-=item Non-string passed as bitmask
-
-=item Search pattern not terminated or ternary operator parsed as search
-pattern
-
-=item "%s" variable %s masks earlier declaration
-
-=item readdir()/closedir()/etc. attempted on invalid dirhandle
-
-=back
-
-=item Changed Internals
-
-=over 4
-
-=item B:: modules inheritance changed
-
-=back
-
-=item Reporting Bugs
-
-=item SEE ALSO
-
-=back
-
-=head2 perl592delta - what is new for perl v5.9.2
-
-=over 4
-
-=item DESCRIPTION
-
-=item Incompatible Changes
-
-=over 4
-
-=item Packing and UTF-8 strings
-
-=item Miscellaneous
-
-=back
-
-=item Core Enhancements
-
-=over 4
-
-=item Malloc wrapping
-
-=item Unicode Character Database 4.0.1
-
-=item suidperl less insecure
-
-=item PERLIO_DEBUG
-
-=item Formats
-
-=item Unicode Character Classes
-
-=item Byte-order modifiers for pack() and unpack()
-
-=item Byte count feature in pack()
-
-=item New variables
-
-=back
-
-=item Modules and Pragmata
-
-=over 4
-
-=item New modules
-
-=item Updated And Improved Modules and Pragmata
-
-B::Concise, Socket, Sys::Syslog, threads
-
-=back
-
-=item Utility Changes
-
-=item Performance Enhancements
-
-=item Installation and Configuration Improvements
-
-=item Selected Bug Fixes
-
-=item New or Changed Diagnostics
-
-=item Changed Internals
-
-=item Known Problems
-
-=item Plans for the next release
-
-=item Reporting Bugs
-
-=item SEE ALSO
-
-=back
-
-=head2 perl591delta - what is new for perl v5.9.1
-
-=over 4
-
-=item DESCRIPTION
-
-=item Incompatible Changes
-
-=over 4
-
-=item substr() lvalues are no longer fixed-length
-
-=item The C<:unique> attribute is only meaningful for globals
-
-=back
-
-=item Core Enhancements
-
-=over 4
-
-=item Lexical C<$_>
-
-=item Tied hashes in scalar context
-
-=item Formats
-
-=item Stacked filetest operators
-
-=back
-
-=item Modules and Pragmata
-
-Benchmark, Carp, Exporter, FindBin, List::Util, threads::shared
-
-=item Utility Changes
-
-=item Documentation
-
-=item Performance Enhancements
-
-=item Selected Bug Fixes
-
-=over 4
-
-=item UTF-8 bugs
-
-=item Threading bugs
-
-=item More bugs
-
-=back
-
-=item New or Changed Diagnostics
-
-=item Changed Internals
-
-=over 4
-
-=item Reordering of SVt_* constants
-
-=item Removal of CPP symbols
-
-=item Less space is used by ops
-
-=item New parser
-
-=back
-
-=item Configuration and Building
-
-=item Known Problems
-
-=over 4
-
-=item Platform Specific Problems
-
-=back
-
-=item To-do for perl 5.10.0
-
-=item Reporting Bugs
-
-=item SEE ALSO
-
-=back
-
-=head2 perl590delta - what is new for perl v5.9.0
-
-=over 4
-
-=item DESCRIPTION
-
-=item Incompatible Changes
-
-=over 4
-
-=item Hash Randomisation
-
-=item UTF-8 On Filehandles No Longer Activated By Locale
-
-=item Single-number v-strings are no longer v-strings before "=>"
-
-=item (Win32) The -C Switch Has Been Repurposed
-
-=item (Win32) The /d Switch Of cmd.exe
-
-=item The C<$*> variable has been removed
-
-=back
-
-=item Core Enhancements
-
-=over 4
-
-=item Assertions
-
-=item Defined-or operators
-
-=item UTF-8 no longer default under UTF-8 locales
-
-=item Unsafe signals again available
-
-=item Tied Arrays with Negative Array Indices
-
-=item local ${$x}
-
-=item Unicode Character Database 4.0.0
-
-=item Miscellaneous Enhancements
-
-=back
-
-=item Modules and Pragmata
-
-=over 4
-
-=item Updated Modules And Pragmata
-
-base, B::Bytecode, B::Concise, B::Deparse, Benchmark, ByteLoader, bytes,
-CGI, charnames, CPAN, Data::Dumper, DB_File, Devel::PPPort, Digest::MD5,
-Encode, fields, libnet, Math::BigInt, MIME::Base64, NEXT, Net::Ping,
-PerlIO::scalar, podlators, Pod::LaTeX, PodParsers, Pod::Perldoc,
-Scalar::Util, Storable, strict, Term::ANSIcolor, Test::Harness, Test::More,
-Test::Simple, Text::Balanced, Time::HiRes, threads, threads::shared,
-Unicode::Collate, Unicode::Normalize, Win32::GetFolderPath,
-Win32::GetOSVersion
-
-=back
-
-=item Utility Changes
-
-=item New Documentation
-
-=item Performance Enhancements
-
-=item Installation and Configuration Improvements
-
-=over 4
-
-=item Platform-specific enhancements
-
-=back
-
-=item Selected Bug Fixes
-
-=over 4
-
-=item Closures, eval and lexicals
-
-=item Generic fixes
-
-=item Platform-specific fixes
-
-=back
-
-=item New or Changed Diagnostics
-
-=over 4
-
-=item Changed "A thread exited while %d threads were running"
-
-=item Removed "Attempt to clear a restricted hash"
-
-=item New "Illegal declaration of anonymous subroutine"
-
-=item Changed "Invalid range "%s" in transliteration operator"
-
-=item New "Missing control char name in \c"
-
-=item New "Newline in left-justified string for %s"
-
-=item New "Possible precedence problem on bitwise %c operator"
-
-=item New "read() on %s filehandle %s"
-
-=item New "Tied variable freed while still in use"
-
-=item New "To%s: illegal mapping '%s'"
-
-=item New "Use of freed value in iteration"
-
-=back
-
-=item Changed Internals
-
-=item New Tests
-
-=item Known Problems
-
-=over 4
-
-=item Tied hashes in scalar context
-
-=item Net::Ping 450_service and 510_ping_udp failures
-
-=item B::C
-
-=back
-
-=item Platform Specific Problems
-
-=over 4
-
-=item EBCDIC Platforms
-
-=item Cygwin 1.5 problems
-
-=item HP-UX: HP cc warnings about sendfile and sendpath
-
-=item IRIX: t/uni/tr_7jis.t falsely failing
-
-=item Mac OS X: no usemymalloc
-
-=item Tru64: No threaded builds with GNU cc (gcc)
-
-=item Win32: sysopen, sysread, syswrite
-
-=back
-
-=item TODO
-
-=item Reporting Bugs
-
-=item SEE ALSO
-
-=back
-
-=head2 perl588delta - what is new for perl v5.8.8
-
-=over 4
-
-=item DESCRIPTION
-
-=item Incompatible Changes
-
-=item Core Enhancements
-
-=item Modules and Pragmata
-
-=item Utility Changes
-
-=over 4
-
-=item C<h2xs> enhancements
-
-=item C<perlivp> enhancements
-
-=back
-
-=item New Documentation
-
-=item Performance Enhancements
-
-=item Installation and Configuration Improvements
-
-=item Selected Bug Fixes
-
-=over 4
-
-=item no warnings 'category' works correctly with -w
-
-=item Remove over-optimisation
-
-=item sprintf() fixes
-
-=item Debugger and Unicode slowdown
-
-=item Smaller fixes
-
-=back
-
-=item New or Changed Diagnostics
-
-=over 4
-
-=item Attempt to set length of freed array
-
-=item Non-string passed as bitmask
-
-=item Search pattern not terminated or ternary operator parsed as search
-pattern
-
-=back
-
-=item Changed Internals
-
-=item Platform Specific Problems
-
-=item Reporting Bugs
-
-=item SEE ALSO
-
-=back
-
-=head2 perl587delta - what is new for perl v5.8.7
-
-=over 4
-
-=item DESCRIPTION
-
-=item Incompatible Changes
-
-=item Core Enhancements
-
-=over 4
-
-=item Unicode Character Database 4.1.0
-
-=item suidperl less insecure
-
-=item Optional site customization script
-
-=item C<Config.pm> is now much smaller.
-
-=back
-
-=item Modules and Pragmata
-
-=item Utility Changes
-
-=over 4
-
-=item find2perl enhancements
-
-=back
-
-=item Performance Enhancements
-
-=item Installation and Configuration Improvements
-
-=item Selected Bug Fixes
-
-=item New or Changed Diagnostics
-
-=item Changed Internals
-
-=item Known Problems
-
-=item Platform Specific Problems
-
-=item Reporting Bugs
-
-=item SEE ALSO
-
-=back
-
-=head2 perl586delta - what is new for perl v5.8.6
-
-=over 4
-
-=item DESCRIPTION
-
-=item Incompatible Changes
-
-=item Core Enhancements
-
-=item Modules and Pragmata
-
-=item Utility Changes
-
-=item Performance Enhancements
-
-=item Selected Bug Fixes
-
-=item New or Changed Diagnostics
-
-=item Changed Internals
-
-=item New Tests
-
-=item Reporting Bugs
-
-=item SEE ALSO
-
-=back
-
-=head2 perl585delta - what is new for perl v5.8.5
-
-=over 4
-
-=item DESCRIPTION
-
-=item Incompatible Changes
-
-=item Core Enhancements
-
-=item Modules and Pragmata
-
-=item Utility Changes
-
-=over 4
-
-=item Perl's debugger
-
-=item h2ph
-
-=back
-
-=item Installation and Configuration Improvements
-
-=item Selected Bug Fixes
-
-=item New or Changed Diagnostics
-
-=item Changed Internals
-
-=item Known Problems
-
-=item Platform Specific Problems
-
-=item Reporting Bugs
-
-=item SEE ALSO
-
-=back
-
-=head2 perl584delta - what is new for perl v5.8.4
-
-=over 4
-
-=item DESCRIPTION
-
-=item Incompatible Changes
-
-=item Core Enhancements
-
-=over 4
-
-=item Malloc wrapping
-
-=item Unicode Character Database 4.0.1
-
-=item suidperl less insecure
-
-=item format
-
-=back
-
-=item Modules and Pragmata
-
-=over 4
-
-=item Updated modules
-
-Attribute::Handlers, B, Benchmark, CGI, Carp, Cwd, Exporter, File::Find,
-IO, IPC::Open3, Local::Maketext, Math::BigFloat, Math::BigInt,
-Math::BigRat, MIME::Base64, ODBM_File, POSIX, Shell, Socket, Storable,
-Switch, Sys::Syslog, Term::ANSIColor, Time::HiRes, Unicode::UCD, Win32,
-base, open, threads, utf8
-
-=back
-
-=item Performance Enhancements
-
-=item Utility Changes
-
-=item Installation and Configuration Improvements
-
-=item Selected Bug Fixes
-
-=item New or Changed Diagnostics
-
-=item Changed Internals
-
-=item Future Directions
-
-=item Platform Specific Problems
-
-=item Reporting Bugs
-
-=item SEE ALSO
-
-=back
-
-=head2 perl583delta - what is new for perl v5.8.3
-
-=over 4
-
-=item DESCRIPTION
-
-=item Incompatible Changes
-
-=item Core Enhancements
-
-=item Modules and Pragmata
-
-CGI, Cwd, Digest, Digest::MD5, Encode, File::Spec, FindBin, List::Util,
-Math::BigInt, PodParser, Pod::Perldoc, POSIX, Unicode::Collate,
-Unicode::Normalize, Test::Harness, threads::shared
-
-=item Utility Changes
-
-=item New Documentation
-
-=item Installation and Configuration Improvements
-
-=item Selected Bug Fixes
-
-=item New or Changed Diagnostics
-
-=item Changed Internals
-
-=item Configuration and Building
-
-=item Platform Specific Problems
-
-=item Known Problems
-
-=item Future Directions
-
-=item Obituary
-
-=item Reporting Bugs
-
-=item SEE ALSO
-
-=back
-
-=head2 perl582delta - what is new for perl v5.8.2
-
-=over 4
-
-=item DESCRIPTION
-
-=item Incompatible Changes
-
-=item Core Enhancements
-
-=over 4
-
-=item Hash Randomisation
-
-=item Threading
-
-=back
-
-=item Modules and Pragmata
-
-=over 4
-
-=item Updated Modules And Pragmata
-
-Devel::PPPort, Digest::MD5, I18N::LangTags, libnet, MIME::Base64,
-Pod::Perldoc, strict, Tie::Hash, Time::HiRes, Unicode::Collate,
-Unicode::Normalize, UNIVERSAL
-
-=back
-
-=item Selected Bug Fixes
-
-=item Changed Internals
-
-=item Platform Specific Problems
-
-=item Future Directions
-
-=item Reporting Bugs
-
-=item SEE ALSO
-
-=back
-
-=head2 perl581delta - what is new for perl v5.8.1
-
-=over 4
-
-=item DESCRIPTION
-
-=item Incompatible Changes
-
-=over 4
-
-=item Hash Randomisation
-
-=item UTF-8 On Filehandles No Longer Activated By Locale
-
-=item Single-number v-strings are no longer v-strings before "=>"
-
-=item (Win32) The -C Switch Has Been Repurposed
-
-=item (Win32) The /d Switch Of cmd.exe
-
-=back
-
-=item Core Enhancements
-
-=over 4
-
-=item UTF-8 no longer default under UTF-8 locales
-
-=item Unsafe signals again available
-
-=item Tied Arrays with Negative Array Indices
-
-=item local ${$x}
-
-=item Unicode Character Database 4.0.0
-
-=item Deprecation Warnings
-
-=item Miscellaneous Enhancements
-
-=back
-
-=item Modules and Pragmata
-
-=over 4
-
-=item Updated Modules And Pragmata
-
-base, B::Bytecode, B::Concise, B::Deparse, Benchmark, ByteLoader, bytes,
-CGI, charnames, CPAN, Data::Dumper, DB_File, Devel::PPPort, Digest::MD5,
-Encode, fields, libnet, Math::BigInt, MIME::Base64, NEXT, Net::Ping,
-PerlIO::scalar, podlators, Pod::LaTeX, PodParsers, Pod::Perldoc,
-Scalar::Util, Storable, strict, Term::ANSIcolor, Test::Harness, Test::More,
-Test::Simple, Text::Balanced, Time::HiRes, threads, threads::shared,
-Unicode::Collate, Unicode::Normalize, Win32::GetFolderPath,
-Win32::GetOSVersion
-
-=back
-
-=item Utility Changes
-
-=item New Documentation
-
-=item Installation and Configuration Improvements
-
-=over 4
-
-=item Platform-specific enhancements
-
-=back
-
-=item Selected Bug Fixes
-
-=over 4
-
-=item Closures, eval and lexicals
-
-=item Generic fixes
-
-=item Platform-specific fixes
-
-=back
-
-=item New or Changed Diagnostics
-
-=over 4
-
-=item Changed "A thread exited while %d threads were running"
-
-=item Removed "Attempt to clear a restricted hash"
-
-=item New "Illegal declaration of anonymous subroutine"
-
-=item Changed "Invalid range "%s" in transliteration operator"
-
-=item New "Missing control char name in \c"
-
-=item New "Newline in left-justified string for %s"
-
-=item New "Possible precedence problem on bitwise %c operator"
-
-=item New "Pseudo-hashes are deprecated"
-
-=item New "read() on %s filehandle %s"
-
-=item New "5.005 threads are deprecated"
-
-=item New "Tied variable freed while still in use"
-
-=item New "To%s: illegal mapping '%s'"
-
-=item New "Use of freed value in iteration"
-
-=back
-
-=item Changed Internals
-
-=item New Tests
-
-=item Known Problems
-
-=over 4
-
-=item Tied hashes in scalar context
-
-=item Net::Ping 450_service and 510_ping_udp failures
-
-=item B::C
-
-=back
-
-=item Platform Specific Problems
-
-=over 4
-
-=item EBCDIC Platforms
-
-=item Cygwin 1.5 problems
-
-=item HP-UX: HP cc warnings about sendfile and sendpath
-
-=item IRIX: t/uni/tr_7jis.t falsely failing
-
-=item Mac OS X: no usemymalloc
-
-=item Tru64: No threaded builds with GNU cc (gcc)
-
-=item Win32: sysopen, sysread, syswrite
-
-=back
-
-=item Future Directions
-
-=item Reporting Bugs
-
-=item SEE ALSO
-
-=back
-
-=head2 perl58delta - what is new for perl v5.8.0
-
-=over 4
-
-=item DESCRIPTION
-
-=item Highlights In 5.8.0
-
-=item Incompatible Changes
-
-=over 4
-
-=item Binary Incompatibility
-
-=item 64-bit platforms and malloc
-
-=item AIX Dynaloading
-
-=item Attributes for C<my> variables now handled at run-time
-
-=item Socket Extension Dynamic in VMS
-
-=item IEEE-format Floating Point Default on OpenVMS Alpha
-
-=item New Unicode Semantics (no more C<use utf8>, almost)
-
-=item New Unicode Properties
-
-=item REF(...) Instead Of SCALAR(...)
-
-=item pack/unpack D/F recycled
-
-=item glob() now returns filenames in alphabetical order
-
-=item Deprecations
-
-=back
-
-=item Core Enhancements
-
-=over 4
-
-=item Unicode Overhaul
-
-=item PerlIO is Now The Default
-
-=item ithreads
-
-=item Restricted Hashes
-
-=item Safe Signals
-
-=item Understanding of Numbers
-
-=item Arrays now always interpolate into double-quoted strings [561]
-
-=item Miscellaneous Changes
-
-=back
-
-=item Modules and Pragmata
-
-=over 4
-
-=item New Modules and Pragmata
-
-=item Updated And Improved Modules and Pragmata
-
-=back
-
-=item Utility Changes
-
-=item New Documentation
-
-=item Performance Enhancements
-
-=item Installation and Configuration Improvements
-
-=over 4
-
-=item Generic Improvements
-
-=item New Or Improved Platforms
-
-=back
-
-=item Selected Bug Fixes
-
-=over 4
-
-=item Platform Specific Changes and Fixes
-
-=back
-
-=item New or Changed Diagnostics
-
-=item Changed Internals
-
-=item Security Vulnerability Closed [561]
-
-=item New Tests
-
-=item Known Problems
-
-=over 4
-
-=item The Compiler Suite Is Still Very Experimental
-
-=item Localising Tied Arrays and Hashes Is Broken
-
-=item Building Extensions Can Fail Because Of Largefiles
-
-=item Modifying $_ Inside for(..)
-
-=item mod_perl 1.26 Doesn't Build With Threaded Perl
-
-=item lib/ftmp-security tests warn 'system possibly insecure'
-
-=item libwww-perl (LWP) fails base/date #51
-
-=item PDL failing some tests
-
-=item Perl_get_sv
-
-=item Self-tying Problems
-
-=item ext/threads/t/libc
-
-=item Failure of Thread (5.005-style) tests
-
-=item Timing problems
-
-=item Tied/Magical Array/Hash Elements Do Not Autovivify
-
-=item Unicode in package/class and subroutine names does not work
-
-=back
-
-=item Platform Specific Problems
-
-=over 4
-
-=item AIX
-
-=item Alpha systems with old gccs fail several tests
-
-=item AmigaOS
-
-=item BeOS
-
-=item Cygwin "unable to remap"
-
-=item Cygwin ndbm tests fail on FAT
-
-=item DJGPP Failures
-
-=item FreeBSD built with ithreads coredumps reading large directories
-
-=item FreeBSD Failing locale Test 117 For ISO 8859-15 Locales
-
-=item IRIX fails ext/List/Util/t/shuffle.t or Digest::MD5
-
-=item HP-UX lib/posix Subtest 9 Fails When LP64-Configured
-
-=item Linux with glibc 2.2.5 fails t/op/int subtest #6 with -Duse64bitint
-
-=item Linux With Sfio Fails op/misc Test 48
-
-=item Mac OS X
-
-=item Mac OS X dyld undefined symbols
-
-=item OS/2 Test Failures
-
-=item op/sprintf tests 91, 129, and 130
-
-=item SCO
-
-=item Solaris 2.5
-
-=item Solaris x86 Fails Tests With -Duse64bitint
-
-=item SUPER-UX (NEC SX)
-
-=item Term::ReadKey not working on Win32
-
-=item UNICOS/mk
-
-=item UTS
-
-=item VOS (Stratus)
-
-=item VMS
-
-=item Win32
-
-=item XML::Parser not working
-
-=item z/OS (OS/390)
-
-=item Unicode Support on EBCDIC Still Spotty
-
-=item Seen In Perl 5.7 But Gone Now
-
-=back
-
-=item Reporting Bugs
-
-=item SEE ALSO
-
-=item HISTORY
-
-=back
-
-=head2 perl573delta - what's new for perl v5.7.3
-
-=over 4
-
-=item DESCRIPTION
-
-=item Changes
-
-=item Reporting Bugs
-
-=item SEE ALSO
-
-=item HISTORY
-
-=back
-
-=head2 perl572delta - what's new for perl v5.7.2
-
-=over 4
-
-=item DESCRIPTION
-
-=item Security Vulnerability Closed
-
-=item Incompatible Changes
-
-=over 4
-
-=item 64-bit platforms and malloc
-
-=item AIX Dynaloading
-
-=item Socket Extension Dynamic in VMS
-
-=item Different Definition of the Unicode Character Classes \p{In...}
-
-=item Deprecations
-
-=back
-
-=item Core Enhancements
-
-=item Modules and Pragmata
-
-=over 4
-
-=item New Modules and Distributions
-
-=item Updated And Improved Modules and Pragmata
-
-=back
-
-=item Utility Changes
-
-=item New Documentation
-
-=item Installation and Configuration Improvements
-
-=over 4
-
-=item New Or Improved Platforms
-
-=item Generic Improvements
-
-=back
-
-=item Selected Bug Fixes
-
-=over 4
-
-=item Platform Specific Changes and Fixes
-
-=back
-
-=item New or Changed Diagnostics
-
-=item Source Code Enhancements
-
-=over 4
-
-=item MAGIC constants
-
-=item Better commented code
-
-=item Regex pre-/post-compilation items matched up
-
-=item gcc -Wall
-
-=back
-
-=item New Tests
-
-=item Known Problems
-
-=over 4
-
-=item AIX
-
-=item Amiga Perl Invoking Mystery
-
-=item lib/ftmp-security tests warn 'system possibly insecure'
-
-=item Cygwin intermittent failures of lib/Memoize/t/expire_file 11 and 12
-
-=item HP-UX lib/io_multihomed Fails When LP64-Configured
-
-=item HP-UX lib/posix Subtest 9 Fails When LP64-Configured
-
-=item Linux With Sfio Fails op/misc Test 48
-
-=item OS/390
-
-=item op/sprintf tests 129 and 130
-
-=item Failure of Thread tests
-
-=item UNICOS
-
-=item UTS
-
-=item VMS
-
-=item Win32
-
-=item Localising a Tied Variable Leaks Memory
-
-=item Self-tying of Arrays and Hashes Is Forbidden
-
-=item Variable Attributes are not Currently Usable for Tieing
-
-=item Building Extensions Can Fail Because Of Largefiles
-
-=item The Compiler Suite Is Still Experimental
-
-=item The Long Double Support is Still Experimental
-
-=back
-
-=item Reporting Bugs
-
-=item SEE ALSO
-
-=item HISTORY
-
-=back
-
-=head2 perl571delta - what's new for perl v5.7.1
-
-=over 4
-
-=item DESCRIPTION
-
-=item Security Vulnerability Closed
-
-=item Incompatible Changes
-
-=item Core Enhancements
-
-=over 4
-
-=item AUTOLOAD Is Now Lvaluable
-
-=item PerlIO is Now The Default
-
-=item Signals Are Now Safe
-
-=back
-
-=item Modules and Pragmata
-
-=over 4
-
-=item New Modules
-
-=item Updated And Improved Modules and Pragmata
-
-=back
-
-=item Performance Enhancements
-
-=item Utility Changes
-
-=item New Documentation
-
-=over 4
-
-=item perlclib
-
-=item perliol
-
-=item README.aix
-
-=item README.bs2000
-
-=item README.macos
-
-=item README.mpeix
-
-=item README.solaris
-
-=item README.vos
-
-=item Porting/repository.pod
-
-=back
-
-=item Installation and Configuration Improvements
-
-=over 4
-
-=item New Or Improved Platforms
-
-=item Generic Improvements
-
-d_cmsghdr, d_fcntl_can_lock, d_fsync, d_getitimer, d_getpagsz, d_msghdr_s,
-need_va_copy, d_readv, d_recvmsg, d_sendmsg, sig_size, d_sockatmark,
-d_strtoq, d_u32align, d_ualarm, d_usleep
-
-=back
-
-=item Selected Bug Fixes
-
-=over 4
-
-=item Platform Specific Changes and Fixes
-
-=back
-
-=item New or Changed Diagnostics
-
-=item Changed Internals
-
-=item New Tests
-
-=item Known Problems
-
-=over 4
-
-=item AIX vac 5.0.0.0 May Produce Buggy Code For Perl
-
-=item lib/ftmp-security tests warn 'system possibly insecure'
-
-=item lib/io_multihomed Fails In LP64-Configured HP-UX
-
-=item Test lib/posix Subtest 9 Fails In LP64-Configured HP-UX
-
-=item lib/b test 19
-
-=item Linux With Sfio Fails op/misc Test 48
-
-=item sigaction test 13 in VMS
-
-=item sprintf tests 129 and 130
-
-=item Failure of Thread tests
-
-=item Localising a Tied Variable Leaks Memory
-
-=item Self-tying of Arrays and Hashes Is Forbidden
-
-=item Building Extensions Can Fail Because Of Largefiles
-
-=item The Compiler Suite Is Still Experimental
-
-=back
-
-=item Reporting Bugs
-
-=item SEE ALSO
-
-=item HISTORY
-
-=back
-
-=head2 perl570delta - what's new for perl v5.7.0
-
-=over 4
-
-=item DESCRIPTION
-
-=item Security Vulnerability Closed
-
-=item Incompatible Changes
-
-=item Core Enhancements
-
-=item Modules and Pragmata
-
-=over 4
-
-=item New Modules
-
-=item Updated And Improved Modules and Pragmata
-
-=back
-
-=item Utility Changes
-
-=item New Documentation
-
-=item Performance Enhancements
-
-=item Installation and Configuration Improvements
-
-=over 4
-
-=item Generic Improvements
-
-=back
-
-=item Selected Bug Fixes
-
-=over 4
-
-=item Platform Specific Changes and Fixes
-
-=back
-
-=item New or Changed Diagnostics
-
-=item Changed Internals
-
-=item Known Problems
-
-=over 4
-
-=item Unicode Support Still Far From Perfect
-
-=item EBCDIC Still A Lost Platform
-
-=item Building Extensions Can Fail Because Of Largefiles
-
-=item ftmp-security tests warn 'system possibly insecure'
-
-=item Test lib/posix Subtest 9 Fails In LP64-Configured HP-UX
-
-=item Long Doubles Still Don't Work In Solaris
-
-=item Linux With Sfio Fails op/misc Test 48
-
-=item Storable tests fail in some platforms
-
-=item Threads Are Still Experimental
-
-=item The Compiler Suite Is Still Experimental
-
-=back
-
-=item Reporting Bugs
-
-=item SEE ALSO
-
-=item HISTORY
-
-=back
-
-=head2 perl561delta - what's new for perl v5.6.x
-
-=over 4
-
-=item DESCRIPTION
-
-=item Summary of changes between 5.6.0 and 5.6.1
-
-=over 4
-
-=item Security Issues
-
-=item Core bug fixes
-
-C<UNIVERSAL::isa()>, Memory leaks, Numeric conversions, qw(a\\b), caller(),
-Bugs in regular expressions, "slurp" mode, Autovivification of symbolic
-references to special variables, Lexical warnings, Spurious warnings and
-errors, glob(), Tainting, sort(), #line directives, Subroutine prototypes,
-map(), Debugger, PERL5OPT, chop(), Unicode support, 64-bit support,
-Compiler, Lvalue subroutines, IO::Socket, File::Find, xsubpp, C<no
-Module;>, Tests
-
-=item Core features
-
-=item Configuration issues
-
-=item Documentation
-
-=item Bundled modules
-
-B::Concise, File::Temp, Pod::LaTeX, Pod::Text::Overstrike, CGI, CPAN,
-Class::Struct, DB_File, Devel::Peek, File::Find, Getopt::Long, IO::Poll,
-IPC::Open3, Math::BigFloat, Math::Complex, Net::Ping, Opcode, Pod::Parser,
-Pod::Text, SDBM_File, Sys::Syslog, Tie::RefHash, Tie::SubstrHash
-
-=item Platform-specific improvements
-
-NCR MP-RAS, NonStop-UX
-
-=back
-
-=item Core Enhancements
-
-=over 4
-
-=item Interpreter cloning, threads, and concurrency
-
-=item Lexically scoped warning categories
-
-=item Unicode and UTF-8 support
-
-=item Support for interpolating named characters
-
-=item "our" declarations
-
-=item Support for strings represented as a vector of ordinals
-
-=item Improved Perl version numbering system
-
-=item New syntax for declaring subroutine attributes
-
-=item File and directory handles can be autovivified
-
-=item open() with more than two arguments
-
-=item 64-bit support
-
-=item Large file support
-
-=item Long doubles
-
-=item "more bits"
-
-=item Enhanced support for sort() subroutines
-
-=item C<sort $coderef @foo> allowed
-
-=item File globbing implemented internally
-
-=item Support for CHECK blocks
-
-=item POSIX character class syntax [: :] supported
-
-=item Better pseudo-random number generator
-
-=item Improved C<qw//> operator
-
-=item Better worst-case behavior of hashes
-
-=item pack() format 'Z' supported
-
-=item pack() format modifier '!' supported
-
-=item pack() and unpack() support counted strings
-
-=item Comments in pack() templates
-
-=item Weak references
-
-=item Binary numbers supported
-
-=item Lvalue subroutines
-
-=item Some arrows may be omitted in calls through references
-
-=item Boolean assignment operators are legal lvalues
-
-=item exists() is supported on subroutine names
-
-=item exists() and delete() are supported on array elements
-
-=item Pseudo-hashes work better
-
-=item Automatic flushing of output buffers
-
-=item Better diagnostics on meaningless filehandle operations
-
-=item Where possible, buffered data discarded from duped input filehandle
-
-=item eof() has the same old magic as <>
-
-=item binmode() can be used to set :crlf and :raw modes
-
-=item C<-T> filetest recognizes UTF-8 encoded files as "text"
-
-=item system(), backticks and pipe open now reflect exec() failure
-
-=item Improved diagnostics
-
-=item Diagnostics follow STDERR
-
-=item More consistent close-on-exec behavior
-
-=item syswrite() ease-of-use
-
-=item Better syntax checks on parenthesized unary operators
-
-=item Bit operators support full native integer width
-
-=item Improved security features
-
-=item More functional bareword prototype (*)
-
-=item C<require> and C<do> may be overridden
-
-=item $^X variables may now have names longer than one character
-
-=item New variable $^C reflects C<-c> switch
-
-=item New variable $^V contains Perl version as a string
-
-=item Optional Y2K warnings
-
-=item Arrays now always interpolate into double-quoted strings
-
-=item @- and @+ provide starting/ending offsets of regex submatches
-
-=back
-
-=item Modules and Pragmata
-
-=over 4
-
-=item Modules
-
-attributes, B, Benchmark, ByteLoader, constant, charnames, Data::Dumper,
-DB, DB_File, Devel::DProf, Devel::Peek, Dumpvalue, DynaLoader, English,
-Env, Fcntl, File::Compare, File::Find, File::Glob, File::Spec,
-File::Spec::Functions, Getopt::Long, IO, JPL, lib, Math::BigInt,
-Math::Complex, Math::Trig, Pod::Parser, Pod::InputObjects, Pod::Checker,
-podchecker, Pod::ParseUtils, Pod::Find, Pod::Select, podselect, Pod::Usage,
-pod2usage, Pod::Text and Pod::Man, SDBM_File, Sys::Syslog, Sys::Hostname,
-Term::ANSIColor, Time::Local, Win32, XSLoader, DBM Filters
-
-=item Pragmata
-
-=back
-
-=item Utility Changes
-
-=over 4
-
-=item dprofpp
-
-=item find2perl
-
-=item h2xs
-
-=item perlcc
-
-=item perldoc
-
-=item The Perl Debugger
-
-=back
-
-=item Improved Documentation
-
-perlapi.pod, perlboot.pod, perlcompile.pod, perldbmfilter.pod,
-perldebug.pod, perldebguts.pod, perlfork.pod, perlfilter.pod, perlhack.pod,
-perlintern.pod, perllexwarn.pod, perlnumber.pod, perlopentut.pod,
-perlreftut.pod, perltootc.pod, perltodo.pod, perlunicode.pod
-
-=item Performance enhancements
-
-=over 4
-
-=item Simple sort() using { $a <=> $b } and the like are optimized
-
-=item Optimized assignments to lexical variables
-
-=item Faster subroutine calls
-
-=item delete(), each(), values() and hash iteration are faster
-
-=back
-
-=item Installation and Configuration Improvements
-
-=over 4
-
-=item -Dusethreads means something different
-
-=item New Configure flags
-
-=item Threadedness and 64-bitness now more daring
-
-=item Long Doubles
-
-=item -Dusemorebits
-
-=item -Duselargefiles
-
-=item installusrbinperl
-
-=item SOCKS support
-
-=item C<-A> flag
-
-=item Enhanced Installation Directories
-
-=item gcc automatically tried if 'cc' does not seem to be working
-
-=back
-
-=item Platform specific changes
-
-=over 4
-
-=item Supported platforms
-
-=item DOS
-
-=item OS390 (OpenEdition MVS)
-
-=item VMS
-
-=item Win32
-
-=back
-
-=item Significant bug fixes
-
-=over 4
-
-=item <HANDLE> on empty files
-
-=item C<eval '...'> improvements
-
-=item All compilation errors are true errors
-
-=item Implicitly closed filehandles are safer
-
-=item Behavior of list slices is more consistent
-
-=item C<(\$)> prototype and C<$foo{a}>
-
-=item C<goto &sub> and AUTOLOAD
-
-=item C<-bareword> allowed under C<use integer>
-
-=item Failures in DESTROY()
-
-=item Locale bugs fixed
-
-=item Memory leaks
-
-=item Spurious subroutine stubs after failed subroutine calls
-
-=item Taint failures under C<-U>
-
-=item END blocks and the C<-c> switch
-
-=item Potential to leak DATA filehandles
-
-=back
-
-=item New or Changed Diagnostics
-
-"%s" variable %s masks earlier declaration in same %s, "my sub" not yet
-implemented, "our" variable %s redeclared, '!' allowed only after types %s,
-/ cannot take a count, / must be followed by a, A or Z, / must be followed
-by a*, A* or Z*, / must follow a numeric type, /%s/: Unrecognized escape
-\\%c passed through, /%s/: Unrecognized escape \\%c in character class
-passed through, /%s/ should probably be written as "%s", %s() called too
-early to check prototype, %s argument is not a HASH or ARRAY element, %s
-argument is not a HASH or ARRAY element or slice, %s argument is not a
-subroutine name, %s package attribute may clash with future reserved word:
-%s, (in cleanup) %s, <> should be quotes, Attempt to join self, Bad evalled
-substitution pattern, Bad realloc() ignored, Bareword found in conditional,
-Binary number > 0b11111111111111111111111111111111 non-portable, Bit vector
-size > 32 non-portable, Buffer overflow in prime_env_iter: %s, Can't check
-filesystem of script "%s", Can't declare class for non-scalar %s in "%s",
-Can't declare %s in "%s", Can't ignore signal CHLD, forcing to default,
-Can't modify non-lvalue subroutine call, Can't read CRTL environ, Can't
-remove %s: %s, skipping file, Can't return %s from lvalue subroutine, Can't
-weaken a nonreference, Character class [:%s:] unknown, Character class
-syntax [%s] belongs inside character classes, Constant is not %s reference,
-constant(%s): %s, CORE::%s is not a keyword, defined(@array) is deprecated,
-defined(%hash) is deprecated, Did not produce a valid header, (Did you mean
-"local" instead of "our"?), Document contains no data, entering effective
-%s failed, false [] range "%s" in regexp, Filehandle %s opened only for
-output, flock() on closed filehandle %s, Global symbol "%s" requires
-explicit package name, Hexadecimal number > 0xffffffff non-portable,
-Ill-formed CRTL environ value "%s", Ill-formed message in prime_env_iter:
-|%s|, Illegal binary digit %s, Illegal binary digit %s ignored, Illegal
-number of bits in vec, Integer overflow in %s number, Invalid %s attribute:
-%s, Invalid %s attributes: %s, invalid [] range "%s" in regexp, Invalid
-separator character %s in attribute list, Invalid separator character %s in
-subroutine attribute list, leaving effective %s failed, Lvalue subs
-returning %s not implemented yet, Method %s not permitted, Missing
-%sbrace%s on \N{}, Missing command in piped open, Missing name in "my sub",
-No %s specified for -%c, No package name allowed for variable %s in "our",
-No space allowed after -%c, no UTC offset information; assuming local time
-is UTC, Octal number > 037777777777 non-portable, panic: del_backref,
-panic: kid popen errno read, panic: magic_killbackrefs, Parentheses missing
-around "%s" list, Possible unintended interpolation of %s in string,
-Possible Y2K bug: %s, pragma "attrs" is deprecated, use "sub NAME : ATTRS"
-instead, Premature end of script headers, Repeat count in pack overflows,
-Repeat count in unpack overflows, realloc() of freed memory ignored,
-Reference is already weak, setpgrp can't take arguments, Strange *+?{} on
-zero-length expression, switching effective %s is not implemented, This
-Perl can't reset CRTL environ elements (%s), This Perl can't set CRTL
-environ elements (%s=%s), Too late to run %s block, Unknown open() mode
-'%s', Unknown process %x sent message to prime_env_iter: %s, Unrecognized
-escape \\%c passed through, Unterminated attribute parameter in attribute
-list, Unterminated attribute list, Unterminated attribute parameter in
-subroutine attribute list, Unterminated subroutine attribute list, Value of
-CLI symbol "%s" too long, Version number must be a constant number
-
-=item New tests
-
-=item Incompatible Changes
-
-=over 4
-
-=item Perl Source Incompatibilities
-
-CHECK is a new keyword, Treatment of list slices of undef has changed,
-Format of $English::PERL_VERSION is different, Literals of the form
-C<1.2.3> parse differently, Possibly changed pseudo-random number
-generator, Hashing function for hash keys has changed, C<undef> fails on
-read only values, Close-on-exec bit may be set on pipe and socket handles,
-Writing C<"$$1"> to mean C<"${$}1"> is unsupported, delete(), each(),
-values() and C<\(%h)>, vec(EXPR,OFFSET,BITS) enforces powers-of-two BITS,
-Text of some diagnostic output has changed, C<%@> has been removed,
-Parenthesized not() behaves like a list operator, Semantics of bareword
-prototype C<(*)> have changed, Semantics of bit operators may have changed
-on 64-bit platforms, More builtins taint their results
-
-=item C Source Incompatibilities
-
-C<PERL_POLLUTE>, C<PERL_IMPLICIT_CONTEXT>, C<PERL_POLLUTE_MALLOC>
-
-=item Compatible C Source API Changes
-
-C<PATCHLEVEL> is now C<PERL_VERSION>
-
-=item Binary Incompatibilities
-
-=back
-
-=item Known Problems
-
-=over 4
-
-=item Localizing a tied hash element may leak memory
-
-=item Known test failures
-
-=item EBCDIC platforms not fully supported
-
-=item UNICOS/mk CC failures during Configure run
-
-=item Arrow operator and arrays
-
-=item Experimental features
-
-Threads, Unicode, 64-bit support, Lvalue subroutines, Weak references, The
-pseudo-hash data type, The Compiler suite, Internal implementation of file
-globbing, The DB module, The regular expression code constructs:
-
-=back
-
-=item Obsolete Diagnostics
-
-Character class syntax [: :] is reserved for future extensions, Ill-formed
-logical name |%s| in prime_env_iter, In string, @%s now must be written as
-\@%s, Probable precedence problem on %s, regexp too big, Use of "$$<digit>"
-to mean "${$}<digit>" is deprecated
-
-=item Reporting Bugs
-
-=item SEE ALSO
-
-=item HISTORY
-
-=back
-
-=head2 perl56delta - what's new for perl v5.6.0
-
-=over 4
-
-=item DESCRIPTION
-
-=item Core Enhancements
-
-=over 4
-
-=item Interpreter cloning, threads, and concurrency
-
-=item Lexically scoped warning categories
-
-=item Unicode and UTF-8 support
-
-=item Support for interpolating named characters
-
-=item "our" declarations
-
-=item Support for strings represented as a vector of ordinals
-
-=item Improved Perl version numbering system
-
-=item New syntax for declaring subroutine attributes
-
-=item File and directory handles can be autovivified
-
-=item open() with more than two arguments
-
-=item 64-bit support
-
-=item Large file support
-
-=item Long doubles
-
-=item "more bits"
-
-=item Enhanced support for sort() subroutines
-
-=item C<sort $coderef @foo> allowed
-
-=item File globbing implemented internally
-
-=item Support for CHECK blocks
-
-=item POSIX character class syntax [: :] supported
-
-=item Better pseudo-random number generator
-
-=item Improved C<qw//> operator
-
-=item Better worst-case behavior of hashes
-
-=item pack() format 'Z' supported
-
-=item pack() format modifier '!' supported
-
-=item pack() and unpack() support counted strings
-
-=item Comments in pack() templates
-
-=item Weak references
-
-=item Binary numbers supported
-
-=item Lvalue subroutines
-
-=item Some arrows may be omitted in calls through references
-
-=item Boolean assignment operators are legal lvalues
-
-=item exists() is supported on subroutine names
-
-=item exists() and delete() are supported on array elements
-
-=item Pseudo-hashes work better
-
-=item Automatic flushing of output buffers
-
-=item Better diagnostics on meaningless filehandle operations
-
-=item Where possible, buffered data discarded from duped input filehandle
-
-=item eof() has the same old magic as <>
-
-=item binmode() can be used to set :crlf and :raw modes
-
-=item C<-T> filetest recognizes UTF-8 encoded files as "text"
-
-=item system(), backticks and pipe open now reflect exec() failure
-
-=item Improved diagnostics
-
-=item Diagnostics follow STDERR
-
-=item More consistent close-on-exec behavior
-
-=item syswrite() ease-of-use
-
-=item Better syntax checks on parenthesized unary operators
-
-=item Bit operators support full native integer width
-
-=item Improved security features
-
-=item More functional bareword prototype (*)
-
-=item C<require> and C<do> may be overridden
-
-=item $^X variables may now have names longer than one character
-
-=item New variable $^C reflects C<-c> switch
-
-=item New variable $^V contains Perl version as a string
-
-=item Optional Y2K warnings
-
-=item Arrays now always interpolate into double-quoted strings
-
-=item @- and @+ provide starting/ending offsets of regex matches
-
-=back
-
-=item Modules and Pragmata
-
-=over 4
-
-=item Modules
-
-attributes, B, Benchmark, ByteLoader, constant, charnames, Data::Dumper,
-DB, DB_File, Devel::DProf, Devel::Peek, Dumpvalue, DynaLoader, English,
-Env, Fcntl, File::Compare, File::Find, File::Glob, File::Spec,
-File::Spec::Functions, Getopt::Long, IO, JPL, lib, Math::BigInt,
-Math::Complex, Math::Trig, Pod::Parser, Pod::InputObjects, Pod::Checker,
-podchecker, Pod::ParseUtils, Pod::Find, Pod::Select, podselect, Pod::Usage,
-pod2usage, Pod::Text and Pod::Man, SDBM_File, Sys::Syslog, Sys::Hostname,
-Term::ANSIColor, Time::Local, Win32, XSLoader, DBM Filters
-
-=item Pragmata
-
-=back
-
-=item Utility Changes
-
-=over 4
-
-=item dprofpp
-
-=item find2perl
-
-=item h2xs
-
-=item perlcc
-
-=item perldoc
-
-=item The Perl Debugger
-
-=back
-
-=item Improved Documentation
-
-perlapi.pod, perlboot.pod, perlcompile.pod, perldbmfilter.pod,
-perldebug.pod, perldebguts.pod, perlfork.pod, perlfilter.pod, perlhack.pod,
-perlintern.pod, perllexwarn.pod, perlnumber.pod, perlopentut.pod,
-perlreftut.pod, perltootc.pod, perltodo.pod, perlunicode.pod
-
-=item Performance enhancements
-
-=over 4
-
-=item Simple sort() using { $a <=> $b } and the like are optimized
-
-=item Optimized assignments to lexical variables
-
-=item Faster subroutine calls
-
-=item delete(), each(), values() and hash iteration are faster
-
-=back
-
-=item Installation and Configuration Improvements
-
-=over 4
-
-=item -Dusethreads means something different
-
-=item New Configure flags
-
-=item Threadedness and 64-bitness now more daring
-
-=item Long Doubles
-
-=item -Dusemorebits
-
-=item -Duselargefiles
-
-=item installusrbinperl
-
-=item SOCKS support
-
-=item C<-A> flag
-
-=item Enhanced Installation Directories
-
-=back
-
-=item Platform specific changes
-
-=over 4
-
-=item Supported platforms
-
-=item DOS
-
-=item OS390 (OpenEdition MVS)
-
-=item VMS
-
-=item Win32
-
-=back
-
-=item Significant bug fixes
-
-=over 4
-
-=item <HANDLE> on empty files
-
-=item C<eval '...'> improvements
-
-=item All compilation errors are true errors
-
-=item Implicitly closed filehandles are safer
-
-=item Behavior of list slices is more consistent
-
-=item C<(\$)> prototype and C<$foo{a}>
-
-=item C<goto &sub> and AUTOLOAD
-
-=item C<-bareword> allowed under C<use integer>
-
-=item Failures in DESTROY()
-
-=item Locale bugs fixed
-
-=item Memory leaks
-
-=item Spurious subroutine stubs after failed subroutine calls
-
-=item Taint failures under C<-U>
-
-=item END blocks and the C<-c> switch
-
-=item Potential to leak DATA filehandles
-
-=back
-
-=item New or Changed Diagnostics
-
-"%s" variable %s masks earlier declaration in same %s, "my sub" not yet
-implemented, "our" variable %s redeclared, '!' allowed only after types %s,
-/ cannot take a count, / must be followed by a, A or Z, / must be followed
-by a*, A* or Z*, / must follow a numeric type, /%s/: Unrecognized escape
-\\%c passed through, /%s/: Unrecognized escape \\%c in character class
-passed through, /%s/ should probably be written as "%s", %s() called too
-early to check prototype, %s argument is not a HASH or ARRAY element, %s
-argument is not a HASH or ARRAY element or slice, %s argument is not a
-subroutine name, %s package attribute may clash with future reserved word:
-%s, (in cleanup) %s, <> should be quotes, Attempt to join self, Bad evalled
-substitution pattern, Bad realloc() ignored, Bareword found in conditional,
-Binary number > 0b11111111111111111111111111111111 non-portable, Bit vector
-size > 32 non-portable, Buffer overflow in prime_env_iter: %s, Can't check
-filesystem of script "%s", Can't declare class for non-scalar %s in "%s",
-Can't declare %s in "%s", Can't ignore signal CHLD, forcing to default,
-Can't modify non-lvalue subroutine call, Can't read CRTL environ, Can't
-remove %s: %s, skipping file, Can't return %s from lvalue subroutine, Can't
-weaken a nonreference, Character class [:%s:] unknown, Character class
-syntax [%s] belongs inside character classes, Constant is not %s reference,
-constant(%s): %s, CORE::%s is not a keyword, defined(@array) is deprecated,
-defined(%hash) is deprecated, Did not produce a valid header, (Did you mean
-"local" instead of "our"?), Document contains no data, entering effective
-%s failed, false [] range "%s" in regexp, Filehandle %s opened only for
-output, flock() on closed filehandle %s, Global symbol "%s" requires
-explicit package name, Hexadecimal number > 0xffffffff non-portable,
-Ill-formed CRTL environ value "%s", Ill-formed message in prime_env_iter:
-|%s|, Illegal binary digit %s, Illegal binary digit %s ignored, Illegal
-number of bits in vec, Integer overflow in %s number, Invalid %s attribute:
-%s, Invalid %s attributes: %s, invalid [] range "%s" in regexp, Invalid
-separator character %s in attribute list, Invalid separator character %s in
-subroutine attribute list, leaving effective %s failed, Lvalue subs
-returning %s not implemented yet, Method %s not permitted, Missing
-%sbrace%s on \N{}, Missing command in piped open, Missing name in "my sub",
-No %s specified for -%c, No package name allowed for variable %s in "our",
-No space allowed after -%c, no UTC offset information; assuming local time
-is UTC, Octal number > 037777777777 non-portable, panic: del_backref,
-panic: kid popen errno read, panic: magic_killbackrefs, Parentheses missing
-around "%s" list, Possible unintended interpolation of %s in string,
-Possible Y2K bug: %s, pragma "attrs" is deprecated, use "sub NAME : ATTRS"
-instead, Premature end of script headers, Repeat count in pack overflows,
-Repeat count in unpack overflows, realloc() of freed memory ignored,
-Reference is already weak, setpgrp can't take arguments, Strange *+?{} on
-zero-length expression, switching effective %s is not implemented, This
-Perl can't reset CRTL environ elements (%s), This Perl can't set CRTL
-environ elements (%s=%s), Too late to run %s block, Unknown open() mode
-'%s', Unknown process %x sent message to prime_env_iter: %s, Unrecognized
-escape \\%c passed through, Unterminated attribute parameter in attribute
-list, Unterminated attribute list, Unterminated attribute parameter in
-subroutine attribute list, Unterminated subroutine attribute list, Value of
-CLI symbol "%s" too long, Version number must be a constant number
-
-=item New tests
-
-=item Incompatible Changes
-
-=over 4
-
-=item Perl Source Incompatibilities
-
-CHECK is a new keyword, Treatment of list slices of undef has changed,
-Format of $English::PERL_VERSION is different, Literals of the form
-C<1.2.3> parse differently, Possibly changed pseudo-random number
-generator, Hashing function for hash keys has changed, C<undef> fails on
-read only values, Close-on-exec bit may be set on pipe and socket handles,
-Writing C<"$$1"> to mean C<"${$}1"> is unsupported, delete(), each(),
-values() and C<\(%h)>, vec(EXPR,OFFSET,BITS) enforces powers-of-two BITS,
-Text of some diagnostic output has changed, C<%@> has been removed,
-Parenthesized not() behaves like a list operator, Semantics of bareword
-prototype C<(*)> have changed, Semantics of bit operators may have changed
-on 64-bit platforms, More builtins taint their results
-
-=item C Source Incompatibilities
-
-C<PERL_POLLUTE>, C<PERL_IMPLICIT_CONTEXT>, C<PERL_POLLUTE_MALLOC>
-
-=item Compatible C Source API Changes
-
-C<PATCHLEVEL> is now C<PERL_VERSION>
-
-=item Binary Incompatibilities
-
-=back
-
-=item Known Problems
-
-=over 4
-
-=item Thread test failures
-
-=item EBCDIC platforms not supported
-
-=item In 64-bit HP-UX the lib/io_multihomed test may hang
-
-=item NEXTSTEP 3.3 POSIX test failure
-
-=item Tru64 (aka Digital UNIX, aka DEC OSF/1) lib/sdbm test failure with
-gcc
-
-=item UNICOS/mk CC failures during Configure run
-
-=item Arrow operator and arrays
-
-=item Experimental features
-
-Threads, Unicode, 64-bit support, Lvalue subroutines, Weak references, The
-pseudo-hash data type, The Compiler suite, Internal implementation of file
-globbing, The DB module, The regular expression code constructs:
-
-=back
-
-=item Obsolete Diagnostics
-
-Character class syntax [: :] is reserved for future extensions, Ill-formed
-logical name |%s| in prime_env_iter, In string, @%s now must be written as
-\@%s, Probable precedence problem on %s, regexp too big, Use of "$$<digit>"
-to mean "${$}<digit>" is deprecated
-
-=item Reporting Bugs
-
-=item SEE ALSO
-
-=item HISTORY
-
-=back
-
-=head2 perl5005delta - what's new for perl5.005
-
-=over 4
-
-=item DESCRIPTION
-
-=item About the new versioning system
-
-=item Incompatible Changes
-
-=over 4
-
-=item WARNING: This version is not binary compatible with Perl 5.004.
-
-=item Default installation structure has changed
-
-=item Perl Source Compatibility
-
-=item C Source Compatibility
-
-=item Binary Compatibility
-
-=item Security fixes may affect compatibility
-
-=item Relaxed new mandatory warnings introduced in 5.004
-
-=item Licensing
-
-=back
-
-=item Core Changes
-
-=over 4
-
-=item Threads
-
-=item Compiler
-
-=item Regular Expressions
-
-Many new and improved optimizations, Many bug fixes, New regular expression
-constructs, New operator for precompiled regular expressions, Other
-improvements, Incompatible changes
-
-=item Improved malloc()
-
-=item Quicksort is internally implemented
-
-=item Reliable signals
-
-=item Reliable stack pointers
-
-=item More generous treatment of carriage returns
-
-=item Memory leaks
-
-=item Better support for multiple interpreters
-
-=item Behavior of local() on array and hash elements is now well-defined
-
-=item C<%!> is transparently tied to the L<Errno> module
-
-=item Pseudo-hashes are supported
-
-=item C<EXPR foreach EXPR> is supported
-
-=item Keywords can be globally overridden
-
-=item C<$^E> is meaningful on Win32
-
-=item C<foreach (1..1000000)> optimized
-
-=item C<Foo::> can be used as implicitly quoted package name
-
-=item C<exists $Foo::{Bar::}> tests existence of a package
-
-=item Better locale support
-
-=item Experimental support for 64-bit platforms
-
-=item prototype() returns useful results on builtins
-
-=item Extended support for exception handling
-
-=item Re-blessing in DESTROY() supported for chaining DESTROY() methods
-
-=item All C<printf> format conversions are handled internally
-
-=item New C<INIT> keyword
-
-=item New C<lock> keyword
-
-=item New C<qr//> operator
-
-=item C<our> is now a reserved word
-
-=item Tied arrays are now fully supported
-
-=item Tied handles support is better
-
-=item 4th argument to substr
-
-=item Negative LENGTH argument to splice
-
-=item Magic lvalues are now more magical
-
-=item <> now reads in records
-
-=back
-
-=item Supported Platforms
-
-=over 4
-
-=item New Platforms
-
-=item Changes in existing support
-
-=back
-
-=item Modules and Pragmata
-
-=over 4
-
-=item New Modules
-
-B, Data::Dumper, Dumpvalue, Errno, File::Spec, ExtUtils::Installed,
-ExtUtils::Packlist, Fatal, IPC::SysV, Test, Tie::Array, Tie::Handle,
-Thread, attrs, fields, re
-
-=item Changes in existing modules
-
-Benchmark, Carp, CGI, Fcntl, Math::Complex, Math::Trig, POSIX, DB_File,
-MakeMaker, CPAN, Cwd
-
-=back
-
-=item Utility Changes
-
-=item Documentation Changes
-
-=item New Diagnostics
-
-Ambiguous call resolved as CORE::%s(), qualify as such or use &, Bad index
-while coercing array into hash, Bareword "%s" refers to nonexistent
-package, Can't call method "%s" on an undefined value, Can't check
-filesystem of script "%s" for nosuid, Can't coerce array into hash, Can't
-goto subroutine from an eval-string, Can't localize pseudo-hash element,
-Can't use %%! because Errno.pm is not available, Cannot find an opnumber
-for "%s", Character class syntax [. .] is reserved for future extensions,
-Character class syntax [: :] is reserved for future extensions, Character
-class syntax [= =] is reserved for future extensions, %s: Eval-group in
-insecure regular expression, %s: Eval-group not allowed, use re 'eval', %s:
-Eval-group not allowed at run time, Explicit blessing to '' (assuming
-package main), Illegal hex digit ignored, No such array field, No such
-field "%s" in variable %s of type %s, Out of memory during ridiculously
-large request, Range iterator outside integer range, Recursive inheritance
-detected while looking for method '%s' %s, Reference found where even-sized
-list expected, Undefined value assigned to typeglob, Use of reserved word
-"%s" is deprecated, perl: warning: Setting locale failed
-
-=item Obsolete Diagnostics
-
-Can't mktemp(), Can't write to temp file for B<-e>: %s, Cannot open
-temporary file, regexp too big
-
-=item Configuration Changes
-
-=item BUGS
-
-=item SEE ALSO
-
-=item HISTORY
-
-=back
-
-=head2 perl5004delta - what's new for perl5.004
-
-=over 4
-
-=item DESCRIPTION
-
-=item Supported Environments
-
-=item Core Changes
-
-=over 4
-
-=item List assignment to %ENV works
-
-=item Change to "Can't locate Foo.pm in @INC" error
-
-=item Compilation option: Binary compatibility with 5.003
-
-=item $PERL5OPT environment variable
-
-=item Limitations on B<-M>, B<-m>, and B<-T> options
-
-=item More precise warnings
-
-=item Deprecated: Inherited C<AUTOLOAD> for non-methods
-
-=item Previously deprecated %OVERLOAD is no longer usable
-
-=item Subroutine arguments created only when they're modified
-
-=item Group vector changeable with C<$)>
-
-=item Fixed parsing of $$<digit>, &$<digit>, etc.
-
-=item Fixed localization of $<digit>, $&, etc.
-
-=item No resetting of $. on implicit close
-
-=item C<wantarray> may return undef
-
-=item C<eval EXPR> determines value of EXPR in scalar context
-
-=item Changes to tainting checks
-
-No glob() or <*>, No spawning if tainted $CDPATH, $ENV, $BASH_ENV, No
-spawning if tainted $TERM doesn't look like a terminal name
-
-=item New Opcode module and revised Safe module
-
-=item Embedding improvements
-
-=item Internal change: FileHandle class based on IO::* classes
-
-=item Internal change: PerlIO abstraction interface
-
-=item New and changed syntax
-
-$coderef->(PARAMS)
-
-=item New and changed builtin constants
-
-__PACKAGE__
-
-=item New and changed builtin variables
-
-$^E, $^H, $^M
-
-=item New and changed builtin functions
-
-delete on slices, flock, printf and sprintf, keys as an lvalue, my() in
-Control Structures, pack() and unpack(), sysseek(), use VERSION, use Module
-VERSION LIST, prototype(FUNCTION), srand, $_ as Default, C<m//gc> does not
-reset search position on failure, C<m//x> ignores whitespace before ?*+{},
-nested C<sub{}> closures work now, formats work right on changing lexicals
-
-=item New builtin methods
-
-isa(CLASS), can(METHOD), VERSION( [NEED] )
-
-=item TIEHANDLE now supported
-
-TIEHANDLE classname, LIST, PRINT this, LIST, PRINTF this, LIST, READ this
-LIST, READLINE this, GETC this, DESTROY this
-
-=item Malloc enhancements
-
--DPERL_EMERGENCY_SBRK, -DPACK_MALLOC, -DTWO_POT_OPTIMIZE
-
-=item Miscellaneous efficiency enhancements
-
-=back
-
-=item Support for More Operating Systems
-
-=over 4
-
-=item Win32
-
-=item Plan 9
-
-=item QNX
-
-=item AmigaOS
-
-=back
-
-=item Pragmata
-
-use autouse MODULE => qw(sub1 sub2 sub3), use blib, use blib 'dir', use
-constant NAME => VALUE, use locale, use ops, use vmsish
-
-=item Modules
-
-=over 4
-
-=item Required Updates
-
-=item Installation directories
-
-=item Module information summary
-
-=item Fcntl
-
-=item IO
-
-=item Math::Complex
-
-=item Math::Trig
-
-=item DB_File
-
-=item Net::Ping
-
-=item Object-oriented overrides for builtin operators
-
-=back
-
-=item Utility Changes
-
-=over 4
-
-=item pod2html
-
-Sends converted HTML to standard output
-
-=item xsubpp
-
-C<void> XSUBs now default to returning nothing
-
-=back
-
-=item C Language API Changes
-
-C<gv_fetchmethod> and C<perl_call_sv>, C<perl_eval_pv>, Extended API for
-manipulating hashes
-
-=item Documentation Changes
-
-L<perldelta>, L<perlfaq>, L<perllocale>, L<perltoot>, L<perlapio>,
-L<perlmodlib>, L<perldebug>, L<perlsec>
-
-=item New Diagnostics
-
-"my" variable %s masks earlier declaration in same scope, %s argument is
-not a HASH element or slice, Allocation too large: %lx, Allocation too
-large, Applying %s to %s will act on scalar(%s), Attempt to free
-nonexistent shared string, Attempt to use reference as lvalue in substr,
-Bareword "%s" refers to nonexistent package, Can't redefine active sort
-subroutine %s, Can't use bareword ("%s") as %s ref while "strict refs" in
-use, Cannot resolve method `%s' overloading `%s' in package `%s', Constant
-subroutine %s redefined, Constant subroutine %s undefined, Copy method did
-not return a reference, Died, Exiting pseudo-block via %s, Identifier too
-long, Illegal character %s (carriage return), Illegal switch in PERL5OPT:
-%s, Integer overflow in hex number, Integer overflow in octal number,
-internal error: glob failed, Invalid conversion in %s: "%s", Invalid type
-in pack: '%s', Invalid type in unpack: '%s', Name "%s::%s" used only once:
-possible typo, Null picture in formline, Offset outside string, Out of
-memory!, Out of memory during request for %s, panic: frexp, Possible
-attempt to put comments in qw() list, Possible attempt to separate words
-with commas, Scalar value @%s{%s} better written as $%s{%s}, Stub found
-while resolving method `%s' overloading `%s' in %s, Too late for "B<-T>"
-option, untie attempted while %d inner references still exist, Unrecognized
-character %s, Unsupported function fork, Use of "$$<digit>" to mean
-"${$}<digit>" is deprecated, Value of %s can be "0"; test with defined(),
-Variable "%s" may be unavailable, Variable "%s" will not stay shared,
-Warning: something's wrong, Ill-formed logical name |%s| in prime_env_iter,
-Got an error from DosAllocMem, Malformed PERLLIB_PREFIX, PERL_SH_DIR too
-long, Process terminated by SIG%s
-
-=item BUGS
-
-=item SEE ALSO
-
-=item HISTORY
-
-=back
-
-=head2 perlartistic - the Perl Artistic License
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item The "Artistic License"
-
-=over 4
-
-=item Preamble
-
-=item Definitions
-
-"Package", "Standard Version", "Copyright Holder", "You", "Reasonable
-copying fee", "Freely Available"
-
-=item Conditions
-
-a), b), c), d), a), b), c), d)
-
-=back
-
-=back
-
-=head2 perlgpl - the GNU General Public License, version 2
-
-=over 4
-
-=item SYNOPSIS
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item GNU GENERAL PUBLIC LICENSE
-
-=back
-
-=head2 perlaix, README.aix - Perl version 5 on IBM Unix (AIX) systems
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Compiling Perl 5 on AIX
-
-=item Supported Compilers
-
-=item Perl 5.8.9 was successfully compiled and tested on:
-
- AIX Level | Compiler Level | w th | w/o th
- --------------------------+-------------------------+------+-------
- 5.1 TL9 32 bit | XL C/C++ V7 | OK | OK
- 5.1 TL9 32 bit | gcc 3.2.2 | OK | OK
- 5.1 TL9 64 bit | XL C/C++ V7 | OK | OK
- 5.2 TL10 32 bit | XL C/C++ V8 | OK | OK
- 5.2 TL10 64 bit | XL C/C++ V8 | OK | OK
- 5.3 TL7 32 bit | XL C/C++ V9 + IZ35785 | OK | OK
- 5.3 TL7 32 bit | gcc 4.2.4 | OK | OK
- 5.3 TL7 64 bit | XL C/C++ V9 + IZ35785 | OK | OK
- 6.1 TL1 32 bit | XL C/C++ V10 | OK | OK
- 6.1 TL1 64 bit + IZ39077 | XL C/C++ V10 | OK | OK
-
- w th = with thread
- w/o th = without thread
-
-=item Building Dynamic Extensions on AIX
-
-=item Using Large Files with Perl
-
-=item Threaded Perl
-
-=item 64-bit Perl
-
-=item Recommended Options AIX 5.1/5.2/5.3 and 6.1 (threaded/32-bit)
-
-=item Recommended Options AIX 5.1/5.2/5.3 and 6.1 (32-bit)
-
-=item Recommended Options AIX 5.1/5.2/5.3 and 6.1 (threaded/64-bit)
-
-=item Recommended Options AIX 5.1/5.2/5.3 and 6.1(64-bit)
-
-=item Compiling Perl 5 on older AIX versions up to 4.3.3
-
-=item OS level
-
-=item Building Dynamic Extensions on AIX
-
-=item The IBM ANSI C Compiler
-
-=item The usenm option
-
-=item Using GNU's gcc for building Perl
-
-=item Using Large Files with Perl
-
-=item Threaded Perl
-
-=item 64-bit Perl
-
-=item AIX 4.2 and extensions using C++ with statics
-
-=back
-
-=item AUTHORS
-
-=item DATE
-
-=back
-
-=head2 perlamiga - Perl under Amiga OS
-
-=over 4
-
-=item NOTE
-
-=item SYNOPSIS
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Prerequisites for Compiling Perl on AmigaOS
-
-B<Unix emulation for AmigaOS: ixemul.library>, B<Version of Amiga OS>
-
-=item Starting Perl programs under AmigaOS
-
-=item Shortcomings of Perl under AmigaOS
-
-=back
-
-=item INSTALLATION
-
-=item Accessing documentation
-
-=over 4
-
-=item Manpages for Perl on AmigaOS
-
-=item Perl HTML Documentation on AmigaOS
-
-=item Perl GNU Info Files on AmigaOS
-
-=item Perl LaTeX Documentation on AmigaOS
-
-=back
-
-=item BUILDING PERL ON AMIGAOS
-
-=over 4
-
-=item Build Prerequisites for Perl on AmigaOS
-
-=item Getting the Perl Source for AmigaOS
-
-=item Making Perl on AmigaOS
-
-=item Testing Perl on AmigaOS
-
-=item Installing the built Perl on AmigaOS
-
-=back
-
-=item PERL 5.8.0 BROKEN IN AMIGAOS
-
-=item AUTHORS
-
-=item SEE ALSO
-
-=back
-
-=head2 perlapollo, README.apollo - Perl version 5 on Apollo DomainOS
-
-=over 4
-
-=item DESCRIPTION
-
-=item AUTHOR
-
-=back
-
-=head2 perlbeos, README.beos - Perl version 5.8+ on BeOS
-
-=over 4
-
-=item DESCRIPTION
-
-=item BUILD AND INSTALL
-
-=over 4
-
-=item Requirements
-
-=item Configure
-
-=item Build
-
-=item Install
-
-=back
-
-=item KNOWN PROBLEMS
-
-=item CONTACT
-
-=back
-
-=head2 perlbs2000, README.BS2000 - building and installing Perl for BS2000.
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item gzip on BS2000
-
-=item bison on BS2000
-
-=item Unpacking Perl Distribution on BS2000
-
-=item Compiling Perl on BS2000
-
-=item Testing Perl on BS2000
-
-=item Installing Perl on BS2000
-
-=item Using Perl in the Posix-Shell of BS2000
-
-=item Using Perl in "native" BS2000
-
-=item Floating point anomalies on BS2000
-
-=item Using PerlIO and different encodings on ASCII and EBCDIC partitions
-
-=back
-
-=item AUTHORS
-
-=item SEE ALSO
-
-=over 4
-
-=item Mailing list
-
-=back
-
-=item HISTORY
-
-=back
-
-=head2 perlce - Perl for WinCE
-
-=over 4
-
-=item Building Perl for WinCE
-
-=over 4
-
-=item DESCRIPTION
-
-=item General explanations on cross-compiling WinCE
-
-=item BUILD
-
-Microsoft Embedded Visual Tools, Microsoft Visual C++, Rainer Keuchel's
-celib-sources, Rainer Keuchel's console-sources, go to C<./win32>
-subdirectory, edit file C<./win32/ce-helpers/compile.bat>, run
-compile.bat, run compile.bat dist
-
-=back
-
-=item Using Perl on WinCE
-
-=over 4
-
-=item DESCRIPTION
-
-=item LIMITATIONS
-
-=item ENVIRONMENT
-
-PERL5LIB, PATH, TMP, UNIXROOTPATH, ROWS/COLS, HOME, CONSOLEFONTSIZE
-
-=item REGISTRY
-
-=item XS
-
-=item BUGS
-
-=item INSTALLATION
-
-=back
-
-=item ACKNOWLEDGEMENTS
-
-=item History of WinCE port
-
-=item AUTHORS
-
-Rainer Keuchel <coyxc@rainer-keuchel.de>, Vadim Konovalov
-
-=back
-
-=head2 perlcygwin, README.cygwin - Perl for Cygwin
-
-=over 4
-
-=item SYNOPSIS
-
-=item PREREQUISITES FOR COMPILING PERL ON CYGWIN
-
-=over 4
-
-=item Cygwin = GNU+Cygnus+Windows (Don't leave UNIX without it)
-
-=item Cygwin Configuration
-
-C<PATH>, I<nroff>, Permissions
-
-=back
-
-=item CONFIGURE PERL ON CYGWIN
-
-=over 4
-
-=item Stripping Perl Binaries on Cygwin
-
-=item Optional Libraries for Perl on Cygwin
-
-C<-lcrypt>, C<-lgdbm_compat> (C<use GDBM_File>), C<-ldb> (C<use DB_File>),
-C<cygserver> (C<use IPC::SysV>), C<-lutil>
-
-=item Configure-time Options for Perl on Cygwin
-
-C<-Uusedl>, C<-Uusemymalloc>, C<-Uuseperlio>, C<-Dusemultiplicity>,
-C<-Duse64bitint>, C<-Duselongdouble>, C<-Dusethreads>, C<-Duselargefiles>,
-C<-Dmksymlinks>
-
-=item Suspicious Warnings on Cygwin
-
-Win9x and C<d_eofnblk>, Compiler/Preprocessor defines
-
-=back
-
-=item MAKE ON CYGWIN
-
-=item TEST ON CYGWIN
-
-=over 4
-
-=item File Permissions on Cygwin
-
-=item NDBM_File and ODBM_File do not work on FAT filesystems
-
-=item C<fork()> failures in io_* tests
-
-=back
-
-=item Specific features of the Cygwin port
-
-=over 4
-
-=item Script Portability on Cygwin
-
-Pathnames, Text/Binary, PerlIO, F<.exe>, Cygwin vs. Windows process ids,
-Cygwin vs. Windows errors, C<chown()>, Miscellaneous
-
-=item Prebuilt methods:
-
-C<Cwd::cwd>, C<Cygwin::pid_to_winpid>, C<Cygwin::winpid_to_pid>,
-C<Cygwin::win_to_posix_path>, C<Cygwin::posix_to_win_path>,
-C<Cygwin::mount_table()>, C<Cygwin::mount_flags>, C<Cygwin::is_binmount>
-
-=back
-
-=item INSTALL PERL ON CYGWIN
-
-=item MANIFEST ON CYGWIN
-
-Documentation, Build, Configure, Make, Install, Tests, Compiled Perl
-Source, Compiled Module Source, Perl Modules/Scripts, Perl Module Tests
-
-=item BUGS ON CYGWIN
-
-=item AUTHORS
-
-=item HISTORY
-
-=back
-
-=head2 perldgux - Perl under DG/UX.
-
-=over 4
-
-=item SYNOPSIS
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item BUILDING PERL ON DG/UX
-
-=over 4
-
-=item Non-threaded Perl on DG/UX
-
-=item Threaded Perl on DG/UX
-
-=item Testing Perl on DG/UX
-
-=item Installing the built perl on DG/UX
-
-=back
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 perldos - Perl under DOS, W31, W95.
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Prerequisites for Compiling Perl on DOS
-
-DJGPP, Pthreads
-
-=item Shortcomings of Perl under DOS
-
-=item Building Perl on DOS
-
-=item Testing Perl on DOS
-
-=item Installation of Perl on DOS
-
-=back
-
-=item BUILDING AND INSTALLING MODULES ON DOS
-
-=over 4
-
-=item Building Prerequisites for Perl on DOS
-
-=item Unpacking CPAN Modules on DOS
-
-=item Building Non-XS Modules on DOS
-
-=item Building XS Modules on DOS
-
-=back
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 perlepoc, README.epoc - Perl for EPOC
-
-=over 4
-
-=item SYNOPSIS
-
-=item INTRODUCTION
-
-=item INSTALLING PERL ON EPOC
-
-=item STARTING PERL ON EPOC
-
-=over 4
-
-=item Editors on Epoc
-
-=item Features of Perl on Epoc
-
-=item Restrictions of Perl on Epoc
-
-=item Compiling Perl 5 on the EPOC cross compiling environment
-
-=back
-
-=item SUPPORT STATUS OF PERL ON EPOC
-
-=item AUTHOR
-
-=item LAST UPDATE
-
-=back
-
-=head2 perlfreebsd, README.freebsd - Perl version 5 on FreeBSD systems
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item FreeBSD core dumps from readdir_r with ithreads
-
-=item $^X doesn't always contain a full path in FreeBSD
-
-=item Perl will no longer be part of "base FreeBSD"
-
-=back
-
-=item AUTHOR
-
-=back
-
-=head2 perlhaiku, README.haiku - Perl version 5.10+ on Haiku
-
-=over 4
-
-=item DESCRIPTION
-
-=item BUILD AND INSTALL
-
-=item KNOWN PROBLEMS
-
-=item CONTACT
-
-=back
-
-=head2 perlhpux, README.hpux - Perl version 5 on Hewlett-Packard Unix
-(HP-UX) systems
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Using perl as shipped with HP-UX
-
-=item Using perl from HP's porting centre
-
-=item Compiling Perl 5 on HP-UX
-
-=item PA-RISC
-
-=item Portability Between PA-RISC Versions
-
-=item PA-RISC 1.0
-
-=item PA-RISC 1.1
-
-=item PA-RISC 2.0
-
-=item Itanium Processor Family (IPF) and HP-UX
-
-=item Itanium, Itanium 2 & Madison 6
-
-=item HP-UX versions
-
-=item Building Dynamic Extensions on HP-UX
-
-=item The HP ANSI C Compiler
-
-=item The GNU C Compiler
-
-=item Using Large Files with Perl on HP-UX
-
-=item Threaded Perl on HP-UX
-
-=item 64-bit Perl on HP-UX
-
-=item Oracle on HP-UX
-
-=item GDBM and Threads on HP-UX
-
-=item NFS filesystems and utime(2) on HP-UX
-
-=item HP-UX Kernel Parameters (maxdsiz) for Compiling Perl
-
-=back
-
-=item nss_delete core dump from op/pwent or op/grent
-
-=item Miscellaneous
-
-=item AUTHOR
-
-=item DATE
-
-=back
-
-=head2 perlhurd, README.hurd - Perl version 5 on Hurd
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Known Problems with Perl on Hurd
-
-=back
-
-=item AUTHOR
-
-=back
-
-=head2 perlirix, README.irix - Perl version 5 on Irix systems
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Building 32-bit Perl in Irix
-
-=item Building 64-bit Perl in Irix
-
-=item About Compiler Versions of Irix
-
-=item Linker Problems in Irix
-
-=item Malloc in Irix
-
-=item Building with threads in Irix
-
-=item Irix 5.3
-
-=back
-
-=item AUTHOR
-
-=back
-
-=head2 perllinux, README.linux - Perl version 5 on Linux systems
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Experimental Support for Sun Studio Compilers for Linux OS
-
-=back
-
-=item AUTHOR
-
-=back
-
-=head2 perlmachten, README.machten - Perl version 5 on Power MachTen
-systems
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Perl version 5.8.x and greater not supported
-
-=item Compiling Perl 5.6.x on MachTen
-
-=item Failures during C<make test> on MachTen
-
-op/lexassign.t, pragma/warnings.t
-
-=item Building external modules on MachTen
-
-=back
-
-=item AUTHOR
-
-=item DATE
-
-=back
-
-=head2 perlmacos, README.macos - Perl under Mac OS (Classic)
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item AUTHOR
-
-=item DATE
-
-=back
-
-=head2 perlmacosx, README.macosx - Perl under Mac OS X
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Installation Prefix
-
-=item SDK support
-
-=item Universal Binary support
-
-=item 64-bit PPC support
-
-=item libperl and Prebinding
-
-=item Updating Apple's Perl
-
-=item Known problems
-
-=item MacPerl
-
-=item Carbon
-
-=item Cocoa
-
-=back
-
-=item Starting From Scratch
-
-=item AUTHOR
-
-=item DATE
-
-=back
-
-=head2 perlmint, README.mint - Perl version 5 on Atari MiNT
-
-=over 4
-
-=item DESCRIPTION
-
-=item Known problems with Perl on MiNT
-
-=item AUTHOR
-
-=back
-
-=head2 perlmpeix, README.mpeix - Perl/iX for HP e3000 MPE
-
-=over 4
-
-=item SYNOPSIS
-
-=item NOTE
-
-=item Binary distribution from HP
-
-=item What's New in Perl for MPE/iX
-
-=item Welcome to Perl/iX
-
-=item System Requirements for Perl/iX
-
-=item How to Obtain Perl/iX
-
-=item Perl/iX Distribution Contents Highlights
-
-README, INSTALL, LIBSHP3K, PERL, .cpan/, lib/, man/,
-public_html/feedback.cgi, src/perl-5.6.0-mpe
-
-=item How to Compile Perl/iX
-
- 4, 6
-
-=item Getting Started with Perl/iX
-
-=item MPE/iX Implementation Considerations
-
-=item Known Perl/iX Bugs Under Investigation
-
-=item Perl/iX To-Do List
-
-=item Perl/iX Change History
-
-=item AUTHOR
-
-=back
-
-=head2 perlnetware - Perl for NetWare
-
-=over 4
-
-=item DESCRIPTION
-
-=item BUILD
-
-=over 4
-
-=item Tools & SDK
-
-=item Setup
-
-SetNWBld.bat, Buildtype.bat
-
-=item Make
-
-=item Interpreter
-
-=item Extensions
-
-=back
-
-=item INSTALL
-
-=item BUILD NEW EXTENSIONS
-
-=item ACKNOWLEDGEMENTS
-
-=item AUTHORS
-
-=item DATE
-
-=back
-
-=head2 perlopenbsd, README.openbsd - Perl version 5 on OpenBSD systems
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item OpenBSD core dumps from getprotobyname_r and getservbyname_r with
-ithreads
-
-=back
-
-=item AUTHOR
-
-=back
-
-=head2 perlos2 - Perl under OS/2, DOS, Win0.3*, Win0.95 and WinNT.
-
-=over 4
-
-=item SYNOPSIS
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Target
-
-=item Other OSes
-
-=item Prerequisites
-
-EMX, RSX, HPFS, pdksh
-
-=item Starting Perl programs under OS/2 (and DOS and...)
-
-=item Starting OS/2 (and DOS) programs under Perl
-
-=back
-
-=item Frequently asked questions
-
-=over 4
-
-=item "It does not work"
-
-=item I cannot run external programs
-
-=item I cannot embed perl into my program, or use F<perl.dll> from my
-program.
-
-Is your program EMX-compiled with C<-Zmt -Zcrtdll>?, Did you use
-L<ExtUtils::Embed>?
-
-=item C<``> and pipe-C<open> do not work under DOS.
-
-=item Cannot start C<find.exe "pattern" file>
-
-=back
-
-=item INSTALLATION
-
-=over 4
-
-=item Automatic binary installation
-
-C<PERL_BADLANG>, C<PERL_BADFREE>, F<Config.pm>
-
-=item Manual binary installation
-
-Perl VIO and PM executables (dynamically linked), Perl_ VIO executable
-(statically linked), Executables for Perl utilities, Main Perl library,
-Additional Perl modules, Tools to compile Perl modules, Manpages for Perl
-and utilities, Manpages for Perl modules, Source for Perl documentation,
-Perl manual in F<.INF> format, Pdksh
-
-=item B<Warning>
-
-=back
-
-=item Accessing documentation
-
-=over 4
-
-=item OS/2 F<.INF> file
-
-=item Plain text
-
-=item Manpages
-
-=item HTML
-
-=item GNU C<info> files
-
-=item F<PDF> files
-
-=item C<LaTeX> docs
-
-=back
-
-=item BUILD
-
-=over 4
-
-=item The short story
-
-=item Prerequisites
-
-=item Getting perl source
-
-=item Application of the patches
-
-=item Hand-editing
-
-=item Making
-
-=item Testing
-
-A lot of C<bad free>, Process terminated by SIGTERM/SIGINT, F<op/fs.t>,
-F<op/stat.t>
-
-=item Installing the built perl
-
-=item C<a.out>-style build
-
-=back
-
-=item Building a binary distribution
-
-=item Building custom F<.EXE> files
-
-=over 4
-
-=item Making executables with a custom collection of statically loaded
-extensions
-
-=item Making executables with a custom search-paths
-
-=back
-
-=item Build FAQ
-
-=over 4
-
-=item Some C</> became C<\> in pdksh.
-
-=item C<'errno'> - unresolved external
-
-=item Problems with tr or sed
-
-=item Some problem (forget which ;-)
-
-=item Library ... not found
-
-=item Segfault in make
-
-=item op/sprintf test failure
-
-=back
-
-=item Specific (mis)features of OS/2 port
-
-=over 4
-
-=item C<setpriority>, C<getpriority>
-
-=item C<system()>
-
-=item C<extproc> on the first line
-
-=item Additional modules:
-
-=item Prebuilt methods:
-
-C<File::Copy::syscopy>, C<DynaLoader::mod2fname>, C<Cwd::current_drive()>,
- C<Cwd::sys_chdir(name)>, C<Cwd::change_drive(name)>,
-C<Cwd::sys_is_absolute(name)>, C<Cwd::sys_is_rooted(name)>,
-C<Cwd::sys_is_relative(name)>, C<Cwd::sys_cwd(name)>,
-C<Cwd::sys_abspath(name, dir)>, C<Cwd::extLibpath([type])>,
-C<Cwd::extLibpath_set( path [, type ] )>,
-C<OS2::Error(do_harderror,do_exception)>, C<OS2::Errors2Drive(drive)>,
-OS2::SysInfo(), OS2::BootDrive(), C<OS2::MorphPM(serve)>,
-C<OS2::UnMorphPM(serve)>, C<OS2::Serve_Messages(force)>,
-C<OS2::Process_Messages(force [, cnt])>, C<OS2::_control87(new,mask)>,
-OS2::get_control87(), C<OS2::set_control87_em(new=MCW_EM,mask=MCW_EM)>,
-C<OS2::DLLname([how [, \&xsub]])>
-
-=item Prebuilt variables:
-
-$OS2::emx_rev, $OS2::emx_env, $OS2::os_ver, $OS2::is_aout, $OS2::can_fork,
-$OS2::nsyserror
-
-=item Misfeatures
-
-=item Modifications
-
-C<popen>, C<tmpnam>, C<tmpfile>, C<ctermid>, C<stat>, C<mkdir>, C<rmdir>,
-C<flock>
-
-=item Identifying DLLs
-
-=item Centralized management of resources
-
-C<HAB>, C<HMQ>, Treating errors reported by OS/2 API,
-C<CheckOSError(expr)>, C<CheckWinError(expr)>, C<SaveWinError(expr)>,
-C<SaveCroakWinError(expr,die,name1,name2)>, C<WinError_2_Perl_rc>,
-C<FillWinError>, C<FillOSError(rc)>, Loading DLLs and ordinals in DLLs
-
-=back
-
-=item Perl flavors
-
-=over 4
-
-=item F<perl.exe>
-
-=item F<perl_.exe>
-
-=item F<perl__.exe>
-
-=item F<perl___.exe>
-
-=item Why strange names?
-
-=item Why dynamic linking?
-
-=item Why chimera build?
-
-=back
-
-=item ENVIRONMENT
-
-=over 4
-
-=item C<PERLLIB_PREFIX>
-
-=item C<PERL_BADLANG>
-
-=item C<PERL_BADFREE>
-
-=item C<PERL_SH_DIR>
-
-=item C<USE_PERL_FLOCK>
-
-=item C<TMP> or C<TEMP>
-
-=back
-
-=item Evolution
-
-=over 4
-
-=item Text-mode filehandles
-
-=item Priorities
-
-=item DLL name mangling: pre 5.6.2
-
-=item DLL name mangling: 5.6.2 and beyond
-
-Global DLLs, specific DLLs, C<BEGINLIBPATH> and C<ENDLIBPATH>, F<.> from
-C<LIBPATH>
-
-=item DLL forwarder generation
-
-=item Threading
-
-=item Calls to external programs
-
-=item Memory allocation
-
-=item Threads
-
-C<COND_WAIT>, F<os2.c>
-
-=back
-
-=item BUGS
-
-=back
-
-=over 4
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 perlos390, README.os390 - building and installing Perl for OS/390
-and z/OS
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Tools
-
-=item Unpacking Perl distribution on OS/390
-
-=item Setup and utilities for Perl on OS/390
-
-=item Configure Perl on OS/390
-
-=item Build, Test, Install Perl on OS/390
-
-=item Build Anomalies with Perl on OS/390
-
-=item Testing Anomalies with Perl on OS/390
-
-=item Installation Anomalies with Perl on OS/390
-
-=item Usage Hints for Perl on OS/390
-
-=item Floating Point Anomalies with Perl on OS/390
-
-=item Modules and Extensions for Perl on OS/390
-
-=back
-
-=item AUTHORS
-
-=item SEE ALSO
-
-=over 4
-
-=item Mailing list for Perl on OS/390
-
-=back
-
-=item HISTORY
-
-=back
-
-=head2 perlos400, README.os400 - Perl version 5 on OS/400
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Compiling Perl for OS/400 PASE
-
-=item Installing Perl in OS/400 PASE
-
-=item Using Perl in OS/400 PASE
-
-=item Known Problems
-
-=item Perl on ILE
-
-=back
-
-=item AUTHORS
-
-=back
-
-=head2 perlplan9 - Plan 9-specific documentation for Perl
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Invoking Perl
-
-=item What's in Plan 9 Perl
-
-=item What's not in Plan 9 Perl
-
-=item Perl5 Functions not currently supported in Plan 9 Perl
-
-=item Signals in Plan 9 Perl
-
-=back
-
-=item COMPILING AND INSTALLING PERL ON PLAN 9
-
-=over 4
-
-=item Installing Perl Documentation on Plan 9
-
-=back
-
-=item BUGS
-
-=item Revision date
-
-=item AUTHOR
-
-=back
-
-=head2 perlqnx, README.qnx - Perl version 5 on QNX
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Required Software for Compiling Perl on QNX4
-
-/bin/sh, ar, nm, cpp, make
-
-=item Outstanding Issues with Perl on QNX4
-
-=item QNX auxiliary files
-
-qnx/ar, qnx/cpp
-
-=item Outstanding issues with perl under QNX6
-
-=back
-
-=item AUTHOR
-
-=back
-
-=head2 perlriscos, README.riscos - Perl version 5 for RISC OS
-
-=over 4
-
-=item DESCRIPTION
-
-=item BUILD
-
-=item AUTHOR
-
-=back
-
-=head2 perlsolaris, README.solaris - Perl version 5 on Solaris systems
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Solaris Version Numbers.
-
-=back
-
-=item RESOURCES
-
-Solaris FAQ, Precompiled Binaries, Solaris Documentation
-
-=item SETTING UP
-
-=over 4
-
-=item File Extraction Problems on Solaris.
-
-=item Compiler and Related Tools on Solaris.
-
-=item Environment for Compiling perl on Solaris
-
-=back
-
-=item RUN CONFIGURE.
-
-=over 4
-
-=item 64-bit perl on Solaris.
-
-=item Threads in perl on Solaris.
-
-=item Malloc Issues with perl on Solaris.
-
-=back
-
-=item MAKE PROBLEMS.
-
-Dynamic Loading Problems With GNU as and GNU ld, ld.so.1: ./perl: fatal:
-relocation error:, dlopen: stub interception failed, #error "No
-DATAMODEL_NATIVE specified", sh: ar: not found
-
-=item MAKE TEST
-
-=over 4
-
-=item op/stat.t test 4 in Solaris
-
-=item nss_delete core dump from op/pwent or op/grent
-
-=back
-
-=item PREBUILT BINARIES OF PERL FOR SOLARIS.
-
-=item RUNTIME ISSUES FOR PERL ON SOLARIS.
-
-=over 4
-
-=item Limits on Numbers of Open Files on Solaris.
-
-=back
-
-=item SOLARIS-SPECIFIC MODULES.
-
-=item SOLARIS-SPECIFIC PROBLEMS WITH MODULES.
-
-=over 4
-
-=item Proc::ProcessTable on Solaris
-
-=item BSD::Resource on Solaris
-
-=item Net::SSLeay on Solaris
-
-=back
-
-=item SunOS 4.x
-
-=item AUTHOR
-
-=back
-
-=head2 perlsymbian, README.symbian - Perl version 5 on Symbian OS
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Compiling Perl on Symbian
-
-=item Compilation problems
-
-=item PerlApp
-
-=item sisify.pl
-
-=item Using Perl in Symbian
-
-=back
-
-=item TO DO
-
-=item WARNING
-
-=item NOTE
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=item LICENSE
-
-=item HISTORY
-
-=back
-
-=head2 perltru64, README.tru64 - Perl version 5 on Tru64 (formerly known as
-Digital UNIX formerly known as DEC OSF/1) systems
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Compiling Perl 5 on Tru64
-
-=item Using Large Files with Perl on Tru64
-
-=item Threaded Perl on Tru64
-
-=item Long Doubles on Tru64
-
-=item DB_File tests failing on Tru64
-
-=item 64-bit Perl on Tru64
-
-=item Warnings about floating-point overflow when compiling Perl on Tru64
-
-=back
-
-=item Testing Perl on Tru64
-
-=item ext/ODBM_File/odbm Test Failing With Static Builds
-
-=item Perl Fails Because Of Unresolved Symbol sockatmark
-
-=item AUTHOR
-
-=back
-
-=head2 perluts - Perl under UTS
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item BUILDING PERL ON UTS
-
-=item Installing the built perl on UTS
-
-=item AUTHOR
-
-=back
-
-=head2 perlvmesa, README.vmesa - building and installing Perl for VM/ESA.
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Unpacking Perl Distribution on VM/ESA
-
-=item Setup Perl and utilities on VM/ESA
-
-=item Configure Perl on VM/ESA
-
-=item Testing Anomalies of Perl on VM/ESA
-
-=item Usage Hints for Perl on VM/ESA
-
-=back
-
-=item AUTHORS
-
-=item SEE ALSO
-
-=over 4
-
-=item Mailing list for Perl on VM/ESA
-
-=back
-
-=back
-
-=head2 perlvms - VMS-specific documentation for Perl
-
-=over 4
-
-=item DESCRIPTION
-
-=item Installation
-
-=item Organization of Perl Images
-
-=over 4
-
-=item Core Images
-
-=item Perl Extensions
-
-=item Installing static extensions
-
-=item Installing dynamic extensions
-
-=back
-
-=item File specifications
-
-=over 4
-
-=item Syntax
-
-=item Filename Case
-
-=item Symbolic Links
-
-=item Wildcard expansion
-
-=item Pipes
-
-=back
-
-=item PERL5LIB and PERLLIB
-
-=item The Perl Forked Debugger
-
-=item PERL_VMS_EXCEPTION_DEBUG
-
-=item Command line
-
-=over 4
-
-=item I/O redirection and backgrounding
-
-=item Command line switches
-
--i, -S, -u
-
-=back
-
-=item Perl functions
-
-File tests, backticks, binmode FILEHANDLE, crypt PLAINTEXT, USER, die,
-dump, exec LIST, fork, getpwent, getpwnam, getpwuid, gmtime, kill, qx//,
-select (system call), stat EXPR, system LIST, time, times, unlink LIST,
-utime LIST, waitpid PID,FLAGS
-
-=item Perl variables
-
-%ENV, CRTL_ENV, CLISYM_[LOCAL], Any other string, $!, $^E, $?, $|
-
-=item Standard modules with VMS-specific differences
-
-=over 4
-
-=item SDBM_File
-
-=back
-
-=item Revision date
-
-=item AUTHOR
-
-=back
-
-=head2 perlvos, README.vos - Perl for Stratus VOS
-
-=over 4
-
-=item SYNOPSIS
-
-=item BUILDING PERL FOR VOS
-
-=item INSTALLING PERL IN VOS
-
-=item USING PERL IN VOS
-
-=over 4
-
-=item Restrictions of Perl on VOS
-
-=item Handling of underflow and overflow
-
-=back
-
-=item TEST STATUS
-
-=item SUPPORT STATUS
-
-=item AUTHOR
-
-=item LAST UPDATE
-
-=back
-
-=head2 perlwin32 - Perl under Windows
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Setting Up Perl on Win32
-
-Make, Command Shell, Borland C++, Microsoft Visual C++, Microsoft Visual
-C++ 2008 Express Edition, Microsoft Visual C++ 2005 Express Edition,
-Microsoft Visual C++ Toolkit 2003, Microsoft Platform SDK 64-bit Compiler,
-MinGW release 3 with gcc, MinGW release 1 with gcc
-
-=item Building
-
-=item Testing Perl on Win32
-
-=item Installation of Perl on Win32
-
-=item Usage Hints for Perl on Win32
-
-Environment Variables, File Globbing, Using perl from the command line,
-Building Extensions, Command-line Wildcard Expansion, Win32 Specific
-Extensions, Notes on 64-bit Windows
-
-=item Running Perl Scripts
-
-=item Miscellaneous Things
-
-=back
-
-=item BUGS AND CAVEATS
-
-=item ACKNOWLEDGEMENTS
-
-=item AUTHORS
-
-Gary Ng E<lt>71564.1743@CompuServe.COME<gt>, Gurusamy Sarathy
-E<lt>gsar@activestate.comE<gt>, Nick Ing-Simmons
-E<lt>nick@ing-simmons.netE<gt>, Jan Dubois E<lt>jand@activestate.comE<gt>,
-Steve Hay E<lt>steve.hay@uk.radan.comE<gt>
-
-=item SEE ALSO
-
-=item HISTORY
-
-=back
-
-=head1 PRAGMA DOCUMENTATION
-
-=head2 attrs - set/get attributes of a subroutine (deprecated)
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-method, locked
-
-=back
-
-=head2 re - Perl pragma to alter regular expression behaviour
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item 'taint' mode
-
-=item 'eval' mode
-
-=item 'debug' mode
-
-=item 'Debug' mode
-
-Compile related options, COMPILE, PARSE, OPTIMISE, TRIEC, DUMP, Execute
-related options, EXECUTE, MATCH, TRIEE, INTUIT, Extra debugging options,
-EXTRA, BUFFERS, TRIEM, STATE, STACK, OPTIMISEM, OFFSETS, OFFSETSDBG, Other
-useful flags, ALL, All, MORE, More
-
-=item Exportable Functions
-
-is_regexp($ref), regexp_pattern($ref), regmust($ref), regname($name,$all),
-regnames($all), regnames_count()
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 threadshared::shared, threads::shared - Perl extension for sharing
-data structures between threads
-
-=over 4
-
-=item VERSION
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item EXPORT
-
-=item FUNCTIONS
-
-share VARIABLE, shared_clone REF, is_shared VARIABLE, lock VARIABLE,
-cond_wait VARIABLE, cond_wait CONDVAR, LOCKVAR, cond_timedwait VARIABLE,
-ABS_TIMEOUT, cond_timedwait CONDVAR, ABS_TIMEOUT, LOCKVAR, cond_signal
-VARIABLE, cond_broadcast VARIABLE
-
-=item OBJECTS
-
-=item NOTES
-
-=item BUGS AND LIMITATIONS
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item LICENSE
-
-=back
-
-=head2 threads - Perl interpreter-based threads
-
-=over 4
-
-=item VERSION
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-$thr = threads->create(FUNCTION, ARGS), $thr->join(), $thr->detach(),
-threads->detach(), threads->self(), $thr->tid(), threads->tid(), "$thr",
-threads->object($tid), threads->yield(), threads->list(),
-threads->list(threads::all), threads->list(threads::running),
-threads->list(threads::joinable), $thr1->equal($thr2), async BLOCK;,
-$thr->error(), $thr->_handle(), threads->_handle()
-
-=item EXITING A THREAD
-
-threads->exit(), threads->exit(status), die(), exit(status), use threads
-'exit' => 'threads_only', threads->create({'exit' => 'thread_only'}, ...),
-$thr->set_thread_exit_only(boolean), threads->set_thread_exit_only(boolean)
-
-=item THREAD STATE
-
-$thr->is_running(), $thr->is_joinable(), $thr->is_detached(),
-threads->is_detached()
-
-=item THREAD CONTEXT
-
-=over 4
-
-=item Explicit context
-
-=item Implicit context
-
-=item $thr->wantarray()
-
-=item threads->wantarray()
-
-=back
-
-=item THREAD STACK SIZE
-
-threads->get_stack_size();, $size = $thr->get_stack_size();, $old_size =
-threads->set_stack_size($new_size);, use threads ('stack_size' => VALUE);,
-$ENV{'PERL5_ITHREADS_STACK_SIZE'}, threads->create({'stack_size' => VALUE},
-FUNCTION, ARGS), $thr2 = $thr1->create(FUNCTION, ARGS)
-
-=item THREAD SIGNALLING
-
-$thr->kill('SIG...');
-
-=item WARNINGS
-
-Perl exited with active threads:, Thread creation failed: pthread_create
-returned #, Thread # terminated abnormally: .., Using minimum thread stack
-size of #, Thread creation failed: pthread_attr_setstacksize(I<SIZE>)
-returned 22
-
-=item ERRORS
-
-This Perl not built to support threads, Cannot change stack size of an
-existing thread, Cannot signal threads without safe signals, Unrecognized
-signal name: ..
-
-=item BUGS AND LIMITATIONS
-
-Thread-safe modules, Using non-thread-safe modules, Current working
-directory, Environment variables, Parent-child threads, Creating threads
-inside special blocks, Unsafe signals, Perl has been built with
-C<PERL_OLD_SIGNALS> (see C<perl -V>), The environment variable
-C<PERL_SIGNALS> is set to C<unsafe> (see L<perlrun/"PERL_SIGNALS">), The
-module L<Perl::Unsafe::Signals> is used, Returning closures from threads,
-Returning objects from threads, END blocks in threads, Perl Bugs and the
-CPAN Version of L<threads>
-
-=item REQUIREMENTS
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item LICENSE
-
-=item ACKNOWLEDGEMENTS
-
-=back
-
-=head2 attributes - get/set subroutine or variable attributes
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item What C<import> does
-
-=item Built-in Attributes
-
-locked, method, lvalue
-
-=item Available Subroutines
-
-get, reftype
-
-=item Package-specific Attribute Handling
-
-FETCH_I<type>_ATTRIBUTES, MODIFY_I<type>_ATTRIBUTES
-
-=item Syntax of Attribute Lists
-
-=back
-
-=item EXPORTS
-
-=over 4
-
-=item Default exports
-
-=item Available exports
-
-=item Export tags defined
-
-=back
-
-=item EXAMPLES
-
-=item MORE EXAMPLES
-
-=item SEE ALSO
-
-=back
-
-=head2 autodie - Replace functions with ones that succeed or die with
-lexical scope
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item EXCEPTIONS
-
-=item CATEGORIES
-
-=item FUNCTION SPECIFIC NOTES
-
-=over 4
-
-=item flock
-
-=item system/exec
-
-=back
-
-=item GOTCHAS
-
-=item DIAGNOSTICS
-
-:void cannot be used with lexical scope
-
-=item BUGS
-
-=over 4
-
-=item REPORTING BUGS
-
-=back
-
-=item FEEDBACK
-
-=item AUTHOR
-
-=item LICENSE
-
-=item SEE ALSO
-
-=item ACKNOWLEDGEMENTS
-
-=back
-
-=head2 autodiexception, autodie::exception - Exceptions from autodying
-functions.
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Common Methods
-
-=back
-
-=back
-
-=over 4
-
-=item Advanced methods
-
-=back
-
-=over 4
-
-=item SEE ALSO
-
-=item LICENSE
-
-=item AUTHOR
-
-=back
-
-=head2 autodiexception::system, autodie::exception::system - Exceptions
-from autodying system().
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=over 4
-
-=item stringify
-
-=back
-
-=over 4
-
-=item LICENSE
-
-=item AUTHOR
-
-=back
-
-=head2 autouse - postpone load of modules until a function is used
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item WARNING
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 base - Establish an ISA relationship with base classes at compile
-time
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item DIAGNOSTICS
-
-Base class package "%s" is empty, Class 'Foo' tried to inherit from itself
-
-=item HISTORY
-
-=item CAVEATS
-
-=item SEE ALSO
-
-=back
-
-=head2 bigint - Transparent BigInteger support for Perl
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item use integer vs. use bigint
-
-=item Options
-
-a or accuracy, p or precision, t or trace, hex, oct, l, lib, try or only, v
-or version
-
-=item Math Library
-
-=item Internal Format
-
-=item Sign
-
-=item Methods
-
-inf(), NaN(), e, PI, bexp(), bpi(), upgrade(), in_effect()
-
-=item MATH LIBRARY
-
-=item Caveat
-
-=back
-
-=item CAVAETS
-
-in_effect(), hex()/oct()
-
-=item MODULES USED
-
-=item EXAMPLES
-
-=item LICENSE
-
-=item SEE ALSO
-
-=item AUTHORS
-
-=back
-
-=head2 bignum - Transparent BigNumber support for Perl
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Options
-
-a or accuracy, p or precision, t or trace, l or lib, hex, oct, v or version
-
-=item Methods
-
-=item Caveats
-
-inf(), NaN(), e, PI(), bexp(), bpi(), upgrade(), in_effect()
-
-=item Math Library
-
-=item INTERNAL FORMAT
-
-=item SIGN
-
-=back
-
-=item CAVAETS
-
-in_effect(), hex()/oct()
-
-=item MODULES USED
-
-=item EXAMPLES
-
-=item LICENSE
-
-=item SEE ALSO
-
-=item AUTHORS
-
-=back
-
-=head2 bigrat - Transparent BigNumber/BigRational support for Perl
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Modules Used
-
-=item Math Library
-
-=item Sign
-
-=item Methods
-
-inf(), NaN(), e, PI, bexp(), bpi(), upgrade(), in_effect()
-
-=item MATH LIBRARY
-
-=item Cavaet
-
-=item Options
-
-a or accuracy, p or precision, t or trace, l or lib, hex, oct, v or version
-
-=back
-
-=item CAVAETS
-
-in_effect(), hex()/oct()
-
-=item EXAMPLES
-
- perl -Mbigrat -le 'print sqrt(33)'
- perl -Mbigrat -le 'print 2*255'
- perl -Mbigrat -le 'print 4.5+2*255'
- perl -Mbigrat -le 'print 3/7 + 5/7 + 8/3'
- perl -Mbigrat -le 'print 12->is_odd()';
- perl -Mbignum=l,GMP -le 'print 7 ** 7777'
-
-=item LICENSE
-
-=item SEE ALSO
-
-=item AUTHORS
-
-=back
-
-=head2 blib - Use MakeMaker's uninstalled version of a package
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item BUGS
-
-=item AUTHOR
-
-=back
-
-=head2 bytes - Perl pragma to force byte semantics rather than character
-semantics
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item LIMITATIONS
-
-=item SEE ALSO
-
-=back
-
-=head2 charnames - define character names for C<\N{named}> string literal
-escapes
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item ALIASES
-
-=item CUSTOM ALIASES
-
-=over 4
-
-=item Anonymous hashes
-
-=item Alias file
-
-=item Alias shortcut
-
-=back
-
-=item charnames::viacode(code)
-
-=item charnames::vianame(name)
-
-=item CUSTOM TRANSLATORS
-
-=item ILLEGAL CHARACTERS
-
-=item BUGS
-
-=back
-
-=head2 constant - Perl pragma to declare constants
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item NOTES
-
-=over 4
-
-=item List constants
-
-=item Defining multiple constants at once
-
-=item Magic constants
-
-=back
-
-=item TECHNICAL NOTES
-
-=item CAVEATS
-
-=item SEE ALSO
-
-=item BUGS
-
-=item AUTHORS
-
-=item COPYRIGHT & LICENSE
-
-=back
-
-=head2 diagnostics, splain - produce verbose warning diagnostics
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item The C<diagnostics> Pragma
-
-=item The I<splain> Program
-
-=back
-
-=item EXAMPLES
-
-=item INTERNALS
-
-=item BUGS
-
-=item AUTHOR
-
-=back
-
-=head2 encoding - allows you to write your script in non-ascii or non-utf8
-
-=over 4
-
-=item SYNOPSIS
-
-=item ABSTRACT
-
-=over 4
-
-=item Literal Conversions
-
-=item PerlIO layers for C<STD(IN|OUT)>
-
-=item Implicit upgrading for byte strings
-
-=item Side effects
-
-=back
-
-=item FEATURES THAT REQUIRE 5.8.1
-
-"NON-EUC" doublebyte encodings, tr//, DATA pseudo-filehandle
-
-=item USAGE
-
-use encoding [I<ENCNAME>] ;, use encoding I<ENCNAME> [ STDIN =E<gt>
-I<ENCNAME_IN> ...] ;, use encoding I<ENCNAME> Filter=E<gt>1;, no encoding;
-
-=item The Filter Option
-
-=over 4
-
-=item Filter-related changes at Encode version 1.87
-
-=back
-
-=item CAVEATS
-
-=over 4
-
-=item NOT SCOPED
-
-=item DO NOT MIX MULTIPLE ENCODINGS
-
-=item tr/// with ranges
-
-Legend of characters above
-
-=back
-
-=item EXAMPLE - Greekperl
-
-=item KNOWN PROBLEMS
-
-literals in regex that are longer than 127 bytes, EBCDIC, format, Thread
-safety
-
-=over 4
-
-=item The Logic of :locale
-
-=back
-
-=item HISTORY
-
-=item SEE ALSO
-
-=back
-
-=head2 encoding::warnings - Warn on implicit encoding conversions
-
-=over 4
-
-=item VERSION
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Overview of the problem
-
-=item Detecting the problem
-
-=item Solving the problem
-
-Upgrade both sides to unicode-strings, Downgrade both sides to
-byte-strings, Specify the encoding for implicit byte-string upgrading,
-PerlIO layers for B<STDIN> and B<STDOUT>, Literal conversions, Implicit
-upgrading for byte-strings
-
-=back
-
-=item CAVEATS
-
-=back
-
-=over 4
-
-=item SEE ALSO
-
-=item AUTHORS
-
-=item COPYRIGHT
-
-=back
-
-=head2 feature - Perl pragma to enable new syntactic features
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Lexical effect
-
-=item C<no feature>
-
-=item The 'switch' feature
-
-=item The 'say' feature
-
-=item the 'state' feature
-
-=back
-
-=item FEATURE BUNDLES
-
-=item IMPLICIT LOADING
-
-=back
-
-=head2 fields - compile-time class fields
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-new, phash
-
-=item SEE ALSO
-
-=back
-
-=head2 filetest - Perl pragma to control the filetest permission operators
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Consider this carefully
-
-=item The "access" sub-pragma
-
-=item Limitation with regard to C<_>
-
-=back
-
-=back
-
-=head2 if - C<use> a Perl module if a condition holds
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item BUGS
-
-=item AUTHOR
-
-=back
-
-=head2 integer - Perl pragma to use integer arithmetic instead of floating
-point
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=head2 less - perl pragma to request less of something
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item FOR MODULE AUTHORS
-
-=over 4
-
-=item C<< BOOLEAN = less->of( FEATURE ) >>
-
-=item C<< FEATURES = less->of() >>
-
-=back
-
-=item CAVEATS
-
-This probably does nothing, This works only on 5.10+
-
-=back
-
-=head2 lib - manipulate @INC at compile time
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Adding directories to @INC
-
-=item Deleting directories from @INC
-
-=item Restoring original @INC
-
-=back
-
-=item CAVEATS
-
-=item NOTES
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 locale - Perl pragma to use and avoid POSIX locales for built-in
-operations
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=head2 mro - Method Resolution Order
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item OVERVIEW
-
-=item The C3 MRO
-
-=over 4
-
-=item What is C3?
-
-=item How does C3 work
-
-=back
-
-=item Functions
-
-=over 4
-
-=item mro::get_linear_isa($classname[, $type])
-
-=item mro::set_mro($classname, $type)
-
-=item mro::get_mro($classname)
-
-=item mro::get_isarev($classname)
-
-=item mro::is_universal($classname)
-
-=item mro::invalidate_all_method_caches()
-
-=item mro::method_changed_in($classname)
-
-=item mro::get_pkg_gen($classname)
-
-=item next::method
-
-=item next::can
-
-=item maybe::next::method
-
-=back
-
-=item SEE ALSO
-
-=over 4
-
-=item The original Dylan paper
-
-L<http://www.webcom.com/haahr/dylan/linearization-oopsla96.html>
-
-=item The prototype Perl 6 Object Model uses C3
-
-L<http://svn.openfoundry.org/pugs/perl5/Perl6-MetaModel/>
-
-=item Parrot now uses C3
-
-L<http://aspn.activestate.com/ASPN/Mail/Message/perl6-internals/2746631>,
-L<http://use.perl.org/~autrijus/journal/25768>
-
-=item Python 2.3 MRO related links
-
-L<http://www.python.org/2.3/mro.html>,
-L<http://www.python.org/2.2.2/descrintro.html#mro>
-
-=item C3 for TinyCLOS
-
-L<http://www.call-with-current-continuation.org/eggs/c3.html>
-
-=item Class::C3
-
-L<Class::C3>
-
-=back
-
-=item AUTHOR
-
-=back
-
-=head2 open - perl pragma to set default PerlIO layers for input and output
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item NONPERLIO FUNCTIONALITY
-
-=item IMPLEMENTATION DETAILS
-
-=item SEE ALSO
-
-=back
-
-=head2 ops - Perl pragma to restrict unsafe operations when compiling
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=back
-
-=head2 overload - Package for overloading Perl operations
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Declaration of overloaded functions
-
-=item Calling Conventions for Binary Operations
-
-FALSE, TRUE, C<undef>
-
-=item Calling Conventions for Unary Operations
-
-=item Calling Conventions for Mutators
-
-C<++> and C<-->, C<x=> and other assignment versions
-
-=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<Iteration>, I<Dereferencing>, I<Special>
-
-=item Inheritance and overloading
-
-Strings as values of C<use overload> directive, Overloading of an operation
-is inherited by derived classes
-
-=back
-
-=item SPECIAL SYMBOLS FOR C<use overload>
-
-=over 4
-
-=item Last Resort
-
-=item Fallback
-
-C<undef>, TRUE, defined, but FALSE
-
-=item Smart Match
-
-=item Copy Constructor
-
-B<Example>
-
-=back
-
-=item MAGIC AUTOGENERATION
-
-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<Iterator>, I<Dereferencing>,
-I<Copy operator>
-
-=item Minimal set of overloaded operations
-
-=item Losing overloading
-
-=item Run-time Overloading
-
-=item Public functions
-
-overload::StrVal(arg), overload::Overloaded(arg), overload::Method(obj,op)
-
-=item Overloading constants
-
-integer, float, binary, q, qr
-
-=item IMPLEMENTATION
-
-=item Metaphor clash
-
-=item Cookbook
-
-=over 4
-
-=item Two-face scalars
-
-=item Two-face references
-
-=item Symbolic calculator
-
-=item I<Really> symbolic calculator
-
-=back
-
-=item AUTHOR
-
-=item DIAGNOSTICS
-
-Odd number of arguments for overload::constant, `%s' is not an overloadable
-type, `%s' is not a code reference
-
-=item BUGS
-
-=back
-
-=head2 parent - Establish an ISA relationship with base classes at compile
-time
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item DIAGNOSTICS
-
-Class 'Foo' tried to inherit from itself
-
-=item HISTORY
-
-=item CAVEATS
-
-=item SEE ALSO
-
-=item AUTHORS AND CONTRIBUTORS
-
-=item MAINTAINER
-
-=item LICENSE
-
-=back
-
-=head2 sigtrap - Perl pragma to enable simple signal handling
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item OPTIONS
-
-=over 4
-
-=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>
-
-=item OTHER
-
-B<untrapped>, B<any>, I<signal>, I<number>
-
-=back
-
-=item EXAMPLES
-
-=back
-
-=head2 sort - perl pragma to control sort() behaviour
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CAVEATS
-
-=back
-
-=head2 strict - Perl pragma to restrict unsafe constructs
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-C<strict refs>, C<strict vars>, C<strict subs>
-
-=item HISTORY
-
-=back
-
-=head2 subs - Perl pragma to predeclare sub names
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=head2 threadshared, threads::shared - Perl extension for sharing data
-structures between threads
-
-=over 4
-
-=item VERSION
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item EXPORT
-
-=item FUNCTIONS
-
-share VARIABLE, shared_clone REF, is_shared VARIABLE, lock VARIABLE,
-cond_wait VARIABLE, cond_wait CONDVAR, LOCKVAR, cond_timedwait VARIABLE,
-ABS_TIMEOUT, cond_timedwait CONDVAR, ABS_TIMEOUT, LOCKVAR, cond_signal
-VARIABLE, cond_broadcast VARIABLE
-
-=item OBJECTS
-
-=item NOTES
-
-=item BUGS AND LIMITATIONS
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item LICENSE
-
-=back
-
-=head2 utf8 - Perl pragma to enable/disable UTF-8 (or UTF-EBCDIC) in source
-code
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Utility functions
-
-$num_octets = utf8::upgrade($string), $success = utf8::downgrade($string[,
-FAIL_OK]), utf8::encode($string), $success = utf8::decode($string), $flag =
-utf8::is_utf8(STRING), $flag = utf8::valid(STRING)
-
-=back
-
-=item BUGS
-
-=item SEE ALSO
-
-=back
-
-=head2 vars - Perl pragma to predeclare global variable names (obsolete)
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=head2 version - Perl extension for Version Objects
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item BEST PRACTICES
-
-Be consistent, Be careful
-
-=item Using modules that use version.pm
-
-Numeric versions always work, Extended version work sometimes
-
-=item What IS a version
-
-Numeric Versions, Extended Versions
-
-=item Numeric Versions
-
-=item Extended Versions
-
-=item Numeric Alpha Versions
-
-=item Object Methods
-
-New Operator, qv(), Normal Form, Numification, Stringification, Comparison
-operators, Logical Operators
-
-=item Quoting
-
-=item What about v-strings?
-
-=item Types of Versions Objects
-
-Ordinary versions, Alpha Versions
-
-=item Replacement UNIVERSAL::VERSION
-
-=back
-
-=item SUBCLASSING
-
-=item EXPORT
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 vmsish - Perl pragma to control VMS-specific language features
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-C<vmsish status>, C<vmsish exit>, C<vmsish time>, C<vmsish hushed>
-
-=back
-
-=head2 warnings - Perl pragma to control optional warnings
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-use warnings::register, warnings::enabled(), warnings::enabled($category),
-warnings::enabled($object), warnings::warn($message),
-warnings::warn($category, $message), warnings::warn($object, $message),
-warnings::warnif($message), warnings::warnif($category, $message),
-warnings::warnif($object, $message)
-
-=back
-
-=head2 warnings::register - warnings import function
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=head1 MODULE DOCUMENTATION
-
-=head2 AnyDBM_File - provide framework for multiple DBMs
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item DBM Comparisons
-
-[0], [1], [2], [3]
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 App::Prove - Implements the C<prove> command.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item SYNOPSIS
-
-=back
-
-=over 4
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=over 4
-
-=item Attributes
-
-C<archive>, C<argv>, C<backwards>, C<blib>, C<color>, C<directives>,
-C<dry>, C<exec>, C<extension>, C<failures>, C<fork>, C<formatter>,
-C<harness>, C<ignore_exit>, C<includes>, C<jobs>, C<lib>, C<merge>,
-C<modules>, C<parse>, C<plugins>, C<quiet>, C<really_quiet>, C<recurse>,
-C<rules>, C<show_count>, C<show_help>, C<show_man>, C<show_version>,
-C<shuffle>, C<state>, C<taint_fail>, C<taint_warn>, C<test_args>, C<timer>,
-C<verbose>, C<warnings_fail>, C<warnings_warn>
-
-=back
-
-=head2 App::Prove::State - State storage for the C<prove> command.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item SYNOPSIS
-
-=back
-
-=over 4
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=over 4
-
-=item C<result_class>
-
-=back
-
-=over 4
-
-=item C<extension>
-
-=back
-
-=over 4
-
-=item C<results>
-
-=back
-
-=over 4
-
-=item C<commit>
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-C<last>, C<failed>, C<passed>, C<all>, C<hot>, C<todo>, C<slow>, C<fast>,
-C<new>, C<old>, C<save>
-
-=back
-
-=head2 App::Prove::State::Result - Individual test suite results.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item SYNOPSIS
-
-=back
-
-=over 4
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=over 4
-
-=item C<state_version>
-
-=back
-
-=over 4
-
-=item C<test_class>
-
-=back
-
-=head2 App::Prove::State::Result::Test - Individual test results.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item SYNOPSIS
-
-=back
-
-=over 4
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=head2 Archive::Extract - A generic archive extracting mechanism
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=over 4
-
-=item METHODS
-
-=over 4
-
-=item $ae = Archive::Extract->new(archive => '/path/to/archive',[type =>
-TYPE])
-
-tar, tgz, gz, Z, zip, bz2, tbz, lzma
-
-=back
-
-=back
-
-=over 4
-
-=item $ae->extract( [to => '/output/path'] )
-
-$ae->extract_path, $ae->files
-
-=back
-
-=over 4
-
-=item ACCESSORS
-
-=over 4
-
-=item $ae->error([BOOL])
-
-=item $ae->extract_path
-
-=item $ae->files
-
-=item $ae->archive
-
-=item $ae->type
-
-=item $ae->types
-
-=back
-
-=back
-
-=over 4
-
-=item $ae->is_tgz
-
-=item $ae->is_tar
-
-=item $ae->is_gz
-
-=item $ae->is_Z
-
-=item $ae->is_zip
-
-=item $ae->is_lzma
-
-=back
-
-=over 4
-
-=item $ae->bin_tar
-
-=item $ae->bin_gzip
-
-=item $ae->bin_unzip
-
-=item $ae->bin_unlzma
-
-=back
-
-=over 4
-
-=item $bool = $ae->have_old_bunzip2
-
-=back
-
-=over 4
-
-=item HOW IT WORKS
-
-=item CAVEATS
-
-=over 4
-
-=item File Extensions
-
-=item Supporting Very Large Files
-
-=item Bunzip2 support of arbitrary extensions.
-
-=back
-
-=item GLOBAL VARIABLES
-
-=over 4
-
-=item $Archive::Extract::DEBUG
-
-=item $Archive::Extract::WARN
-
-=item $Archive::Extract::PREFER_BIN
-
-=back
-
-=item TODO
-
-Mime magic support
-
-=item BUG REPORTS
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 Archive::Tar - module for manipulations of tar archives
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Object Methods
-
-=over 4
-
-=item Archive::Tar->new( [$file, $compressed] )
-
-=back
-
-=back
-
-=over 4
-
-=item $tar->read ( $filename|$handle, [$compressed, {opt => 'val'}] )
-
-limit, filter, extract
-
-=back
-
-=over 4
-
-=item $tar->contains_file( $filename )
-
-=back
-
-=over 4
-
-=item $tar->extract( [@filenames] )
-
-=back
-
-=over 4
-
-=item $tar->extract_file( $file, [$extract_path] )
-
-=back
-
-=over 4
-
-=item $tar->list_files( [\@properties] )
-
-=back
-
-=over 4
-
-=item $tar->get_files( [@filenames] )
-
-=back
-
-=over 4
-
-=item $tar->get_content( $file )
-
-=back
-
-=over 4
-
-=item $tar->replace_content( $file, $content )
-
-=back
-
-=over 4
-
-=item $tar->rename( $file, $new_name )
-
-=back
-
-=over 4
-
-=item $tar->remove (@filenamelist)
-
-=back
-
-=over 4
-
-=item $tar->clear
-
-=back
-
-=over 4
-
-=item $tar->write ( [$file, $compressed, $prefix] )
-
-=back
-
-=over 4
-
-=item $tar->add_files( @filenamelist )
-
-=back
-
-=over 4
-
-=item $tar->add_data ( $filename, $data, [$opthashref] )
-
-FILE, HARDLINK, SYMLINK, CHARDEV, BLOCKDEV, DIR, FIFO, SOCKET
-
-=back
-
-=over 4
-
-=item $tar->error( [$BOOL] )
-
-=back
-
-=over 4
-
-=item $tar->setcwd( $cwd );
-
-=back
-
-=over 4
-
-=item Class Methods
-
-=over 4
-
-=item Archive::Tar->create_archive($file, $compressed, @filelist)
-
-=back
-
-=back
-
-=over 4
-
-=item Archive::Tar->iter( $filename, [ $compressed, {opt => $val} ] )
-
-=back
-
-=over 4
-
-=item Archive::Tar->list_archive($file, $compressed, [\@properties])
-
-=back
-
-=over 4
-
-=item Archive::Tar->extract_archive($file, $compressed)
-
-=back
-
-=over 4
-
-=item $bool = Archive::Tar->has_io_string
-
-=back
-
-=over 4
-
-=item $bool = Archive::Tar->has_perlio
-
-=back
-
-=over 4
-
-=item $bool = Archive::Tar->has_zlib_support
-
-=back
-
-=over 4
-
-=item $bool = Archive::Tar->has_bzip2_support
-
-=back
-
-=over 4
-
-=item Archive::Tar->can_handle_compressed_files
-
-=back
-
-=over 4
-
-=item GLOBAL VARIABLES
-
-=over 4
-
-=item $Archive::Tar::FOLLOW_SYMLINK
-
-=item $Archive::Tar::CHOWN
-
-=item $Archive::Tar::CHMOD
-
-=item $Archive::Tar::DO_NOT_USE_PREFIX
-
-=item $Archive::Tar::DEBUG
-
-=item $Archive::Tar::WARN
-
-=item $Archive::Tar::error
-
-=item $Archive::Tar::INSECURE_EXTRACT_MODE
-
-=item $Archive::Tar::HAS_PERLIO
-
-=item $Archive::Tar::HAS_IO_STRING
-
-=back
-
-=item FAQ
-
-What's the minimum perl version required to run Archive::Tar?, Isn't
-Archive::Tar slow?, Isn't Archive::Tar heavier on memory than /bin/tar?,
-Can you lazy-load data instead?, How much memory will an X kb tar file
-need?, What do you do with unsupported filetypes in an archive?, I'm using
-WinZip, or some other non-POSIX client, and files are not being extracted
-properly!, How do I extract only files that have property X from an
-archive?, How do I access .tar.Z files?, How do I handle Unicode strings?
-
-=item TODO
-
-Check if passed in handles are open for read/write, Allow archives to be
-passed in as string, Facilitate processing an opened filehandle of a
-compressed archive
-
-=item SEE ALSO
-
-The GNU tar specification, The PAX format specication, A comparison of GNU
-and POSIX tar standards;
-C<http://www.delorie.com/gnu/docs/tar/tar_114.html>, GNU tar intends to
-switch to POSIX compatibility, A Comparison between various tar
-implementations
-
-=item AUTHOR
-
-=item ACKNOWLEDGEMENTS
-
-=item COPYRIGHT
-
-=back
-
-=head2 Archive::Tar::File - a subclass for in-memory extracted file from
-Archive::Tar
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Accessors
-
-name, mode, uid, gid, size, mtime, chksum, type, linkname, magic, version,
-uname, gname, devmajor, devminor, prefix, raw
-
-=back
-
-=item Methods
-
-=over 4
-
-=item Archive::Tar::File->new( file => $path )
-
-=item Archive::Tar::File->new( data => $path, $data, $opt )
-
-=item Archive::Tar::File->new( chunk => $chunk )
-
-=back
-
-=back
-
-=over 4
-
-=item $bool = $file->extract( [ $alternative_name ] )
-
-=back
-
-=over 4
-
-=item $path = $file->full_path
-
-=back
-
-=over 4
-
-=item $bool = $file->validate
-
-=back
-
-=over 4
-
-=item $bool = $file->has_content
-
-=back
-
-=over 4
-
-=item $content = $file->get_content
-
-=back
-
-=over 4
-
-=item $cref = $file->get_content_by_ref
-
-=back
-
-=over 4
-
-=item $bool = $file->replace_content( $content )
-
-=back
-
-=over 4
-
-=item $bool = $file->rename( $new_name )
-
-=back
-
-=over 4
-
-=item Convenience methods
-
-$file->is_file, $file->is_dir, $file->is_hardlink, $file->is_symlink,
-$file->is_chardev, $file->is_blockdev, $file->is_fifo, $file->is_socket,
-$file->is_longlink, $file->is_label, $file->is_unknown
-
-=back
-
-=head2 Attribute::Handlers - Simpler definition of attribute handlers
-
-=over 4
-
-=item VERSION
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-[0], [1], [2], [3], [4], [5], [6], [7]
-
-=over 4
-
-=item Typed lexicals
-
-=item Type-specific attribute handlers
-
-=item Non-interpretive attribute handlers
-
-=item Phase-specific attribute handlers
-
-=item Attributes as C<tie> interfaces
-
-=back
-
-=item EXAMPLES
-
-=item DIAGNOSTICS
-
-C<Bad attribute type: ATTR(%s)>, C<Attribute handler %s doesn't handle %s
-attributes>, C<Declaration of %s attribute in package %s may clash with
-future reserved word>, C<Can't have two ATTR specifiers on one subroutine>,
-C<Can't autotie a %s>, C<Internal error: %s symbol went missing>, C<Won't
-be able to apply END handler>
-
-=item AUTHOR
-
-=item BUGS
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 AutoLoader - load subroutines only on demand
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Subroutine Stubs
-
-=item Using B<AutoLoader>'s AUTOLOAD Subroutine
-
-=item Overriding B<AutoLoader>'s AUTOLOAD Subroutine
-
-=item Package Lexicals
-
-=item Not Using AutoLoader
-
-=item B<AutoLoader> vs. B<SelfLoader>
-
-=back
-
-=item CAVEATS
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 AutoSplit - split a package for autoloading
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-$keep, $check, $modtime
-
-=over 4
-
-=item Multiple packages
-
-=back
-
-=item DIAGNOSTICS
-
-=item AUTHOR
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 B - The Perl Compiler
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item OVERVIEW
-
-=item Utility Functions
-
-=over 4
-
-=item Functions Returning C<B::SV>, C<B::AV>, C<B::HV>, and C<B::CV>
-objects
-
-sv_undef, sv_yes, sv_no, svref_2object(SVREF), amagic_generation, init_av,
-check_av, unitcheck_av, begin_av, end_av, comppadlist, regex_padav, main_cv
-
-=item Functions for Examining the Symbol Table
-
-walksymtable(SYMREF, METHOD, RECURSE, PREFIX)
-
-=item Functions Returning C<B::OP> objects or for walking op trees
-
-main_root, main_start, walkoptree(OP, METHOD), walkoptree_debug(DEBUG)
-
-=item Miscellaneous Utility Functions
-
-ppname(OPNUM), hash(STR), cast_I32(I), minus_c, cstring(STR),
-perlstring(STR), class(OBJ), threadsv_names
-
-=item Exported utility variabiles
-
-@optype, @specialsv_name
-
-=back
-
-=item OVERVIEW OF CLASSES
-
-=over 4
-
-=item SV-RELATED CLASSES
-
-=item B::SV Methods
-
-REFCNT, FLAGS, object_2svref
-
-=item B::IV Methods
-
-IV, IVX, UVX, int_value, needs64bits, packiv
-
-=item B::NV Methods
-
-NV, NVX
-
-=item B::RV Methods
-
-RV
-
-=item B::PV Methods
-
-PV, RV, PVX
-
-=item B::PVMG Methods
-
-MAGIC, SvSTASH
-
-=item B::MAGIC Methods
-
-MOREMAGIC, precomp, PRIVATE, TYPE, FLAGS, OBJ, PTR, REGEX
-
-=item B::PVLV Methods
-
-TARGOFF, TARGLEN, TYPE, TARG
-
-=item B::BM Methods
-
-USEFUL, PREVIOUS, RARE, TABLE
-
-=item B::GV Methods
-
-is_empty, NAME, SAFENAME, STASH, SV, IO, FORM, AV, HV, EGV, CV, CVGEN,
-LINE, FILE, FILEGV, GvREFCNT, FLAGS
-
-=item B::IO Methods
-
-LINES, PAGE, PAGE_LEN, LINES_LEFT, TOP_NAME, TOP_GV, FMT_NAME, FMT_GV,
-BOTTOM_NAME, BOTTOM_GV, SUBPROCESS, IoTYPE, IoFLAGS, IsSTD
-
-=item B::AV Methods
-
-FILL, MAX, ARRAY, ARRAYelt, OFF, AvFLAGS
-
-=item B::CV Methods
-
-STASH, START, ROOT, GV, FILE, DEPTH, PADLIST, OUTSIDE, OUTSIDE_SEQ, XSUB,
-XSUBANY, CvFLAGS, const_sv
-
-=item B::HV Methods
-
-FILL, MAX, KEYS, RITER, NAME, ARRAY, PMROOT
-
-=item OP-RELATED CLASSES
-
-=item B::OP Methods
-
-next, sibling, name, ppaddr, desc, targ, type, opt, flags, private, spare
-
-=item B::UNOP METHOD
-
-first
-
-=item B::BINOP METHOD
-
-last
-
-=item B::LOGOP METHOD
-
-other
-
-=item B::LISTOP METHOD
-
-children
-
-=item B::PMOP Methods
-
-pmreplroot, pmreplstart, pmnext, pmregexp, pmflags, extflags, precomp,
-pmoffset
-
-=item B::SVOP METHOD
-
-sv, gv
-
-=item B::PADOP METHOD
-
-padix
-
-=item B::PVOP METHOD
-
-pv
-
-=item B::LOOP Methods
-
-redoop, nextop, lastop
-
-=item B::COP Methods
-
-label, stash, stashpv, file, cop_seq, arybase, line, warnings, io, hints,
-hints_hash
-
-=back
-
-=item AUTHOR
-
-=back
-
-=head2 B::Concise - Walk Perl syntax tree, printing concise info about ops
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item EXAMPLE
-
-=item OPTIONS
-
-=over 4
-
-=item Options for Opcode Ordering
-
-B<-basic>, B<-exec>, B<-tree>
-
-=item Options for Line-Style
-
-B<-concise>, B<-terse>, B<-linenoise>, B<-debug>, B<-env>
-
-=item Options for tree-specific formatting
-
-B<-compact>, B<-loose>, B<-vt>, B<-ascii>
-
-=item Options controlling sequence numbering
-
-B<-base>I<n>, B<-bigendian>, B<-littleendian>
-
-=item Other options
-
-B<-src>, B<-stash="somepackage">, B<-main>, B<-nomain>, B<-nobanner>,
-B<-banner>, B<-banneris> => subref
-
-=item Option Stickiness
-
-=back
-
-=item ABBREVIATIONS
-
-=over 4
-
-=item OP class abbreviations
-
-=item OP flags abbreviations
-
-=back
-
-=item FORMATTING SPECIFICATIONS
-
-=over 4
-
-=item Special Patterns
-
-B<(x(>I<exec_text>B<;>I<basic_text>B<)x)>, B<(*(>I<text>B<)*)>,
-B<(*(>I<text1>B<;>I<text2>B<)*)>, B<(?(>I<text1>B<#>I<var>I<Text2>B<)?)>,
-B<~>
-
-=item # Variables
-
-B<#>I<var>, B<#>I<var>I<N>, B<#>I<Var>, B<#addr>, B<#arg>, B<#class>,
-B<#classsym>, B<#coplabel>, B<#exname>, B<#extarg>, B<#firstaddr>,
-B<#flags>, B<#flagval>, B<#hints>, B<#hintsval>, B<#hyphseq>, B<#label>,
-B<#lastaddr>, B<#name>, B<#NAME>, B<#next>, B<#nextaddr>, B<#noise>,
-B<#private>, B<#privval>, B<#seq>, B<#seqnum>, B<#opt>, B<#sibaddr>,
-B<#svaddr>, B<#svclass>, B<#svval>, B<#targ>, B<#targarg>, B<#targarglife>,
-B<#typenum>
-
-=back
-
-=item One-Liner Command tips
-
-perl -MO=Concise,bar foo.pl, perl -MDigest::MD5=md5 -MO=Concise,md5 -e1,
-perl -MPOSIX -MO=Concise,_POSIX_ARG_MAX -e1, perl -MPOSIX -MO=Concise,a -e
-'print _POSIX_SAVED_IDS', perl -MPOSIX -MO=Concise,a -e 'sub
-a{_POSIX_SAVED_IDS}', perl -MB::Concise -e
-'B::Concise::compile("-exec","-src", \%B::Concise::)->()'
-
-=item Using B::Concise outside of the O framework
-
-=over 4
-
-=item Example: Altering Concise Renderings
-
-=item set_style()
-
-=item set_style_standard($name)
-
-=item add_style()
-
-=item add_callback()
-
-=item Running B::Concise::compile()
-
-=item B::Concise::reset_sequence()
-
-=item Errors
-
-=back
-
-=item AUTHOR
-
-=back
-
-=head2 B::Debug - Walk Perl syntax tree, printing debug info about ops
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item OPTIONS
-
-=item Changes
-
-=item AUTHOR
-
-=item LICENSE
-
-=back
-
-=head2 B::Deparse - Perl compiler backend to produce perl code
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item OPTIONS
-
-B<-d>, B<-f>I<FILE>, B<-l>, B<-p>, B<-P>, B<-q>, B<-s>I<LETTERS>, B<C>,
-B<i>I<NUMBER>, B<T>, B<v>I<STRING>B<.>, B<-x>I<LEVEL>
-
-=item USING B::Deparse AS A MODULE
-
-=over 4
-
-=item Synopsis
-
-=item Description
-
-=item new
-
-=item ambient_pragmas
-
-strict, $[, bytes, utf8, integer, re, warnings, hint_bits, warning_bits,
-%^H
-
-=item coderef2text
-
-=back
-
-=item BUGS
-
-=item AUTHOR
-
-=back
-
-=head2 B::Lint - Perl lint
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item OPTIONS AND LINT CHECKS
-
-B<magic-diamond>, B<context>, B<implicit-read> and B<implicit-write>,
-B<bare-subs>, B<dollar-underscore>, B<private-names>, B<undefined-subs>,
-B<regexp-variables>, B<all>, B<none>
-
-=item NON LINT-CHECK OPTIONS
-
-B<-u Package>
-
-=item EXTENDING LINT
-
-=item TODO
-
-while(<FH>) stomps $_, strict oo, unchecked system calls, more tests,
-validate against older perls
-
-=item BUGS
-
-=item AUTHOR
-
-=item ACKNOWLEDGEMENTS
-
-=back
-
-=head2 B::Lint::Debug - Adds debugging stringification to B::
-
-=over 4
-
-=item DESCRIPTION
-
-=back
-
-=head2 B::O, O - Generic interface to Perl Compiler backends
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CONVENTIONS
-
-=item IMPLEMENTATION
-
-=item BUGS
-
-=item AUTHOR
-
-=back
-
-=head2 B::Showlex - Show lexical variables used in functions or files
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item EXAMPLES
-
-=over 4
-
-=item OPTIONS
-
-=back
-
-=item SEE ALSO
-
-=item TODO
-
-=item AUTHOR
-
-=back
-
-=head2 B::Terse - Walk Perl syntax tree, printing terse info about ops
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item AUTHOR
-
-=back
-
-=head2 B::Xref - Generates cross reference reports for Perl programs
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item OPTIONS
-
-C<-oFILENAME>, C<-r>, C<-d>, C<-D[tO]>
-
-=item BUGS
-
-=item AUTHOR
-
-=back
-
-=head2 Benchmark - benchmark running times of Perl code
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Methods
-
-new, debug, iters
-
-=item Standard Exports
-
-timeit(COUNT, CODE), timethis ( COUNT, CODE, [ TITLE, [ STYLE ]] ),
-timethese ( COUNT, CODEHASHREF, [ STYLE ] ), timediff ( T1, T2 ), timestr (
-TIMEDIFF, [ STYLE, [ FORMAT ] ] )
-
-=item Optional Exports
-
-clearcache ( COUNT ), clearallcache ( ), cmpthese ( COUNT, CODEHASHREF, [
-STYLE ] ), cmpthese ( RESULTSHASHREF, [ STYLE ] ), countit(TIME, CODE),
-disablecache ( ), enablecache ( ), timesum ( T1, T2 )
-
-=item :hireswallclock
-
-=back
-
-=item NOTES
-
-=item EXAMPLES
-
-=item INHERITANCE
-
-=item CAVEATS
-
-=item SEE ALSO
-
-=item AUTHORS
-
-=item MODIFICATION HISTORY
-
-=back
-
-=head2 CGI - Simple Common Gateway Interface Class
-
-=over 4
-
-=item SYNOPSIS
-
-=item ABSTRACT
-
-=item DESCRIPTION
-
-=over 4
-
-=item PROGRAMMING STYLE
-
-=item CALLING CGI.PM ROUTINES
-
-=item CREATING A NEW QUERY OBJECT (OBJECT-ORIENTED STYLE):
-
-=item CREATING A NEW QUERY OBJECT FROM AN INPUT FILE
-
-=item FETCHING A LIST OF KEYWORDS FROM THE QUERY:
-
-=item FETCHING THE NAMES OF ALL THE PARAMETERS PASSED TO YOUR SCRIPT:
-
-=item FETCHING THE VALUE OR VALUES OF A SINGLE NAMED PARAMETER:
-
-=item SETTING THE VALUE(S) OF A NAMED PARAMETER:
-
-=item APPENDING ADDITIONAL VALUES TO A NAMED PARAMETER:
-
-=item IMPORTING ALL PARAMETERS INTO A NAMESPACE:
-
-=item DELETING A PARAMETER COMPLETELY:
-
-=item DELETING ALL PARAMETERS:
-
-=item HANDLING NON-URLENCODED ARGUMENTS
-
-=item DIRECT ACCESS TO THE PARAMETER LIST:
-
-=item FETCHING THE PARAMETER LIST AS A HASH:
-
-=item SAVING THE STATE OF THE SCRIPT TO A FILE:
-
-=item RETRIEVING CGI ERRORS
-
-=item USING THE FUNCTION-ORIENTED INTERFACE
-
-B<:cgi>, B<:form>, B<:html2>, B<:html3>, B<:html4>, B<:netscape>, B<:html>,
-B<:standard>, B<:all>
-
-=item PRAGMAS
-
--any, -compile, -nosticky, -tabindex, -no_undef_params, -no_xhtml, -utf8,
--nph, -newstyle_urls, -oldstyle_urls, -autoload, -no_debug, -debug,
--private_tempfiles
-
-=item SPECIAL FORMS FOR IMPORTING HTML-TAG FUNCTIONS
-
-1. start_table() (generates a <table> tag), 2. end_table() (generates a
-</table> tag), 3. start_ul() (generates a <ul> tag), 4. end_ul() (generates
-a </ul> tag)
-
-=back
-
-=item GENERATING DYNAMIC DOCUMENTS
-
-=over 4
-
-=item CREATING A STANDARD HTTP HEADER:
-
-=item GENERATING A REDIRECTION HEADER
-
-=item CREATING THE HTML DOCUMENT HEADER
-
-B<Parameters:>, 4, 5, 6..
-
-=item ENDING THE HTML DOCUMENT:
-
-=item CREATING A SELF-REFERENCING URL THAT PRESERVES STATE INFORMATION:
-
-=item OBTAINING THE SCRIPT'S URL
-
-B<-absolute>, B<-relative>, B<-full>, B<-path> (B<-path_info>), B<-query>
-(B<-query_string>), B<-base>, B<-rewrite>
-
-=item MIXING POST AND URL PARAMETERS
-
-=back
-
-=item CREATING STANDARD HTML ELEMENTS:
-
-=over 4
-
-=item PROVIDING ARGUMENTS TO HTML SHORTCUTS
-
-=item THE DISTRIBUTIVE PROPERTY OF HTML SHORTCUTS
-
-=item HTML SHORTCUTS AND LIST INTERPOLATION
-
-=item NON-STANDARD HTML SHORTCUTS
-
-=item AUTOESCAPING HTML
-
-$escaped_string = escapeHTML("unescaped string");, $charset =
-charset([$charset]);, $flag = autoEscape([$flag]);
-
-=item PRETTY-PRINTING HTML
-
-=back
-
-=item CREATING FILL-OUT FORMS:
-
-=over 4
-
-=item CREATING AN ISINDEX TAG
-
-=item STARTING AND ENDING A FORM
-
-B<application/x-www-form-urlencoded>, B<multipart/form-data>
-
-=item FORM ELEMENTS
-
-B<-name>, B<-value>, B<-values>, B<-tabindex>, B<-id>, B<-override>,
-B<-onChange>, B<-onFocus>, B<-onBlur>, B<-onMouseOver>, B<-onMouseOut>,
-B<-onSelect>
-
-=item CREATING A TEXT FIELD
-
-B<Parameters>
-
-=item CREATING A BIG TEXT FIELD
-
-=item CREATING A PASSWORD FIELD
-
-=item CREATING A FILE UPLOAD FIELD
-
-B<Parameters>
-
-=item CREATING A POPUP MENU
-
-=item CREATING AN OPTION GROUP
-
-=item CREATING A SCROLLING LIST
-
-B<Parameters:>
-
-=item CREATING A GROUP OF RELATED CHECKBOXES
-
-B<Parameters:>
-
-=item CREATING A STANDALONE CHECKBOX
-
-B<Parameters:>
-
-=item CREATING A RADIO BUTTON GROUP
-
-B<Parameters:>
-
-=item CREATING A SUBMIT BUTTON
-
-B<Parameters:>
-
-=item CREATING A RESET BUTTON
-
-=item CREATING A DEFAULT BUTTON
-
-=item CREATING A HIDDEN FIELD
-
-B<Parameters:>
-
-=item CREATING A CLICKABLE IMAGE BUTTON
-
-B<Parameters:>, 3. The third option (-align, optional) is an alignment
-type, and may be TOP, BOTTOM or MIDDLE
-
-=item CREATING A JAVASCRIPT ACTION BUTTON
-
-=back
-
-=item HTTP COOKIES
-
-1. an expiration time, 2. a domain, 3. a path, 4. a "secure" flag,
-B<-name>, B<-value>, B<-path>, B<-domain>, B<-expires>, B<-secure>
-
-=item WORKING WITH FRAMES
-
-1. Create a <Frameset> document, 2. Specify the destination for the
-document in the HTTP header, 3. Specify the destination for the document in
-the <form> tag
-
-=item SUPPORT FOR JAVASCRIPT
-
-B<onLoad>, B<onUnload>, B<onSubmit>, B<onClick>, B<onChange>, B<onFocus>,
-B<onBlur>, B<onSelect>, B<onMouseOver>, B<onMouseOut>
-
-=item LIMITED SUPPORT FOR CASCADING STYLE SHEETS
-
-=item DEBUGGING
-
-=over 4
-
-=item DUMPING OUT ALL THE NAME/VALUE PAIRS
-
-=back
-
-=item FETCHING ENVIRONMENT VARIABLES
-
-B<Accept()>, B<raw_cookie()>, B<user_agent()>, B<path_info()>,
-B<path_translated()>, B<remote_host()>, B<script_name()> Return the script
-name as a partial URL, for self-refering scripts, B<referer()>, B<auth_type
-()>, B<server_name ()>, B<virtual_host ()>, B<server_port ()>,
-B<virtual_port ()>, B<server_software ()>, B<remote_user ()>, B<user_name
-()>, B<request_method()>, B<content_type()>, B<http()>, B<https()>
-
-=item USING NPH SCRIPTS
-
-In the B<use> statement, By calling the B<nph()> method:, By using B<-nph>
-parameters
-
-=item Server Push
-
-multipart_init(), multipart_start(), multipart_end(), multipart_final()
-
-=item Avoiding Denial of Service Attacks
-
-B<$CGI::POST_MAX>, B<$CGI::DISABLE_UPLOADS>, B<1. On a script-by-script
-basis>, B<2. Globally for all scripts>
-
-=item COMPATIBILITY WITH CGI-LIB.PL
-
-=item AUTHOR INFORMATION
-
-=item CREDITS
-
-Matt Heffron (heffron@falstaff.css.beckman.com), James Taylor
-(james.taylor@srs.gov), Scott Anguish <sanguish@digifix.com>, Mike Jewell
-(mlj3u@virginia.edu), Timothy Shimmin (tes@kbs.citri.edu.au), Joergen Haegg
-(jh@axis.se), Laurent Delfosse (delfosse@delfosse.com), Richard Resnick
-(applepi1@aol.com), Craig Bishop (csb@barwonwater.vic.gov.au), Tony Curtis
-(tc@vcpc.univie.ac.at), Tim Bunce (Tim.Bunce@ig.co.uk), Tom Christiansen
-(tchrist@convex.com), Andreas Koenig (k@franz.ww.TU-Berlin.DE), Tim
-MacKenzie (Tim.MacKenzie@fulcrum.com.au), Kevin B. Hendricks
-(kbhend@dogwood.tyler.wm.edu), Stephen Dahmen (joyfire@inxpress.net), Ed
-Jordan (ed@fidalgo.net), David Alan Pisoni (david@cnation.com), Doug
-MacEachern (dougm@opengroup.org), Robin Houston (robin@oneworld.org),
-...and many many more..
-
-=item A COMPLETE EXAMPLE OF A SIMPLE FORM-BASED SCRIPT
-
-=item BUGS
-
-=item SEE ALSO
-
-=back
-
-=head2 CGI::Apache - Backward compatibility module for CGI.pm
-
-=over 4
-
-=item SYNOPSIS
-
-=item ABSTRACT
-
-=item DESCRIPTION
-
-=item AUTHOR INFORMATION
-
-=item BUGS
-
-=item SEE ALSO
-
-=back
-
-=head2 CGI::Carp, B<CGI::Carp> - CGI routines for writing to the HTTPD (or
-other) error log
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item REDIRECTING ERROR MESSAGES
-
-=item MAKING PERL ERRORS APPEAR IN THE BROWSER WINDOW
-
-=over 4
-
-=item Changing the default message
-
-=back
-
-=item DOING MORE THAN PRINTING A MESSAGE IN THE EVENT OF PERL ERRORS
-
-=item MAKING WARNINGS APPEAR AS HTML COMMENTS
-
-=item OVERRIDING THE NAME OF THE PROGRAM
-
-=item AUTHORS
-
-=item SEE ALSO
-
-=back
-
-=head2 CGI::Cookie - Interface to Netscape Cookies
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item USING CGI::Cookie
-
-B<1. expiration date>, B<2. domain>, B<3. path>, B<4. secure flag>, B<4.
-httponly flag>
-
-=over 4
-
-=item Creating New Cookies
-
-=item Sending the Cookie to the Browser
-
-=item Recovering Previous Cookies
-
-=item Manipulating Cookies
-
-B<name()>, B<value()>, B<domain()>, B<path()>, B<expires()>
-
-=back
-
-=item AUTHOR INFORMATION
-
-=item BUGS
-
-=item SEE ALSO
-
-=back
-
-=head2 CGI::Fast - CGI Interface for Fast CGI
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item OTHER PIECES OF THE PUZZLE
-
-=item WRITING FASTCGI PERL SCRIPTS
-
-=item INSTALLING FASTCGI SCRIPTS
-
-=item USING FASTCGI SCRIPTS AS CGI SCRIPTS
-
-=item EXTERNAL FASTCGI SERVER INVOCATION
-
-FCGI_SOCKET_PATH, FCGI_LISTEN_QUEUE
-
-=item CAVEATS
-
-=item AUTHOR INFORMATION
-
-=item BUGS
-
-=item SEE ALSO
-
-=back
-
-=head2 CGI::Pretty - module to produce nicely formatted HTML code
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Tags that won't be formatted
-
-=item Customizing the Indenting
-
-=back
-
-=item BUGS
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 CGI::Push - Simple Interface to Server Push
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item USING CGI::Push
-
--next_page, -last_page, -type, -delay, -cookie, -target, -expires, -nph
-
-=over 4
-
-=item Heterogeneous Pages
-
-=item Changing the Page Delay on the Fly
-
-=back
-
-=item INSTALLING CGI::Push SCRIPTS
-
-=item AUTHOR INFORMATION
-
-=item BUGS
-
-=item SEE ALSO
-
-=back
-
-=head2 CGI::Switch - Backward compatibility module for defunct CGI::Switch
-
-=over 4
-
-=item SYNOPSIS
-
-=item ABSTRACT
-
-=item DESCRIPTION
-
-=item AUTHOR INFORMATION
-
-=item BUGS
-
-=item SEE ALSO
-
-=back
-
-=head2 CGI::Util - Internal utilities used by CGI module
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item AUTHOR INFORMATION
-
-=item SEE ALSO
-
-=back
-
-=head2 CORE - Pseudo-namespace for Perl's core routines
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item OVERRIDING CORE FUNCTIONS
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 CPAN - query, download and build perl modules from CPAN sites
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item CPAN::shell([$prompt, $command]) Starting Interactive Mode
-
-Searching for authors, bundles, distribution files and modules, C<get>,
-C<make>, C<test>, C<install>, C<clean> modules or distributions, C<readme>,
-C<perldoc>, C<look> module or distribution, C<ls> author, C<ls>
-globbing_expression, C<failed>, Persistence between sessions, The C<force>
-and the C<fforce> pragma, Lockfile, Signals
-
-=item CPAN::Shell
-
-=item autobundle
-
-=item hosts
-
-=item mkmyconfig
-
-=item recent ***EXPERIMENTAL COMMAND***
-
-=item recompile
-
-=item report Bundle|Distribution|Module
-
-=item smoke ***EXPERIMENTAL COMMAND***
-
-=item upgrade [Module|/Regex/]...
-
-=item The four C<CPAN::*> Classes: Author, Bundle, Module, Distribution
-
-=item Integrating local directories
-
-=item Redirection
-
-=back
-
-=item CONFIGURATION
-
-completion support, displaying some help: o conf help, displaying current
-values: o conf [KEY], changing of scalar values: o conf KEY VALUE, changing
-of list values: o conf KEY SHIFT|UNSHIFT|PUSH|POP|SPLICE|LIST, reverting to
-saved: o conf defaults, saving the config: o conf commit
-
-=over 4
-
-=item Config Variables
-
-C<o conf E<lt>scalar optionE<gt>>, C<o conf E<lt>scalar optionE<gt>
-E<lt>valueE<gt>>, C<o conf E<lt>list optionE<gt>>, C<o conf E<lt>list
-optionE<gt> [shift|pop]>, C<o conf E<lt>list optionE<gt>
-[unshift|push|splice] E<lt>listE<gt>>, interactive editing: o conf init
-[MATCH|LIST]
-
-=item CPAN::anycwd($path): Note on config variable getcwd
-
-cwd, getcwd, fastcwd, backtickcwd
-
-=item Note on the format of the urllist parameter
-
-=item The urllist parameter has CD-ROM support
-
-=item Maintaining the urllist parameter
-
-=item The C<requires> and C<build_requires> dependency declarations
-
-=item Configuration for individual distributions (I<Distroprefs>)
-
-=item Filenames
-
-=item Fallback Data::Dumper and Storable
-
-=item Blueprint
-
-=item Language Specs
-
-comment [scalar], cpanconfig [hash], depends [hash] *** EXPERIMENTAL
-FEATURE ***, disabled [boolean], features [array] *** EXPERIMENTAL FEATURE
-***, goto [string], install [hash], make [hash], match [hash], patches
-[array], pl [hash], test [hash]
-
-=item Processing Instructions
-
-args [array], commandline, eexpect [hash], env [hash], expect [array]
-
-=item Schema verification with C<Kwalify>
-
-=item Example Distroprefs Files
-
-=back
-
-=item PROGRAMMER'S INTERFACE
-
-expand($type,@things), expandany(@things), Programming Examples
-
-=over 4
-
-=item Methods in the other Classes
-
-CPAN::Author::as_glimpse(), CPAN::Author::as_string(),
-CPAN::Author::email(), CPAN::Author::fullname(), CPAN::Author::name(),
-CPAN::Bundle::as_glimpse(), CPAN::Bundle::as_string(),
-CPAN::Bundle::clean(), CPAN::Bundle::contains(),
-CPAN::Bundle::force($method,@args), CPAN::Bundle::get(),
-CPAN::Bundle::inst_file(), CPAN::Bundle::inst_version(),
-CPAN::Bundle::uptodate(), CPAN::Bundle::install(), CPAN::Bundle::make(),
-CPAN::Bundle::readme(), CPAN::Bundle::test(),
-CPAN::Distribution::as_glimpse(), CPAN::Distribution::as_string(),
-CPAN::Distribution::author, CPAN::Distribution::pretty_id(),
-CPAN::Distribution::base_id(), CPAN::Distribution::clean(),
-CPAN::Distribution::containsmods(), CPAN::Distribution::cvs_import(),
-CPAN::Distribution::dir(), CPAN::Distribution::force($method,@args),
-CPAN::Distribution::get(), CPAN::Distribution::install(),
-CPAN::Distribution::install_tested(), CPAN::Distribution::isa_perl(),
-CPAN::Distribution::look(), CPAN::Distribution::make(),
-CPAN::Distribution::perldoc(), CPAN::Distribution::prefs(),
-CPAN::Distribution::prereq_pm(), CPAN::Distribution::readme(),
-CPAN::Distribution::reports(), CPAN::Distribution::read_yaml(),
-CPAN::Distribution::test(), CPAN::Distribution::uptodate(),
-CPAN::Index::force_reload(), CPAN::Index::reload(), CPAN::InfoObj::dump(),
-CPAN::Module::as_glimpse(), CPAN::Module::as_string(),
-CPAN::Module::clean(), CPAN::Module::cpan_file(),
-CPAN::Module::cpan_version(), CPAN::Module::cvs_import(),
-CPAN::Module::description(), CPAN::Module::distribution(),
-CPAN::Module::dslip_status(), CPAN::Module::force($method,@args),
-CPAN::Module::get(), CPAN::Module::inst_file(),
-CPAN::Module::available_file(), CPAN::Module::inst_version(),
-CPAN::Module::available_version(), CPAN::Module::install(),
-CPAN::Module::look(), CPAN::Module::make(),
-CPAN::Module::manpage_headline(), CPAN::Module::perldoc(),
-CPAN::Module::readme(), CPAN::Module::reports(), CPAN::Module::test(),
-CPAN::Module::uptodate(), CPAN::Module::userid()
-
-=item Cache Manager
-
-=item Bundles
-
-=back
-
-=item PREREQUISITES
-
-=item UTILITIES
-
-=over 4
-
-=item Finding packages and VERSION
-
-=item Debugging
-
-o debug package.., o debug -package.., o debug all, o debug number
-
-=item Floppy, Zip, Offline Mode
-
-=item Basic Utilities for Programmers
-
-has_inst($module), has_usable($module), instance($module)
-
-=back
-
-=item SECURITY
-
-=over 4
-
-=item Cryptographically signed modules
-
-=back
-
-=item EXPORT
-
-=item ENVIRONMENT
-
-=item POPULATE AN INSTALLATION WITH LOTS OF MODULES
-
-=item WORKING WITH CPAN.pm BEHIND FIREWALLS
-
-=over 4
-
-=item Three basic types of firewalls
-
-http firewall, ftp firewall, One way visibility, SOCKS, IP Masquerade
-
-=item Configuring lynx or ncftp for going through a firewall
-
-=back
-
-=item FAQ
-
-1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17),
-18)
-
-=item COMPATIBILITY
-
-=over 4
-
-=item OLD PERL VERSIONS
-
-=item CPANPLUS
-
-=back
-
-=item SECURITY ADVICE
-
-=item BUGS
-
-=item AUTHOR
-
-=item LICENSE
-
-=item TRANSLATIONS
-
-=item SEE ALSO
-
-=back
-
-=head2 CPAN::API::HOWTO - a recipe book for programming with CPAN.pm
-
-=over 4
-
-=item RECIPES
-
-=over 4
-
-=item What distribution contains a particular module?
-
-=item What modules does a particular distribution contain?
-
-=back
-
-=item SEE ALSO
-
-=item LICENSE
-
-=item AUTHOR
-
-=back
-
-=head2 CPAN::Distroprefs -- read and match distroprefs
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item INTERFACE
-
-a CPAN::Distroprefs::Result object, C<undef>, indicating that no prefs
-files remain to be found
-
-=item RESULTS
-
-=over 4
-
-=item Common
-
-=item Errors
-
-=item Successes
-
-=back
-
-=item PREFS
-
-=item LICENSE
-
-=back
-
-=head2 CPAN::FirstTime - Utility for CPAN::Config file Initialization
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-auto_commit, build_cache, build_dir, build_dir_reuse,
-build_requires_install_policy, cache_metadata, check_sigs, colorize_output,
-colorize_print, colorize_warn, colorize_debug, commandnumber_in_prompt,
-connect_to_internet_ok, ftp_passive, ftpstats_period, ftpstats_size,
-getcwd, halt_on_failure, histfile, histsize, inactivity_timeout,
-index_expire, inhibit_startup_message, keep_source_where,
-load_module_verbosity, makepl_arg, make_arg, make_install_arg,
-make_install_make_command, mbuildpl_arg, mbuild_arg, mbuild_install_arg,
-mbuild_install_build_command, pager, prefer_installer, prefs_dir,
-prerequisites_policy, randomize_urllist, scan_cache, shell,
-show_unparsable_versions, show_upload_date, show_zero_versions,
-tar_verbosity, term_is_latin, term_ornaments, test_report,
-perl5lib_verbosity, trust_test_report_history, use_sqlite, yaml_load_code,
-yaml_module
-
-=over 4
-
-=item LICENSE
-
-=back
-
-=head2 CPAN::Kwalify - Interface between CPAN.pm and Kwalify.pm
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-_validate($schema_name, $data, $file, $doc), yaml($schema_name)
-
-=item AUTHOR
-
-=item LICENSE
-
-=back
-
-=head2 CPAN::Version - utility functions to compare CPAN versions
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item LICENSE
-
-=back
-
-=head2 CPANPLUS - API & CLI access to the CPAN mirrors
-
-=over 4
-
-=item SYNOPSIS
-
-=item GUIDE TO DOCUMENTATION
-
-=over 4
-
-=item GENERAL USAGE
-
-=item API REFERENCE
-
-=back
-
-=back
-
-=over 4
-
-=item COMMANDLINE TOOLS
-
-=over 4
-
-=item STARTING AN INTERACTIVE SHELL
-
-=item BUILDING PACKAGES
-
-=item $bool = install( Module::Name | /A/AU/AUTHOR/Module-Name-1.tgz )
-
-=item $where = fetch( Module::Name | /A/AU/AUTHOR/Module-Name-1.tgz )
-
-=item $where = get( Module::Name | /A/AU/AUTHOR/Module-Name-1.tgz )
-
-=item shell()
-
-=back
-
-=item FAQ
-
-=item BUG REPORTS
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=item CONTACT INFORMATION
-
-Bug reporting: I<bug-cpanplus@rt.cpan.org>, Questions & suggestions:
-I<cpanplus-devel@lists.sourceforge.net>
-
-=back
-
-=head2 CPANPLUS::Backend
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item ENVIRONMENT
-
-=item METHODS
-
-=over 4
-
-=item $cb = CPANPLUS::Backend->new( [CONFIGURE_OBJ] )
-
-Provide a valid C<CPANPLUS::Configure> object, No arguments
-
-=back
-
-=back
-
-=over 4
-
-=item $href = $cb->module_tree( [@modules_names_list] )
-
-=back
-
-=over 4
-
-=item $href = $cb->author_tree( [@author_names_list] )
-
-=back
-
-=over 4
-
-=item $conf = $cb->configure_object;
-
-=back
-
-=over 4
-
-=item $su = $cb->selfupdate_object;
-
-=back
-
-=over 4
-
-=item @mods = $cb->search( type => TYPE, allow => AREF, [data => AREF,
-verbose => BOOL] )
-
-=back
-
-=over 4
-
-=item $backend_rv = $cb->fetch( modules => \@mods )
-
-=item $backend_rv = $cb->extract( modules => \@mods )
-
-=item $backend_rv = $cb->install( modules => \@mods )
-
-=item $backend_rv = $cb->readme( modules => \@mods )
-
-=item $backend_rv = $cb->files( modules => \@mods )
-
-=item $backend_rv = $cb->distributions( modules => \@mods )
-
-=back
-
-=over 4
-
-=item $mod_obj = $cb->parse_module( module =>
-$modname|$distname|$modobj|URI )
-
-Text::Bastardize, Text-Bastardize, Text-Bastardize-1.06,
-AYRNIEU/Text-Bastardize, AYRNIEU/Text-Bastardize-1.06,
-AYRNIEU/Text-Bastardize-1.06.tar.gz,
-http://example.com/Text-Bastardize-1.06.tar.gz,
-file:///tmp/Text-Bastardize-1.06.tar.gz
-
-=back
-
-=over 4
-
-=item $bool = $cb->reload_indices( [update_source => BOOL, verbose => BOOL]
-);
-
-=back
-
-=over 4
-
-=item $bool = $cb->flush(CACHE_NAME)
-
-C<methods>, C<hosts>, C<modules>, C<lib>, C<load>, C<all>
-
-=back
-
-=over 4
-
-=item @mods = $cb->installed()
-
-=back
-
-=over 4
-
-=item $bool = $cb->local_mirror([path => '/dir/to/save/to', index_files =>
-BOOL, force => BOOL, verbose => BOOL] )
-
-path, index_files, force, verbose
-
-=back
-
-=over 4
-
-=item $file = $cb->autobundle([path => OUTPUT_PATH, force => BOOL, verbose
-=> BOOL])
-
-=back
-
-=over 4
-
-=item CUSTOM MODULE SOURCES
-
-=over 4
-
-=item %files = $cb->list_custom_sources
-
-=back
-
-=back
-
-=over 4
-
-=item $local_index = $cb->add_custom_source( uri => URI, [verbose => BOOL]
-);
-
-=back
-
-=over 4
-
-=item $local_index = $cb->remove_custom_source( uri => URI, [verbose =>
-BOOL] );
-
-=back
-
-=over 4
-
-=item $bool = $cb->update_custom_source( [remote => URI] );
-
-=back
-
-=over 4
-
-=item $file = $cb->write_custom_source_index( path =>
-/path/to/package/root, [to => /path/to/index/file, verbose => BOOL] );
-
-=back
-
-=over 4
-
-=item BUG REPORTS
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=head2 CPANPLUS::Backend::RV
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item new( ok => BOOL, args => DATA, rv => DATA, [function => $method_name]
-)
-
-ok, args, rv, function
-
-=back
-
-=back
-
-=over 4
-
-=item BUG REPORTS
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 CPANPLUS::Config
-
-=over 4
-
-=item DESCRIPTION
-
-=item CONFIGURATION
-
-=back
-
-=over 4
-
-=item Section 'conf'
-
-hosts
-
-=back
-
-base
-
-buildflags
-
-cpantest
-
-cpantest_mx
-
-debug
-
-dist_type
-
-email
-
-extractdir
-
-fetchdir
-
-flush
-
-force
-
-lib
-
-makeflags
-
-makemakerflags
-
-md5
-
-no_update
-
-passive
-
-prefer_bin
-
-prefer_makefile
-
-prereqs
-
-shell
-
-show_startup_tip
-
-signature
-
-skiptest
-
-storable
-
-timeout
-
-verbose
-
-write_install_log
-
-editor
-
-make
-
-pager
-
-shell
-
-sudo
-
-perlwrapper
-
-=over 4
-
-=item BUG REPORTS
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=head2 CPANPLUS::Configure
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item $Configure = CPANPLUS::Configure->new( load_configs => BOOL )
-
-=back
-
-=back
-
-=over 4
-
-=item $bool = $Configure->init( [rescan => BOOL])
-
-=back
-
-=over 4
-
-=item can_save( [$config_location] )
-
-=back
-
-=over 4
-
-=item $file = $conf->save( [$package_name] )
-
-=back
-
-=over 4
-
-=item options( type => TYPE )
-
-=back
-
-=over 4
-
-=item ACCESSORS
-
-=over 4
-
-=item get_SOMETHING( ITEM, [ITEM, ITEM, ... ] );
-
-=item set_SOMETHING( ITEM => VAL, [ITEM => VAL, ITEM => VAL, ... ] );
-
-=item add_SOMETHING( ITEM => VAL, [ITEM => VAL, ITEM => VAL, ... ] );
-
-set|get_conf, set|get_program, _set|_get_build, _set|_get_source,
-_set|_get_mirror, _set|_get_fetch
-
-=back
-
-=back
-
-=over 4
-
-=item BUG REPORTS
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=head2 CPANPLUS::Dist
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item ACCESSORS
-
-parent(), status()
-
-=item STATUS ACCESSORS
-
-created(), installed(), uninstalled(), dist()
-
-=back
-
-=over 4
-
-=item $dist = CPANPLUS::Dist->new( module => MODOBJ, [format => DIST_TYPE]
-);
-
-=back
-
-=over 4
-
-=item @dists = CPANPLUS::Dist->dist_types;
-
-=back
-
-=over 4
-
-=item prereq_satisfied( modobj => $modobj, version => $version_spec )
-
-=back
-
-=over 4
-
-=item _resolve_prereqs
-
-=back
-
-=head2 CPANPLUS::Dist::Base - Base class for custom distribution classes
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item FLOW
-
-=item METHODS
-
-=back
-
-=over 4
-
-=item $bool = $Class->format_available
-
-=back
-
-=over 4
-
-=item $bool = $dist->init
-
-=back
-
-=over 4
-
-=item $bool = $dist->prepare
-
-=back
-
-=over 4
-
-=item $bool = $dist->create
-
-=back
-
-=over 4
-
-=item $bool = $dist->install
-
-=back
-
-=over 4
-
-=item $bool = $dist->uninstall
-
-=back
-
-=head2 CPANPLUS::Dist::Build
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item ACCESSORS
-
-parent(), status()
-
-=item STATUS ACCESSORS
-
-build_pl (), build (), test (), prepared (), distdir (), created (),
-installed (), uninstalled (), _create_args (), _install_args (), _mb_object
-()
-
-=back
-
-=over 4
-
-=item METHODS
-
-=over 4
-
-=item $bool = CPANPLUS::Dist::Build->format_available();
-
-=back
-
-=back
-
-=over 4
-
-=item $bool = $dist->init();
-
-=back
-
-=over 4
-
-=item $bool = $dist->prepare([perl => '/path/to/perl', buildflags =>
-'EXTRA=FLAGS', force => BOOL, verbose => BOOL])
-
-=back
-
-=over 4
-
-=item $dist->create([perl => '/path/to/perl', buildflags => 'EXTRA=FLAGS',
-prereq_target => TARGET, force => BOOL, verbose => BOOL, skiptest => BOOL])
-
-=back
-
-=over 4
-
-=item $dist->install([verbose => BOOL, perl => /path/to/perl])
-
-=back
-
-=over 4
-
-=item KNOWN ISSUES
-
-Module::Build can not be upgraded using its own API (#13169), Module::Build
-does not provide access to install history (#9793)
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 CPANPLUS::Dist::MM
-
-=over 4
-
-=item SYNOPSIS
-
-=item ACCESSORS
-
-parent(), status()
-
-=item STATUS ACCESSORS
-
-makefile (), make (), test (), prepared (), distdir (), created (),
-installed (), uninstalled (), _create_args (), _install_args ()
-
-=back
-
-=over 4
-
-=item METHODS
-
-=over 4
-
-=item $bool = $dist->format_available();
-
-=back
-
-=back
-
-=over 4
-
-=item $href = $dist->_find_prereqs( file => '/path/to/Makefile', [verbose
-=> BOOL])
-
-=back
-
-=over 4
-
-=item $bool = $dist->create([perl => '/path/to/perl', make =>
-'/path/to/make', makeflags => 'EXTRA=FLAGS', prereq_target => TARGET,
-skiptest => BOOL, force => BOOL, verbose => BOOL])
-
-=back
-
-=over 4
-
-=item $bool = $dist->install([make => '/path/to/make', makemakerflags =>
-'EXTRA=FLAGS', force => BOOL, verbose => BOOL])
-
-=back
-
-=over 4
-
-=item $bool = $dist->write_makefile_pl([force => BOOL, verbose => BOOL])
-
-=back
-
-=head2 CPANPLUS::Dist::Sample -- Sample code to create your own Dist::*
-plugin
-
-=over 4
-
-=item Description.
-
-=back
-
-=head2 CPANPLUS::Error
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item FUNCTIONS
-
-=over 4
-
-=item cp_msg("message string" [,VERBOSE])
-
-=item msg()
-
-=item cp_error("error string" [,VERBOSE])
-
-=item error()
-
-=back
-
-=item CLASS METHODS
-
-=over 4
-
-=item CPANPLUS::Error->stack()
-
-=item CPANPLUS::Error->stack_as_string([TRACE])
-
-=item CPANPLUS::Error->flush()
-
-=back
-
-=back
-
-=over 4
-
-=item GLOBAL VARIABLES
-
-$ERROR_FH, $MSG_FH
-
-=back
-
-=head2 CPANPLUS::FAQ
-
-=over 4
-
-=item DESCRIPTION
-
-=item BUG REPORTS
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 CPANPLUS::Hacking
-
-=over 4
-
-=item DESCRIPTION
-
-=item OBTAINING CPANPLUS
-
-=item INSTALLING CPANPLUS
-
-=item CONFIGURING CPANPLUS
-
-=item RUNNING CPANPLUS FROM DEVELOPMENT ENVIRONMENT
-
-=item RUNNING CPANPLUS TESTS
-
-=item FINDING BUGS
-
-Problem description, Program demonstrating the bug, [OPTIONAL] A patch to
-the test suite to test for the bug, [OPTIONAL] A patch to the code + tests
-+ documentation
-
-=item SUPPLYING PATCHES
-
-In C<diff -u> or C<diff -c> format, From the root of the snapshot,
-Including patches for code + tests + docs, Sent per mail to
-cpanplus-devel@lists.sourceforge.net, With subject containing C<[PATCH]> +
-description of the patch
-
-=back
-
-=head2 CPANPLUS::Internals
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item ACCESSORS
-
-_conf, _id, _lib, _perl5lib
-
-=back
-
-=over 4
-
-=item METHODS
-
-=over 4
-
-=item $internals = CPANPLUS::Internals->_init( _conf => CONFIG_OBJ )
-
-=back
-
-=back
-
-=over 4
-
-=item $bool = $internals->_flush( list => \@caches )
-
-=back
-
-=over 4
-
-=item $bool = $internals->_register_callback( name => CALLBACK_NAME, code
-=> CODEREF );
-
-install_prerequisite, send_test_report, munge_test_report,
-edit_test_report, proceed_on_test_failure, munge_dist_metafile
-
-=back
-
-=over 4
-
-=item $bool = $internals->_add_to_includepath( directories => \@dirs )
-
-=back
-
-=over 4
-
-=item $id = CPANPLUS::Internals->_last_id
-
-=item $id = CPANPLUS::Internals->_store_id( $internals )
-
-=item $obj = CPANPLUS::Internals->_retrieve_id( $ID )
-
-=item CPANPLUS::Internals->_remove_id( $ID )
-
-=item @objs = CPANPLUS::Internals->_return_all_objects
-
-=back
-
-=head2 CPANPLUS::Internals::Extract
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item $dir = _extract( module => $modobj, [perl => '/path/to/perl',
-extractdir => '/path/to/extract/to', prefer_bin => BOOL, verbose => BOOL,
-force => BOOL] )
-
-module, extractdir, prefer_bin, perl, verbose, force
-
-=back
-
-=back
-
-=head2 CPANPLUS::Internals::Fetch
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=back
-
-=over 4
-
-=item $path = _fetch( module => $modobj, [fetchdir => '/path/to/save/to',
-fetch_from => 'scheme://path/to/fetch/from', verbose => BOOL, force =>
-BOOL, prefer_bin => BOOL] )
-
-=back
-
-=over 4
-
-=item _add_fail_host( host => $host_hashref )
-
-=item _host_ok( host => $host_hashref )
-
-=back
-
-=head2 CPANPLUS::Internals::Report
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item $bool = $cb->_have_query_report_modules
-
-=item $bool = $cb->_have_send_report_modules
-
-=back
-
-=back
-
-=over 4
-
-=item @list = $cb->_query_report( module => $modobj, [all_versions => BOOL,
-verbose => BOOL] )
-
-=back
-
-=over 4
-
-=item $bool = $cb->_send_report( module => $modobj, buffer => $make_output,
-failed => BOOL, [save => BOOL, address => $email_to, dontcc => BOOL,
-verbose => BOOL, force => BOOL]);
-
-module, buffer, failed, save, address, dontcc, verbose, force
-
-=back
-
-=head2 CPANPLUS::Internals::Search
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item _search_module_tree( type => TYPE, allow => \@regexex, [data =>
-\@previous_results ] )
-
-type, allow, data
-
-=back
-
-=back
-
-=over 4
-
-=item _search_author_tree( type => TYPE, allow => \@regexex, [data =>
-\@previous_results ] )
-
-type, allow, data
-
-=back
-
-=over 4
-
-=item _all_installed()
-
-=back
-
-=head2 CPANPLUS::Internals::Source
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=back
-
-=over 4
-
-=item $cb->_check_trees( [update_source => BOOL, path => PATH, verbose =>
-BOOL] )
-
-update_source, path, verbose
-
-=back
-
-=over 4
-
-=item $cb->__check_uptodate( file => $file, name => $name, [update_source
-=> BOOL, verbose => BOOL] )
-
-file, name, update_source, verbose
-
-=back
-
-=over 4
-
-=item $cb->_update_source( name => $name, [path => $path, verbose => BOOL]
-)
-
-name, path, verbose
-
-=back
-
-=over 4
-
-=item $cb->_build_trees( uptodate => BOOL, [use_stored => BOOL, path =>
-$path, verbose => BOOL] )
-
-uptodate, path, verbose, use_stored
-
-=back
-
-=over 4
-
-=item $cb->__retrieve_source(name => $name, [path => $path, uptodate =>
-BOOL, verbose => BOOL])
-
-name, uptodate, path, verbose
-
-=back
-
-=over 4
-
-=item $cb->_save_source([verbose => BOOL, path => $path])
-
-path, verbose
-
-=back
-
-=over 4
-
-=item $cb->__create_author_tree([path => $path, uptodate => BOOL, verbose
-=> BOOL])
-
-uptodate, path, verbose
-
-=back
-
-=over 4
-
-=item $cb->_create_mod_tree([path => $path, uptodate => BOOL, verbose =>
-BOOL])
-
-uptodate, path, verbose
-
-=back
-
-=over 4
-
-=item $cb->__create_dslip_tree([path => $path, uptodate => BOOL, verbose =>
-BOOL])
-
-uptodate, path, verbose
-
-=back
-
-=over 4
-
-=item $cb->_dslip_defs ()
-
-=back
-
-=over 4
-
-=item $file = $cb->_add_custom_module_source( uri => URI, [verbose => BOOL]
-);
-
-=back
-
-=over 4
-
-=item $index = $cb->__custom_module_source_index_file( uri => $uri );
-
-=back
-
-=over 4
-
-=item $file = $cb->_remove_custom_module_source( uri => URI, [verbose =>
-BOOL] );
-
-=back
-
-=over 4
-
-=item %files = $cb->__list_custom_module_sources
-
-=back
-
-=over 4
-
-=item $bool = $cb->__update_custom_module_sources( [verbose => BOOL] );
-
-=back
-
-=over 4
-
-=item $ok = $cb->__update_custom_module_source
-
-=back
-
-=over 4
-
-=item $bool = $cb->__write_custom_module_index( path => /path/to/packages,
-[to => /path/to/index/file, verbose => BOOL] )
-
-=back
-
-=over 4
-
-=item $bool = $cb->__create_custom_module_entries( [verbose => BOOL] )
-
-=back
-
-=head2 CPANPLUS::Internals::Utils
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item $cb->_mkdir( dir => '/some/dir' )
-
-=back
-
-=back
-
-=over 4
-
-=item $cb->_chdir( dir => '/some/dir' )
-
-=back
-
-=over 4
-
-=item $cb->_rmdir( dir => '/some/dir' );
-
-=back
-
-=over 4
-
-=item $cb->_perl_version ( perl => 'some/perl/binary' );
-
-=back
-
-=over 4
-
-=item $cb->_version_to_number( version => $version );
-
-=back
-
-=over 4
-
-=item $cb->_whoami
-
-=back
-
-=over 4
-
-=item _get_file_contents( file => $file );
-
-=back
-
-=over 4
-
-=item $cb->_mode_plus_w( file => '/path/to/file' );
-
-=back
-
-=over 4
-
-=item $uri = $cb->_host_to_uri( scheme => SCHEME, host => HOST, path =>
-PATH );
-
-=back
-
-=over 4
-
-=item $cb->_vcmp( VERSION, VERSION );
-
-=back
-
-=over 4
-
-=item $cb->_home_dir
-
-=back
-
-=over 4
-
-=item $path = $cb->_safe_path( path => $path );
-
-=back
-
-=over 4
-
-=item ($pkg, $version, $ext) = $cb->_split_package_string( package =>
-PACKAGE_STRING );
-
-=back
-
-=head2 CPANPLUS::Module
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=over 4
-
-=item CLASS METHODS
-
-=over 4
-
-=item accessors ()
-
-=back
-
-=back
-
-=over 4
-
-=item ACCESSORS
-
-name, module, version, path, comment, package, description, dslip
-
-=back
-
-status, author, parent
-
-=over 4
-
-=item STATUS ACCESSORS
-
-installer_type, dist_cpan, dist, prereqs, signature, extract, fetch,
-readme, uninstall, created, installed, checksums, checksum_ok,
-checksum_value
-
-=item METHODS
-
-=over 4
-
-=item $self = CPANPLUS::Module::new( OPTIONS )
-
-=back
-
-=back
-
-=over 4
-
-=item $mod->package_name
-
-=item $mod->package_version
-
-=item $mod->package_extension
-
-=item $mod->package_is_perl_core
-
-=item $mod->module_is_supplied_with_perl_core( [version => $]] )
-
-=item $mod->is_bundle
-
-=item $mod->is_third_party
-
-=item $mod->third_party_information
-
-=back
-
-=over 4
-
-=item $clone = $self->clone
-
-=back
-
-=over 4
-
-=item $where = $self->fetch
-
-=back
-
-=over 4
-
-=item $path = $self->extract
-
-=back
-
-=over 4
-
-=item $type = $self->get_installer_type([prefer_makefile => BOOL])
-
-=back
-
-=over 4
-
-=item $dist = $self->dist([target => 'prepare|create', format =>
-DISTRIBUTION_TYPE, args => {key => val}]);
-
-=back
-
-=over 4
-
-=item $bool = $mod->prepare( )
-
-Convenience method around C<install()> that prepares a module
-without actually building it. This is equivalent to invoking C<install>
-with C<target> set to C<prepare>
-
-=back
-
-=over 4
-
-=item $bool = $mod->create( )
-
-=back
-
-=over 4
-
-=item $bool = $mod->test( )
-
-=back
-
-=over 4
-
-=item $bool = $self->install([ target => 'prepare|create|install', format
-=> FORMAT_TYPE, extractdir => DIRECTORY, fetchdir => DIRECTORY, prefer_bin
-=> BOOL, force => BOOL, verbose => BOOL, ..... ]);
-
-=back
-
-=over 4
-
-=item $text = $self->readme
-
-=back
-
-=over 4
-
-=item $version = $self->installed_version()
-
-=item $where = $self->installed_file()
-
-=item $bool = $self->is_uptodate([version => VERSION_NUMBER])
-
-=back
-
-=over 4
-
-=item $href = $self->details()
-
-=back
-
-=over 4
-
-=item @list = $self->contains()
-
-=back
-
-=over 4
-
-=item @list_of_hrefs = $self->fetch_report()
-
-=back
-
-=over 4
-
-=item $bool = $self->uninstall([type => [all|man|prog])
-
-=back
-
-=over 4
-
-=item @modobj = $self->distributions()
-
-=back
-
-=over 4
-
-=item @list = $self->files ()
-
-=back
-
-=over 4
-
-=item @list = $self->directory_tree ()
-
-=back
-
-=over 4
-
-=item @list = $self->packlist ()
-
-=back
-
-=over 4
-
-=item @list = $self->validate ()
-
-=back
-
-=over 4
-
-=item $bool = $self->add_to_includepath;
-
-=item $path = $self->best_path_to_module_build();
-
-=back
-
-=over 4
-
-=item BUG REPORTS
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 CPANPLUS::Module::Author
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item ACCESSORS
-
-author, cpanid, email, parent
-
-=back
-
-=over 4
-
-=item METHODS
-
-=over 4
-
-=item $auth = CPANPLUS::Module::Author->new( author => AUTHOR_NAME, cpanid
-=> CPAN_ID, _id => INTERNALS_ID [, email => AUTHOR_EMAIL] )
-
-=back
-
-=back
-
-=over 4
-
-=item @mod_objs = $auth->modules()
-
-=back
-
-=over 4
-
-=item @dists = $auth->distributions()
-
-=back
-
-=over 4
-
-=item CLASS METHODS
-
-=over 4
-
-=item accessors ()
-
-=back
-
-=back
-
-=head2 CPANPLUS::Module::Author::Fake
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item new( _id => DIGIT )
-
-=back
-
-=back
-
-=head2 CPANPLUS::Module::Checksums
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item $mod->checksums
-
-=back
-
-=back
-
-=head2 CPANPLUS::Module::Fake
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item new( module => $mod, path => $path, package => $pkg, [_id => DIGIT] )
-
-=back
-
-=back
-
-=head2 CPANPLUS::inc
-
-=over 4
-
-=item DESCRIPTION
-
-=back
-
-=head2 CPANPLUS::inc - runtime inclusion of privately bundled modules
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-Put a coderef at the beginning of C<@INC>, Add the full path to the
-C<CPANPLUS/inc> directory to C<$ENV{PERL5LIB>
-
-=item METHODS
-
-=over 4
-
-=item CPANPLUS::inc->inc_path()
-
-=item CPANPLUS::inc->my_path()
-
-=item CPANPLUS::inc->installer_path()
-
-=back
-
-=back
-
-=over 4
-
-=item CPANPLUS::inc->original_perl5lib
-
-=item CPANPLUS::inc->original_perl5opt
-
-=item CPANPLUS::inc->original_inc
-
-=item CPANPLUS::inc->limited_perl5opt(@modules);
-
-=back
-
-=over 4
-
-=item CPANPLUS::inc->interesting_modules()
-
-=back
-
-=over 4
-
-=item INTERESTING MODULES
-
-Loop over your @INC, Check the version on every suitable module found in
-@INC
-
-=back
-
-=over 4
-
-=item DEBUG
-
-=item CAVEATS
-
-On multiple C<use lib> calls, our coderef may not be the first in @INC,
-Non-directories in @INC
-
-=back
-
-=head2 CPANPLUSelfupdate, CPANPLUS::Selfupdate
-
-=over 4
-
-=item SYNOPSIS
-
-=back
-
-=over 4
-
-=item METHODS
-
-=over 4
-
-=item $self = CPANPLUS::Selfupdate->new( $backend_object );
-
-=back
-
-=back
-
-=over 4
-
-=item %list = $self->list_modules_to_update( update =>
-"core|dependencies|enabled_features|features|all", [latest => BOOL] )
-
-List which modules C<selfupdate> would upgrade. You can update either
-the core (CPANPLUS itself), the core dependencies, all features you have
-currently turned on, or all features available, or everything.
-
-=back
-
-=over 4
-
-=item @features = $self->list_features
-
-=back
-
-=over 4
-
-=item @features = $self->list_enabled_features
-
-=back
-
-=over 4
-
-=item @mods = $self->modules_for_feature( FEATURE [,AS_HASH] )
-
-=back
-
-=over 4
-
-=item @mods = $self->list_core_dependencies( [AS_HASH] )
-
-=back
-
-=over 4
-
-=item @mods = $self->list_core_modules( [AS_HASH] )
-
-=back
-
-=over 4
-
-=item CPANPLUS::Selfupdate::Module
-
-=back
-
-=over 4
-
-=item $version = $mod->version_required
-
-=back
-
-=over 4
-
-=item $bool = $mod->is_installed_version_sufficient
-
-=back
-
-=over 4
-
-=item BUG REPORTS
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 CPANPLUShell, CPANPLUS::Shell
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=over 4
-
-=item BUG REPORTS
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=head2 CPANPLUShell::Classic, CPANPLUS::Shell::Classic - CPAN.pm emulation
-for CPANPLUS
-
-=over 4
-
-=item DESCRIPTION
-
-=item BUG REPORTS
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=over 4
-
-=item SEE ALSO
-
-=back
-
-=head2 CPANPLUShell::Default, CPANPLUS::Shell::Default
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=over 4
-
-=item BUG REPORTS
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=head2 CPANPLUShell::Default::Plugins::CustomSource,
-CPANPLUS::Shell::Default::Plugins::CustomSource
-
-=over 4
-
-=item SYNOPSIS
-
- ### elaborate help text
- CPAN Terminal> /? cs
-
-=item DESCRIPTION
-
-=back
-
-=head2 CPANPLUShell::Default::Plugins::HOWTO,
-CPANPLUS::Shell::Default::Plugins::HOWTO -- documentation on how to write
-your own plugins
-
-=over 4
-
-=item SYNOPSIS
-
-=item HOWTO
-
-=over 4
-
-=item Registering Plugin Modules
-
-=item Registering Plugin Commands
-
-=item Registering Plugin Help
-
-=item Arguments to Plugin Commands
-
-Classname -- The name of your plugin class, Shell -- The
-CPANPLUS::Shell::Default object, Backend -- The CPANPLUS::Backend object,
-Command -- The command issued by the user, Input -- The input string
-from the user, Options -- A hashref of options provided by the user
-
-=back
-
-=item BUG REPORTS
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=head2 CPANPLUShell::Default::Plugins::Remote,
-CPANPLUS::Shell::Default::Plugins::Remote
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=over 4
-
-=item BUG REPORTS
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=head2 CPANPLUShell::Default::Plugins::Source,
-CPANPLUS::Shell::Default::Plugins::Source
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=over 4
-
-=item BUG REPORTS
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=head2 CPANox, CPAN::Nox - Wrapper around CPAN.pm without using any XS
-module
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item LICENSE
-
-=item SEE ALSO
-
-=back
-
-=head2 Carp, carp - warn of errors (from perspective of caller)
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Forcing a Stack Trace
-
-=back
-
-=item GLOBAL VARIABLES
-
-=over 4
-
-=item $Carp::MaxEvalLen
-
-=item $Carp::MaxArgLen
-
-=item $Carp::MaxArgNums
-
-=item $Carp::Verbose
-
-=item %Carp::Internal
-
-=item %Carp::CarpInternal
-
-=item $Carp::CarpLevel
-
-=back
-
-=item BUGS
-
-=back
-
-=head2 Carp::Heavy - heavy machinery, no user serviceable parts inside
-
-=head2 Class::ISA -- report the search path for a class's ISA tree
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item FUNCTIONS
-
-the function Class::ISA::super_path($CLASS), the function
-Class::ISA::self_and_super_path($CLASS), the function
-Class::ISA::self_and_super_versions($CLASS)
-
-=item CAUTIONARY NOTES
-
-=item COPYRIGHT
-
-=item AUTHOR
-
-=back
-
-=head2 Class::Struct - declare struct-like datatypes as Perl classes
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item The C<struct()> function
-
-=item Class Creation at Compile Time
-
-=item Element Types and Accessor Methods
-
-Scalar (C<'$'> or C<'*$'>), Array (C<'@'> or C<'*@'>), Hash (C<'%'> or
-C<'*%'>), Class (C<'Class_Name'> or C<'*Class_Name'>)
-
-=item Initializing with C<new>
-
-=back
-
-=item EXAMPLES
-
-Example 1, Example 2, Example 3
-
-=item Author and Modification History
-
-=back
-
-=head2 Compress::Raw::Zlib - Low-Level Interface to zlib compression
-library
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Compress::Raw::Zlib::Deflate
-
-=over 4
-
-=item B<($d, $status) = new Compress::Raw::Zlib::Deflate( [OPT] ) >
-
-B<-Level>, B<-Method>, B<-WindowBits>, B<-MemLevel>, B<-Strategy>,
-B<-Dictionary>, B<-Bufsize>, B<-AppendOutput>, B<-CRC32>, B<-ADLER32>
-
-=item B<$status = $d-E<gt>deflate($input, $output)>
-
-=item B<$status = $d-E<gt>flush($output [, $flush_type]) >
-
-=item B<$status = $d-E<gt>deflateParams([OPT])>
-
-B<-Level>, B<-Strategy>, B<-BufSize>
-
-=item B<$status = $d-E<gt>deflateTune($good_length, $max_lazy,
-$nice_length, $max_chain)>
-
-=item B<$d-E<gt>dict_adler()>
-
-=item B<$d-E<gt>crc32()>
-
-=item B<$d-E<gt>adler32()>
-
-=item B<$d-E<gt>msg()>
-
-=item B<$d-E<gt>total_in()>
-
-=item B<$d-E<gt>total_out()>
-
-=item B<$d-E<gt>get_Strategy()>
-
-=item B<$d-E<gt>get_Level()>
-
-=item B<$d-E<gt>get_BufSize()>
-
-=item Example
-
-=back
-
-=item Compress::Raw::Zlib::Inflate
-
-=over 4
-
-=item B< ($i, $status) = new Compress::Raw::Zlib::Inflate( [OPT] ) >
-
-B<-WindowBits>, B<-Bufsize>, B<-Dictionary>, B<-AppendOutput>, B<-CRC32>,
-B<-ADLER32>, B<-ConsumeInput>
-
-=item B< $status = $i-E<gt>inflate($input, $output [,$eof]) >
-
-=item B<$status = $i-E<gt>inflateSync($input)>
-
-=item B<$i-E<gt>dict_adler()>
-
-=item B<$i-E<gt>crc32()>
-
-=item B<$i-E<gt>adler32()>
-
-=item B<$i-E<gt>msg()>
-
-=item B<$i-E<gt>total_in()>
-
-=item B<$i-E<gt>total_out()>
-
-=item B<$d-E<gt>get_BufSize()>
-
-=item Example
-
-=back
-
-=item CHECKSUM FUNCTIONS
-
-=item ACCESSING ZIP FILES
-
-=item CONSTANTS
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 Compress::Raw::Zlib::Compress::Raw::Zlib, Compress::Raw::Zlib -
-Low-Level Interface to zlib compression library
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Compress::Raw::Zlib::Deflate
-
-=over 4
-
-=item B<($d, $status) = new Compress::Raw::Zlib::Deflate( [OPT] ) >
-
-B<-Level>, B<-Method>, B<-WindowBits>, B<-MemLevel>, B<-Strategy>,
-B<-Dictionary>, B<-Bufsize>, B<-AppendOutput>, B<-CRC32>, B<-ADLER32>
-
-=item B<$status = $d-E<gt>deflate($input, $output)>
-
-=item B<$status = $d-E<gt>flush($output [, $flush_type]) >
-
-=item B<$status = $d-E<gt>deflateParams([OPT])>
-
-B<-Level>, B<-Strategy>, B<-BufSize>
-
-=item B<$status = $d-E<gt>deflateTune($good_length, $max_lazy,
-$nice_length, $max_chain)>
-
-=item B<$d-E<gt>dict_adler()>
-
-=item B<$d-E<gt>crc32()>
-
-=item B<$d-E<gt>adler32()>
-
-=item B<$d-E<gt>msg()>
-
-=item B<$d-E<gt>total_in()>
-
-=item B<$d-E<gt>total_out()>
-
-=item B<$d-E<gt>get_Strategy()>
-
-=item B<$d-E<gt>get_Level()>
-
-=item B<$d-E<gt>get_BufSize()>
-
-=item Example
-
-=back
-
-=item Compress::Raw::Zlib::Inflate
-
-=over 4
-
-=item B< ($i, $status) = new Compress::Raw::Zlib::Inflate( [OPT] ) >
-
-B<-WindowBits>, B<-Bufsize>, B<-Dictionary>, B<-AppendOutput>, B<-CRC32>,
-B<-ADLER32>, B<-ConsumeInput>
-
-=item B< $status = $i-E<gt>inflate($input, $output [,$eof]) >
-
-=item B<$status = $i-E<gt>inflateSync($input)>
-
-=item B<$i-E<gt>dict_adler()>
-
-=item B<$i-E<gt>crc32()>
-
-=item B<$i-E<gt>adler32()>
-
-=item B<$i-E<gt>msg()>
-
-=item B<$i-E<gt>total_in()>
-
-=item B<$i-E<gt>total_out()>
-
-=item B<$d-E<gt>get_BufSize()>
-
-=item Example
-
-=back
-
-=item CHECKSUM FUNCTIONS
-
-=item ACCESSING ZIP FILES
-
-=item CONSTANTS
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 Compress::Raw::Zlib::pod::FAQ, Compress::Raw::Zlib::FAQ --
-Frequently Asked Questions about Compress::Raw::Zlib
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Compatibility with Unix compress/uncompress.
-
-=item Accessing .tar.Z files
-
-=item Accessing Zip Files
-
-=item Zlib Library Version Support
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 Compress::Zlib - Interface to zlib compression library
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Notes for users of Compress::Zlib version 1
-
-=back
-
-=item GZIP INTERFACE
-
-B<$gz = gzopen($filename, $mode)>, B<$gz = gzopen($filehandle, $mode)>,
-B<$bytesread = $gz-E<gt>gzread($buffer [, $size]) ;>, B<$bytesread =
-$gz-E<gt>gzreadline($line) ;>, B<$byteswritten = $gz-E<gt>gzwrite($buffer)
-;>, B<$status = $gz-E<gt>gzflush($flush_type) ;>, B<$offset =
-$gz-E<gt>gztell() ;>, B<$status = $gz-E<gt>gzseek($offset, $whence) ;>,
-B<$gz-E<gt>gzclose>, B<$gz-E<gt>gzsetparams($level, $strategy>, B<$level>,
-B<$strategy>, B<$gz-E<gt>gzerror>, B<$gzerrno>
-
-=over 4
-
-=item Examples
-
-=item Compress::Zlib::memGzip
-
-=item Compress::Zlib::memGunzip
-
-=back
-
-=item COMPRESS/UNCOMPRESS
-
-B<$dest = compress($source [, $level] ) ;>, B<$dest = uncompress($source)
-;>
-
-=item Deflate Interface
-
-=over 4
-
-=item B<($d, $status) = deflateInit( [OPT] )>
-
-B<-Level>, B<-Method>, B<-WindowBits>, B<-MemLevel>, B<-Strategy>,
-B<-Dictionary>, B<-Bufsize>
-
-=item B<($out, $status) = $d-E<gt>deflate($buffer)>
-
-=item B<($out, $status) = $d-E<gt>flush()>
-=head2 B<($out, $status) = $d-E<gt>flush($flush_type)>
-
-=item B<$status = $d-E<gt>deflateParams([OPT])>
-
-B<-Level>, B<-Strategy>
-
-=item B<$d-E<gt>dict_adler()>
-
-=item B<$d-E<gt>msg()>
-
-=item B<$d-E<gt>total_in()>
-
-=item B<$d-E<gt>total_out()>
-
-=item Example
-
-=back
-
-=item Inflate Interface
-
-=over 4
-
-=item B<($i, $status) = inflateInit()>
-
-B<-WindowBits>, B<-Bufsize>, B<-Dictionary>
-
-=item B<($out, $status) = $i-E<gt>inflate($buffer)>
-
-=item B<$status = $i-E<gt>inflateSync($buffer)>
-
-=item B<$i-E<gt>dict_adler()>
-
-=item B<$i-E<gt>msg()>
-
-=item B<$i-E<gt>total_in()>
-
-=item B<$i-E<gt>total_out()>
-
-=item Example
-
-=back
-
-=item CHECKSUM FUNCTIONS
-
-=item CONSTANTS
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 Compress::Zlib::Compress::Zlib, Compress::Zlib - Interface to zlib
-compression library
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Notes for users of Compress::Zlib version 1
-
-=back
-
-=item GZIP INTERFACE
-
-B<$gz = gzopen($filename, $mode)>, B<$gz = gzopen($filehandle, $mode)>,
-B<$bytesread = $gz-E<gt>gzread($buffer [, $size]) ;>, B<$bytesread =
-$gz-E<gt>gzreadline($line) ;>, B<$byteswritten = $gz-E<gt>gzwrite($buffer)
-;>, B<$status = $gz-E<gt>gzflush($flush_type) ;>, B<$offset =
-$gz-E<gt>gztell() ;>, B<$status = $gz-E<gt>gzseek($offset, $whence) ;>,
-B<$gz-E<gt>gzclose>, B<$gz-E<gt>gzsetparams($level, $strategy>, B<$level>,
-B<$strategy>, B<$gz-E<gt>gzerror>, B<$gzerrno>
-
-=over 4
-
-=item Examples
-
-=item Compress::Zlib::memGzip
-
-=item Compress::Zlib::memGunzip
-
-=back
-
-=item COMPRESS/UNCOMPRESS
-
-B<$dest = compress($source [, $level] ) ;>, B<$dest = uncompress($source)
-;>
-
-=item Deflate Interface
-
-=over 4
-
-=item B<($d, $status) = deflateInit( [OPT] )>
-
-B<-Level>, B<-Method>, B<-WindowBits>, B<-MemLevel>, B<-Strategy>,
-B<-Dictionary>, B<-Bufsize>
-
-=item B<($out, $status) = $d-E<gt>deflate($buffer)>
-
-=item B<($out, $status) = $d-E<gt>flush()>
-=head2 B<($out, $status) = $d-E<gt>flush($flush_type)>
-
-=item B<$status = $d-E<gt>deflateParams([OPT])>
-
-B<-Level>, B<-Strategy>
-
-=item B<$d-E<gt>dict_adler()>
-
-=item B<$d-E<gt>msg()>
-
-=item B<$d-E<gt>total_in()>
-
-=item B<$d-E<gt>total_out()>
-
-=item Example
-
-=back
-
-=item Inflate Interface
-
-=over 4
-
-=item B<($i, $status) = inflateInit()>
-
-B<-WindowBits>, B<-Bufsize>, B<-Dictionary>
-
-=item B<($out, $status) = $i-E<gt>inflate($buffer)>
-
-=item B<$status = $i-E<gt>inflateSync($buffer)>
-
-=item B<$i-E<gt>dict_adler()>
-
-=item B<$i-E<gt>msg()>
-
-=item B<$i-E<gt>total_in()>
-
-=item B<$i-E<gt>total_out()>
-
-=item Example
-
-=back
-
-=item CHECKSUM FUNCTIONS
-
-=item CONSTANTS
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 Compress::Zlib::pod::FAQ, Compress::Zlib::FAQ -- Frequently Asked
-Questions about Compress::Zlib
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Compatibility with Unix compress/uncompress.
-
-=item Accessing .tar.Z files
-
-=item Accessing Zip Files
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 Config - access Perl configuration information
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-myconfig(), config_sh(), config_re($regex), config_vars(@names)
-
-=item EXAMPLE
-
-=item WARNING
-
-=item GLOSSARY
-
-=back
-
-=over 4
-
-=item _
-
-=back
-
-C<_a>, C<_exe>, C<_o>
-
-=over 4
-
-=item a
-
-=back
-
-C<afs>, C<afsroot>, C<alignbytes>, C<ansi2knr>, C<aphostname>,
-C<api_revision>, C<api_subversion>, C<api_version>, C<api_versionstring>,
-C<ar>, C<archlib>, C<archlibexp>, C<archname>, C<archname64>, C<archobjs>,
-C<asctime_r_proto>, C<awk>
-
-=over 4
-
-=item b
-
-=back
-
-C<baserev>, C<bash>, C<bin>, C<binexp>, C<bison>, C<byacc>, C<byteorder>
-
-=over 4
-
-=item c
-
-=back
-
-C<c>, C<castflags>, C<cat>, C<cc>, C<cccdlflags>, C<ccdlflags>, C<ccflags>,
-C<ccflags_uselargefiles>, C<ccname>, C<ccsymbols>, C<ccversion>, C<cf_by>,
-C<cf_email>, C<cf_time>, C<chgrp>, C<chmod>, C<chown>, C<clocktype>,
-C<comm>, C<compress>, C<contains>, C<cp>, C<cpio>, C<cpp>, C<cpp_stuff>,
-C<cppccsymbols>, C<cppflags>, C<cpplast>, C<cppminus>, C<cpprun>,
-C<cppstdin>, C<cppsymbols>, C<crypt_r_proto>, C<cryptlib>, C<csh>,
-C<ctermid_r_proto>, C<ctime_r_proto>
-
-=over 4
-
-=item d
-
-=back
-
-C<d__fwalk>, C<d_access>, C<d_accessx>, C<d_aintl>, C<d_alarm>,
-C<d_archlib>, C<d_asctime64>, C<d_asctime_r>, C<d_atolf>, C<d_atoll>,
-C<d_attribute_deprecated>, C<d_attribute_format>, C<d_attribute_malloc>,
-C<d_attribute_nonnull>, C<d_attribute_noreturn>, C<d_attribute_pure>,
-C<d_attribute_unused>, C<d_attribute_warn_unused_result>, C<d_bcmp>,
-C<d_bcopy>, C<d_bsd>, C<d_bsdgetpgrp>, C<d_bsdsetpgrp>,
-C<d_builtin_choose_expr>, C<d_builtin_expect>, C<d_bzero>,
-C<d_c99_variadic_macros>, C<d_casti32>, C<d_castneg>, C<d_charvspr>,
-C<d_chown>, C<d_chroot>, C<d_chsize>, C<d_class>, C<d_clearenv>,
-C<d_closedir>, C<d_cmsghdr_s>, C<d_const>, C<d_copysignl>, C<d_cplusplus>,
-C<d_crypt>, C<d_crypt_r>, C<d_csh>, C<d_ctermid>, C<d_ctermid_r>,
-C<d_ctime64>, C<d_ctime_r>, C<d_cuserid>, C<d_dbl_dig>, C<d_dbminitproto>,
-C<d_difftime>, C<d_difftime64>, C<d_dir_dd_fd>, C<d_dirfd>, C<d_dirnamlen>,
-C<d_dlerror>, C<d_dlopen>, C<d_dlsymun>, C<d_dosuid>, C<d_drand48_r>,
-C<d_drand48proto>, C<d_dup2>, C<d_eaccess>, C<d_endgrent>, C<d_endgrent_r>,
-C<d_endhent>, C<d_endhostent_r>, C<d_endnent>, C<d_endnetent_r>,
-C<d_endpent>, C<d_endprotoent_r>, C<d_endpwent>, C<d_endpwent_r>,
-C<d_endsent>, C<d_endservent_r>, C<d_eofnblk>, C<d_eunice>, C<d_faststdio>,
-C<d_fchdir>, C<d_fchmod>, C<d_fchown>, C<d_fcntl>, C<d_fcntl_can_lock>,
-C<d_fd_macros>, C<d_fd_set>, C<d_fds_bits>, C<d_fgetpos>, C<d_finite>,
-C<d_finitel>, C<d_flexfnam>, C<d_flock>, C<d_flockproto>, C<d_fork>,
-C<d_fp_class>, C<d_fpathconf>, C<d_fpclass>, C<d_fpclassify>,
-C<d_fpclassl>, C<d_fpos64_t>, C<d_frexpl>, C<d_fs_data_s>, C<d_fseeko>,
-C<d_fsetpos>, C<d_fstatfs>, C<d_fstatvfs>, C<d_fsync>, C<d_ftello>,
-C<d_ftime>, C<d_futimes>, C<d_Gconvert>, C<d_gdbm_ndbm_h_uses_prototypes>,
-C<d_gdbmndbm_h_uses_prototypes>, C<d_getcwd>, C<d_getespwnam>,
-C<d_getfsstat>, C<d_getgrent>, C<d_getgrent_r>, C<d_getgrgid_r>,
-C<d_getgrnam_r>, C<d_getgrps>, C<d_gethbyaddr>, C<d_gethbyname>,
-C<d_gethent>, C<d_gethname>, C<d_gethostbyaddr_r>, C<d_gethostbyname_r>,
-C<d_gethostent_r>, C<d_gethostprotos>, C<d_getitimer>, C<d_getlogin>,
-C<d_getlogin_r>, C<d_getmnt>, C<d_getmntent>, C<d_getnbyaddr>,
-C<d_getnbyname>, C<d_getnent>, C<d_getnetbyaddr_r>, C<d_getnetbyname_r>,
-C<d_getnetent_r>, C<d_getnetprotos>, C<d_getpagsz>, C<d_getpbyname>,
-C<d_getpbynumber>, C<d_getpent>, C<d_getpgid>, C<d_getpgrp>, C<d_getpgrp2>,
-C<d_getppid>, C<d_getprior>, C<d_getprotobyname_r>,
-C<d_getprotobynumber_r>, C<d_getprotoent_r>, C<d_getprotoprotos>,
-C<d_getprpwnam>, C<d_getpwent>, C<d_getpwent_r>, C<d_getpwnam_r>,
-C<d_getpwuid_r>, C<d_getsbyname>, C<d_getsbyport>, C<d_getsent>,
-C<d_getservbyname_r>, C<d_getservbyport_r>, C<d_getservent_r>,
-C<d_getservprotos>, C<d_getspnam>, C<d_getspnam_r>, C<d_gettimeod>,
-C<d_gmtime64>, C<d_gmtime_r>, C<d_gnulibc>, C<d_grpasswd>, C<d_hasmntopt>,
-C<d_htonl>, C<d_ilogbl>, C<d_inc_version_list>, C<d_index>, C<d_inetaton>,
-C<d_int64_t>, C<d_isascii>, C<d_isfinite>, C<d_isinf>, C<d_isnan>,
-C<d_isnanl>, C<d_killpg>, C<d_lchown>, C<d_ldbl_dig>,
-C<d_libm_lib_version>, C<d_link>, C<d_localtime64>, C<d_localtime_r>,
-C<d_localtime_r_needs_tzset>, C<d_locconv>, C<d_lockf>, C<d_longdbl>,
-C<d_longlong>, C<d_lseekproto>, C<d_lstat>, C<d_madvise>,
-C<d_malloc_good_size>, C<d_malloc_size>, C<d_mblen>, C<d_mbstowcs>,
-C<d_mbtowc>, C<d_memchr>, C<d_memcmp>, C<d_memcpy>, C<d_memmove>,
-C<d_memset>, C<d_mkdir>, C<d_mkdtemp>, C<d_mkfifo>, C<d_mkstemp>,
-C<d_mkstemps>, C<d_mktime>, C<d_mktime64>, C<d_mmap>, C<d_modfl>,
-C<d_modfl_pow32_bug>, C<d_modflproto>, C<d_mprotect>, C<d_msg>,
-C<d_msg_ctrunc>, C<d_msg_dontroute>, C<d_msg_oob>, C<d_msg_peek>,
-C<d_msg_proxy>, C<d_msgctl>, C<d_msgget>, C<d_msghdr_s>, C<d_msgrcv>,
-C<d_msgsnd>, C<d_msync>, C<d_munmap>, C<d_mymalloc>, C<d_ndbm>,
-C<d_ndbm_h_uses_prototypes>, C<d_nice>, C<d_nl_langinfo>,
-C<d_nv_preserves_uv>, C<d_nv_zero_is_allbits_zero>, C<d_off64_t>,
-C<d_old_pthread_create_joinable>, C<d_oldpthreads>, C<d_oldsock>,
-C<d_open3>, C<d_pathconf>, C<d_pause>, C<d_perl_otherlibdirs>,
-C<d_phostname>, C<d_pipe>, C<d_poll>, C<d_portable>, C<d_PRId64>,
-C<d_PRIeldbl>, C<d_PRIEUldbl>, C<d_PRIfldbl>, C<d_PRIFUldbl>,
-C<d_PRIgldbl>, C<d_PRIGUldbl>, C<d_PRIi64>, C<d_printf_format_null>,
-C<d_PRIo64>, C<d_PRIu64>, C<d_PRIx64>, C<d_PRIXU64>, C<d_procselfexe>,
-C<d_pseudofork>, C<d_pthread_atfork>, C<d_pthread_attr_setscope>,
-C<d_pthread_yield>, C<d_pwage>, C<d_pwchange>, C<d_pwclass>,
-C<d_pwcomment>, C<d_pwexpire>, C<d_pwgecos>, C<d_pwpasswd>, C<d_pwquota>,
-C<d_qgcvt>, C<d_quad>, C<d_random_r>, C<d_readdir>, C<d_readdir64_r>,
-C<d_readdir_r>, C<d_readlink>, C<d_readv>, C<d_recvmsg>, C<d_rename>,
-C<d_rewinddir>, C<d_rmdir>, C<d_safebcpy>, C<d_safemcpy>, C<d_sanemcmp>,
-C<d_sbrkproto>, C<d_scalbnl>, C<d_sched_yield>, C<d_scm_rights>,
-C<d_SCNfldbl>, C<d_seekdir>, C<d_select>, C<d_sem>, C<d_semctl>,
-C<d_semctl_semid_ds>, C<d_semctl_semun>, C<d_semget>, C<d_semop>,
-C<d_sendmsg>, C<d_setegid>, C<d_seteuid>, C<d_setgrent>, C<d_setgrent_r>,
-C<d_setgrps>, C<d_sethent>, C<d_sethostent_r>, C<d_setitimer>,
-C<d_setlinebuf>, C<d_setlocale>, C<d_setlocale_r>, C<d_setnent>,
-C<d_setnetent_r>, C<d_setpent>, C<d_setpgid>, C<d_setpgrp>, C<d_setpgrp2>,
-C<d_setprior>, C<d_setproctitle>, C<d_setprotoent_r>, C<d_setpwent>,
-C<d_setpwent_r>, C<d_setregid>, C<d_setresgid>, C<d_setresuid>,
-C<d_setreuid>, C<d_setrgid>, C<d_setruid>, C<d_setsent>, C<d_setservent_r>,
-C<d_setsid>, C<d_setvbuf>, C<d_sfio>, C<d_shm>, C<d_shmat>,
-C<d_shmatprototype>, C<d_shmctl>, C<d_shmdt>, C<d_shmget>, C<d_sigaction>,
-C<d_signbit>, C<d_sigprocmask>, C<d_sigsetjmp>, C<d_sitearch>,
-C<d_snprintf>, C<d_sockatmark>, C<d_sockatmarkproto>, C<d_socket>,
-C<d_socklen_t>, C<d_sockpair>, C<d_socks5_init>,
-C<d_sprintf_returns_strlen>, C<d_sqrtl>, C<d_srand48_r>, C<d_srandom_r>,
-C<d_sresgproto>, C<d_sresuproto>, C<d_statblks>, C<d_statfs_f_flags>,
-C<d_statfs_s>, C<d_statvfs>, C<d_stdio_cnt_lval>, C<d_stdio_ptr_lval>,
-C<d_stdio_ptr_lval_nochange_cnt>, C<d_stdio_ptr_lval_sets_cnt>,
-C<d_stdio_stream_array>, C<d_stdiobase>, C<d_stdstdio>, C<d_strchr>,
-C<d_strcoll>, C<d_strctcpy>, C<d_strerrm>, C<d_strerror>, C<d_strerror_r>,
-C<d_strftime>, C<d_strlcat>, C<d_strlcpy>, C<d_strtod>, C<d_strtol>,
-C<d_strtold>, C<d_strtoll>, C<d_strtoq>, C<d_strtoul>, C<d_strtoull>,
-C<d_strtouq>, C<d_strxfrm>, C<d_suidsafe>, C<d_symlink>, C<d_syscall>,
-C<d_syscallproto>, C<d_sysconf>, C<d_sysernlst>, C<d_syserrlst>,
-C<d_system>, C<d_tcgetpgrp>, C<d_tcsetpgrp>, C<d_telldir>,
-C<d_telldirproto>, C<d_time>, C<d_timegm>, C<d_times>, C<d_tm_tm_gmtoff>,
-C<d_tm_tm_zone>, C<d_tmpnam_r>, C<d_truncate>, C<d_ttyname_r>, C<d_tzname>,
-C<d_u32align>, C<d_ualarm>, C<d_umask>, C<d_uname>, C<d_union_semun>,
-C<d_unordered>, C<d_unsetenv>, C<d_usleep>, C<d_usleepproto>, C<d_ustat>,
-C<d_vendorarch>, C<d_vendorbin>, C<d_vendorlib>, C<d_vendorscript>,
-C<d_vfork>, C<d_void_closedir>, C<d_voidsig>, C<d_voidtty>, C<d_volatile>,
-C<d_vprintf>, C<d_vsnprintf>, C<d_wait4>, C<d_waitpid>, C<d_wcstombs>,
-C<d_wctomb>, C<d_writev>, C<d_xenix>, C<date>, C<db_hashtype>,
-C<db_prefixtype>, C<db_version_major>, C<db_version_minor>,
-C<db_version_patch>, C<defvoidused>, C<direntrytype>, C<dlext>, C<dlsrc>,
-C<doublesize>, C<drand01>, C<drand48_r_proto>, C<dtrace>, C<dynamic_ext>
-
-=over 4
-
-=item e
-
-=back
-
-C<eagain>, C<ebcdic>, C<echo>, C<egrep>, C<emacs>, C<endgrent_r_proto>,
-C<endhostent_r_proto>, C<endnetent_r_proto>, C<endprotoent_r_proto>,
-C<endpwent_r_proto>, C<endservent_r_proto>, C<eunicefix>, C<exe_ext>,
-C<expr>, C<extensions>, C<extern_C>, C<extras>
-
-=over 4
-
-=item f
-
-=back
-
-C<fflushall>, C<fflushNULL>, C<find>, C<firstmakefile>, C<flex>,
-C<fpossize>, C<fpostype>, C<freetype>, C<from>, C<full_ar>, C<full_csh>,
-C<full_sed>
-
-=over 4
-
-=item g
-
-=back
-
-C<gccansipedantic>, C<gccosandvers>, C<gccversion>, C<getgrent_r_proto>,
-C<getgrgid_r_proto>, C<getgrnam_r_proto>, C<gethostbyaddr_r_proto>,
-C<gethostbyname_r_proto>, C<gethostent_r_proto>, C<getlogin_r_proto>,
-C<getnetbyaddr_r_proto>, C<getnetbyname_r_proto>, C<getnetent_r_proto>,
-C<getprotobyname_r_proto>, C<getprotobynumber_r_proto>,
-C<getprotoent_r_proto>, C<getpwent_r_proto>, C<getpwnam_r_proto>,
-C<getpwuid_r_proto>, C<getservbyname_r_proto>, C<getservbyport_r_proto>,
-C<getservent_r_proto>, C<getspnam_r_proto>, C<gidformat>, C<gidsign>,
-C<gidsize>, C<gidtype>, C<glibpth>, C<gmake>, C<gmtime_r_proto>,
-C<gnulibc_version>, C<grep>, C<groupcat>, C<groupstype>, C<gzip>
-
-=over 4
-
-=item h
-
-=back
-
-C<h_fcntl>, C<h_sysfile>, C<hint>, C<hostcat>, C<html1dir>, C<html1direxp>,
-C<html3dir>, C<html3direxp>
-
-=over 4
-
-=item i
-
-=back
-
-C<i16size>, C<i16type>, C<i32size>, C<i32type>, C<i64size>, C<i64type>,
-C<i8size>, C<i8type>, C<i_arpainet>, C<i_assert>, C<i_bsdioctl>,
-C<i_crypt>, C<i_db>, C<i_dbm>, C<i_dirent>, C<i_dld>, C<i_dlfcn>,
-C<i_fcntl>, C<i_float>, C<i_fp>, C<i_fp_class>, C<i_gdbm>, C<i_gdbm_ndbm>,
-C<i_gdbmndbm>, C<i_grp>, C<i_ieeefp>, C<i_inttypes>, C<i_langinfo>,
-C<i_libutil>, C<i_limits>, C<i_locale>, C<i_machcthr>, C<i_malloc>,
-C<i_mallocmalloc>, C<i_math>, C<i_memory>, C<i_mntent>, C<i_ndbm>,
-C<i_netdb>, C<i_neterrno>, C<i_netinettcp>, C<i_niin>, C<i_poll>,
-C<i_prot>, C<i_pthread>, C<i_pwd>, C<i_rpcsvcdbm>, C<i_sfio>, C<i_sgtty>,
-C<i_shadow>, C<i_socks>, C<i_stdarg>, C<i_stddef>, C<i_stdlib>,
-C<i_string>, C<i_sunmath>, C<i_sysaccess>, C<i_sysdir>, C<i_sysfile>,
-C<i_sysfilio>, C<i_sysin>, C<i_sysioctl>, C<i_syslog>, C<i_sysmman>,
-C<i_sysmode>, C<i_sysmount>, C<i_sysndir>, C<i_sysparam>, C<i_syspoll>,
-C<i_sysresrc>, C<i_syssecrt>, C<i_sysselct>, C<i_syssockio>, C<i_sysstat>,
-C<i_sysstatfs>, C<i_sysstatvfs>, C<i_systime>, C<i_systimek>,
-C<i_systimes>, C<i_systypes>, C<i_sysuio>, C<i_sysun>, C<i_sysutsname>,
-C<i_sysvfs>, C<i_syswait>, C<i_termio>, C<i_termios>, C<i_time>,
-C<i_unistd>, C<i_ustat>, C<i_utime>, C<i_values>, C<i_varargs>,
-C<i_varhdr>, C<i_vfork>, C<ignore_versioned_solibs>, C<inc_version_list>,
-C<inc_version_list_init>, C<incpath>, C<inews>, C<initialinstalllocation>,
-C<installarchlib>, C<installbin>, C<installhtml1dir>, C<installhtml3dir>,
-C<installman1dir>, C<installman3dir>, C<installprefix>,
-C<installprefixexp>, C<installprivlib>, C<installscript>,
-C<installsitearch>, C<installsitebin>, C<installsitehtml1dir>,
-C<installsitehtml3dir>, C<installsitelib>, C<installsiteman1dir>,
-C<installsiteman3dir>, C<installsitescript>, C<installstyle>,
-C<installusrbinperl>, C<installvendorarch>, C<installvendorbin>,
-C<installvendorhtml1dir>, C<installvendorhtml3dir>, C<installvendorlib>,
-C<installvendorman1dir>, C<installvendorman3dir>, C<installvendorscript>,
-C<intsize>, C<issymlink>, C<ivdformat>, C<ivsize>, C<ivtype>
-
-=over 4
-
-=item k
-
-=back
-
-C<known_extensions>, C<ksh>
-
-=over 4
-
-=item l
-
-=back
-
-C<ld>, C<lddlflags>, C<ldflags>, C<ldflags_uselargefiles>, C<ldlibpthname>,
-C<less>, C<lib_ext>, C<libc>, C<libperl>, C<libpth>, C<libs>, C<libsdirs>,
-C<libsfiles>, C<libsfound>, C<libspath>, C<libswanted>,
-C<libswanted_uselargefiles>, C<line>, C<lint>, C<lkflags>, C<ln>, C<lns>,
-C<localtime_r_proto>, C<locincpth>, C<loclibpth>, C<longdblsize>,
-C<longlongsize>, C<longsize>, C<lp>, C<lpr>, C<ls>, C<lseeksize>,
-C<lseektype>
-
-=over 4
-
-=item m
-
-=back
-
-C<mad>, C<madlyh>, C<madlyobj>, C<madlysrc>, C<mail>, C<mailx>, C<make>,
-C<make_set_make>, C<mallocobj>, C<mallocsrc>, C<malloctype>, C<man1dir>,
-C<man1direxp>, C<man1ext>, C<man3dir>, C<man3direxp>, C<man3ext>,
-C<mips_type>, C<mistrustnm>, C<mkdir>, C<mmaptype>, C<modetype>, C<more>,
-C<multiarch>, C<mv>, C<myarchname>, C<mydomain>, C<myhostname>, C<myuname>
-
-=over 4
-
-=item n
-
-=back
-
-C<n>, C<need_va_copy>, C<netdb_hlen_type>, C<netdb_host_type>,
-C<netdb_name_type>, C<netdb_net_type>, C<nm>, C<nm_opt>, C<nm_so_opt>,
-C<nonxs_ext>, C<nroff>, C<nv_overflows_integers_at>,
-C<nv_preserves_uv_bits>, C<nveformat>, C<nvEUformat>, C<nvfformat>,
-C<nvFUformat>, C<nvgformat>, C<nvGUformat>, C<nvsize>, C<nvtype>
-
-=over 4
-
-=item o
-
-=back
-
-C<o_nonblock>, C<obj_ext>, C<old_pthread_create_joinable>, C<optimize>,
-C<orderlib>, C<osname>, C<osvers>, C<otherlibdirs>
-
-=over 4
-
-=item p
-
-=back
-
-C<package>, C<pager>, C<passcat>, C<patchlevel>, C<path_sep>, C<perl>,
-C<perl5>
-
-=over 4
-
-=item P
-
-=back
-
-C<PERL_API_REVISION>, C<PERL_API_SUBVERSION>, C<PERL_API_VERSION>,
-C<PERL_CONFIG_SH>, C<PERL_PATCHLEVEL>, C<perl_patchlevel>,
-C<PERL_REVISION>, C<PERL_SUBVERSION>, C<PERL_VERSION>, C<perladmin>,
-C<perllibs>, C<perlpath>, C<pg>, C<phostname>, C<pidtype>, C<plibpth>,
-C<pmake>, C<pr>, C<prefix>, C<prefixexp>, C<privlib>, C<privlibexp>,
-C<procselfexe>, C<prototype>, C<ptrsize>
-
-=over 4
-
-=item q
-
-=back
-
-C<quadkind>, C<quadtype>
-
-=over 4
-
-=item r
-
-=back
-
-C<randbits>, C<randfunc>, C<random_r_proto>, C<randseedtype>, C<ranlib>,
-C<rd_nodata>, C<readdir64_r_proto>, C<readdir_r_proto>, C<revision>, C<rm>,
-C<rm_try>, C<rmail>, C<run>, C<runnm>
-
-=over 4
-
-=item s
-
-=back
-
-C<sched_yield>, C<scriptdir>, C<scriptdirexp>, C<sed>, C<seedfunc>,
-C<selectminbits>, C<selecttype>, C<sendmail>, C<setgrent_r_proto>,
-C<sethostent_r_proto>, C<setlocale_r_proto>, C<setnetent_r_proto>,
-C<setprotoent_r_proto>, C<setpwent_r_proto>, C<setservent_r_proto>,
-C<sGMTIME_max>, C<sGMTIME_min>, C<sh>, C<shar>, C<sharpbang>, C<shmattype>,
-C<shortsize>, C<shrpenv>, C<shsharp>, C<sig_count>, C<sig_name>,
-C<sig_name_init>, C<sig_num>, C<sig_num_init>, C<sig_size>, C<signal_t>,
-C<sitearch>, C<sitearchexp>, C<sitebin>, C<sitebinexp>, C<sitehtml1dir>,
-C<sitehtml1direxp>, C<sitehtml3dir>, C<sitehtml3direxp>, C<sitelib>,
-C<sitelib_stem>, C<sitelibexp>, C<siteman1dir>, C<siteman1direxp>,
-C<siteman3dir>, C<siteman3direxp>, C<siteprefix>, C<siteprefixexp>,
-C<sitescript>, C<sitescriptexp>, C<sizesize>, C<sizetype>, C<sleep>,
-C<sLOCALTIME_max>, C<sLOCALTIME_min>, C<smail>, C<so>, C<sockethdr>,
-C<socketlib>, C<socksizetype>, C<sort>, C<spackage>, C<spitshell>,
-C<sPRId64>, C<sPRIeldbl>, C<sPRIEUldbl>, C<sPRIfldbl>, C<sPRIFUldbl>,
-C<sPRIgldbl>, C<sPRIGUldbl>, C<sPRIi64>, C<sPRIo64>, C<sPRIu64>,
-C<sPRIx64>, C<sPRIXU64>, C<srand48_r_proto>, C<srandom_r_proto>, C<src>,
-C<sSCNfldbl>, C<ssizetype>, C<startperl>, C<startsh>, C<static_ext>,
-C<stdchar>, C<stdio_base>, C<stdio_bufsiz>, C<stdio_cnt>, C<stdio_filbuf>,
-C<stdio_ptr>, C<stdio_stream_array>, C<strerror_r_proto>, C<strings>,
-C<submit>, C<subversion>, C<sysman>
-
-=over 4
-
-=item t
-
-=back
-
-C<tail>, C<tar>, C<targetarch>, C<tbl>, C<tee>, C<test>, C<timeincl>,
-C<timetype>, C<tmpnam_r_proto>, C<to>, C<touch>, C<tr>, C<trnl>, C<troff>,
-C<ttyname_r_proto>
-
-=over 4
-
-=item u
-
-=back
-
-C<u16size>, C<u16type>, C<u32size>, C<u32type>, C<u64size>, C<u64type>,
-C<u8size>, C<u8type>, C<uidformat>, C<uidsign>, C<uidsize>, C<uidtype>,
-C<uname>, C<uniq>, C<uquadtype>, C<use5005threads>, C<use64bitall>,
-C<use64bitint>, C<usecrosscompile>, C<usedevel>, C<usedl>, C<usedtrace>,
-C<usefaststdio>, C<useithreads>, C<uselargefiles>, C<uselongdouble>,
-C<usemallocwrap>, C<usemorebits>, C<usemultiplicity>, C<usemymalloc>,
-C<usenm>, C<useopcode>, C<useperlio>, C<useposix>, C<usereentrant>,
-C<userelocatableinc>, C<usesfio>, C<useshrplib>, C<usesitecustomize>,
-C<usesocks>, C<usethreads>, C<usevendorprefix>, C<usevfork>, C<usrinc>,
-C<uuname>, C<uvoformat>, C<uvsize>, C<uvtype>, C<uvuformat>, C<uvxformat>,
-C<uvXUformat>
-
-=over 4
-
-=item v
-
-=back
-
-C<vendorarch>, C<vendorarchexp>, C<vendorbin>, C<vendorbinexp>,
-C<vendorhtml1dir>, C<vendorhtml1direxp>, C<vendorhtml3dir>,
-C<vendorhtml3direxp>, C<vendorlib>, C<vendorlib_stem>, C<vendorlibexp>,
-C<vendorman1dir>, C<vendorman1direxp>, C<vendorman3dir>,
-C<vendorman3direxp>, C<vendorprefix>, C<vendorprefixexp>, C<vendorscript>,
-C<vendorscriptexp>, C<version>, C<version_patchlevel_string>,
-C<versiononly>, C<vi>, C<voidflags>
-
-=over 4
-
-=item x
-
-=back
-
-C<xlibpth>
-
-=over 4
-
-=item y
-
-=back
-
-C<yacc>, C<yaccflags>
-
-=over 4
-
-=item z
-
-=back
-
-C<zcat>, C<zip>
-
-=over 4
-
-=item NOTE
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-dynamic, nonxs, static
-
-=item AUTHOR
-
-=back
-
-=head2 Cwd - get pathname of current working directory
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item getcwd and friends
-
-getcwd, cwd, fastcwd, fastgetcwd, getdcwd
-
-=item abs_path and friends
-
-abs_path, realpath, fast_abs_path
-
-=item $ENV{PWD}
-
-=back
-
-=item NOTES
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=head2 DB - programmatic interface to the Perl debugging API
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Global Variables
-
- $DB::sub, %DB::sub, $DB::single, $DB::signal, $DB::trace, @DB::args,
-@DB::dbline, %DB::dbline, $DB::package, $DB::filename, $DB::subname,
-$DB::lineno
-
-=item API Methods
-
-CLIENT->register(), CLIENT->evalcode(STRING), CLIENT->skippkg('D::hide'),
-CLIENT->run(), CLIENT->step(), CLIENT->next(), CLIENT->done()
-
-=item Client Callback Methods
-
-CLIENT->init(), CLIENT->prestop([STRING]), CLIENT->stop(), CLIENT->idle(),
-CLIENT->poststop([STRING]), CLIENT->evalcode(STRING), CLIENT->cleanup(),
-CLIENT->output(LIST)
-
-=back
-
-=item BUGS
-
-=item AUTHOR
-
-=back
-
-=head2 DBM_Filter -- Filter DBM keys/values
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item What is a DBM Filter?
-
-=over 4
-
-=item So what's new?
-
-=back
-
-=item METHODS
-
-=over 4
-
-=item $db->Filter_Push()
-
-=item $db->Filter_Key_Push()
-
-=item $db->Filter_Value_Push()
-
-Filter_Push, Filter_Key_Push, Filter_Value_Push
-
-=item $db->Filter_Pop()
-
-=item $db->Filtered()
-
-=back
-
-=item Writing a Filter
-
-=over 4
-
-=item Immediate Filters
-
-=item Canned Filters
-
-"name", params
-
-=back
-
-=item Filters Included
-
-utf8, encode, compress, int32, null
-
-=item NOTES
-
-=over 4
-
-=item Maintain Round Trip Integrity
-
-=item Don't mix filtered & non-filtered data in the same database file.
-
-=back
-
-=item EXAMPLE
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=back
-
-=head2 DBM_Filter::compress - filter for DBM_Filter
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=back
-
-=head2 DBM_Filter::encode - filter for DBM_Filter
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=back
-
-=head2 DBM_Filter::int32 - filter for DBM_Filter
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=back
-
-=head2 DBM_Filter::null - filter for DBM_Filter
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=back
-
-=head2 DBM_Filter::utf8 - filter for DBM_Filter
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=back
-
-=head2 DB_File - Perl5 access to Berkeley DB version 1.x
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-B<DB_HASH>, B<DB_BTREE>, B<DB_RECNO>
-
-=over 4
-
-=item Using DB_File with Berkeley DB version 2 or greater
-
-=item Interface to Berkeley DB
-
-=item Opening a Berkeley DB Database File
-
-=item Default Parameters
-
-=item In Memory Databases
-
-=back
-
-=item DB_HASH
-
-=over 4
-
-=item A Simple Example
-
-=back
-
-=item DB_BTREE
-
-=over 4
-
-=item Changing the BTREE sort order
-
-=item Handling Duplicate Keys
-
-=item The get_dup() Method
-
-=item The find_dup() Method
-
-=item The del_dup() Method
-
-=item Matching Partial Keys
-
-=back
-
-=item DB_RECNO
-
-=over 4
-
-=item The 'bval' Option
-
-=item A Simple Example
-
-=item Extra RECNO 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>, B<$X-E<gt>splice(offset,
-length, elements);>
-
-=item Another Example
-
-=back
-
-=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 DBM FILTERS
-
-B<filter_store_key>, B<filter_store_value>, B<filter_fetch_key>,
-B<filter_fetch_value>
-
-=over 4
-
-=item The Filter
-
-=item An Example -- the NULL termination problem.
-
-=item Another Example -- Key is a C int.
-
-=back
-
-=item HINTS AND TIPS
-
-=over 4
-
-=item Locking: The Trouble with fd
-
-=item Safe ways to lock a database
-
-B<Tie::DB_Lock>, B<Tie::DB_LockFile>, B<DB_File::Lock>
-
-=item Sharing Databases With C Applications
-
-=item The untie() Gotcha
-
-=back
-
-=item COMMON QUESTIONS
-
-=over 4
-
-=item Why is there Perl source in my database?
-
-=item How do I store complex data structures with DB_File?
-
-=item What does "Invalid Argument" mean?
-
-=item What does "Bareword 'DB_File' not allowed" mean?
-
-=back
-
-=item REFERENCES
-
-=item HISTORY
-
-=item BUGS
-
-=item AVAILABILITY
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=back
-
-=head2 Data::Dumper - stringified perl data structures, suitable for both
-printing and C<eval>
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Methods
-
-I<PACKAGE>->new(I<ARRAYREF [>, I<ARRAYREF]>), I<$OBJ>->Dump I<or>
-I<PACKAGE>->Dump(I<ARRAYREF [>, I<ARRAYREF]>), I<$OBJ>->Seen(I<[HASHREF]>),
-I<$OBJ>->Values(I<[ARRAYREF]>), I<$OBJ>->Names(I<[ARRAYREF]>),
-I<$OBJ>->Reset
-
-=item Functions
-
-Dumper(I<LIST>)
-
-=item Configuration Variables or Methods
-
-=item Exports
-
-Dumper
-
-=back
-
-=item EXAMPLES
-
-=item BUGS
-
-=over 4
-
-=item NOTE
-
-=back
-
-=item AUTHOR
-
-=item VERSION
-
-=item SEE ALSO
-
-=back
-
-=head2 Devel::DProf - a Perl code profiler
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item PROFILE FORMAT
-
-=item AUTOLOAD
-
-=item ENVIRONMENT
-
-=item BUGS
-
-=item SEE ALSO
-
-=back
-
-=head2 Devel::InnerPackage - find all the inner packages of a package
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item list_packages <package name>
-
-=back
-
-=back
-
-=over 4
-
-=item AUTHOR
-
-=item COPYING
-
-=item BUGS
-
-=back
-
-=head2 Devel::PPPort - Perl/Pollution/Portability
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Why use ppport.h?
-
-=item How to use ppport.h
-
-=item Running ppport.h
-
-=back
-
-=item FUNCTIONS
-
-=over 4
-
-=item WriteFile
-
-=back
-
-=item COMPATIBILITY
-
-=over 4
-
-=item Provided Perl compatibility API
-
-=item Perl API not supported by ppport.h
-
-perl 5.11.0, perl 5.10.0, perl 5.9.5, perl 5.9.4, perl 5.9.3, perl 5.9.2,
-perl 5.9.1, perl 5.9.0, perl 5.8.3, perl 5.8.1, perl 5.8.0, perl 5.7.3,
-perl 5.7.2, perl 5.7.1, perl 5.6.1, perl 5.6.0, perl 5.005_03, perl 5.005,
-perl 5.004_05, perl 5.004
-
-=back
-
-=item BUGS
-
-=item AUTHORS
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=head2 Devel::Peek - A data debugging tool for the XS programmer
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Runtime debugging
-
-=item Memory footprint debugging
-
-=back
-
-=item EXAMPLES
-
-=over 4
-
-=item A simple scalar string
-
-=item A simple scalar number
-
-=item A simple scalar with an extra reference
-
-=item A reference to a simple scalar
-
-=item A reference to an array
-
-=item A reference to a hash
-
-=item Dumping a large array or hash
-
-=item A reference to an SV which holds a C pointer
-
-=item A reference to a subroutine
-
-=back
-
-=item EXPORTS
-
-=item BUGS
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 Devel::SelfStubber - generate stubs for a SelfLoading module
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=head2 Digest - Modules that calculate message digests
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-I<binary>, I<hex>, I<base64>
-
-=item OO INTERFACE
-
-$ctx = Digest->XXX($arg,...), $ctx = Digest->new(XXX => $arg,...), $ctx =
-Digest::XXX->new($arg,...), $other_ctx = $ctx->clone, $ctx->reset,
-$ctx->add( $data ), $ctx->add( $chunk1, $chunk2, ... ), $ctx->addfile(
-$io_handle ), $ctx->add_bits( $data, $nbits ), $ctx->add_bits( $bitstring
-), $ctx->digest, $ctx->hexdigest, $ctx->b64digest
-
-=item Digest speed
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=back
-
-=head2 Digest::MD5 - Perl interface to the MD5 Algorithm
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item FUNCTIONS
-
-md5($data,...), md5_hex($data,...), md5_base64($data,...)
-
-=item METHODS
-
-$md5 = Digest::MD5->new, $md5->reset, $md5->clone, $md5->add($data,...),
-$md5->addfile($io_handle), $md5->add_bits($data, $nbits),
-$md5->add_bits($bitstring), $md5->digest, $md5->hexdigest, $md5->b64digest
-
-=item EXAMPLES
-
-=item SEE ALSO
-
-=item COPYRIGHT
-
-=item AUTHORS
-
-=back
-
-=head2 Digest::SHA - Perl extension for SHA-1/224/256/384/512
-
-=over 4
-
-=item SYNOPSIS
-
-=item SYNOPSIS (HMAC-SHA)
-
-=item ABSTRACT
-
-=item DESCRIPTION
-
-=item NIST STATEMENT ON SHA-1
-
-=item PADDING OF BASE64 DIGESTS
-
-=item EXPORT
-
-=item EXPORTABLE FUNCTIONS
-
-B<sha1($data, ...)>, B<sha224($data, ...)>, B<sha256($data, ...)>,
-B<sha384($data, ...)>, B<sha512($data, ...)>, B<sha1_hex($data, ...)>,
-B<sha224_hex($data, ...)>, B<sha256_hex($data, ...)>, B<sha384_hex($data,
-...)>, B<sha512_hex($data, ...)>, B<sha1_base64($data, ...)>,
-B<sha224_base64($data, ...)>, B<sha256_base64($data, ...)>,
-B<sha384_base64($data, ...)>, B<sha512_base64($data, ...)>, B<new($alg)>,
-B<reset($alg)>, B<hashsize>, B<algorithm>, B<clone>, B<add($data, ...)>,
-B<add_bits($data, $nbits)>, B<add_bits($bits)>, B<addfile(*FILE)>,
-B<addfile($filename [, $mode])>, B<dump($filename)>, B<load($filename)>,
-B<digest>, B<hexdigest>, B<b64digest>, B<hmac_sha1($data, $key)>,
-B<hmac_sha224($data, $key)>, B<hmac_sha256($data, $key)>,
-B<hmac_sha384($data, $key)>, B<hmac_sha512($data, $key)>,
-B<hmac_sha1_hex($data, $key)>, B<hmac_sha224_hex($data, $key)>,
-B<hmac_sha256_hex($data, $key)>, B<hmac_sha384_hex($data, $key)>,
-B<hmac_sha512_hex($data, $key)>, B<hmac_sha1_base64($data, $key)>,
-B<hmac_sha224_base64($data, $key)>, B<hmac_sha256_base64($data, $key)>,
-B<hmac_sha384_base64($data, $key)>, B<hmac_sha512_base64($data, $key)>
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item ACKNOWLEDGMENTS
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 Digest::SHA::lib::Digest::SHA, Digest::SHA - Perl extension for
-SHA-1/224/256/384/512
-
-=over 4
-
-=item SYNOPSIS
-
-=item SYNOPSIS (HMAC-SHA)
-
-=item ABSTRACT
-
-=item DESCRIPTION
-
-=item NIST STATEMENT ON SHA-1
-
-=item PADDING OF BASE64 DIGESTS
-
-=item EXPORT
-
-=item EXPORTABLE FUNCTIONS
-
-B<sha1($data, ...)>, B<sha224($data, ...)>, B<sha256($data, ...)>,
-B<sha384($data, ...)>, B<sha512($data, ...)>, B<sha1_hex($data, ...)>,
-B<sha224_hex($data, ...)>, B<sha256_hex($data, ...)>, B<sha384_hex($data,
-...)>, B<sha512_hex($data, ...)>, B<sha1_base64($data, ...)>,
-B<sha224_base64($data, ...)>, B<sha256_base64($data, ...)>,
-B<sha384_base64($data, ...)>, B<sha512_base64($data, ...)>, B<new($alg)>,
-B<reset($alg)>, B<hashsize>, B<algorithm>, B<clone>, B<add($data, ...)>,
-B<add_bits($data, $nbits)>, B<add_bits($bits)>, B<addfile(*FILE)>,
-B<addfile($filename [, $mode])>, B<dump($filename)>, B<load($filename)>,
-B<digest>, B<hexdigest>, B<b64digest>, B<hmac_sha1($data, $key)>,
-B<hmac_sha224($data, $key)>, B<hmac_sha256($data, $key)>,
-B<hmac_sha384($data, $key)>, B<hmac_sha512($data, $key)>,
-B<hmac_sha1_hex($data, $key)>, B<hmac_sha224_hex($data, $key)>,
-B<hmac_sha256_hex($data, $key)>, B<hmac_sha384_hex($data, $key)>,
-B<hmac_sha512_hex($data, $key)>, B<hmac_sha1_base64($data, $key)>,
-B<hmac_sha224_base64($data, $key)>, B<hmac_sha256_base64($data, $key)>,
-B<hmac_sha384_base64($data, $key)>, B<hmac_sha512_base64($data, $key)>
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item ACKNOWLEDGMENTS
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 Digest::base - Digest base class
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=back
-
-=head2 Digest::file - Calculate digests of files
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-digest_file( $file, $algorithm, [$arg,...] ), digest_file_hex( $file,
-$algorithm, [$arg,...] ), digest_file_base64( $file, $algorithm, [$arg,...]
-)
-
-=item SEE ALSO
-
-=back
-
-=head2 DirHandle - supply object methods for directory handles
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item NOTES
-
-=back
-
-=head2 Dumpvalue - provides screen dump of Perl data.
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Creation
-
-C<arrayDepth>, C<hashDepth>, C<compactDump>, C<veryCompact>, C<globPrint>,
-C<dumpDBFiles>, C<dumpPackages>, C<dumpReused>, C<tick>, C<quoteHighBit>,
-C<printUndef>, C<usageOnly>, unctrl, subdump, bareStringify, quoteHighBit,
-stopDbSignal
-
-=item Methods
-
-dumpValue, dumpValues, stringify, dumpvars, set_quote, set_unctrl,
-compactDump, veryCompact, set, get
-
-=back
-
-=back
-
-=head2 DynaLoader - Dynamically load C libraries into Perl code
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-@dl_library_path, @dl_resolve_using, @dl_require_symbols, @dl_librefs,
-@dl_modules, @dl_shared_objects, dl_error(), $dl_debug, dl_findfile(),
-dl_expandspec(), dl_load_file(), dl_unload_file(), dl_load_flags(),
-dl_find_symbol(), dl_find_symbol_anywhere(), dl_undef_symbols(),
-dl_install_xsub(), bootstrap()
-
-=item AUTHOR
-
-=back
-
-=head2 DynaLoader::XSLoader, XSLoader - Dynamically load C libraries into
-Perl code
-
-=over 4
-
-=item VERSION
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Migration from C<DynaLoader>
-
-=item Backward compatible boilerplate
-
-=back
-
-=item Order of initialization: early load()
-
-=over 4
-
-=item The most hairy case
-
-=back
-
-=item DIAGNOSTICS
-
-C<Can't find '%s' symbol in %s>, C<Can't load '%s' for module %s: %s>,
-C<Undefined symbols present after loading %s: %s>,
-C<XSLoader::load('Your::Module', $Your::Module::VERSION)>
-
-=item LIMITATIONS
-
-=item BUGS
-
-=item SEE ALSO
-
-=item AUTHORS
-
-=item COPYRIGHT & LICENSE
-
-=back
-
-=head2 Encode - character encodings
-
-=over 4
-
-=item SYNOPSIS
-
-=over 4
-
-=item Table of Contents
-
-=back
-
-=item DESCRIPTION
-
-=over 4
-
-=item TERMINOLOGY
-
-=back
-
-=item PERL ENCODING API
-
-$octets = encode(ENCODING, $string [, CHECK]), $string = decode(ENCODING,
-$octets [, CHECK]), [$obj =] find_encoding(ENCODING), [$length =]
-from_to($octets, FROM_ENC, TO_ENC [, CHECK]), $octets =
-encode_utf8($string);, $string = decode_utf8($octets [, CHECK]);
-
-=over 4
-
-=item Listing available encodings
-
-=item Defining Aliases
-
-=item Finding IANA Character Set Registry names
-
-=back
-
-=item Encoding via PerlIO
-
-=item Handling Malformed Data
-
-B<NOTE:> Not all encoding support this feature, I<CHECK> =
-Encode::FB_DEFAULT ( == 0), I<CHECK> = Encode::FB_CROAK ( == 1), I<CHECK> =
-Encode::FB_QUIET, I<CHECK> = Encode::FB_WARN, perlqq mode (I<CHECK> =
-Encode::FB_PERLQQ), HTML charref mode (I<CHECK> = Encode::FB_HTMLCREF), XML
-charref mode (I<CHECK> = Encode::FB_XMLCREF), The bitmask,
-Encode::LEAVE_SRC
-
-=over 4
-
-=item coderef for CHECK
-
-=back
-
-=item Defining Encodings
-
-=item The UTF8 flag
-
-Goal #1:, Goal #2:, Goal #3:, Goal #4:
-
-=over 4
-
-=item Messing with Perl's Internals
-
-is_utf8(STRING [, CHECK]), _utf8_on(STRING), _utf8_off(STRING)
-
-=back
-
-=item UTF-8 vs. utf8 vs. UTF8
-
-=item SEE ALSO
-
-=item MAINTAINER
-
-=item COPYRIGHT
-
-=back
-
-=head2 Encode::Alias - alias definitions to encodings
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-As a simple string, As a qr// compiled regular expression, e.g.:, As a code
-reference, e.g.:
-
-=over 4
-
-=item Alias overloading
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 Encode::Byte - Single Byte Encodings
-
-=over 4
-
-=item SYNOPSIS
-
-=item ABSTRACT
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=back
-
-=head2 Encode::CJKConstants -- Internally used by Encode::??::ISO_2022_*
-
-=head2 Encode::CN - China-based Chinese Encodings
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item NOTES
-
-=item BUGS
-
-=item SEE ALSO
-
-=back
-
-=head2 Encode::CN::HZ -- internally used by Encode::CN
-
-=head2 Encode::Config -- internally used by Encode
-
-=head2 Encode::EBCDIC - EBCDIC Encodings
-
-=over 4
-
-=item SYNOPSIS
-
-=item ABSTRACT
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=back
-
-=head2 Encode::Encoding - Encode Implementation Base Class
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Methods you should implement
-
--E<gt>encode($string [,$check]), -E<gt>decode($octets [,$check]),
--E<gt>cat_decode($destination, $octets, $offset, $terminator [,$check])
-
-=item Other methods defined in Encode::Encodings
-
--E<gt>name, -E<gt>mime_name, -E<gt>renew, -E<gt>renewed, -E<gt>perlio_ok(),
--E<gt>needs_lines()
-
-=item Example: Encode::ROT13
-
-=back
-
-=item Why the heck Encode API is different?
-
-=over 4
-
-=item Compiled Encodings
-
-=back
-
-=item SEE ALSO
-
-Scheme 1, Scheme 2, Other Schemes
-
-=back
-
-=head2 Encode::GSM0338 -- ESTI GSM 03.38 Encoding
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item NOTES
-
-=item BUGS
-
-=item SEE ALSO
-
-=back
-
-=head2 Encode::Guess -- Guesses encoding from data
-
-=over 4
-
-=item SYNOPSIS
-
-=item ABSTRACT
-
-=item DESCRIPTION
-
-Encode::Guess->set_suspects, Encode::Guess->add_suspects,
-Encode::decode("Guess" ...), Encode::Guess->guess($data),
-guess_encoding($data, [, I<list of suspects>])
-
-=item CAVEATS
-
-=item TO DO
-
-=item SEE ALSO
-
-=back
-
-=head2 Encode::JP - Japanese Encodings
-
-=over 4
-
-=item SYNOPSIS
-
-=item ABSTRACT
-
-=item DESCRIPTION
-
-=item Note on ISO-2022-JP(-1)?
-
-=item BUGS
-
-=item SEE ALSO
-
-=back
-
-=head2 Encode::JP::H2Z -- internally used by Encode::JP::2022_JP*
-
-=head2 Encode::JP::JIS7 -- internally used by Encode::JP
-
-=head2 Encode::KR - Korean Encodings
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item BUGS
-
-=item SEE ALSO
-
-=back
-
-=head2 Encode::KR::2022_KR -- internally used by Encode::KR
-
-=head2 Encode::MIME::Header -- MIME 'B' and 'Q' header encoding
-
-=over 4
-
-=item SYNOPSIS
-
-=item ABSTRACT
-
-=item DESCRIPTION
-
-=item BUGS
-
-=item SEE ALSO
-
-=back
-
-=head2 Encode::MIME::Name, Encode::MIME::NAME -- internally used by Encode
-
-=over 4
-
-=item SEE ALSO
-
-=back
-
-=head2 Encode::PerlIO -- a detailed document on Encode and PerlIO
-
-=over 4
-
-=item Overview
-
-=item How does it work?
-
-=item Line Buffering
-
-=over 4
-
-=item How can I tell whether my encoding fully supports PerlIO ?
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 Encode::Supported -- Encodings supported by Encode
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Encoding Names
-
-=back
-
-=item Supported Encodings
-
-=over 4
-
-=item Built-in Encodings
-
-=item Encode::Unicode -- other Unicode encodings
-
-=item Encode::Byte -- Extended ASCII
-
-ISO-8859 and corresponding vendor mappings, KOI8 - De Facto Standard for
-the Cyrillic world
-
-=item gsm0338 - Hentai Latin 1
-
-gsm0338 support before 2.19
-
-=item CJK: Chinese, Japanese, Korean (Multibyte)
-
-Encode::CN -- Continental China, Encode::JP -- Japan, Encode::KR -- Korea,
-Encode::TW -- Taiwan, Encode::HanExtra -- More Chinese via CPAN,
-Encode::JIS2K -- JIS X 0213 encodings via CPAN
-
-=item Miscellaneous encodings
-
-Encode::EBCDIC, Encode::Symbols, Encode::MIME::Header, Encode::Guess
-
-=back
-
-=item Unsupported encodings
-
- ISO-2022-JP-2 [RFC1554], ISO-2022-CN [RFC1922], Various HP-UX encodings,
-Cyrillic encoding ISO-IR-111, ISO-8859-8-1 [Hebrew], ISIRI 3342, Iran
-System, ISIRI 2900 [Farsi], Thai encoding TCVN, Vietnamese encodings VPS,
-Various Mac encodings, (Mac) Indic encodings
-
-=item Encoding vs. Charset -- terminology
-
-=item Encoding Classification (by Anton Tagunov and Dan Kogai)
-
-=over 4
-
-=item Microsoft-related naming mess
-
-KS_C_5601-1987, GB2312, Big5, Shift_JIS
-
-=back
-
-=item Glossary
-
-character repertoire, coded character set (CCS), character encoding scheme
-(CES), charset (in MIME context), EUC, ISO-2022, UCS, UCS-2, Unicode, UTF,
-UTF-16
-
-=item See Also
-
-=item References
-
-ECMA, ECMA-035 (eq C<ISO-2022>), IANA, Assigned Charset Names by IANA, ISO,
-RFC, UC, Unicode Glossary
-
-=over 4
-
-=item Other Notable Sites
-
-czyborra.com, CJK.inf, Jungshik Shin's Hangul FAQ, debian.org:
-"Introduction to i18n"
-
-=item Offline sources
-
-C<CJKV Information Processing> by Ken Lunde
-
-=back
-
-=back
-
-=head2 Encode::Symbol - Symbol Encodings
-
-=over 4
-
-=item SYNOPSIS
-
-=item ABSTRACT
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=back
-
-=head2 Encode::TW - Taiwan-based Chinese Encodings
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item NOTES
-
-=item BUGS
-
-=item SEE ALSO
-
-=back
-
-=head2 Encode::Unicode -- Various Unicode Transformation Formats
-
-=over 4
-
-=item SYNOPSIS
-
-=item ABSTRACT
-
-L<http://www.unicode.org/glossary/> says:, Quick Reference
-
-=item Size, Endianness, and BOM
-
-=over 4
-
-=item by size
-
-=item by endianness
-
-BOM as integer when fetched in network byte order
-
-=back
-
-=item Surrogate Pairs
-
-=item Error Checking
-
-=item SEE ALSO
-
-=back
-
-=head2 Encode::Unicode::UTF7 -- UTF-7 encoding
-
-=over 4
-
-=item SYNOPSIS
-
-=item ABSTRACT
-
-=item In Practice
-
-=item SEE ALSO
-
-=back
-
-=head2 Encode::lib::Encode::Alias, Encode::Alias - alias definitions to
-encodings
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-As a simple string, As a qr// compiled regular expression, e.g.:, As a code
-reference, e.g.:
-
-=over 4
-
-=item Alias overloading
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 Encode::lib::Encode::CJKConstants, Encode::CJKConstants.pm --
-Internally used by Encode::??::ISO_2022_*
-
-=head2 Encode::lib::Encode::CN::HZ, Encode::CN::HZ -- internally used by
-Encode::CN
-
-=head2 Encode::lib::Encode::Config, Encode::Config -- internally used by
-Encode
-
-=head2 Encode::lib::Encode::Encoding, Encode::Encoding - Encode
-Implementation Base Class
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Methods you should implement
-
--E<gt>encode($string [,$check]), -E<gt>decode($octets [,$check]),
--E<gt>cat_decode($destination, $octets, $offset, $terminator [,$check])
-
-=item Other methods defined in Encode::Encodings
-
--E<gt>name, -E<gt>mime_name, -E<gt>renew, -E<gt>renewed, -E<gt>perlio_ok(),
--E<gt>needs_lines()
-
-=item Example: Encode::ROT13
-
-=back
-
-=item Why the heck Encode API is different?
-
-=over 4
-
-=item Compiled Encodings
-
-=back
-
-=item SEE ALSO
-
-Scheme 1, Scheme 2, Other Schemes
-
-=back
-
-=head2 Encode::lib::Encode::GSM0338, Encode::GSM0338 -- ESTI GSM 03.38
-Encoding
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item NOTES
-
-=item BUGS
-
-=item SEE ALSO
-
-=back
-
-=head2 Encode::lib::Encode::Guess, Encode::Guess -- Guesses encoding from
-data
-
-=over 4
-
-=item SYNOPSIS
-
-=item ABSTRACT
-
-=item DESCRIPTION
-
-Encode::Guess->set_suspects, Encode::Guess->add_suspects,
-Encode::decode("Guess" ...), Encode::Guess->guess($data),
-guess_encoding($data, [, I<list of suspects>])
-
-=item CAVEATS
-
-=item TO DO
-
-=item SEE ALSO
-
-=back
-
-=head2 Encode::lib::Encode::JP::H2Z, Encode::JP::H2Z -- internally used by
-Encode::JP::2022_JP*
-
-=head2 Encode::lib::Encode::JP::JIS7, Encode::JP::JIS7 -- internally used
-by Encode::JP
-
-=head2 Encode::lib::Encode::KR::2022_KR, Encode::KR::2022_KR -- internally
-used by Encode::KR
-
-=head2 Encode::lib::Encode::MIME::Header, Encode::MIME::Header -- MIME 'B'
-and 'Q' header encoding
-
-=over 4
-
-=item SYNOPSIS
-
-=item ABSTRACT
-
-=item DESCRIPTION
-
-=item BUGS
-
-=item SEE ALSO
-
-=back
-
-=head2 Encode::lib::Encode::MIME::Name, Encode::MIME::NAME -- internally
-used by Encode
-
-=over 4
-
-=item SEE ALSO
-
-=back
-
-=head2 Encode::lib::Encode::PerlIO, Encode::PerlIO -- a detailed document
-on Encode and PerlIO
-
-=over 4
-
-=item Overview
-
-=item How does it work?
-
-=item Line Buffering
-
-=over 4
-
-=item How can I tell whether my encoding fully supports PerlIO ?
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 Encode::lib::Encode::Supported, Encode::Supported -- Encodings
-supported by Encode
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Encoding Names
-
-=back
-
-=item Supported Encodings
-
-=over 4
-
-=item Built-in Encodings
-
-=item Encode::Unicode -- other Unicode encodings
-
-=item Encode::Byte -- Extended ASCII
-
-ISO-8859 and corresponding vendor mappings, KOI8 - De Facto Standard for
-the Cyrillic world
-
-=item gsm0338 - Hentai Latin 1
-
-gsm0338 support before 2.19
-
-=item CJK: Chinese, Japanese, Korean (Multibyte)
-
-Encode::CN -- Continental China, Encode::JP -- Japan, Encode::KR -- Korea,
-Encode::TW -- Taiwan, Encode::HanExtra -- More Chinese via CPAN,
-Encode::JIS2K -- JIS X 0213 encodings via CPAN
-
-=item Miscellaneous encodings
-
-Encode::EBCDIC, Encode::Symbols, Encode::MIME::Header, Encode::Guess
-
-=back
-
-=item Unsupported encodings
-
- ISO-2022-JP-2 [RFC1554], ISO-2022-CN [RFC1922], Various HP-UX encodings,
-Cyrillic encoding ISO-IR-111, ISO-8859-8-1 [Hebrew], ISIRI 3342, Iran
-System, ISIRI 2900 [Farsi], Thai encoding TCVN, Vietnamese encodings VPS,
-Various Mac encodings, (Mac) Indic encodings
-
-=item Encoding vs. Charset -- terminology
-
-=item Encoding Classification (by Anton Tagunov and Dan Kogai)
-
-=over 4
-
-=item Microsoft-related naming mess
-
-KS_C_5601-1987, GB2312, Big5, Shift_JIS
-
-=back
-
-=item Glossary
-
-character repertoire, coded character set (CCS), character encoding scheme
-(CES), charset (in MIME context), EUC, ISO-2022, UCS, UCS-2, Unicode, UTF,
-UTF-16
-
-=item See Also
-
-=item References
-
-ECMA, ECMA-035 (eq C<ISO-2022>), IANA, Assigned Charset Names by IANA, ISO,
-RFC, UC, Unicode Glossary
-
-=over 4
-
-=item Other Notable Sites
-
-czyborra.com, CJK.inf, Jungshik Shin's Hangul FAQ, debian.org:
-"Introduction to i18n"
-
-=item Offline sources
-
-C<CJKV Information Processing> by Ken Lunde
-
-=back
-
-=back
-
-=head2 Encode::lib::Encode::Unicode::UTF7, Encode::Unicode::UTF7 -- UTF-7
-encoding
-
-=over 4
-
-=item SYNOPSIS
-
-=item ABSTRACT
-
-=item In Practice
-
-=item SEE ALSO
-
-=back
-
-=head2 Encode::lib::Encoder, Encode::Encoder -- Object Oriented Encoder
-
-=over 4
-
-=item SYNOPSIS
-
-=item ABSTRACT
-
-=item Description
-
-=over 4
-
-=item Predefined Methods
-
-$e = Encode::Encoder-E<gt>new([$data, $encoding]);, encoder(),
-$e-E<gt>data([$data]), $e-E<gt>encoding([$encoding]),
-$e-E<gt>bytes([$encoding])
-
-=item Example: base64 transcoder
-
-=item Operator Overloading
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 Encodencoding, encoding - allows you to write your script in
-non-ascii or non-utf8
-
-=over 4
-
-=item SYNOPSIS
-
-=item ABSTRACT
-
-=over 4
-
-=item Literal Conversions
-
-=item PerlIO layers for C<STD(IN|OUT)>
-
-=item Implicit upgrading for byte strings
-
-=item Side effects
-
-=back
-
-=item FEATURES THAT REQUIRE 5.8.1
-
-"NON-EUC" doublebyte encodings, tr//, DATA pseudo-filehandle
-
-=item USAGE
-
-use encoding [I<ENCNAME>] ;, use encoding I<ENCNAME> [ STDIN =E<gt>
-I<ENCNAME_IN> ...] ;, use encoding I<ENCNAME> Filter=E<gt>1;, no encoding;
-
-=item The Filter Option
-
-=over 4
-
-=item Filter-related changes at Encode version 1.87
-
-=back
-
-=item CAVEATS
-
-=over 4
-
-=item NOT SCOPED
-
-=item DO NOT MIX MULTIPLE ENCODINGS
-
-=item tr/// with ranges
-
-Legend of characters above
-
-=back
-
-=item EXAMPLE - Greekperl
-
-=item KNOWN PROBLEMS
-
-literals in regex that are longer than 127 bytes, EBCDIC, format, Thread
-safety
-
-=over 4
-
-=item The Logic of :locale
-
-=back
-
-=item HISTORY
-
-=item SEE ALSO
-
-=back
-
-=head2 Encoder, Encode::Encoder -- Object Oriented Encoder
-
-=over 4
-
-=item SYNOPSIS
-
-=item ABSTRACT
-
-=item Description
-
-=over 4
-
-=item Predefined Methods
-
-$e = Encode::Encoder-E<gt>new([$data, $encoding]);, encoder(),
-$e-E<gt>data([$data]), $e-E<gt>encoding([$encoding]),
-$e-E<gt>bytes([$encoding])
-
-=item Example: base64 transcoder
-
-=item Operator Overloading
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 English - use nice English (or awk) names for ugly punctuation
-variables
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item PERFORMANCE
-
-=back
-
-=head2 Env - perl module that imports environment variables as scalars or
-arrays
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item LIMITATIONS
-
-=item AUTHOR
-
-=back
-
-=head2 Errno - System errno constants
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CAVEATS
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 Exporter - Implements default import method for modules
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item How to Export
-
-=item Selecting What To Export
-
-=item How to Import
-
-C<use YourModule;>, C<use YourModule ();>, C<use YourModule qw(...);>
-
-=back
-
-=item Advanced features
-
-=over 4
-
-=item Specialised Import Lists
-
-=item Exporting without using Exporter's import method
-
-=item Exporting without inheriting from Exporter
-
-=item Module Version Checking
-
-=item Managing Unknown Symbols
-
-=item Tag Handling Utility Functions
-
-=item Generating combined tags
-
-=item C<AUTOLOAD>ed Constants
-
-=back
-
-=item Good Practices
-
-=over 4
-
-=item Declaring C<@EXPORT_OK> and Friends
-
-=item Playing Safe
-
-=item What not to Export
-
-=back
-
-=item SEE ALSO
-
-=item LICENSE
-
-=back
-
-=head2 Exporter::Heavy - Exporter guts
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=head2 ExtUtils::CBuilder - Compile and link C code for Perl modules
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-new, have_compiler, compile, C<object_file>, C<include_dirs>,
-C<extra_compiler_flags>, link, lib_file, module_name, extra_linker_flags,
-link_executable, exe_file, object_file, lib_file, exe_file, prelink,
-need_prelink, extra_link_args_after_prelink
-
-=item TO DO
-
-=item HISTORY
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=head2 ExtUtils::CBuilder::Platform::Windows - Builder class for Windows
-platforms
-
-=over 4
-
-=item DESCRIPTION
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 ExtUtils::Command - utilities to replace common UNIX commands in
-Makefiles etc.
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item FUNCTIONS
-
-=back
-
-=back
-
-cat
-
-eqtime
-
-rm_rf
-
-rm_f
-
-touch
-
-mv
-
-cp
-
-chmod
-
-mkpath
-
-test_f
-
-test_d
-
-dos2unix
-
-=over 4
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=back
-
-=head2 ExtUtils::Command::MM - Commands for the MM's to use in Makefiles
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-B<test_harness>
-
-=back
-
-B<pod2man>
-
-B<warn_if_old_packlist>
-
-B<perllocal_install>
-
-B<uninstall>
-
-=head2 ExtUtils::Constant - generate XS code to import C header constants
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item USAGE
-
-IV, UV, NV, PV, PVN, SV, YES, NO, UNDEF
-
-=item FUNCTIONS
-
-=back
-
-constant_types
-
-XS_constant PACKAGE, TYPES, XS_SUBNAME, C_SUBNAME
-
-autoload PACKAGE, VERSION, AUTOLOADER
-
-WriteMakefileSnippet
-
-WriteConstants ATTRIBUTE =E<gt> VALUE [, ...], NAME, DEFAULT_TYPE,
-BREAKOUT_AT, NAMES, PROXYSUBS, C_FH, C_FILE, XS_FH, XS_FILE, XS_SUBNAME,
-C_SUBNAME
-
-=over 4
-
-=item AUTHOR
-
-=back
-
-=head2 ExtUtils::Constant::Base - base class for ExtUtils::Constant objects
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item USAGE
-
-=back
-
-header
-
-memEQ_clause args_hashref
-
-dump_names arg_hashref, ITEM..
-
-assign arg_hashref, VALUE..
-
-return_clause arg_hashref, ITEM
-
-switch_clause arg_hashref, NAMELEN, ITEMHASH, ITEM..
-
-params WHAT
-
-dogfood arg_hashref, ITEM..
-
-normalise_items args, default_type, seen_types, seen_items, ITEM..
-
-C_constant arg_hashref, ITEM.., name, type, value, macro, default, pre,
-post, def_pre, def_post, utf8, weight
-
-=over 4
-
-=item BUGS
-
-=item AUTHOR
-
-=back
-
-=head2 ExtUtils::Constant::Utils - helper functions for ExtUtils::Constant
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item USAGE
-
-C_stringify NAME
-
-=back
-
-perl_stringify NAME
-
-=over 4
-
-=item AUTHOR
-
-=back
-
-=head2 ExtUtils::Constant::XS, ExtUtils::Constant::Base - base class for
-ExtUtils::Constant objects
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item BUGS
-
-=item AUTHOR
-
-=back
-
-=head2 ExtUtils::Embed - Utilities for embedding Perl in C/C++ applications
-
-=over 4
-
-=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
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=back
-
-=head2 ExtUtils::Install - install files from here to there
-
-=over 4
-
-=item SYNOPSIS
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-_chmod($$;$), _warnonce(@), _choke(@)
-
-=back
-
-_move_file_at_boot( $file, $target, $moan )
-
-_unlink_or_rename( $file, $tryhard, $installing )
-
-=over 4
-
-=item Functions
-
-_get_install_skip
-
-=back
-
-_have_write_access
-
-_can_write_dir(C<$dir>)
-
-_mkpath($dir,$show,$mode,$verbose,$dry_run)
-
-_copy($from,$to,$verbose,$dry_run)
-
-_chdir($from)
-
-B<install>
-
-_do_cleanup
-
-install_rooted_file( $file ), install_rooted_dir( $dir )
-
-forceunlink( $file, $tryhard )
-
-directory_not_empty( $dir )
-
-B<install_default> I<DISCOURAGED>
-
-B<uninstall>
-
-inc_uninstall($filepath,$libdir,$verbose,$dry_run,$ignore,$results)
-
-run_filter($cmd,$src,$dest)
-
-B<pm_to_blib>
-
-_autosplit
-
-_invokant
-
-=over 4
-
-=item ENVIRONMENT
-
-B<PERL_INSTALL_ROOT>, B<EU_INSTALL_IGNORE_SKIP>,
-B<EU_INSTALL_SITE_SKIPFILE>, B<EU_INSTALL_ALWAYS_COPY>
-
-=item AUTHOR
-
-=item LICENSE
-
-=back
-
-=head2 ExtUtils::Installed - Inventory management of installed modules
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item USAGE
-
-=item FUNCTIONS
-
-new(), modules(), files(), directories(), directory_tree(), validate(),
-packlist(), version()
-
-=item EXAMPLE
-
-=item AUTHOR
-
-=back
-
-=head2 ExtUtils::Liblist - determine libraries to use and how to use them
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-For static extensions, For dynamic extensions at build/link time, For
-dynamic extensions at load time
-
-=over 4
-
-=item EXTRALIBS
-
-=item LDLOADLIBS and LD_RUN_PATH
-
-=item BSLOADLIBS
-
-=back
-
-=item PORTABILITY
-
-=over 4
-
-=item VMS implementation
-
-=item Win32 implementation
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 ExtUtils::MM - OS adjusted ExtUtils::MakeMaker subclass
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=head2 ExtUtils::MM_AIX - AIX specific subclass of ExtUtils::MM_Unix
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Overridden methods
-
-=back
-
-=back
-
-=over 4
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 ExtUtils::MM_Any - Platform-agnostic MM methods
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Cross-platform helper methods
-
-=back
-
-=back
-
-=over 4
-
-=item Targets
-
-=back
-
-=over 4
-
-=item Init methods
-
-=back
-
-=over 4
-
-=item Tools
-
-=back
-
-=over 4
-
-=item File::Spec wrappers
-
-=back
-
-=over 4
-
-=item Misc
-
-=back
-
-=over 4
-
-=item AUTHOR
-
-=back
-
-=head2 ExtUtils::MM_BeOS - methods to override UN*X behaviour in
-ExtUtils::MakeMaker
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-os_flavor
-
-init_linker
-
-=head2 ExtUtils::MM_Cygwin - methods to override UN*X behaviour in
-ExtUtils::MakeMaker
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-os_flavor
-
-=back
-
-cflags
-
-replace_manpage_separator
-
-init_linker
-
-=head2 ExtUtils::MM_DOS - DOS specific subclass of ExtUtils::MM_Unix
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Overridden methods
-
-os_flavor
-
-=back
-
-=back
-
-B<replace_manpage_separator>
-
-=over 4
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 ExtUtils::MM_Darwin - special behaviors for OS X
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Overriden Methods
-
-=back
-
-=back
-
-=head2 ExtUtils::MM_Haiku - methods to override UN*X behaviour in
-ExtUtils::MakeMaker
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-os_flavor
-
-init_linker
-
-=head2 ExtUtils::MM_MacOS - once produced Makefiles for MacOS Classic
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=head2 ExtUtils::MM_NW5 - methods to override UN*X behaviour in
-ExtUtils::MakeMaker
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-os_flavor
-
-init_platform, platform_constants
-
-const_cccmd
-
-static_lib
-
-dynamic_lib
-
-=head2 ExtUtils::MM_OS2 - methods to override UN*X behaviour in
-ExtUtils::MakeMaker
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-init_dist
-
-=back
-
-init_linker
-
-os_flavor
-
-=head2 ExtUtils::MM_QNX - QNX specific subclass of ExtUtils::MM_Unix
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Overridden methods
-
-=back
-
-=back
-
-=over 4
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 ExtUtils::MM_UWIN - U/WIN specific subclass of ExtUtils::MM_Unix
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Overridden methods
-
-os_flavor
-
-=back
-
-=back
-
-B<replace_manpage_separator>
-
-=over 4
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 ExtUtils::MM_Unix - methods used by ExtUtils::MakeMaker
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=back
-
-=over 4
-
-=item Methods
-
-os_flavor
-
-=back
-
-c_o (o)
-
-cflags (o)
-
-const_cccmd (o)
-
-const_config (o)
-
-const_loadlibs (o)
-
-constants (o)
-
-depend (o)
-
-init_DEST
-
-init_dist
-
-dist (o)
-
-dist_basics (o)
-
-dist_ci (o)
-
-dist_core (o)
-
-B<dist_target>
-
-B<tardist_target>
-
-B<zipdist_target>
-
-B<tarfile_target>
-
-zipfile_target
-
-uutardist_target
-
-shdist_target
-
-dlsyms (o)
-
-dynamic_bs (o)
-
-dynamic_lib (o)
-
-exescan
-
-extliblist
-
-find_perl
-
-fixin
-
-force (o)
-
-guess_name
-
-has_link_code
-
-init_dirscan
-
-init_MANPODS
-
-init_MAN1PODS
-
-init_MAN3PODS
-
-init_PM
-
-init_DIRFILESEP
-
-init_main
-
-init_others
-
-init_linker
-
-init_lib2arch
-
-init_PERL
-
-init_platform, platform_constants
-
-init_PERM
-
-init_xs
-
-install (o)
-
-installbin (o)
-
-linkext (o)
-
-lsdir
-
-macro (o)
-
-makeaperl (o)
-
-makefile (o)
-
-maybe_command
-
-needs_linking (o)
-
-parse_abstract
-
-parse_version
-
-pasthru (o)
-
-perl_script
-
-perldepend (o)
-
-perm_rw (o)
-
-perm_rwx (o)
-
-pm_to_blib
-
-post_constants (o)
-
-post_initialize (o)
-
-postamble (o)
-
-ppd
-
-prefixify
-
-processPL (o)
-
-quote_paren
-
-replace_manpage_separator
-
-cd
-
-oneliner
-
-quote_literal
-
-escape_newlines
-
-max_exec_len
-
-static (o)
-
-static_lib (o)
-
-staticmake (o)
-
-subdir_x (o)
-
-subdirs (o)
-
-test (o)
-
-test_via_harness (override)
-
-test_via_script (override)
-
-tools_other (o)
-
-tool_xsubpp (o)
-
-all_target
-
-top_targets (o)
-
-writedoc
-
-xs_c (o)
-
-xs_cpp (o)
-
-xs_o (o)
-
-=over 4
-
-=item SEE ALSO
-
-=back
-
-=head2 ExtUtils::MM_VMS - methods to override UN*X behaviour in
-ExtUtils::MakeMaker
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Methods always loaded
-
-wraplist
-
-=back
-
-=back
-
-=over 4
-
-=item Methods
-
-guess_name (override)
-
-=back
-
-find_perl (override)
-
-maybe_command (override)
-
-pasthru (override)
-
-pm_to_blib (override)
-
-perl_script (override)
-
-replace_manpage_separator
-
-init_DEST
-
-init_DIRFILESEP
-
-init_main (override)
-
-init_others (override)
-
-init_platform (override)
-
-platform_constants
-
-init_VERSION (override)
-
-constants (override)
-
-special_targets
-
-cflags (override)
-
-const_cccmd (override)
-
-tools_other (override)
-
-init_dist (override)
-
-c_o (override)
-
-xs_c (override)
-
-xs_o (override)
-
-dlsyms (override)
-
-dynamic_lib (override)
-
-static_lib (override)
-
-extra_clean_files
-
-zipfile_target, tarfile_target, shdist_target
-
-install (override)
-
-perldepend (override)
-
-makeaperl (override)
-
-maketext_filter (override)
-
-prefixify (override)
-
-cd
-
-oneliner
-
-B<echo>
-
-quote_literal
-
-escape_newlines
-
-max_exec_len
-
-init_linker
-
-eliminate_macros
-
-fixpath
-
-os_flavor
-
-=over 4
-
-=item AUTHOR
-
-=back
-
-=head2 ExtUtils::MM_VOS - VOS specific subclass of ExtUtils::MM_Unix
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Overridden methods
-
-=back
-
-=back
-
-=over 4
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 ExtUtils::MM_Win32 - methods to override UN*X behaviour in
-ExtUtils::MakeMaker
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=over 4
-
-=item Overridden methods
-
-B<dlsyms>
-
-=back
-
-replace_manpage_separator
-
-B<maybe_command>
-
-B<init_DIRFILESEP>
-
-B<init_others>
-
-init_platform, platform_constants
-
-special_targets
-
-static_lib
-
-dynamic_lib
-
-extra_clean_files
-
-init_linker
-
-perl_script
-
-xs_o
-
-pasthru
-
-oneliner
-
-cd
-
-max_exec_len
-
-os_flavor
-
-cflags
-
-=head2 ExtUtils::MM_Win95 - method to customize MakeMaker for Win9X
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Overridden methods
-
-xs_c
-
-=back
-
-=back
-
-xs_cpp
-
-xs_o
-
-max_exec_len
-
-os_flavor
-
-=over 4
-
-=item AUTHOR
-
-=back
-
-=head2 ExtUtils::MY - ExtUtils::MakeMaker subclass for customization
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=head2 ExtUtils::MakeMaker - Create a module Makefile
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item How To Write A Makefile.PL
-
-=item Default Makefile Behaviour
-
-=item make test
-
-=item make testdb
-
-=item make install
-
-=item INSTALL_BASE
-
-=item PREFIX and LIB attribute
-
-=item AFS users
-
-=item Static Linking of a new Perl Binary
-
-=item Determination of Perl Library and Installation Locations
-
-=item Which architecture dependent directory?
-
-=item Using Attributes and Parameters
-
-ABSTRACT, ABSTRACT_FROM, AUTHOR, BINARY_LOCATION, C, CCFLAGS, CONFIG,
-CONFIGURE, DEFINE, DESTDIR, DIR, DISTNAME, DISTVNAME, DL_FUNCS, DL_VARS,
-EXCLUDE_EXT, EXE_FILES, FIRST_MAKEFILE, FULLPERL, FULLPERLRUN,
-FULLPERLRUNINST, FUNCLIST, H, IMPORTS, INC, INCLUDE_EXT, INSTALLARCHLIB,
-INSTALLBIN, INSTALLDIRS, INSTALLMAN1DIR, INSTALLMAN3DIR, INSTALLPRIVLIB,
-INSTALLSCRIPT, INSTALLSITEARCH, INSTALLSITEBIN, INSTALLSITELIB,
-INSTALLSITEMAN1DIR, INSTALLSITEMAN3DIR, INSTALLSITESCRIPT,
-INSTALLVENDORARCH, INSTALLVENDORBIN, INSTALLVENDORLIB,
-INSTALLVENDORMAN1DIR, INSTALLVENDORMAN3DIR, INSTALLVENDORSCRIPT,
-INST_ARCHLIB, INST_BIN, INST_LIB, INST_MAN1DIR, INST_MAN3DIR, INST_SCRIPT,
-LD, LDDLFLAGS, LDFROM, LIB, LIBPERL_A, LIBS, LICENSE, LINKTYPE, MAKE,
-MAKEAPERL, MAKEFILE_OLD, MAN1PODS, MAN3PODS, MAP_TARGET, META_ADD,
-META_MERGE, MIN_PERL_VERSION, MYEXTLIB, NAME, NEEDS_LINKING, NOECHO,
-NORECURS, NO_META, NO_VC, OBJECT, OPTIMIZE, PERL, PERL_CORE, PERLMAINCC,
-PERL_ARCHLIB, PERL_LIB, PERL_MALLOC_OK, PERLPREFIX, PERLRUN, PERLRUNINST,
-PERL_SRC, PERM_RW, PERM_RWX, PL_FILES, PM, PMLIBDIRS, PM_FILTER, POLLUTE,
-PPM_INSTALL_EXEC, PPM_INSTALL_SCRIPT, PREFIX, PREREQ_FATAL, PREREQ_PM,
-PREREQ_PRINT, PRINT_PREREQ, SITEPREFIX, SIGN, SKIP, TYPEMAPS, VENDORPREFIX,
-VERBINST, VERSION, VERSION_FROM, VERSION_SYM, XS, XSOPT, XSPROTOARG,
-XS_VERSION
-
-=item Additional lowercase attributes
-
-clean, depend, dist, dynamic_lib, linkext, macro, postamble, realclean,
-test, tool_autosplit
-
-=item Overriding MakeMaker Methods
-
-=item The End Of Cargo Cult Programming
-
-C<< MAN3PODS => ' ' >>
-
-=item Hintsfile support
-
-=item Distribution Support
-
- make distcheck, make skipcheck, make distclean, make manifest,
- make distdir, make disttest, make tardist, make dist, make
-uutardist, make shdist, make zipdist, make ci
-
-=item Module Meta-Data
-
-=item Disabling an extension
-
-=item Other Handy Functions
-
-prompt
-
-=back
-
-=item ENVIRONMENT
-
-PERL_MM_OPT, PERL_MM_USE_DEFAULT, PERL_CORE
-
-=item SEE ALSO
-
-=item AUTHORS
-
-=item LICENSE
-
-=back
-
-=head2 ExtUtils::MakeMaker::Config - Wrapper around Config.pm
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=head2 ExtUtils::MakeMaker::FAQ - Frequently Asked Questions About
-MakeMaker
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Module Installation
-
-How do I install a module into my home directory?, How do I get MakeMaker
-and Module::Build to install to the same place?, How do I keep from
-installing man pages?, How do I use a module without installing it?, PREFIX
-vs INSTALL_BASE from Module::Build::Cookbook
-
-=item Philosophy and History
-
-Why not just use <insert other build config tool here>?, What is
-Module::Build and how does it relate to MakeMaker?, pure perl. no make, no
-shell commands, easier to customize, cleaner internals, less cruft
-
-=item Module Writing
-
-How do I keep my $VERSION up to date without resetting it manually?, What's
-this F<META.yml> thing and how did it get in my F<MANIFEST>?!, How do I
-delete everything not in my F<MANIFEST>?
-
-=item XS
-
-How to I prevent "object version X.XX does not match bootstrap parameter
-Y.YY" errors?, How do I make two or more XS files coexist in the same
-directory?
-
-=back
-
-=item PATCHING
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 ExtUtils::MakeMaker::Tutorial - Writing a module with MakeMaker
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item The Mantra
-
-=item The Layout
-
-Makefile.PL, MANIFEST, lib/, t/, Changes, README, INSTALL, MANIFEST.SKIP,
-bin/
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 ExtUtils::MakeMaker::bytes - Version-agnostic bytes.pm
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=head2 ExtUtils::MakeMaker::vmsish - Platform-agnostic vmsish.pm
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=head2 ExtUtils::Manifest - utilities to write and check a MANIFEST file
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Functions
-
-mkmanifest
-
-=back
-
-=back
-
-manifind
-
-manicheck
-
-filecheck
-
-fullcheck
-
-skipcheck
-
-maniread
-
-maniskip
-
-manicopy
-
-maniadd
-
-=over 4
-
-=item MANIFEST
-
-=item MANIFEST.SKIP
-
-#!include_default, #!include /Path/to/another/manifest.skip
-
-=item EXPORT_OK
-
-=item GLOBAL VARIABLES
-
-=back
-
-=over 4
-
-=item DIAGNOSTICS
-
-C<Not in MANIFEST:> I<file>, C<Skipping> I<file>, C<No such file:> I<file>,
-C<MANIFEST:> I<$!>, C<Added to MANIFEST:> I<file>
-
-=item ENVIRONMENT
-
-B<PERL_MM_MANIFEST_DEBUG>
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=back
-
-=head2 ExtUtils::Miniperl, writemain - write the C code for perlmain.c
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=back
-
-=head2 ExtUtils::Mkbootstrap - make a bootstrap file for use by DynaLoader
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=head2 ExtUtils::Mksymlists - write linker options files for dynamic
-extension
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-DLBASE, DL_FUNCS, DL_VARS, FILE, FUNCLIST, IMPORTS, NAME
-
-=item AUTHOR
-
-=item REVISION
-
-mkfh()
-
-=back
-
-__find_relocations
-
-=head2 ExtUtils::Packlist - manage .packlist files
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item USAGE
-
-=item FUNCTIONS
-
-new(), read(), write(), validate(), packlist_file()
-
-=item EXAMPLE
-
-=item AUTHOR
-
-=back
-
-=head2 ExtUtils::ParseXS - converts Perl XS code into C code
-
-=over 4
-
-=item SYNOPSIS
-
-=item EXPORT
-
-=item FUNCTIONS
-
-process_xs(), B<C++>, B<hiertype>, B<except>, B<typemap>, B<prototypes>,
-B<versioncheck>, B<linenumbers>, B<optimize>, B<inout>, B<argtypes>, B<s>,
-errors()
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=head2 ExtUtils::testlib - add blib/* directories to @INC
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=head2 Fatal - Replace functions with equivalents which succeed or die
-
-=over 4
-
-=item SYNOPSIS
-
-=item BEST PRACTICE
-
-=item DESCRIPTION
-
-=item DIAGNOSTICS
-
-Bad subroutine name for Fatal: %s, %s is not a Perl subroutine, %s is
-neither a builtin, nor a Perl subroutine, Cannot make the non-overridable
-%s fatal, Internal error: %s
-
-=item BUGS
-
-=item AUTHOR
-
-=item LICENSE
-
-=item SEE ALSO
-
-=back
-
-=head2 Fcntl - load the C Fcntl.h defines
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item NOTE
-
-=item EXPORTED SYMBOLS
-
-=back
-
-=head2 File::Basename - Parse file paths into directory, filename and
-suffix.
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-C<fileparse> X<fileparse>
-
-C<basename> X<basename> X<filename>
-
-C<dirname> X<dirname>
-
-C<fileparse_set_fstype> X<filesystem>
-
-=over 4
-
-=item SEE ALSO
-
-=back
-
-=head2 File::CheckTree - run many filetest checks on a tree
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item AUTHOR
-
-=item HISTORY
-
-=back
-
-=head2 File::Compare - Compare files or filehandles
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item RETURN
-
-=item AUTHOR
-
-=back
-
-=head2 File::Copy - Copy files or filehandles
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-copy X<copy> X<cp>, move X<move> X<mv> X<rename>, syscopy X<syscopy>,
-rmscopy($from,$to[,$date_flag]) X<rmscopy>
-
-=item RETURN
-
-=item NOTES
-
-=item AUTHOR
-
-=back
-
-=head2 File::DosGlob - DOS like globbing and then some
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item NOTES
-
-=item EXPORTS (by request only)
-
-=item BUGS
-
-=item AUTHOR
-
-=item HISTORY
-
-=item SEE ALSO
-
-=back
-
-=head2 File::Fetch - A generic file fetching mechanism
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item ACCESSORS
-
-$ff->uri, $ff->scheme, $ff->host, $ff->vol, $ff->share, $ff->path,
-$ff->file
-
-=back
-
-$ff->output_file
-
-=over 4
-
-=item METHODS
-
-=over 4
-
-=item $ff = File::Fetch->new( uri => 'http://some.where.com/dir/file.txt'
-);
-
-=back
-
-=back
-
-=over 4
-
-=item $ff->fetch( [to => /my/output/dir/] )
-
-=back
-
-=over 4
-
-=item $ff->error([BOOL])
-
-=back
-
-=over 4
-
-=item HOW IT WORKS
-
-=item GLOBAL VARIABLES
-
-=over 4
-
-=item $File::Fetch::FROM_EMAIL
-
-=item $File::Fetch::USER_AGENT
-
-=item $File::Fetch::FTP_PASSIVE
-
-=item $File::Fetch::TIMEOUT
-
-=item $File::Fetch::WARN
-
-=item $File::Fetch::DEBUG
-
-=item $File::Fetch::BLACKLIST
-
-=item $File::Fetch::METHOD_FAIL
-
-=back
-
-=item MAPPING
-
-=item FREQUENTLY ASKED QUESTIONS
-
-=over 4
-
-=item So how do I use a proxy with File::Fetch?
-
-=item I used 'lynx' to fetch a file, but its contents is all wrong!
-
-=item Files I'm trying to fetch have reserved characters or non-ASCII
-characters in them. What do I do?
-
-=back
-
-=item TODO
-
-Implement $PREFER_BIN
-
-=item BUG REPORTS
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 File::Find - Traverse a directory tree.
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-B<find>, B<finddepth>
-
-=over 4
-
-=item %options
-
-C<wanted>, C<bydepth>, C<preprocess>, C<postprocess>, C<follow>,
-C<follow_fast>, C<follow_skip>, C<dangling_symlinks>, C<no_chdir>,
-C<untaint>, C<untaint_pattern>, C<untaint_skip>
-
-=item The wanted function
-
-C<$File::Find::dir> is the current directory name,, C<$_> is the current
-filename within that directory, C<$File::Find::name> is the complete
-pathname to the file
-
-=back
-
-=item WARNINGS
-
-=item CAVEAT
-
-$dont_use_nlink, symlinks
-
-=item NOTES
-
-=item BUGS AND CAVEATS
-
-=item HISTORY
-
-=back
-
-=head2 File::Glob - Perl extension for BSD glob routine
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item META CHARACTERS
-
-=item POSIX FLAGS
-
-C<GLOB_ERR>, C<GLOB_LIMIT>, C<GLOB_MARK>, C<GLOB_NOCASE>, C<GLOB_NOCHECK>,
-C<GLOB_NOSORT>, C<GLOB_BRACE>, C<GLOB_NOMAGIC>, C<GLOB_QUOTE>,
-C<GLOB_TILDE>, C<GLOB_CSH>, C<GLOB_ALPHASORT>
-
-=back
-
-=item DIAGNOSTICS
-
-C<GLOB_NOSPACE>, C<GLOB_ABEND>
-
-=item NOTES
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=back
-
-=head2 File::GlobMapper - Extend File Glob to Allow Input and Output Files
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Behind The Scenes
-
-=item Limitations
-
-=item Input File Glob
-
-B<~>, B<~user>, B<.>, B<*>, B<?>, B<\>, B<[]>, B<{,}>, B<()>
-
-=item Output File Glob
-
-"*", #1
-
-=item Returned Data
-
-=back
-
-=item EXAMPLES
-
-=over 4
-
-=item A Rename script
-
-=item A few example globmaps
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 File::Path - Create or remove directory trees
-
-=over 4
-
-=item VERSION
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-make_path( $dir1, $dir2, .... ), make_path( $dir1, $dir2, ...., \%opts ),
-mode => $num, verbose => $bool, error => \$err, mkpath( $dir ), mkpath(
-$dir, $verbose, $mode ), mkpath( [$dir1, $dir2,...], $verbose, $mode ),
-mkpath( $dir1, $dir2,..., \%opt ), remove_tree( $dir1, $dir2, .... ),
-remove_tree( $dir1, $dir2, ...., \%opts ), verbose => $bool, safe => $bool,
-keep_root => $bool, result => \$res, error => \$err, rmtree( $dir ),
-rmtree( $dir, $verbose, $safe ), rmtree( [$dir1, $dir2,...], $verbose,
-$safe ), rmtree( $dir1, $dir2,..., \%opt )
-
-=over 4
-
-=item ERROR HANDLING
-
-B<NOTE:>
-
-=item NOTES
-
-=back
-
-=item DIAGNOSTICS
-
-mkdir [path]: [errmsg] (SEVERE), No root path(s) specified, No such file or
-directory, cannot fetch initial working directory: [errmsg], cannot stat
-initial working directory: [errmsg], cannot chdir to [dir]: [errmsg],
-directory [dir] changed before chdir, expected dev=[n] ino=[n], actual
-dev=[n] ino=[n], aborting. (FATAL), cannot make directory [dir]
-read+writeable: [errmsg], cannot read [dir]: [errmsg], cannot reset chmod
-[dir]: [errmsg], cannot remove [dir] when cwd is [dir], cannot chdir to
-[parent-dir] from [child-dir]: [errmsg], aborting. (FATAL), cannot stat
-prior working directory [dir]: [errmsg], aborting. (FATAL), previous
-directory [parent-dir] changed before entering [child-dir], expected
-dev=[n] ino=[n], actual dev=[n] ino=[n], aborting. (FATAL), cannot make
-directory [dir] writeable: [errmsg], cannot remove directory [dir]:
-[errmsg], cannot restore permissions of [dir] to [0nnn]: [errmsg], cannot
-make file [file] writeable: [errmsg], cannot unlink file [file]: [errmsg],
-cannot restore permissions of [file] to [0nnn]: [errmsg]
-
-=item SEE ALSO
-
-=item BUGS
-
-=item ACKNOWLEDGEMENTS
-
-=item AUTHORS
-
-=item COPYRIGHT
-
-=item LICENSE
-
-=back
-
-=head2 File::Spec - portably perform operations on file names
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-canonpath X<canonpath>, catdir X<catdir>, catfile X<catfile>, curdir
-X<curdir>, devnull X<devnull>, rootdir X<rootdir>, tmpdir X<tmpdir>, updir
-X<updir>, no_upwards, case_tolerant, file_name_is_absolute, path X<path>,
-join X<join, path>, splitpath X<splitpath> X<split, path>, splitdir
-X<splitdir> X<split, dir>, catpath(), abs2rel X<abs2rel> X<absolute, path>
-X<relative, path>, rel2abs() X<rel2abs> X<absolute, path> X<relative, path>
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 File::Spec::Cygwin - methods for Cygwin file specs
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-canonpath
-
-file_name_is_absolute
-
-tmpdir (override)
-
-case_tolerant
-
-=over 4
-
-=item COPYRIGHT
-
-=back
-
-=head2 File::Spec::Epoc - methods for Epoc file specs
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-canonpath()
-
-=over 4
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=head2 File::Spec::Functions - portably perform operations on file names
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Exports
-
-=back
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=head2 File::Spec::Mac - File::Spec for Mac OS (Classic)
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-canonpath
-
-=back
-
-catdir()
-
-catfile
-
-curdir
-
-devnull
-
-rootdir
-
-tmpdir
-
-updir
-
-file_name_is_absolute
-
-path
-
-splitpath
-
-splitdir
-
-catpath
-
-abs2rel
-
-rel2abs
-
-=over 4
-
-=item AUTHORS
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=head2 File::Spec::OS2 - methods for OS/2 file specs
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-tmpdir, splitpath
-
-=item COPYRIGHT
-
-=back
-
-=head2 File::Spec::Unix - File::Spec for Unix, base for other File::Spec
-modules
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-canonpath()
-
-=back
-
-catdir()
-
-catfile
-
-curdir
-
-devnull
-
-rootdir
-
-tmpdir
-
-updir
-
-no_upwards
-
-case_tolerant
-
-file_name_is_absolute
-
-path
-
-join
-
-splitpath
-
-splitdir
-
-catpath()
-
-abs2rel
-
-rel2abs()
-
-=over 4
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=head2 File::Spec::VMS - methods for VMS file specs
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-canonpath (override)
-
-=back
-
-catdir (override)
-
-catfile (override)
-
-curdir (override)
-
-devnull (override)
-
-rootdir (override)
-
-tmpdir (override)
-
-updir (override)
-
-case_tolerant (override)
-
-path (override)
-
-file_name_is_absolute (override)
-
-splitpath (override)
-
-splitdir (override)
-
-catpath (override)
-
-abs2rel (override)
-
-rel2abs (override)
-
-=over 4
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=head2 File::Spec::Win32 - methods for Win32 file specs
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-devnull
-
-=back
-
-tmpdir
-
-case_tolerant
-
-file_name_is_absolute
-
-catfile
-
-canonpath
-
-splitpath
-
-splitdir
-
-catpath
-
-=over 4
-
-=item Note For File::Spec::Win32 Maintainers
-
-=back
-
-=over 4
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=head2 File::Temp - return name and handle of a temporary file safely
-
-=over 4
-
-=item PORTABILITY
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=over 4
-
-=item OBJECT-ORIENTED INTERFACE
-
-B<new>
-
-=back
-
-B<newdir>
-
-B<filename>
-
-B<dirname>, B<unlink_on_destroy>
-
-B<DESTROY>
-
-=over 4
-
-=item FUNCTIONS
-
-B<tempfile>
-
-=back
-
-B<tempdir>
-
-=over 4
-
-=item MKTEMP FUNCTIONS
-
-B<mkstemp>
-
-=back
-
-B<mkstemps>
-
-B<mkdtemp>
-
-B<mktemp>
-
-=over 4
-
-=item POSIX FUNCTIONS
-
-B<tmpnam>
-
-=back
-
-B<tmpfile>
-
-=over 4
-
-=item ADDITIONAL FUNCTIONS
-
-B<tempnam>
-
-=back
-
-=over 4
-
-=item UTILITY FUNCTIONS
-
-B<unlink0>
-
-=back
-
-B<cmpstat>
-
-B<unlink1>
-
-B<cleanup>
-
-=over 4
-
-=item PACKAGE VARIABLES
-
-B<safe_level>, STANDARD, MEDIUM, HIGH
-
-=back
-
-TopSystemUID
-
-B<$KEEP_ALL>, B<$DEBUG>
-
-=over 4
-
-=item WARNING
-
-=over 4
-
-=item Temporary files and NFS
-
-=item Forking
-
-=item Directory removal
-
-=item BINMODE
-
-=back
-
-=item HISTORY
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=back
-
-=head2 File::stat - by-name interface to Perl's built-in stat() functions
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item BUGS
-
-=item NOTE
-
-=item AUTHOR
-
-=back
-
-=head2 FileCache - keep more files open than the system permits
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-cacheout EXPR, cacheout MODE, EXPR
-
-=item CAVEATS
-
-=item BUGS
-
-=back
-
-=head2 FileHandle - supply object methods for filehandles
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-$fh->print, $fh->printf, $fh->getline, $fh->getlines
-
-=item SEE ALSO
-
-=back
-
-=head2 Filter::Simple - Simplified source filtering
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item The Problem
-
-=item A Solution
-
-=item Disabling or changing <no> behaviour
-
-=item All-in-one interface
-
-=item Filtering only specific components of source code
-
-C<"code">, C<"code_no_comments">, C<"executable">,
-C<"executable_no_comments">, C<"quotelike">, C<"string">, C<"regex">,
-C<"all">
-
-=item Filtering only the code parts of source code
-
-Most source code ceases to be grammatically correct when it is broken up
-into the pieces between string literals and regexes. So the C<'code'>
-and C<'code_no_comments'> component filter behave slightly differently
-from the other partial filters described in the previous section.
-
-=item Using Filter::Simple with an explicit C<import> subroutine
-
-=item Using Filter::Simple and Exporter together
-
-=item How it works
-
-=back
-
-=item AUTHOR
-
-=item CONTACT
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 Filter::Util::Call - Perl Source Filter Utility Module
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item B<use Filter::Util::Call>
-
-=item B<import()>
-
-=item B<filter() and anonymous sub>
-
-B<$_>, B<$status>, B<filter_read> and B<filter_read_exact>, B<filter_del>
-
-=back
-
-=item EXAMPLES
-
-=over 4
-
-=item Example 1: A simple filter.
-
-=item Example 2: Using the context
-
-=item Example 3: Using the context within the filter
-
-=item Example 4: Using filter_del
-
-=back
-
-=item Filter::Simple
-
-=item AUTHOR
-
-=item DATE
-
-=back
-
-=head2 FindBin - Locate directory of original perl script
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item EXPORTABLE VARIABLES
-
-=item KNOWN ISSUES
-
-=item KNOWN BUGS
-
-=item AUTHORS
-
-=item COPYRIGHT
-
-=back
-
-=head2 GDBM_File - Perl5 access to the gdbm library.
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item AVAILABILITY
-
-=item BUGS
-
-=item SEE ALSO
-
-=back
-
-=head2 Getopt::Long - Extended processing of command line options
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Command Line Options, an Introduction
-
-=item Getting Started with Getopt::Long
-
-=over 4
-
-=item Simple options
-
-=item A little bit less simple options
-
-=item Mixing command line option with other arguments
-
-=item Options with values
-
-=item Options with multiple values
-
-=item Options with hash values
-
-=item User-defined subroutines to handle options
-
-=item Options with multiple names
-
-=item Case and abbreviations
-
-=item Summary of Option Specifications
-
-!, +, s, i, o, f, : I<type> [ I<desttype> ], : I<number> [ I<desttype> ], :
-+ [ I<desttype> ]
-
-=back
-
-=item Advanced Possibilities
-
-=over 4
-
-=item Object oriented interface
-
-=item Thread Safety
-
-=item Documentation and help texts
-
-=item Parsing options from an arbitrary array
-
-=item Parsing options from an arbitrary string
-
-=item Storing options values in a hash
-
-=item Bundling
-
-=item The lonesome dash
-
-=item Argument callback
-
-=back
-
-=item Configuring Getopt::Long
-
-default, posix_default, auto_abbrev, getopt_compat, gnu_compat, gnu_getopt,
-require_order, permute, bundling (default: disabled), bundling_override
-(default: disabled), ignore_case (default: enabled), ignore_case_always
-(default: disabled), auto_version (default:disabled), auto_help
-(default:disabled), pass_through (default: disabled), prefix,
-prefix_pattern, long_prefix_pattern, debug (default: disabled)
-
-=item Exportable Methods
-
-VersionMessage, C<-message>, C<-msg>, C<-exitval>, C<-output>, HelpMessage
-
-=item Return values and Errors
-
-=item Legacy
-
-=over 4
-
-=item Default destinations
-
-=item Alternative option starters
-
-=item Configuration variables
-
-=back
-
-=item Tips and Techniques
-
-=over 4
-
-=item Pushing multiple values in a hash option
-
-=back
-
-=item Trouble Shooting
-
-=over 4
-
-=item GetOptions does not return a false result when an option is not
-supplied
-
-=item GetOptions does not split the command line correctly
-
-=item Undefined subroutine &main::GetOptions called
-
-=item How do I put a "-?" option into a Getopt::Long?
-
-=back
-
-=item AUTHOR
-
-=item COPYRIGHT AND DISCLAIMER
-
-=back
-
-=head2 Getopt::Std, getopt, getopts - Process single-character switches
-with switch clustering
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item C<--help> and C<--version>
-
-=back
-
-=head2 Hash::Util - A selection of general-utility hash subroutines
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Restricted hashes
-
-B<lock_keys>, B<unlock_keys>
-
-=back
-
-=back
-
-B<lock_keys_plus>
-
-B<lock_value>, B<unlock_value>
-
-B<lock_hash>, B<unlock_hash>
-
-B<lock_hash_recurse>, B<unlock_hash_recurse>
-
-B<hash_unlocked>
-
-B<legal_keys>, B<hidden_keys>, B<all_keys>, B<hash_seed>
-
-B<hv_store>
-
-=over 4
-
-=item Operating on references to hashes.
-
-lock_ref_keys, unlock_ref_keys, lock_ref_keys_plus, lock_ref_value,
-unlock_ref_value, lock_hashref, unlock_hashref, lock_hashref_recurse,
-unlock_hashref_recurse, hash_ref_unlocked, legal_ref_keys, hidden_ref_keys
-
-=back
-
-=over 4
-
-=item CAVEATS
-
-=item BUGS
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 Hash::Util::FieldHash - Support for Inside-Out Classes
-
-=over 4
-
-=item SYNOPSIS
-
-=item FUNCTIONS
-
-id, id_2obj, register, idhash, idhashes, fieldhash, fieldhashes
-
-=item DESCRIPTION
-
-=over 4
-
-=item The Inside-out Technique
-
-=item Problems of Inside-out
-
-=item Solutions
-
-=item More Problems
-
-=item The Generic Object
-
-=item How to use Field Hashes
-
-=item Garbage-Collected Hashes
-
-=back
-
-=item EXAMPLES
-
-C<init()>, C<first()>, C<last()>, C<name()>, C<Name_hash>, C<Name_id>,
-C<Name_idhash>, C<Name_id_reg>, C<Name_idhash_reg>, C<Name_fieldhash>
-
-=over 4
-
-=item Example 1
-
-=item Example 2
-
-=back
-
-=item GUTS
-
-=over 4
-
-=item The C<PERL_MAGIC_uvar> interface for hashes
-
-=item Weakrefs call uvar magic
-
-=item How field hashes work
-
-=item Internal function Hash::Util::FieldHash::_fieldhash
-
-=back
-
-=item AUTHOR
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 Hash::Util::FieldHash::lib::Hash::Util::FieldHash,
-Hash::Util::FieldHash - Support for Inside-Out Classes
-
-=over 4
-
-=item SYNOPSIS
-
-=item FUNCTIONS
-
-id, id_2obj, register, idhash, idhashes, fieldhash, fieldhashes
-
-=item DESCRIPTION
-
-=over 4
-
-=item The Inside-out Technique
-
-=item Problems of Inside-out
-
-=item Solutions
-
-=item More Problems
-
-=item The Generic Object
-
-=item How to use Field Hashes
-
-=item Garbage-Collected Hashes
-
-=back
-
-=item EXAMPLES
-
-C<init()>, C<first()>, C<last()>, C<name()>, C<Name_hash>, C<Name_id>,
-C<Name_idhash>, C<Name_id_reg>, C<Name_idhash_reg>, C<Name_fieldhash>
-
-=over 4
-
-=item Example 1
-
-=item Example 2
-
-=back
-
-=item GUTS
-
-=over 4
-
-=item The C<PERL_MAGIC_uvar> interface for hashes
-
-=item Weakrefs call uvar magic
-
-=item How field hashes work
-
-=item Internal function Hash::Util::FieldHash::_fieldhash
-
-=back
-
-=item AUTHOR
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 Hash::Utilib::Hash::Util, Hash::Util - A selection of
-general-utility hash subroutines
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Restricted hashes
-
-B<lock_keys>, B<unlock_keys>
-
-=back
-
-=back
-
-B<lock_keys_plus>
-
-B<lock_value>, B<unlock_value>
-
-B<lock_hash>, B<unlock_hash>
-
-B<lock_hash_recurse>, B<unlock_hash_recurse>
-
-B<hash_unlocked>
-
-B<legal_keys>, B<hidden_keys>, B<all_keys>, B<hash_seed>
-
-B<hv_store>
-
-=over 4
-
-=item Operating on references to hashes.
-
-lock_ref_keys, unlock_ref_keys, lock_ref_keys_plus, lock_ref_value,
-unlock_ref_value, lock_hashref, unlock_hashref, lock_hashref_recurse,
-unlock_hashref_recurse, hash_ref_unlocked, legal_ref_keys, hidden_ref_keys
-
-=back
-
-=over 4
-
-=item CAVEATS
-
-=item BUGS
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 I18N::Collate - compare 8-bit scalar data according to the current
-locale
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=head2 I18N::LangTags - functions for dealing with RFC3066-style language
-tags
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-the function is_language_tag($lang1)
-
-the function extract_language_tags($whatever)
-
-the function same_language_tag($lang1, $lang2)
-
-the function similarity_language_tag($lang1, $lang2)
-
-the function is_dialect_of($lang1, $lang2)
-
-the function super_languages($lang1)
-
-the function locale2language_tag($locale_identifier)
-
-the function encode_language_tag($lang1)
-
-the function alternate_language_tags($lang1)
-
-the function @langs = panic_languages(@accept_languages)
-
-the function implicate_supers( ...languages... ), the function
-implicate_supers_strictly( ...languages... )
-
-=over 4
-
-=item ABOUT LOWERCASING
-
-=item ABOUT UNICODE PLAINTEXT LANGUAGE TAGS
-
-=item SEE ALSO
-
-=item COPYRIGHT
-
-=item AUTHOR
-
-=back
-
-=head2 I18N::LangTags::Detect - detect the user's language preferences
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item FUNCTIONS
-
-=item ENVIRONMENT
-
-=item SEE ALSO
-
-=item COPYRIGHT
-
-=item AUTHOR
-
-=back
-
-=head2 I18N::LangTags::List -- tags and names for human languages
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item ABOUT LANGUAGE TAGS
-
-=item LIST OF LANGUAGES
-
-{ab} : Abkhazian, {ace} : Achinese, {ach} : Acoli, {ada} : Adangme, {ady} :
-Adyghe, {aa} : Afar, {afh} : Afrihili, {af} : Afrikaans, [{afa} :
-Afro-Asiatic (Other)], {ak} : Akan, {akk} : Akkadian, {sq} : Albanian,
-{ale} : Aleut, [{alg} : Algonquian languages], [{tut} : Altaic (Other)],
-{am} : Amharic, {i-ami} : Ami, [{apa} : Apache languages], {ar} : Arabic,
-{arc} : Aramaic, {arp} : Arapaho, {arn} : Araucanian, {arw} : Arawak, {hy}
-: Armenian, {an} : Aragonese, [{art} : Artificial (Other)], {ast} :
-Asturian, {as} : Assamese, [{ath} : Athapascan languages], [{aus} :
-Australian languages], [{map} : Austronesian (Other)], {av} : Avaric, {ae}
-: Avestan, {awa} : Awadhi, {ay} : Aymara, {az} : Azerbaijani, {ban} :
-Balinese, [{bat} : Baltic (Other)], {bal} : Baluchi, {bm} : Bambara, [{bai}
-: Bamileke languages], {bad} : Banda, [{bnt} : Bantu (Other)], {bas} :
-Basa, {ba} : Bashkir, {eu} : Basque, {btk} : Batak (Indonesia), {bej} :
-Beja, {be} : Belarusian, {bem} : Bemba, {bn} : Bengali, [{ber} : Berber
-(Other)], {bho} : Bhojpuri, {bh} : Bihari, {bik} : Bikol, {bin} : Bini,
-{bi} : Bislama, {bs} : Bosnian, {bra} : Braj, {br} : Breton, {bug} :
-Buginese, {bg} : Bulgarian, {i-bnn} : Bunun, {bua} : Buriat, {my} :
-Burmese, {cad} : Caddo, {car} : Carib, {ca} : Catalan, [{cau} : Caucasian
-(Other)], {ceb} : Cebuano, [{cel} : Celtic (Other)], [{cai} : Central
-American Indian (Other)], {chg} : Chagatai, [{cmc} : Chamic languages],
-{ch} : Chamorro, {ce} : Chechen, {chr} : Cherokee, {chy} : Cheyenne, {chb}
-: Chibcha, {ny} : Chichewa, {zh} : Chinese, {chn} : Chinook Jargon, {chp} :
-Chipewyan, {cho} : Choctaw, {cu} : Church Slavic, {chk} : Chuukese, {cv} :
-Chuvash, {cop} : Coptic, {kw} : Cornish, {co} : Corsican, {cr} : Cree,
-{mus} : Creek, [{cpe} : English-based Creoles and pidgins (Other)], [{cpf}
-: French-based Creoles and pidgins (Other)], [{cpp} : Portuguese-based
-Creoles and pidgins (Other)], [{crp} : Creoles and pidgins (Other)], {hr} :
-Croatian, [{cus} : Cushitic (Other)], {cs} : Czech, {dak} : Dakota, {da} :
-Danish, {dar} : Dargwa, {day} : Dayak, {i-default} : Default (Fallthru)
-Language, {del} : Delaware, {din} : Dinka, {dv} : Divehi, {doi} : Dogri,
-{dgr} : Dogrib, [{dra} : Dravidian (Other)], {dua} : Duala, {nl} : Dutch,
-{dum} : Middle Dutch (ca.1050-1350), {dyu} : Dyula, {dz} : Dzongkha, {efi}
-: Efik, {egy} : Ancient Egyptian, {eka} : Ekajuk, {elx} : Elamite, {en} :
-English, {enm} : Old English (1100-1500), {ang} : Old English
-(ca.450-1100), {i-enochian} : Enochian (Artificial), {myv} : Erzya, {eo} :
-Esperanto, {et} : Estonian, {ee} : Ewe, {ewo} : Ewondo, {fan} : Fang, {fat}
-: Fanti, {fo} : Faroese, {fj} : Fijian, {fi} : Finnish, [{fiu} :
-Finno-Ugrian (Other)], {fon} : Fon, {fr} : French, {frm} : Middle French
-(ca.1400-1600), {fro} : Old French (842-ca.1400), {fy} : Frisian, {fur} :
-Friulian, {ff} : Fulah, {gaa} : Ga, {gd} : Scots Gaelic, {gl} : Gallegan,
-{lg} : Ganda, {gay} : Gayo, {gba} : Gbaya, {gez} : Geez, {ka} : Georgian,
-{de} : German, {gmh} : Middle High German (ca.1050-1500), {goh} : Old High
-German (ca.750-1050), [{gem} : Germanic (Other)], {gil} : Gilbertese, {gon}
-: Gondi, {gor} : Gorontalo, {got} : Gothic, {grb} : Grebo, {grc} : Ancient
-Greek, {el} : Modern Greek, {gn} : Guarani, {gu} : Gujarati, {gwi} :
-Gwich'in, {hai} : Haida, {ht} : Haitian, {ha} : Hausa, {haw} : Hawaiian,
-{he} : Hebrew, {hz} : Herero, {hil} : Hiligaynon, {him} : Himachali, {hi} :
-Hindi, {ho} : Hiri Motu, {hit} : Hittite, {hmn} : Hmong, {hu} : Hungarian,
-{hup} : Hupa, {iba} : Iban, {is} : Icelandic, {io} : Ido, {ig} : Igbo,
-{ijo} : Ijo, {ilo} : Iloko, [{inc} : Indic (Other)], [{ine} : Indo-European
-(Other)], {id} : Indonesian, {inh} : Ingush, {ia} : Interlingua
-(International Auxiliary Language Association), {ie} : Interlingue, {iu} :
-Inuktitut, {ik} : Inupiaq, [{ira} : Iranian (Other)], {ga} : Irish, {mga} :
-Middle Irish (900-1200), {sga} : Old Irish (to 900), [{iro} : Iroquoian
-languages], {it} : Italian, {ja} : Japanese, {jv} : Javanese, {jrb} :
-Judeo-Arabic, {jpr} : Judeo-Persian, {kbd} : Kabardian, {kab} : Kabyle,
-{kac} : Kachin, {kl} : Kalaallisut, {xal} : Kalmyk, {kam} : Kamba, {kn} :
-Kannada, {kr} : Kanuri, {krc} : Karachay-Balkar, {kaa} : Kara-Kalpak, {kar}
-: Karen, {ks} : Kashmiri, {csb} : Kashubian, {kaw} : Kawi, {kk} : Kazakh,
-{kha} : Khasi, {km} : Khmer, [{khi} : Khoisan (Other)], {kho} : Khotanese,
-{ki} : Kikuyu, {kmb} : Kimbundu, {rw} : Kinyarwanda, {ky} : Kirghiz,
-{i-klingon} : Klingon, {kv} : Komi, {kg} : Kongo, {kok} : Konkani, {ko} :
-Korean, {kos} : Kosraean, {kpe} : Kpelle, {kro} : Kru, {kj} : Kuanyama,
-{kum} : Kumyk, {ku} : Kurdish, {kru} : Kurukh, {kut} : Kutenai, {lad} :
-Ladino, {lah} : Lahnda, {lam} : Lamba, {lo} : Lao, {la} : Latin, {lv} :
-Latvian, {lb} : Letzeburgesch, {lez} : Lezghian, {li} : Limburgish, {ln} :
-Lingala, {lt} : Lithuanian, {nds} : Low German, {art-lojban} : Lojban
-(Artificial), {loz} : Lozi, {lu} : Luba-Katanga, {lua} : Luba-Lulua, {lui}
-: Luiseno, {lun} : Lunda, {luo} : Luo (Kenya and Tanzania), {lus} : Lushai,
-{mk} : Macedonian, {mad} : Madurese, {mag} : Magahi, {mai} : Maithili,
-{mak} : Makasar, {mg} : Malagasy, {ms} : Malay, {ml} : Malayalam, {mt} :
-Maltese, {mnc} : Manchu, {mdr} : Mandar, {man} : Mandingo, {mni} :
-Manipuri, [{mno} : Manobo languages], {gv} : Manx, {mi} : Maori, {mr} :
-Marathi, {chm} : Mari, {mh} : Marshall, {mwr} : Marwari, {mas} : Masai,
-[{myn} : Mayan languages], {men} : Mende, {mic} : Micmac, {min} :
-Minangkabau, {i-mingo} : Mingo, [{mis} : Miscellaneous languages], {moh} :
-Mohawk, {mdf} : Moksha, {mo} : Moldavian, [{mkh} : Mon-Khmer (Other)],
-{lol} : Mongo, {mn} : Mongolian, {mos} : Mossi, [{mul} : Multiple
-languages], [{mun} : Munda languages], {nah} : Nahuatl, {nap} : Neapolitan,
-{na} : Nauru, {nv} : Navajo, {nd} : North Ndebele, {nr} : South Ndebele,
-{ng} : Ndonga, {ne} : Nepali, {new} : Newari, {nia} : Nias, [{nic} :
-Niger-Kordofanian (Other)], [{ssa} : Nilo-Saharan (Other)], {niu} : Niuean,
-{nog} : Nogai, {non} : Old Norse, [{nai} : North American Indian], {no} :
-Norwegian, {nb} : Norwegian Bokmal, {nn} : Norwegian Nynorsk, [{nub} :
-Nubian languages], {nym} : Nyamwezi, {nyn} : Nyankole, {nyo} : Nyoro, {nzi}
-: Nzima, {oc} : Occitan (post 1500), {oj} : Ojibwa, {or} : Oriya, {om} :
-Oromo, {osa} : Osage, {os} : Ossetian; Ossetic, [{oto} : Otomian
-languages], {pal} : Pahlavi, {i-pwn} : Paiwan, {pau} : Palauan, {pi} :
-Pali, {pam} : Pampanga, {pag} : Pangasinan, {pa} : Panjabi, {pap} :
-Papiamento, [{paa} : Papuan (Other)], {fa} : Persian, {peo} : Old Persian
-(ca.600-400 B.C.), [{phi} : Philippine (Other)], {phn} : Phoenician, {pon}
-: Pohnpeian, {pl} : Polish, {pt} : Portuguese, [{pra} : Prakrit languages],
-{pro} : Old Provencal (to 1500), {ps} : Pushto, {qu} : Quechua, {rm} :
-Raeto-Romance, {raj} : Rajasthani, {rap} : Rapanui, {rar} : Rarotongan,
-[{qaa - qtz} : Reserved for local use.], [{roa} : Romance (Other)], {ro} :
-Romanian, {rom} : Romany, {rn} : Rundi, {ru} : Russian, [{sal} : Salishan
-languages], {sam} : Samaritan Aramaic, {se} : Northern Sami, {sma} :
-Southern Sami, {smn} : Inari Sami, {smj} : Lule Sami, {sms} : Skolt Sami,
-[{smi} : Sami languages (Other)], {sm} : Samoan, {sad} : Sandawe, {sg} :
-Sango, {sa} : Sanskrit, {sat} : Santali, {sc} : Sardinian, {sas} : Sasak,
-{sco} : Scots, {sel} : Selkup, [{sem} : Semitic (Other)], {sr} : Serbian,
-{srr} : Serer, {shn} : Shan, {sn} : Shona, {sid} : Sidamo, {sgn-...} : Sign
-Languages, {bla} : Siksika, {sd} : Sindhi, {si} : Sinhalese, [{sit} :
-Sino-Tibetan (Other)], [{sio} : Siouan languages], {den} : Slave
-(Athapascan), [{sla} : Slavic (Other)], {sk} : Slovak, {sl} : Slovenian,
-{sog} : Sogdian, {so} : Somali, {son} : Songhai, {snk} : Soninke, {wen} :
-Sorbian languages, {nso} : Northern Sotho, {st} : Southern Sotho, [{sai} :
-South American Indian (Other)], {es} : Spanish, {suk} : Sukuma, {sux} :
-Sumerian, {su} : Sundanese, {sus} : Susu, {sw} : Swahili, {ss} : Swati,
-{sv} : Swedish, {syr} : Syriac, {tl} : Tagalog, {ty} : Tahitian, [{tai} :
-Tai (Other)], {tg} : Tajik, {tmh} : Tamashek, {ta} : Tamil, {i-tao} : Tao,
-{tt} : Tatar, {i-tay} : Tayal, {te} : Telugu, {ter} : Tereno, {tet} :
-Tetum, {th} : Thai, {bo} : Tibetan, {tig} : Tigre, {ti} : Tigrinya, {tem} :
-Timne, {tiv} : Tiv, {tli} : Tlingit, {tpi} : Tok Pisin, {tkl} : Tokelau,
-{tog} : Tonga (Nyasa), {to} : Tonga (Tonga Islands), {tsi} : Tsimshian,
-{ts} : Tsonga, {i-tsu} : Tsou, {tn} : Tswana, {tum} : Tumbuka, [{tup} :
-Tupi languages], {tr} : Turkish, {ota} : Ottoman Turkish (1500-1928), {crh}
-: Crimean Turkish, {tk} : Turkmen, {tvl} : Tuvalu, {tyv} : Tuvinian, {tw} :
-Twi, {udm} : Udmurt, {uga} : Ugaritic, {ug} : Uighur, {uk} : Ukrainian,
-{umb} : Umbundu, {und} : Undetermined, {ur} : Urdu, {uz} : Uzbek, {vai} :
-Vai, {ve} : Venda, {vi} : Vietnamese, {vo} : Volapuk, {vot} : Votic, [{wak}
-: Wakashan languages], {wa} : Walloon, {wal} : Walamo, {war} : Waray, {was}
-: Washo, {cy} : Welsh, {wo} : Wolof, {x-...} : Unregistered (Semi-Private
-Use), {xh} : Xhosa, {sah} : Yakut, {yao} : Yao, {yap} : Yapese, {ii} :
-Sichuan Yi, {yi} : Yiddish, {yo} : Yoruba, [{ypk} : Yupik languages], {znd}
-: Zande, [{zap} : Zapotec], {zen} : Zenaga, {za} : Zhuang, {zu} : Zulu,
-{zun} : Zuni
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMER
-
-=item AUTHOR
-
-=back
-
-=head2 I18N::Langinfo - query locale information
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item EXPORT
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 IO - load various IO modules
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item DEPRECATED
-
-=back
-
-=head2 IO::Compress::Base - Base Class for IO::Compress modules
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 IO::Compress::Deflate - Write RFC 1950 files/buffers
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Functional Interface
-
-=over 4
-
-=item deflate $input => $output [, OPTS]
-
-A filename, A filehandle, A scalar reference, An array reference, An Input
-FileGlob string, A filename, A filehandle, A scalar reference, An Array
-Reference, An Output FileGlob
-
-=item Notes
-
-=item Optional Parameters
-
-C<< AutoClose => 0|1 >>, C<< BinModeIn => 0|1 >>, C<< Append => 0|1 >>
-
-=item Examples
-
-=back
-
-=item OO Interface
-
-=over 4
-
-=item Constructor
-
-A filename, A filehandle, A scalar reference
-
-=item Constructor Options
-
-C<< AutoClose => 0|1 >>, C<< Append => 0|1 >>, A Buffer, A Filename, A
-Filehandle, C<< Merge => 0|1 >>, -Level, -Strategy, C<< Strict => 0|1 >>
-
-=item Examples
-
-=back
-
-=item Methods
-
-=over 4
-
-=item print
-
-=item printf
-
-=item syswrite
-
-=item write
-
-=item flush
-
-=item tell
-
-=item eof
-
-=item seek
-
-=item binmode
-
-=item opened
-
-=item autoflush
-
-=item input_line_number
-
-=item fileno
-
-=item close
-
-=item newStream([OPTS])
-
-=item deflateParams
-
-=back
-
-=item Importing
-
-:all, :constants, :flush, :level, :strategy
-
-=item EXAMPLES
-
-=over 4
-
-=item Apache::GZip Revisited
-
-=item Working with Net::FTP
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 IO::Compress::Gzip - Write RFC 1952 files/buffers
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Functional Interface
-
-=over 4
-
-=item gzip $input => $output [, OPTS]
-
-A filename, A filehandle, A scalar reference, An array reference, An Input
-FileGlob string, A filename, A filehandle, A scalar reference, An Array
-Reference, An Output FileGlob
-
-=item Notes
-
-=item Optional Parameters
-
-C<< AutoClose => 0|1 >>, C<< BinModeIn => 0|1 >>, C<< Append => 0|1 >>
-
-=item Examples
-
-=back
-
-=item OO Interface
-
-=over 4
-
-=item Constructor
-
-A filename, A filehandle, A scalar reference
-
-=item Constructor Options
-
-C<< AutoClose => 0|1 >>, C<< Append => 0|1 >>, A Buffer, A Filename, A
-Filehandle, C<< Merge => 0|1 >>, -Level, -Strategy, C<< Minimal => 0|1 >>,
-C<< Comment => $comment >>, C<< Name => $string >>, C<< Time => $number >>,
-C<< TextFlag => 0|1 >>, C<< HeaderCRC => 0|1 >>, C<< OS_Code => $value >>,
-C<< ExtraField => $data >>, C<< ExtraFlags => $value >>, C<< Strict => 0|1
->>
-
-=item Examples
-
-=back
-
-=item Methods
-
-=over 4
-
-=item print
-
-=item printf
-
-=item syswrite
-
-=item write
-
-=item flush
-
-=item tell
-
-=item eof
-
-=item seek
-
-=item binmode
-
-=item opened
-
-=item autoflush
-
-=item input_line_number
-
-=item fileno
-
-=item close
-
-=item newStream([OPTS])
-
-=item deflateParams
-
-=back
-
-=item Importing
-
-:all, :constants, :flush, :level, :strategy
-
-=item EXAMPLES
-
-=over 4
-
-=item Apache::GZip Revisited
-
-=item Working with Net::FTP
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 IO::Compress::RawDeflate - Write RFC 1951 files/buffers
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Functional Interface
-
-=over 4
-
-=item rawdeflate $input => $output [, OPTS]
-
-A filename, A filehandle, A scalar reference, An array reference, An Input
-FileGlob string, A filename, A filehandle, A scalar reference, An Array
-Reference, An Output FileGlob
-
-=item Notes
-
-=item Optional Parameters
-
-C<< AutoClose => 0|1 >>, C<< BinModeIn => 0|1 >>, C<< Append => 0|1 >>
-
-=item Examples
-
-=back
-
-=item OO Interface
-
-=over 4
-
-=item Constructor
-
-A filename, A filehandle, A scalar reference
-
-=item Constructor Options
-
-C<< AutoClose => 0|1 >>, C<< Append => 0|1 >>, A Buffer, A Filename, A
-Filehandle, C<< Merge => 0|1 >>, -Level, -Strategy, C<< Strict => 0|1 >>
-
-=item Examples
-
-=back
-
-=item Methods
-
-=over 4
-
-=item print
-
-=item printf
-
-=item syswrite
-
-=item write
-
-=item flush
-
-=item tell
-
-=item eof
-
-=item seek
-
-=item binmode
-
-=item opened
-
-=item autoflush
-
-=item input_line_number
-
-=item fileno
-
-=item close
-
-=item newStream([OPTS])
-
-=item deflateParams
-
-=back
-
-=item Importing
-
-:all, :constants, :flush, :level, :strategy
-
-=item EXAMPLES
-
-=over 4
-
-=item Apache::GZip Revisited
-
-=item Working with Net::FTP
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 IO::Compress::Zip - Write zip files/buffers
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Functional Interface
-
-=over 4
-
-=item zip $input => $output [, OPTS]
-
-A filename, A filehandle, A scalar reference, An array reference, An Input
-FileGlob string, A filename, A filehandle, A scalar reference, An Array
-Reference, An Output FileGlob
-
-=item Notes
-
-=item Optional Parameters
-
-C<< AutoClose => 0|1 >>, C<< BinModeIn => 0|1 >>, C<< Append => 0|1 >>
-
-=item Examples
-
-=back
-
-=item OO Interface
-
-=over 4
-
-=item Constructor
-
-A filename, A filehandle, A scalar reference
-
-=item Constructor Options
-
-C<< AutoClose => 0|1 >>, C<< Append => 0|1 >>, A Buffer, A Filename, A
-Filehandle, C<< Name => $string >>, C<< Time => $number >>, C<< ExtAttr =>
-$attr >>, C<< exTime => [$atime, $mtime, $ctime] >>, C<< exUnix2 => [$uid,
-$gid] >>, C<< Comment => $comment >>, C<< ZipComment => $comment >>, C<<
-Method => $method >>, C<< Stream => 0|1 >>, C<< Zip64 => 0|1 >>, C<<
-TextFlag => 0|1 >>, C<< ExtraFieldLocal => $data >> =item C<<
-ExtraFieldCentral => $data >>, C<< Minimal => 1|0 >>, C<< BlockSize100K =>
-number >>, C<< WorkFactor => number >>, -Level, -Strategy, C<< Strict =>
-0|1 >>
-
-=item Examples
-
-=back
-
-=item Methods
-
-=over 4
-
-=item print
-
-=item printf
-
-=item syswrite
-
-=item write
-
-=item flush
-
-=item tell
-
-=item eof
-
-=item seek
-
-=item binmode
-
-=item opened
-
-=item autoflush
-
-=item input_line_number
-
-=item fileno
-
-=item close
-
-=item newStream([OPTS])
-
-=item deflateParams
-
-=back
-
-=item Importing
-
-:all, :constants, :flush, :level, :strategy, :zip_method
-
-=item EXAMPLES
-
-=over 4
-
-=item Apache::GZip Revisited
-
-=item Working with Net::FTP
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 IO::Dir - supply object methods for directory handles
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-new ( [ DIRNAME ] ), open ( DIRNAME ), read (), seek ( POS ), tell (),
-rewind (), close (), tie %hash, 'IO::Dir', DIRNAME [, OPTIONS ]
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 IO::File - supply object methods for filehandles
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CONSTRUCTOR
-
-new ( FILENAME [,MODE [,PERMS]] ), new_tmpfile
-
-=item METHODS
-
-open( FILENAME [,MODE [,PERMS]] ), open( FILENAME, IOLAYERS ), binmode(
-[LAYER] )
-
-=item NOTE
-
-=item SEE ALSO
-
-=item HISTORY
-
-=back
-
-=head2 IO::Handle - supply object methods for I/O handles
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CONSTRUCTOR
-
-new (), new_from_fd ( FD, MODE )
-
-=item METHODS
-
-$io->fdopen ( FD, MODE ), $io->opened, $io->getline, $io->getlines,
-$io->ungetc ( ORD ), $io->write ( BUF, LEN [, OFFSET ] ), $io->error,
-$io->clearerr, $io->sync, $io->flush, $io->printflush ( ARGS ),
-$io->blocking ( [ BOOL ] ), $io->untaint
-
-=item NOTE
-
-=item SEE ALSO
-
-=item BUGS
-
-=item HISTORY
-
-=back
-
-=head2 IO::Pipe - supply object methods for pipes
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CONSTRUCTOR
-
-new ( [READER, WRITER] )
-
-=item METHODS
-
-reader ([ARGS]), writer ([ARGS]), handles ()
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 IO::Poll - Object interface to system poll call
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-mask ( IO [, EVENT_MASK ] ), poll ( [ TIMEOUT ] ), events ( IO ), remove (
-IO ), handles( [ EVENT_MASK ] )
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 IO::Seekable - supply seek based methods for I/O objects
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-$io->getpos, $io->setpos, $io->seek ( POS, WHENCE ), WHENCE=0 (SEEK_SET),
-WHENCE=1 (SEEK_CUR), WHENCE=2 (SEEK_END), $io->sysseek( POS, WHENCE ),
-$io->tell
-
-=item SEE ALSO
-
-=item HISTORY
-
-=back
-
-=head2 IO::Select - OO interface to the select system call
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CONSTRUCTOR
-
-new ( [ HANDLES ] )
-
-=item METHODS
-
-add ( HANDLES ), remove ( HANDLES ), exists ( HANDLE ), handles, can_read (
-[ TIMEOUT ] ), can_write ( [ TIMEOUT ] ), has_exception ( [ TIMEOUT ] ),
-count (), bits(), select ( READ, WRITE, EXCEPTION [, TIMEOUT ] )
-
-=item EXAMPLE
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 IO::Socket - Object interface to socket communications
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CONSTRUCTOR
-
-new ( [ARGS] )
-
-=item METHODS
-
-accept([PKG]), socketpair(DOMAIN, TYPE, PROTOCOL), atmark, connected,
-protocol, sockdomain, sockopt(OPT [, VAL]), socktype, timeout([VAL])
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 IO::Socket::INET - Object interface for AF_INET domain sockets
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CONSTRUCTOR
-
-new ( [ARGS] )
-
-=over 4
-
-=item METHODS
-
-sockaddr (), sockport (), sockhost (), peeraddr (), peerport (), peerhost
-()
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 IO::Socket::UNIX - Object interface for AF_UNIX domain sockets
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CONSTRUCTOR
-
-new ( [ARGS] )
-
-=item METHODS
-
-hostpath(), peerpath()
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 IO::Uncompress::AnyInflate - Uncompress zlib-based (zip, gzip)
-file/buffer
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-RFC 1950, RFC 1951 (optionally), gzip (RFC 1952), zip
-
-=item Functional Interface
-
-=over 4
-
-=item anyinflate $input => $output [, OPTS]
-
-A filename, A filehandle, A scalar reference, An array reference, An Input
-FileGlob string, A filename, A filehandle, A scalar reference, An Array
-Reference, An Output FileGlob
-
-=item Notes
-
-=item Optional Parameters
-
-C<< AutoClose => 0|1 >>, C<< BinModeOut => 0|1 >>, C<< Append => 0|1 >>,
-C<< MultiStream => 0|1 >>, C<< TrailingData => $scalar >>
-
-=item Examples
-
-=back
-
-=item OO Interface
-
-=over 4
-
-=item Constructor
-
-A filename, A filehandle, A scalar reference
-
-=item Constructor Options
-
-C<< AutoClose => 0|1 >>, C<< MultiStream => 0|1 >>, C<< Prime => $string
->>, C<< Transparent => 0|1 >>, C<< BlockSize => $num >>, C<< InputLength =>
-$size >>, C<< Append => 0|1 >>, C<< Strict => 0|1 >>, C<< RawInflate => 0|1
->>, C<< ParseExtra => 0|1 >> If the gzip FEXTRA header field is present and
-this option is set, it will force the module to check that it conforms to
-the sub-field structure as defined in RFC 1952
-
-=item Examples
-
-=back
-
-=item Methods
-
-=over 4
-
-=item read
-
-=item read
-
-=item getline
-
-=item getc
-
-=item ungetc
-
-=item inflateSync
-
-=item getHeaderInfo
-
-=item tell
-
-=item eof
-
-=item seek
-
-=item binmode
-
-=item opened
-
-=item autoflush
-
-=item input_line_number
-
-=item fileno
-
-=item close
-
-=item nextStream
-
-=item trailingData
-
-=back
-
-=item Importing
-
-:all
-
-=item EXAMPLES
-
-=over 4
-
-=item Working with Net::FTP
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 IO::Uncompress::AnyUncompress - Uncompress gzip, zip, bzip2 or lzop
-file/buffer
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-RFC 1950, RFC 1951 (optionally), gzip (RFC 1952), zip, bzip2, lzop, lzf
-
-=item Functional Interface
-
-=over 4
-
-=item anyuncompress $input => $output [, OPTS]
-
-A filename, A filehandle, A scalar reference, An array reference, An Input
-FileGlob string, A filename, A filehandle, A scalar reference, An Array
-Reference, An Output FileGlob
-
-=item Notes
-
-=item Optional Parameters
-
-C<< AutoClose => 0|1 >>, C<< BinModeOut => 0|1 >>, C<< Append => 0|1 >>,
-C<< MultiStream => 0|1 >>, C<< TrailingData => $scalar >>
-
-=item Examples
-
-=back
-
-=item OO Interface
-
-=over 4
-
-=item Constructor
-
-A filename, A filehandle, A scalar reference
-
-=item Constructor Options
-
-C<< AutoClose => 0|1 >>, C<< MultiStream => 0|1 >>, C<< Prime => $string
->>, C<< Transparent => 0|1 >>, C<< BlockSize => $num >>, C<< InputLength =>
-$size >>, C<< Append => 0|1 >>, C<< Strict => 0|1 >>, C<< RawInflate => 0|1
->>
-
-=item Examples
-
-=back
-
-=item Methods
-
-=over 4
-
-=item read
-
-=item read
-
-=item getline
-
-=item getc
-
-=item ungetc
-
-=item getHeaderInfo
-
-=item tell
-
-=item eof
-
-=item seek
-
-=item binmode
-
-=item opened
-
-=item autoflush
-
-=item input_line_number
-
-=item fileno
-
-=item close
-
-=item nextStream
-
-=item trailingData
-
-=back
-
-=item Importing
-
-:all
-
-=item EXAMPLES
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 IO::Uncompress::Base - Base Class for IO::Uncompress modules
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 IO::Uncompress::Gunzip - Read RFC 1952 files/buffers
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Functional Interface
-
-=over 4
-
-=item gunzip $input => $output [, OPTS]
-
-A filename, A filehandle, A scalar reference, An array reference, An Input
-FileGlob string, A filename, A filehandle, A scalar reference, An Array
-Reference, An Output FileGlob
-
-=item Notes
-
-=item Optional Parameters
-
-C<< AutoClose => 0|1 >>, C<< BinModeOut => 0|1 >>, C<< Append => 0|1 >>,
-C<< MultiStream => 0|1 >>, C<< TrailingData => $scalar >>
-
-=item Examples
-
-=back
-
-=item OO Interface
-
-=over 4
-
-=item Constructor
-
-A filename, A filehandle, A scalar reference
-
-=item Constructor Options
-
-C<< AutoClose => 0|1 >>, C<< MultiStream => 0|1 >>, C<< Prime => $string
->>, C<< Transparent => 0|1 >>, C<< BlockSize => $num >>, C<< InputLength =>
-$size >>, C<< Append => 0|1 >>, C<< Strict => 0|1 >>, C<< ParseExtra => 0|1
->> If the gzip FEXTRA header field is present and this option is set, it
-will force the module to check that it conforms to the sub-field structure
-as defined in RFC 1952
-
-=item Examples
-
-=back
-
-=item Methods
-
-=over 4
-
-=item read
-
-=item read
-
-=item getline
-
-=item getc
-
-=item ungetc
-
-=item inflateSync
-
-=item getHeaderInfo
-
-Name, Comment
-
-=item tell
-
-=item eof
-
-=item seek
-
-=item binmode
-
-=item opened
-
-=item autoflush
-
-=item input_line_number
-
-=item fileno
-
-=item close
-
-=item nextStream
-
-=item trailingData
-
-=back
-
-=item Importing
-
-:all
-
-=item EXAMPLES
-
-=over 4
-
-=item Working with Net::FTP
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 IO::Uncompress::Inflate - Read RFC 1950 files/buffers
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Functional Interface
-
-=over 4
-
-=item inflate $input => $output [, OPTS]
-
-A filename, A filehandle, A scalar reference, An array reference, An Input
-FileGlob string, A filename, A filehandle, A scalar reference, An Array
-Reference, An Output FileGlob
-
-=item Notes
-
-=item Optional Parameters
-
-C<< AutoClose => 0|1 >>, C<< BinModeOut => 0|1 >>, C<< Append => 0|1 >>,
-C<< MultiStream => 0|1 >>, C<< TrailingData => $scalar >>
-
-=item Examples
-
-=back
-
-=item OO Interface
-
-=over 4
-
-=item Constructor
-
-A filename, A filehandle, A scalar reference
-
-=item Constructor Options
-
-C<< AutoClose => 0|1 >>, C<< MultiStream => 0|1 >>, C<< Prime => $string
->>, C<< Transparent => 0|1 >>, C<< BlockSize => $num >>, C<< InputLength =>
-$size >>, C<< Append => 0|1 >>, C<< Strict => 0|1 >>
-
-=item Examples
-
-=back
-
-=item Methods
-
-=over 4
-
-=item read
-
-=item read
-
-=item getline
-
-=item getc
-
-=item ungetc
-
-=item inflateSync
-
-=item getHeaderInfo
-
-=item tell
-
-=item eof
-
-=item seek
-
-=item binmode
-
-=item opened
-
-=item autoflush
-
-=item input_line_number
-
-=item fileno
-
-=item close
-
-=item nextStream
-
-=item trailingData
-
-=back
-
-=item Importing
-
-:all
-
-=item EXAMPLES
-
-=over 4
-
-=item Working with Net::FTP
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 IO::Uncompress::RawInflate - Read RFC 1951 files/buffers
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Functional Interface
-
-=over 4
-
-=item rawinflate $input => $output [, OPTS]
-
-A filename, A filehandle, A scalar reference, An array reference, An Input
-FileGlob string, A filename, A filehandle, A scalar reference, An Array
-Reference, An Output FileGlob
-
-=item Notes
-
-=item Optional Parameters
-
-C<< AutoClose => 0|1 >>, C<< BinModeOut => 0|1 >>, C<< Append => 0|1 >>,
-C<< MultiStream => 0|1 >>, C<< TrailingData => $scalar >>
-
-=item Examples
-
-=back
-
-=item OO Interface
-
-=over 4
-
-=item Constructor
-
-A filename, A filehandle, A scalar reference
-
-=item Constructor Options
-
-C<< AutoClose => 0|1 >>, C<< MultiStream => 0|1 >>, C<< Prime => $string
->>, C<< Transparent => 0|1 >>, C<< BlockSize => $num >>, C<< InputLength =>
-$size >>, C<< Append => 0|1 >>, C<< Strict => 0|1 >>
-
-=item Examples
-
-=back
-
-=item Methods
-
-=over 4
-
-=item read
-
-=item read
-
-=item getline
-
-=item getc
-
-=item ungetc
-
-=item inflateSync
-
-=item getHeaderInfo
-
-=item tell
-
-=item eof
-
-=item seek
-
-=item binmode
-
-=item opened
-
-=item autoflush
-
-=item input_line_number
-
-=item fileno
-
-=item close
-
-=item nextStream
-
-=item trailingData
-
-=back
-
-=item Importing
-
-:all
-
-=item EXAMPLES
-
-=over 4
-
-=item Working with Net::FTP
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 IO::Uncompress::Unzip - Read zip files/buffers
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Functional Interface
-
-=over 4
-
-=item unzip $input => $output [, OPTS]
-
-A filename, A filehandle, A scalar reference, An array reference, An Input
-FileGlob string, A filename, A filehandle, A scalar reference, An Array
-Reference, An Output FileGlob
-
-=item Notes
-
-=item Optional Parameters
-
-C<< AutoClose => 0|1 >>, C<< BinModeOut => 0|1 >>, C<< Append => 0|1 >>,
-C<< MultiStream => 0|1 >>, C<< TrailingData => $scalar >>
-
-=item Examples
-
-=back
-
-=item OO Interface
-
-=over 4
-
-=item Constructor
-
-A filename, A filehandle, A scalar reference
-
-=item Constructor Options
-
-C<< AutoClose => 0|1 >>, C<< MultiStream => 0|1 >>, C<< Prime => $string
->>, C<< Transparent => 0|1 >>, C<< BlockSize => $num >>, C<< InputLength =>
-$size >>, C<< Append => 0|1 >>, C<< Strict => 0|1 >>
-
-=item Examples
-
-=back
-
-=item Methods
-
-=over 4
-
-=item read
-
-=item read
-
-=item getline
-
-=item getc
-
-=item ungetc
-
-=item inflateSync
-
-=item getHeaderInfo
-
-=item tell
-
-=item eof
-
-=item seek
-
-=item binmode
-
-=item opened
-
-=item autoflush
-
-=item input_line_number
-
-=item fileno
-
-=item close
-
-=item nextStream
-
-=item trailingData
-
-=back
-
-=item Importing
-
-:all
-
-=item EXAMPLES
-
-=over 4
-
-=item Working with Net::FTP
-
-=item Walking through a zip file
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 IO::Zlib - IO:: style interface to L<Compress::Zlib>
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CONSTRUCTOR
-
-new ( [ARGS] )
-
-=item OBJECT METHODS
-
-open ( FILENAME, MODE ), opened, close, getc, getline, getlines, print (
-ARGS... ), read ( BUF, NBYTES, [OFFSET] ), eof, seek ( OFFSET, WHENCE ),
-tell, setpos ( POS ), getpos ( POS )
-
-=item USING THE EXTERNAL GZIP
-
-=item CLASS METHODS
-
-has_Compress_Zlib, gzip_external, gzip_used, gzip_read_open,
-gzip_write_open
-
-=item DIAGNOSTICS
-
-IO::Zlib::getlines: must be called in list context,
-IO::Zlib::gzopen_external: mode '...' is illegal, IO::Zlib::import: '...'
-is illegal, IO::Zlib::import: ':gzip_external' requires an argument,
-IO::Zlib::import: 'gzip_read_open' requires an argument, IO::Zlib::import:
-'gzip_read' '...' is illegal, IO::Zlib::import: 'gzip_write_open' requires
-an argument, IO::Zlib::import: 'gzip_write_open' '...' is illegal,
-IO::Zlib::import: no Compress::Zlib and no external gzip, IO::Zlib::open:
-needs a filename, IO::Zlib::READ: NBYTES must be specified,
-IO::Zlib::WRITE: too long LENGTH
-
-=item SEE ALSO
-
-=item HISTORY
-
-=item COPYRIGHT
-
-=back
-
-=head2 IO::lib::IO::Dir, IO::Dir - supply object methods for directory
-handles
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-new ( [ DIRNAME ] ), open ( DIRNAME ), read (), seek ( POS ), tell (),
-rewind (), close (), tie %hash, 'IO::Dir', DIRNAME [, OPTIONS ]
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 IO::lib::IO::File, IO::File - supply object methods for filehandles
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CONSTRUCTOR
-
-new ( FILENAME [,MODE [,PERMS]] ), new_tmpfile
-
-=item METHODS
-
-open( FILENAME [,MODE [,PERMS]] ), open( FILENAME, IOLAYERS ), binmode(
-[LAYER] )
-
-=item NOTE
-
-=item SEE ALSO
-
-=item HISTORY
-
-=back
-
-=head2 IO::lib::IO::Handle, IO::Handle - supply object methods for I/O
-handles
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CONSTRUCTOR
-
-new (), new_from_fd ( FD, MODE )
-
-=item METHODS
-
-$io->fdopen ( FD, MODE ), $io->opened, $io->getline, $io->getlines,
-$io->ungetc ( ORD ), $io->write ( BUF, LEN [, OFFSET ] ), $io->error,
-$io->clearerr, $io->sync, $io->flush, $io->printflush ( ARGS ),
-$io->blocking ( [ BOOL ] ), $io->untaint
-
-=item NOTE
-
-=item SEE ALSO
-
-=item BUGS
-
-=item HISTORY
-
-=back
-
-=head2 IO::lib::IO::Pipe, IO::Pipe - supply object methods for pipes
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CONSTRUCTOR
-
-new ( [READER, WRITER] )
-
-=item METHODS
-
-reader ([ARGS]), writer ([ARGS]), handles ()
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 IO::lib::IO::Poll, IO::Poll - Object interface to system poll call
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-mask ( IO [, EVENT_MASK ] ), poll ( [ TIMEOUT ] ), events ( IO ), remove (
-IO ), handles( [ EVENT_MASK ] )
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 IO::lib::IO::Seekable, IO::Seekable - supply seek based methods for
-I/O objects
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-$io->getpos, $io->setpos, $io->seek ( POS, WHENCE ), WHENCE=0 (SEEK_SET),
-WHENCE=1 (SEEK_CUR), WHENCE=2 (SEEK_END), $io->sysseek( POS, WHENCE ),
-$io->tell
-
-=item SEE ALSO
-
-=item HISTORY
-
-=back
-
-=head2 IO::lib::IO::Select, IO::Select - OO interface to the select system
-call
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CONSTRUCTOR
-
-new ( [ HANDLES ] )
-
-=item METHODS
-
-add ( HANDLES ), remove ( HANDLES ), exists ( HANDLE ), handles, can_read (
-[ TIMEOUT ] ), can_write ( [ TIMEOUT ] ), has_exception ( [ TIMEOUT ] ),
-count (), bits(), select ( READ, WRITE, EXCEPTION [, TIMEOUT ] )
-
-=item EXAMPLE
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 IO::lib::IO::Socket, IO::Socket - Object interface to socket
-communications
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CONSTRUCTOR
-
-new ( [ARGS] )
-
-=item METHODS
-
-accept([PKG]), socketpair(DOMAIN, TYPE, PROTOCOL), atmark, connected,
-protocol, sockdomain, sockopt(OPT [, VAL]), socktype, timeout([VAL])
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 IO::lib::IO::Socket::INET, IO::Socket::INET - Object interface for
-AF_INET domain sockets
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CONSTRUCTOR
-
-new ( [ARGS] )
-
-=over 4
-
-=item METHODS
-
-sockaddr (), sockport (), sockhost (), peeraddr (), peerport (), peerhost
-()
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 IO::lib::IO::Socket::UNIX, IO::Socket::UNIX - Object interface for
-AF_UNIX domain sockets
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CONSTRUCTOR
-
-new ( [ARGS] )
-
-=item METHODS
-
-hostpath(), peerpath()
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 IO_Compress_Base::lib::File::GlobMapper, File::GlobMapper - Extend
-File Glob to Allow Input and Output Files
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Behind The Scenes
-
-=item Limitations
-
-=item Input File Glob
-
-B<~>, B<~user>, B<.>, B<*>, B<?>, B<\>, B<[]>, B<{,}>, B<()>
-
-=item Output File Glob
-
-"*", #1
-
-=item Returned Data
-
-=back
-
-=item EXAMPLES
-
-=over 4
-
-=item A Rename script
-
-=item A few example globmaps
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 IO_Compress_Base::lib::IO::Compress::Base, IO::Compress::Base - Base
-Class for IO::Compress modules
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 IO_Compress_Base::lib::IO::Uncompress::AnyUncompress,
-IO::Uncompress::AnyUncompress - Uncompress gzip, zip, bzip2 or lzop
-file/buffer
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-RFC 1950, RFC 1951 (optionally), gzip (RFC 1952), zip, bzip2, lzop, lzf
-
-=item Functional Interface
-
-=over 4
-
-=item anyuncompress $input => $output [, OPTS]
-
-A filename, A filehandle, A scalar reference, An array reference, An Input
-FileGlob string, A filename, A filehandle, A scalar reference, An Array
-Reference, An Output FileGlob
-
-=item Notes
-
-=item Optional Parameters
-
-C<< AutoClose => 0|1 >>, C<< BinModeOut => 0|1 >>, C<< Append => 0|1 >>,
-C<< MultiStream => 0|1 >>, C<< TrailingData => $scalar >>
-
-=item Examples
-
-=back
-
-=item OO Interface
-
-=over 4
-
-=item Constructor
-
-A filename, A filehandle, A scalar reference
-
-=item Constructor Options
-
-C<< AutoClose => 0|1 >>, C<< MultiStream => 0|1 >>, C<< Prime => $string
->>, C<< Transparent => 0|1 >>, C<< BlockSize => $num >>, C<< InputLength =>
-$size >>, C<< Append => 0|1 >>, C<< Strict => 0|1 >>, C<< RawInflate => 0|1
->>
-
-=item Examples
-
-=back
-
-=item Methods
-
-=over 4
-
-=item read
-
-=item read
-
-=item getline
-
-=item getc
-
-=item ungetc
-
-=item getHeaderInfo
-
-=item tell
-
-=item eof
-
-=item seek
-
-=item binmode
-
-=item opened
-
-=item autoflush
-
-=item input_line_number
-
-=item fileno
-
-=item close
-
-=item nextStream
-
-=item trailingData
-
-=back
-
-=item Importing
-
-:all
-
-=item EXAMPLES
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 IO_Compress_Base::lib::IO::Uncompress::Base, IO::Uncompress::Base -
-Base Class for IO::Uncompress modules
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 IO_Compress_Base::pod::FAQ, IO::Compress::Base::FAQ -- Frequently
-Asked Questions about IO::Compress::Base
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Compatibility with Unix compress/uncompress.
-
-=item Accessing .tar.Z files
-
-=item Accessing Zip Files
-
-=item Compressed files and Net::FTP
-
-=item How do I recompress using a different compression?
-
-=item Using C<InputLength> to uncompress data embedded in a larger
-file/buffer.
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 IO_Compress_Zlib::IO::Compress::Deflate, IO::Compress::Deflate -
-Write RFC 1950 files/buffers
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Functional Interface
-
-=over 4
-
-=item deflate $input => $output [, OPTS]
-
-A filename, A filehandle, A scalar reference, An array reference, An Input
-FileGlob string, A filename, A filehandle, A scalar reference, An Array
-Reference, An Output FileGlob
-
-=item Notes
-
-=item Optional Parameters
-
-C<< AutoClose => 0|1 >>, C<< BinModeIn => 0|1 >>, C<< Append => 0|1 >>
-
-=item Examples
-
-=back
-
-=item OO Interface
-
-=over 4
-
-=item Constructor
-
-A filename, A filehandle, A scalar reference
-
-=item Constructor Options
-
-C<< AutoClose => 0|1 >>, C<< Append => 0|1 >>, A Buffer, A Filename, A
-Filehandle, C<< Merge => 0|1 >>, -Level, -Strategy, C<< Strict => 0|1 >>
-
-=item Examples
-
-=back
-
-=item Methods
-
-=over 4
-
-=item print
-
-=item printf
-
-=item syswrite
-
-=item write
-
-=item flush
-
-=item tell
-
-=item eof
-
-=item seek
-
-=item binmode
-
-=item opened
-
-=item autoflush
-
-=item input_line_number
-
-=item fileno
-
-=item close
-
-=item newStream([OPTS])
-
-=item deflateParams
-
-=back
-
-=item Importing
-
-:all, :constants, :flush, :level, :strategy
-
-=item EXAMPLES
-
-=over 4
-
-=item Apache::GZip Revisited
-
-=item Working with Net::FTP
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 IO_Compress_Zlib::IO::Compress::Gzip, IO::Compress::Gzip - Write RFC
-1952 files/buffers
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Functional Interface
-
-=over 4
-
-=item gzip $input => $output [, OPTS]
-
-A filename, A filehandle, A scalar reference, An array reference, An Input
-FileGlob string, A filename, A filehandle, A scalar reference, An Array
-Reference, An Output FileGlob
-
-=item Notes
-
-=item Optional Parameters
-
-C<< AutoClose => 0|1 >>, C<< BinModeIn => 0|1 >>, C<< Append => 0|1 >>
-
-=item Examples
-
-=back
-
-=item OO Interface
-
-=over 4
-
-=item Constructor
-
-A filename, A filehandle, A scalar reference
-
-=item Constructor Options
-
-C<< AutoClose => 0|1 >>, C<< Append => 0|1 >>, A Buffer, A Filename, A
-Filehandle, C<< Merge => 0|1 >>, -Level, -Strategy, C<< Minimal => 0|1 >>,
-C<< Comment => $comment >>, C<< Name => $string >>, C<< Time => $number >>,
-C<< TextFlag => 0|1 >>, C<< HeaderCRC => 0|1 >>, C<< OS_Code => $value >>,
-C<< ExtraField => $data >>, C<< ExtraFlags => $value >>, C<< Strict => 0|1
->>
-
-=item Examples
-
-=back
-
-=item Methods
-
-=over 4
-
-=item print
-
-=item printf
-
-=item syswrite
-
-=item write
-
-=item flush
-
-=item tell
-
-=item eof
-
-=item seek
-
-=item binmode
-
-=item opened
-
-=item autoflush
-
-=item input_line_number
-
-=item fileno
-
-=item close
-
-=item newStream([OPTS])
-
-=item deflateParams
-
-=back
-
-=item Importing
-
-:all, :constants, :flush, :level, :strategy
-
-=item EXAMPLES
-
-=over 4
-
-=item Apache::GZip Revisited
-
-=item Working with Net::FTP
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 IO_Compress_Zlib::IO::Compress::RawDeflate, IO::Compress::RawDeflate
-- Write RFC 1951 files/buffers
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Functional Interface
-
-=over 4
-
-=item rawdeflate $input => $output [, OPTS]
-
-A filename, A filehandle, A scalar reference, An array reference, An Input
-FileGlob string, A filename, A filehandle, A scalar reference, An Array
-Reference, An Output FileGlob
-
-=item Notes
-
-=item Optional Parameters
-
-C<< AutoClose => 0|1 >>, C<< BinModeIn => 0|1 >>, C<< Append => 0|1 >>
-
-=item Examples
-
-=back
-
-=item OO Interface
-
-=over 4
-
-=item Constructor
-
-A filename, A filehandle, A scalar reference
-
-=item Constructor Options
-
-C<< AutoClose => 0|1 >>, C<< Append => 0|1 >>, A Buffer, A Filename, A
-Filehandle, C<< Merge => 0|1 >>, -Level, -Strategy, C<< Strict => 0|1 >>
-
-=item Examples
-
-=back
-
-=item Methods
-
-=over 4
-
-=item print
-
-=item printf
-
-=item syswrite
-
-=item write
-
-=item flush
-
-=item tell
-
-=item eof
-
-=item seek
-
-=item binmode
-
-=item opened
-
-=item autoflush
-
-=item input_line_number
-
-=item fileno
-
-=item close
-
-=item newStream([OPTS])
-
-=item deflateParams
-
-=back
-
-=item Importing
-
-:all, :constants, :flush, :level, :strategy
-
-=item EXAMPLES
-
-=over 4
-
-=item Apache::GZip Revisited
-
-=item Working with Net::FTP
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 IO_Compress_Zlib::IO::Compress::Zip, IO::Compress::Zip - Write zip
-files/buffers
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Functional Interface
-
-=over 4
-
-=item zip $input => $output [, OPTS]
-
-A filename, A filehandle, A scalar reference, An array reference, An Input
-FileGlob string, A filename, A filehandle, A scalar reference, An Array
-Reference, An Output FileGlob
-
-=item Notes
-
-=item Optional Parameters
-
-C<< AutoClose => 0|1 >>, C<< BinModeIn => 0|1 >>, C<< Append => 0|1 >>
-
-=item Examples
-
-=back
-
-=item OO Interface
-
-=over 4
-
-=item Constructor
-
-A filename, A filehandle, A scalar reference
-
-=item Constructor Options
-
-C<< AutoClose => 0|1 >>, C<< Append => 0|1 >>, A Buffer, A Filename, A
-Filehandle, C<< Name => $string >>, C<< Time => $number >>, C<< ExtAttr =>
-$attr >>, C<< exTime => [$atime, $mtime, $ctime] >>, C<< exUnix2 => [$uid,
-$gid] >>, C<< Comment => $comment >>, C<< ZipComment => $comment >>, C<<
-Method => $method >>, C<< Stream => 0|1 >>, C<< Zip64 => 0|1 >>, C<<
-TextFlag => 0|1 >>, C<< ExtraFieldLocal => $data >> =item C<<
-ExtraFieldCentral => $data >>, C<< Minimal => 1|0 >>, C<< BlockSize100K =>
-number >>, C<< WorkFactor => number >>, -Level, -Strategy, C<< Strict =>
-0|1 >>
-
-=item Examples
-
-=back
-
-=item Methods
-
-=over 4
-
-=item print
-
-=item printf
-
-=item syswrite
-
-=item write
-
-=item flush
-
-=item tell
-
-=item eof
-
-=item seek
-
-=item binmode
-
-=item opened
-
-=item autoflush
-
-=item input_line_number
-
-=item fileno
-
-=item close
-
-=item newStream([OPTS])
-
-=item deflateParams
-
-=back
-
-=item Importing
-
-:all, :constants, :flush, :level, :strategy, :zip_method
-
-=item EXAMPLES
-
-=over 4
-
-=item Apache::GZip Revisited
-
-=item Working with Net::FTP
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 IO_Compress_Zlib::IO::Uncompress::AnyInflate,
-IO::Uncompress::AnyInflate - Uncompress zlib-based (zip, gzip) file/buffer
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-RFC 1950, RFC 1951 (optionally), gzip (RFC 1952), zip
-
-=item Functional Interface
-
-=over 4
-
-=item anyinflate $input => $output [, OPTS]
-
-A filename, A filehandle, A scalar reference, An array reference, An Input
-FileGlob string, A filename, A filehandle, A scalar reference, An Array
-Reference, An Output FileGlob
-
-=item Notes
-
-=item Optional Parameters
-
-C<< AutoClose => 0|1 >>, C<< BinModeOut => 0|1 >>, C<< Append => 0|1 >>,
-C<< MultiStream => 0|1 >>, C<< TrailingData => $scalar >>
-
-=item Examples
-
-=back
-
-=item OO Interface
-
-=over 4
-
-=item Constructor
-
-A filename, A filehandle, A scalar reference
-
-=item Constructor Options
-
-C<< AutoClose => 0|1 >>, C<< MultiStream => 0|1 >>, C<< Prime => $string
->>, C<< Transparent => 0|1 >>, C<< BlockSize => $num >>, C<< InputLength =>
-$size >>, C<< Append => 0|1 >>, C<< Strict => 0|1 >>, C<< RawInflate => 0|1
->>, C<< ParseExtra => 0|1 >> If the gzip FEXTRA header field is present and
-this option is set, it will force the module to check that it conforms to
-the sub-field structure as defined in RFC 1952
-
-=item Examples
-
-=back
-
-=item Methods
-
-=over 4
-
-=item read
-
-=item read
-
-=item getline
-
-=item getc
-
-=item ungetc
-
-=item inflateSync
-
-=item getHeaderInfo
-
-=item tell
-
-=item eof
-
-=item seek
-
-=item binmode
-
-=item opened
-
-=item autoflush
-
-=item input_line_number
-
-=item fileno
-
-=item close
-
-=item nextStream
-
-=item trailingData
-
-=back
-
-=item Importing
-
-:all
-
-=item EXAMPLES
-
-=over 4
-
-=item Working with Net::FTP
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 IO_Compress_Zlib::IO::Uncompress::Gunzip, IO::Uncompress::Gunzip -
-Read RFC 1952 files/buffers
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Functional Interface
-
-=over 4
-
-=item gunzip $input => $output [, OPTS]
-
-A filename, A filehandle, A scalar reference, An array reference, An Input
-FileGlob string, A filename, A filehandle, A scalar reference, An Array
-Reference, An Output FileGlob
-
-=item Notes
-
-=item Optional Parameters
-
-C<< AutoClose => 0|1 >>, C<< BinModeOut => 0|1 >>, C<< Append => 0|1 >>,
-C<< MultiStream => 0|1 >>, C<< TrailingData => $scalar >>
-
-=item Examples
-
-=back
-
-=item OO Interface
-
-=over 4
-
-=item Constructor
-
-A filename, A filehandle, A scalar reference
-
-=item Constructor Options
-
-C<< AutoClose => 0|1 >>, C<< MultiStream => 0|1 >>, C<< Prime => $string
->>, C<< Transparent => 0|1 >>, C<< BlockSize => $num >>, C<< InputLength =>
-$size >>, C<< Append => 0|1 >>, C<< Strict => 0|1 >>, C<< ParseExtra => 0|1
->> If the gzip FEXTRA header field is present and this option is set, it
-will force the module to check that it conforms to the sub-field structure
-as defined in RFC 1952
-
-=item Examples
-
-=back
-
-=item Methods
-
-=over 4
-
-=item read
-
-=item read
-
-=item getline
-
-=item getc
-
-=item ungetc
-
-=item inflateSync
-
-=item getHeaderInfo
-
-Name, Comment
-
-=item tell
-
-=item eof
-
-=item seek
-
-=item binmode
-
-=item opened
-
-=item autoflush
-
-=item input_line_number
-
-=item fileno
-
-=item close
-
-=item nextStream
-
-=item trailingData
-
-=back
-
-=item Importing
-
-:all
-
-=item EXAMPLES
-
-=over 4
-
-=item Working with Net::FTP
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 IO_Compress_Zlib::IO::Uncompress::Inflate, IO::Uncompress::Inflate -
-Read RFC 1950 files/buffers
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Functional Interface
-
-=over 4
-
-=item inflate $input => $output [, OPTS]
-
-A filename, A filehandle, A scalar reference, An array reference, An Input
-FileGlob string, A filename, A filehandle, A scalar reference, An Array
-Reference, An Output FileGlob
-
-=item Notes
-
-=item Optional Parameters
-
-C<< AutoClose => 0|1 >>, C<< BinModeOut => 0|1 >>, C<< Append => 0|1 >>,
-C<< MultiStream => 0|1 >>, C<< TrailingData => $scalar >>
-
-=item Examples
-
-=back
-
-=item OO Interface
-
-=over 4
-
-=item Constructor
-
-A filename, A filehandle, A scalar reference
-
-=item Constructor Options
-
-C<< AutoClose => 0|1 >>, C<< MultiStream => 0|1 >>, C<< Prime => $string
->>, C<< Transparent => 0|1 >>, C<< BlockSize => $num >>, C<< InputLength =>
-$size >>, C<< Append => 0|1 >>, C<< Strict => 0|1 >>
-
-=item Examples
-
-=back
-
-=item Methods
-
-=over 4
-
-=item read
-
-=item read
-
-=item getline
-
-=item getc
-
-=item ungetc
-
-=item inflateSync
-
-=item getHeaderInfo
-
-=item tell
-
-=item eof
-
-=item seek
-
-=item binmode
-
-=item opened
-
-=item autoflush
-
-=item input_line_number
-
-=item fileno
-
-=item close
-
-=item nextStream
-
-=item trailingData
-
-=back
-
-=item Importing
-
-:all
-
-=item EXAMPLES
-
-=over 4
-
-=item Working with Net::FTP
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 IO_Compress_Zlib::IO::Uncompress::RawInflate,
-IO::Uncompress::RawInflate - Read RFC 1951 files/buffers
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Functional Interface
-
-=over 4
-
-=item rawinflate $input => $output [, OPTS]
-
-A filename, A filehandle, A scalar reference, An array reference, An Input
-FileGlob string, A filename, A filehandle, A scalar reference, An Array
-Reference, An Output FileGlob
-
-=item Notes
-
-=item Optional Parameters
-
-C<< AutoClose => 0|1 >>, C<< BinModeOut => 0|1 >>, C<< Append => 0|1 >>,
-C<< MultiStream => 0|1 >>, C<< TrailingData => $scalar >>
-
-=item Examples
-
-=back
-
-=item OO Interface
-
-=over 4
-
-=item Constructor
-
-A filename, A filehandle, A scalar reference
-
-=item Constructor Options
-
-C<< AutoClose => 0|1 >>, C<< MultiStream => 0|1 >>, C<< Prime => $string
->>, C<< Transparent => 0|1 >>, C<< BlockSize => $num >>, C<< InputLength =>
-$size >>, C<< Append => 0|1 >>, C<< Strict => 0|1 >>
-
-=item Examples
-
-=back
-
-=item Methods
-
-=over 4
-
-=item read
-
-=item read
-
-=item getline
-
-=item getc
-
-=item ungetc
-
-=item inflateSync
-
-=item getHeaderInfo
-
-=item tell
-
-=item eof
-
-=item seek
-
-=item binmode
-
-=item opened
-
-=item autoflush
-
-=item input_line_number
-
-=item fileno
-
-=item close
-
-=item nextStream
-
-=item trailingData
-
-=back
-
-=item Importing
-
-:all
-
-=item EXAMPLES
-
-=over 4
-
-=item Working with Net::FTP
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 IO_Compress_Zlib::IO::Uncompress::Unzip, IO::Uncompress::Unzip -
-Read zip files/buffers
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Functional Interface
-
-=over 4
-
-=item unzip $input => $output [, OPTS]
-
-A filename, A filehandle, A scalar reference, An array reference, An Input
-FileGlob string, A filename, A filehandle, A scalar reference, An Array
-Reference, An Output FileGlob
-
-=item Notes
-
-=item Optional Parameters
-
-C<< AutoClose => 0|1 >>, C<< BinModeOut => 0|1 >>, C<< Append => 0|1 >>,
-C<< MultiStream => 0|1 >>, C<< TrailingData => $scalar >>
-
-=item Examples
-
-=back
-
-=item OO Interface
-
-=over 4
-
-=item Constructor
-
-A filename, A filehandle, A scalar reference
-
-=item Constructor Options
-
-C<< AutoClose => 0|1 >>, C<< MultiStream => 0|1 >>, C<< Prime => $string
->>, C<< Transparent => 0|1 >>, C<< BlockSize => $num >>, C<< InputLength =>
-$size >>, C<< Append => 0|1 >>, C<< Strict => 0|1 >>
-
-=item Examples
-
-=back
-
-=item Methods
-
-=over 4
-
-=item read
-
-=item read
-
-=item getline
-
-=item getc
-
-=item ungetc
-
-=item inflateSync
-
-=item getHeaderInfo
-
-=item tell
-
-=item eof
-
-=item seek
-
-=item binmode
-
-=item opened
-
-=item autoflush
-
-=item input_line_number
-
-=item fileno
-
-=item close
-
-=item nextStream
-
-=item trailingData
-
-=back
-
-=item Importing
-
-:all
-
-=item EXAMPLES
-
-=over 4
-
-=item Working with Net::FTP
-
-=item Walking through a zip file
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 IO_Compress_Zlib::pod::FAQ, IO::Compress::Zlib::FAQ -- Frequently
-Asked Questions about IO::Compress::Zlib
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Compatibility with Unix compress/uncompress.
-
-=item Accessing .tar.Z files
-
-=item Accessing Zip Files
-
-=item Compressed files and Net::FTP
-
-=item How do I recompress using a different compression?
-
-=item Apache::GZip Revisited
-
-=item Using C<InputLength> to uncompress data embedded in a larger
-file/buffer.
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item MODIFICATION HISTORY
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 IPC::Msg - SysV Msg IPC object class
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-new ( KEY , FLAGS ), id, rcv ( BUF, LEN [, TYPE [, FLAGS ]] ), remove, set
-( STAT ), set ( NAME => VALUE [, NAME => VALUE ...] ), snd ( TYPE, MSG [,
-FLAGS ] ), stat
-
-=item SEE ALSO
-
-=item AUTHORS
-
-=item COPYRIGHT
-
-=back
-
-=head2 IPC::Open2, open2 - open a process for both reading and writing
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item WARNING
-
-=item SEE ALSO
-
-=back
-
-=head2 IPC::Open3, open3 - open a process for reading, writing, and error
-handling
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item See Also
-
-L<IPC::Open2>, L<IPC::Run>
-
-=item WARNING
-
-=back
-
-=head2 IPC::Semaphore - SysV Semaphore IPC object class
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-new ( KEY , NSEMS , FLAGS ), getall, getncnt ( SEM ), getpid ( SEM ),
-getval ( SEM ), getzcnt ( SEM ), id, op ( OPLIST ), remove, set ( STAT ),
-set ( NAME => VALUE [, NAME => VALUE ...] ), setall ( VALUES ), setval ( N
-, VALUE ), stat
-
-=item SEE ALSO
-
-=item AUTHORS
-
-=item COPYRIGHT
-
-=back
-
-=head2 IPC::SharedMem - SysV Shared Memory IPC object class
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-new ( KEY , SIZE , FLAGS ), id, read ( POS, SIZE ), write ( STRING, POS,
-SIZE ), remove, is_removed, stat, attach ( [FLAG] ), detach, addr
-
-=item SEE ALSO
-
-=item AUTHORS
-
-=item COPYRIGHT
-
-=back
-
-=head2 IPC::SysV - System V IPC constants and system calls
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-ftok( PATH ), ftok( PATH, ID ), shmat( ID, ADDR, FLAG ), shmdt( ADDR ),
-memread( ADDR, VAR, POS, SIZE ), memwrite( ADDR, STRING, POS, SIZE )
-
-=item SEE ALSO
-
-=item AUTHORS
-
-=item COPYRIGHT
-
-=back
-
-=head2 IPC::SysV::lib::IPC::Msg, IPC::Msg - SysV Msg IPC object class
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-new ( KEY , FLAGS ), id, rcv ( BUF, LEN [, TYPE [, FLAGS ]] ), remove, set
-( STAT ), set ( NAME => VALUE [, NAME => VALUE ...] ), snd ( TYPE, MSG [,
-FLAGS ] ), stat
-
-=item SEE ALSO
-
-=item AUTHORS
-
-=item COPYRIGHT
-
-=back
-
-=head2 IPC::SysV::lib::IPC::Semaphore, IPC::Semaphore - SysV Semaphore IPC
-object class
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-new ( KEY , NSEMS , FLAGS ), getall, getncnt ( SEM ), getpid ( SEM ),
-getval ( SEM ), getzcnt ( SEM ), id, op ( OPLIST ), remove, set ( STAT ),
-set ( NAME => VALUE [, NAME => VALUE ...] ), setall ( VALUES ), setval ( N
-, VALUE ), stat
-
-=item SEE ALSO
-
-=item AUTHORS
-
-=item COPYRIGHT
-
-=back
-
-=head2 IPC::SysV::lib::IPC::SharedMem, IPC::SharedMem - SysV Shared Memory
-IPC object class
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-new ( KEY , SIZE , FLAGS ), id, read ( POS, SIZE ), write ( STRING, POS,
-SIZE ), remove, is_removed, stat, attach ( [FLAG] ), detach, addr
-
-=item SEE ALSO
-
-=item AUTHORS
-
-=item COPYRIGHT
-
-=back
-
-=head2 IPC::SysV::lib::IPC::SysV, IPC::SysV - System V IPC constants and
-system calls
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-ftok( PATH ), ftok( PATH, ID ), shmat( ID, ADDR, FLAG ), shmdt( ADDR ),
-memread( ADDR, VAR, POS, SIZE ), memwrite( ADDR, STRING, POS, SIZE )
-
-=item SEE ALSO
-
-=item AUTHORS
-
-=item COPYRIGHT
-
-=back
-
-=head2 IPCmd, IPC::Cmd - finding and running system commands made easy
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CLASS METHODS
-
-=over 4
-
-=item $ipc_run_version = IPC::Cmd->can_use_ipc_run( [VERBOSE] )
-
-=back
-
-=back
-
-=over 4
-
-=item $ipc_open3_version = IPC::Cmd->can_use_ipc_open3( [VERBOSE] )
-
-=back
-
-=over 4
-
-=item $bool = IPC::Cmd->can_capture_buffer
-
-=back
-
-=over 4
-
-=item FUNCTIONS
-
-=over 4
-
-=item $path = can_run( PROGRAM );
-
-=back
-
-=back
-
-=over 4
-
-=item $ok | ($ok, $err, $full_buf, $stdout_buff, $stderr_buff) = run(
-command => COMMAND, [verbose => BOOL, buffer => \$SCALAR, timeout => DIGIT]
-);
-
-command, verbose, buffer, timeout, success, error message, full_buffer,
-out_buffer, error_buffer
-
-=back
-
-=over 4
-
-=item $q = QUOTE
-
-=back
-
-=over 4
-
-=item HOW IT WORKS
-
-=item Global Variables
-
-=over 4
-
-=item $IPC::Cmd::VERBOSE
-
-=item $IPC::Cmd::USE_IPC_RUN
-
-=item $IPC::Cmd::USE_IPC_OPEN3
-
-=item $IPC::Cmd::WARN
-
-=back
-
-=item Caveats
-
-Whitespace and IPC::Open3 / system(), Whitespace and IPC::Run, IO Redirect,
-Interleaving STDOUT/STDERR
-
-=item See Also
-
-=item ACKNOWLEDGEMENTS
-
-=item BUG REPORTS
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 List::Util - A selection of general-utility list subroutines
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-first BLOCK LIST, max LIST, maxstr LIST, min LIST, minstr LIST, reduce
-BLOCK LIST, shuffle LIST, sum LIST
-
-=item KNOWN BUGS
-
-=item SUGGESTED ADDITIONS
-
-=item SEE ALSO
-
-=item COPYRIGHT
-
-=back
-
-=head2 List::Utilib::List::Util, List::Util - A selection of
-general-utility list subroutines
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-first BLOCK LIST, max LIST, maxstr LIST, min LIST, minstr LIST, reduce
-BLOCK LIST, shuffle LIST, sum LIST
-
-=item KNOWN BUGS
-
-=item SUGGESTED ADDITIONS
-
-=item SEE ALSO
-
-=item COPYRIGHT
-
-=back
-
-=head2 List::Utilib::Scalar::Util, Scalar::Util - A selection of
-general-utility scalar subroutines
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-blessed EXPR, dualvar NUM, STRING, isvstring EXPR, isweak EXPR,
-looks_like_number EXPR, openhandle FH, refaddr EXPR, reftype EXPR,
-set_prototype CODEREF, PROTOTYPE, tainted EXPR, weaken REF
-
-=item KNOWN BUGS
-
-=item SEE ALSO
-
-=item COPYRIGHT
-
-=back
-
-=head2 Locale::Constants - constants for Locale codes
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item KNOWN BUGS AND LIMITATIONS
-
-=item SEE ALSO
-
-Locale::Language, Locale::Country, Locale::Script, Locale::Currency
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 Locale::Country - ISO codes for country identification (ISO 3166)
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-B<alpha-2>, B<alpha-3>, B<numeric>
-
-=item CONVERSION ROUTINES
-
-code2country( CODE, [ CODESET ] ), country2code( STRING, [ CODESET ] ),
-country_code2code( CODE, CODESET, CODESET )
-
-=item QUERY ROUTINES
-
-C<all_country_codes( [ CODESET ] )>, C<all_country_names( [ CODESET ] )>
-
-=item SEMI-PRIVATE ROUTINES
-
-=over 4
-
-=item alias_code
-
-=item rename_country
-
-=back
-
-=item EXAMPLES
-
-=item DOMAIN NAMES
-
-=item KNOWN BUGS AND LIMITATIONS
-
-=item SEE ALSO
-
-Locale::Language, Locale::Script, Locale::Currency, Locale::SubCountry, ISO
-3166-1, http://www.iso.org/iso/en/prods-services/iso3166ma/index.html,
-http://www.egt.ie/standards/iso3166/iso3166-1-en.html,
-http://www.cia.gov/cia/publications/factbook/docs/app-d-1.html
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 Locale::Currency - ISO three letter codes for currency
-identification (ISO 4217)
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-XTS, XXX
-
-=item CONVERSION ROUTINES
-
-code2currency(), currency2code()
-
-=item QUERY ROUTINES
-
-C<all_currency_codes()>, C<all_currency_names()>
-
-=item EXAMPLES
-
-=item KNOWN BUGS AND LIMITATIONS
-
-=item SEE ALSO
-
-Locale::Country, Locale::Script, ISO 4217:1995,
-http://www.bsi-global.com/iso4217currency
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 Locale::Language - ISO two letter codes for language identification
-(ISO 639)
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CONVERSION ROUTINES
-
-code2language(), language2code()
-
-=item QUERY ROUTINES
-
-C<all_language_codes()>, C<all_language_names()>
-
-=item EXAMPLES
-
-=item KNOWN BUGS AND LIMITATIONS
-
-=item SEE ALSO
-
-Locale::Country, Locale::Script, Locale::Currency, ISO 639:1988 (E/F),
-http://lcweb.loc.gov/standards/iso639-2/langhome.html
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 Locale::Maketext - framework for localization
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item QUICK OVERVIEW
-
-=item METHODS
-
-=over 4
-
-=item Construction Methods
-
-=item The "maketext" Method
-
-$lh->fail_with I<or> $lh->fail_with(I<PARAM>), $lh->failure_handler_auto
-
-=item Utility Methods
-
-$language->quant($number, $singular), $language->quant($number, $singular,
-$plural), $language->quant($number, $singular, $plural, $negative),
-$language->numf($number), $language->sprintf($format, @items),
-$language->language_tag(), $language->encoding()
-
-=item Language Handle Attributes and Internals
-
-=back
-
-=item LANGUAGE CLASS HIERARCHIES
-
-=item ENTRIES IN EACH LEXICON
-
-=item BRACKET NOTATION
-
-=item AUTO LEXICONS
-
-=item CONTROLLING LOOKUP FAILURE
-
-=item HOW TO USE MAKETEXT
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMER
-
-=item AUTHOR
-
-=back
-
-=head2 Locale::Maketext::Simple - Simple interface to
-Locale::Maketext::Lexicon
-
-=over 4
-
-=item VERSION
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item OPTIONS
-
-=over 4
-
-=item Class
-
-=item Path
-
-=item Style
-
-=item Export
-
-=item Subclass
-
-=item Decode
-
-=item Encoding
-
-=back
-
-=back
-
-=over 4
-
-=item ACKNOWLEDGMENTS
-
-=item SEE ALSO
-
-=item AUTHORS
-
-=item COPYRIGHT
-
-=over 4
-
-=item The "MIT" License
-
-=back
-
-=back
-
-=head2 Locale::Maketext::TPJ13 -- article about software localization
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Localization and Perl: gettext breaks, Maketext fixes
-
-=over 4
-
-=item A Localization Horror Story: It Could Happen To You
-
-=item The Linguistic View
-
-=item Breaking gettext
-
-=item Replacing gettext
-
-=item Buzzwords: Abstraction and Encapsulation
-
-=item Buzzword: Isomorphism
-
-=item Buzzword: Inheritance
-
-=item Buzzword: Concision
-
-=item The Devil in the Details
-
-=item The Proof in the Pudding: Localizing Web Sites
-
-=item References
-
-=back
-
-=back
-
-=head2 Locale::Script - ISO codes for script identification (ISO 15924)
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-B<alpha-2>, B<alpha-3>, B<numeric>
-
-=over 4
-
-=item SPECIAL CODES
-
-=back
-
-=item CONVERSION ROUTINES
-
-code2script( CODE, [ CODESET ] ), script2code( STRING, [ CODESET ] ),
-script_code2code( CODE, CODESET, CODESET )
-
-=item QUERY ROUTINES
-
-C<all_script_codes ( [ CODESET ] )>, C<all_script_names ( [ CODESET ] )>
-
-=item EXAMPLES
-
-=item KNOWN BUGS AND LIMITATIONS
-
-=item SEE ALSO
-
-Locale::Language, Locale::Currency, Locale::Country, ISO 15924,
-http://www.evertype.com/standards/iso15924/
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 Log::Message - A generic message storing mechanism;
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Hierarchy
-
-Log::Message, Log::Message::Item, Log::Message::Handlers,
-Log::Message::Config
-
-=item Options
-
-config, private, verbose, tag, level, remove, chrono
-
-=back
-
-=over 4
-
-=item Methods
-
-=over 4
-
-=item new
-
-=back
-
-=back
-
-=over 4
-
-=item store
-
-message, tag, level, extra
-
-=back
-
-=over 4
-
-=item retrieve
-
-tag, level, message, amount, chrono, remove
-
-=back
-
-=over 4
-
-=item first
-
-=back
-
-=over 4
-
-=item last
-
-=back
-
-=over 4
-
-=item flush
-
-=back
-
-=over 4
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item Acknowledgements
-
-=item COPYRIGHT
-
-=back
-
-=head2 Log::Message::Config - Configuration options for Log::Message
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item Acknowledgements
-
-=item COPYRIGHT
-
-=back
-
-=head2 Log::Message::Handlers - Message handlers for Log::Message
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Default Handlers
-
-=over 4
-
-=item log
-
-=back
-
-=back
-
-=over 4
-
-=item carp
-
-=back
-
-=over 4
-
-=item croak
-
-=back
-
-=over 4
-
-=item cluck
-
-=back
-
-=over 4
-
-=item confess
-
-=back
-
-=over 4
-
-=item die
-
-=back
-
-=over 4
-
-=item warn
-
-=back
-
-=over 4
-
-=item trace
-
-=back
-
-=over 4
-
-=item Custom Handlers
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item Acknowledgements
-
-=item COPYRIGHT
-
-=back
-
-=head2 Log::Message::Item - Message objects for Log::Message
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Methods and Accessors
-
-=over 4
-
-=item remove
-
-=item id
-
-=item when
-
-=item message
-
-=item level
-
-=item tag
-
-=item shortmess
-
-=item longmess
-
-=item parent
-
-=back
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item Acknowledgements
-
-=item COPYRIGHT
-
-=back
-
-=head2 Log::Message::Simple
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item FUNCTIONS
-
-=over 4
-
-=item msg("message string" [,VERBOSE])
-
-=item debug("message string" [,VERBOSE])
-
-=item error("error string" [,VERBOSE])
-
-=back
-
-=back
-
-=over 4
-
-=item carp();
-
-=item croak();
-
-=item confess();
-
-=item cluck();
-
-=back
-
-=over 4
-
-=item CLASS METHODS
-
-=over 4
-
-=item Log::Message::Simple->stack()
-
-=item Log::Message::Simple->stack_as_string([TRACE])
-
-=item Log::Message::Simple->flush()
-
-=back
-
-=back
-
-=over 4
-
-=item GLOBAL VARIABLES
-
-$ERROR_FH, $MSG_FH, $DEBUG_FH, $STACKTRACE_ON_ERROR
-
-=back
-
-=head2 MIME::Base64 - Encoding and decoding of base64 strings
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-encode_base64($str), encode_base64($str, $eol);, decode_base64($str)
-
-=item DIAGNOSTICS
-
-Premature end of base64 data, Premature padding of base64 data, Wide
-character in subroutine entry
-
-=item EXAMPLES
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=head2 MIME::Base64::QuotedPrint, MIME::QuotedPrint - Encoding and decoding
-of quoted-printable strings
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-encode_qp($str), encode_qp($str, $eol), encode_qp($str, $eol, $binmode),
-decode_qp($str);
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=head2 MIME::QuotedPrint - Encoding and decoding of quoted-printable
-strings
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-encode_qp($str), encode_qp($str, $eol), encode_qp($str, $eol, $binmode),
-decode_qp($str);
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=head2 Math::BigFloat - Arbitrary size floating point math package
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Canonical notation
-
-=item Output
-
-=item C<mantissa()>, C<exponent()> and C<parts()>
-
-=item Accuracy vs. Precision
-
-=item Rounding
-
-ffround ( +$scale ), ffround ( -$scale ), ffround ( 0 ), fround ( +$scale
-), fround ( -$scale ) and fround ( 0 )
-
-=back
-
-=item METHODS
-
-=over 4
-
-=item accuracy
-
-=item precision()
-
-=item bexp()
-
-=item bnok()
-
-=item bpi()
-
-=item bcos()
-
-=item bsin()
-
-=item batan2()
-
-=item batan()
-
-=item bmuladd()
-
-=back
-
-=item Autocreating constants
-
-=over 4
-
-=item Math library
-
-=item Using Math::BigInt::Lite
-
-=back
-
-=item EXPORTS
-
-=item BUGS
-
-=item CAVEATS
-
-stringify, bstr(), bdiv, brsft, Modifying and =, bpow, precision() vs.
-accuracy()
-
-=item SEE ALSO
-
-=item LICENSE
-
-=item AUTHORS
-
-=back
-
-=head2 Math::BigInt - Arbitrary size integer/float math package
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-Input, Output
-
-=item METHODS
-
-=over 4
-
-=item config()
-
-=item accuracy()
-
-=item precision()
-
-=item brsft()
-
-=item new()
-
-=item from_oct()
-
-=item from_hex()
-
-=item from_bin()
-
-=item bnan()
-
-=item bzero()
-
-=item binf()
-
-=item bone()
-
-=item is_one()/is_zero()/is_nan()/is_inf()
-
-=item is_pos()/is_neg()/is_positive()/is_negative()
-
- $x->is_pos(); # true if > 0
- $x->is_neg(); # true if < 0
-
-=item is_odd()/is_even()/is_int()
-
-=item bcmp()
-
-=item bacmp()
-
-=item sign()
-
-=item digit()
-
-=item bneg()
-
-=item babs()
-
-=item bnorm()
-
-=item bnot()
-
-=item binc()
-
-=item bdec()
-
-=item badd()
-
-=item bsub()
-
-=item bmul()
-
-=item bmuladd()
-
-=item bdiv()
-
-=item bmod()
-
-=item bmodinv()
-
-=item bmodpow()
-
-=item bpow()
-
-=item blog()
-
-=item bexp()
-
-=item bnok()
-
-=item bpi()
-
-=item bcos()
-
-=item bsin()
-
-=item batan2()
-
-=item batan()
-
-=item blsft()
-
-=item brsft()
-
-=item band()
-
-=item bior()
-
-=item bxor()
-
-=item bnot()
-
-=item bsqrt()
-
-=item broot()
-
-=item bfac()
-
-=item round()
-
-=item bround()
-
-=item bfround()
-
-=item bfloor()
-
-=item bceil()
-
-=item bgcd()
-
-=item blcm()
-
-=item exponent()
-
-=item mantissa()
-
-=item parts()
-
-=item copy()
-
-=item as_int()/as_number()
-
-=item bsstr()
-
-=item as_hex()
-
-=item as_bin()
-
-=item as_oct()
-
-=item numify()
-
-=item modify()
-
-=item upgrade()/downgrade()
-
-=item div_scale()
-
-=item round_mode()
-
-=back
-
-=item ACCURACY and PRECISION
-
-=over 4
-
-=item Precision P
-
-=item Accuracy A
-
-=item Fallback F
-
-=item Rounding mode R
-
-'trunc', 'even', 'odd', '+inf', '-inf', 'zero', 'common', Precision,
-Accuracy (significant digits), Setting/Accessing, Creating numbers, Usage,
-Precedence, Overriding globals, Local settings, Rounding, Default values,
-Remarks
-
-=back
-
-=item Infinity and Not a Number
-
-oct()/hex(), log(-inf), exp(), cos(), sin(), atan2()
-
-=item INTERNALS
-
-=over 4
-
-=item MATH LIBRARY
-
-=item SIGN
-
-=item mantissa(), exponent() and parts()
-
-=back
-
-=item EXAMPLES
-
- use Math::BigInt;
-
-=item Autocreating constants
-
-=item PERFORMANCE
-
-=over 4
-
-=item Alternative math libraries
-
-=item SUBCLASSING
-
-=back
-
-=item Subclassing Math::BigInt
-
-=item UPGRADING
-
-=over 4
-
-=item Auto-upgrade
-
-bsqrt(), div(), blog(), bexp()
-
-=back
-
-=item EXPORTS
-
-=item CAVEATS
-
-bstr(), bsstr() and 'cmp', int(), length, bdiv, infinity handling,
-Modifying and =, bpow, Overloading -$x, Mixing different object types,
-bsqrt(), brsft()
-
-=item LICENSE
-
-=item SEE ALSO
-
-=item AUTHORS
-
-=back
-
-=head2 Math::BigInt::Calc - Pure Perl module to support Math::BigInt
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item STORAGE
-
-=item METHODS
-
-=item WRAP YOUR OWN
-
-=item LICENSE
-
-This program is free software; you may redistribute it and/or modify it
-under
-the same terms as Perl itself.
-
-=item AUTHORS
-
-=item SEE ALSO
-
-=back
-
-=head2 Math::BigInt::CalcEmu - Emulate low-level math with BigInt code
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item __emu_bxor
-
-=item __emu_band
-
-=item __emu_bior
-
-=back
-
-=item LICENSE
-
-This program is free software; you may redistribute it and/or modify it
-under
-the same terms as Perl itself.
-
-=item AUTHORS
-
-=item SEE ALSO
-
-=back
-
-=head2 Math::BigInt::FastCalc - Math::BigInt::Calc with some XS for more
-speed
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item STORAGE
-
-=item METHODS
-
-=item LICENSE
-
-This program is free software; you may redistribute it and/or modify it
-under
-the same terms as Perl itself.
-
-=item AUTHORS
-
-=item SEE ALSO
-
-=back
-
-=head2 Math::BigRat - Arbitrary big rational numbers
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item MATH LIBRARY
-
-=back
-
-=item METHODS
-
-=over 4
-
-=item new()
-
-=item numerator()
-
-=item denominator()
-
- $d = $x->denominator();
-
-=item parts()
-
-=item numify()
-
-=item as_int()/as_number()
-
-=item as_float()
-
-=item as_hex()
-
-=item as_bin()
-
-=item as_oct()
-
-=item from_hex()/from_bin()/from_oct()
-
-=item length()
-
-=item digit()
-
-=item bnorm()
-
-=item bfac()
-
-=item bround()/round()/bfround()
-
-=item bmod()
-
-=item bneg()
-
-=item is_one()
-
-=item is_zero()
-
-=item is_pos()/is_positive()
-
-=item is_neg()/is_negative()
-
-=item is_int()
-
-=item is_odd()
-
-=item is_even()
-
-=item bceil()
-
-=item bfloor()
-
- $x->bfloor();
-
-=item bsqrt()
-
- $x->bsqrt();
-
-=item broot()
-
- $x->broot($n);
-
-=item badd()/bmul()/bsub()/bdiv()/bdec()/binc()
-
-=item copy()
-
-=item bstr()/bsstr()
-
-=item bacmp()/bcmp()
-
-=item blsft()/brsft()
-
-=item bpow()
-
-=item bexp()
-
-=item bnok()
-
-=item config()
-
-=item objectify()
-
-=back
-
-=item BUGS
-
-inf handling (partial), NaN handling (partial), rounding (not implemented
-except for bceil/bfloor), $x ** $y where $y is not an integer, bmod(),
-blog(), bmodinv() and bmodpow() (partial)
-
-=item LICENSE
-
-=item SEE ALSO
-
-=item AUTHORS
-
-=back
-
-=head2 Math::Complex - complex numbers and associated mathematical
-functions
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item OPERATIONS
-
-=item CREATION
-
-=item DISPLAYING
-
-=over 4
-
-=item CHANGED IN PERL 5.6
-
-=back
-
-=item USAGE
-
-=item CONSTANTS
-
-=over 4
-
-=item PI
-
-=item Inf
-
-=back
-
-=item ERRORS DUE TO DIVISION BY ZERO OR LOGARITHM OF ZERO
-
-=item ERRORS DUE TO INDIGESTIBLE ARGUMENTS
-
-=item BUGS
-
-=item SEE ALSO
-
-=item AUTHORS
-
-=item LICENSE
-
-=back
-
-=head2 Math::Trig - trigonometric functions
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item TRIGONOMETRIC FUNCTIONS
-
-B<tan>
-
-=over 4
-
-=item ERRORS DUE TO DIVISION BY ZERO
-
-=item SIMPLE (REAL) ARGUMENTS, COMPLEX RESULTS
-
-=back
-
-=item PLANE ANGLE CONVERSIONS
-
-deg2rad, grad2rad, rad2deg, grad2deg, deg2grad, rad2grad, rad2rad, deg2deg,
-grad2grad
-
-=item RADIAL COORDINATE CONVERSIONS
-
-=over 4
-
-=item COORDINATE SYSTEMS
-
-=item 3-D ANGLE CONVERSIONS
-
-cartesian_to_cylindrical, cartesian_to_spherical, cylindrical_to_cartesian,
-cylindrical_to_spherical, spherical_to_cartesian, spherical_to_cylindrical
-
-=back
-
-=item GREAT CIRCLE DISTANCES AND DIRECTIONS
-
-=over 4
-
-=item great_circle_distance
-
-=item great_circle_direction
-
-=item great_circle_bearing
-
-=item great_circle_destination
-
-=item great_circle_midpoint
-
-=item great_circle_waypoint
-
-=back
-
-=item EXAMPLES
-
-=over 4
-
-=item CAVEAT FOR GREAT CIRCLE FORMULAS
-
-=item Real-valued asin and acos
-
-asin_real, acos_real
-
-=back
-
-=item BUGS
-
-=item AUTHORS
-
-=item LICENSE
-
-=back
-
-=head2 Memoize - Make functions faster by trading space for time
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item DETAILS
-
-=item OPTIONS
-
-=over 4
-
-=item INSTALL
-
-=item NORMALIZER
-
-=item C<SCALAR_CACHE>, C<LIST_CACHE>
-
-C<MEMORY>, C<HASH>, C<TIE>, C<FAULT>, C<MERGE>
-
-=back
-
-=item OTHER FACILITIES
-
-=over 4
-
-=item C<unmemoize>
-
-=item C<flush_cache>
-
-=back
-
-=item CAVEATS
-
-=item PERSISTENT CACHE SUPPORT
-
-=item EXPIRATION SUPPORT
-
-=item BUGS
-
-=item MAILING LIST
-
-=item AUTHOR
-
-=item COPYRIGHT AND LICENSE
-
-=item THANK YOU
-
-=back
-
-=head2 Memoize::AnyDBM_File - glue to provide EXISTS for AnyDBM_File for
-Storable use
-
-=over 4
-
-=item DESCRIPTION
-
-=back
-
-=head2 Memoize::Expire - Plug-in module for automatic expiration of
-memoized values
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item INTERFACE
-
- TIEHASH, EXISTS, STORE
-
-=item ALTERNATIVES
-
-=item CAVEATS
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 Memoize::ExpireFile - test for Memoize expiration semantics
-
-=over 4
-
-=item DESCRIPTION
-
-=back
-
-=head2 Memoize::ExpireTest - test for Memoize expiration semantics
-
-=over 4
-
-=item DESCRIPTION
-
-=back
-
-=head2 Memoize::NDBM_File - glue to provide EXISTS for NDBM_File for
-Storable use
-
-=over 4
-
-=item DESCRIPTION
-
-=back
-
-=head2 Memoize::SDBM_File - glue to provide EXISTS for SDBM_File for
-Storable use
-
-=over 4
-
-=item DESCRIPTION
-
-=back
-
-=head2 Memoize::Storable - store Memoized data in Storable database
-
-=over 4
-
-=item DESCRIPTION
-
-=back
-
-=head2 Module::Build - Build and install Perl modules
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item GUIDE TO DOCUMENTATION
-
-General Usage (L<Module::Build>), Authoring Reference
-(L<Module::Build::Authoring>), API Reference (L<Module::Build::API>),
-Cookbook (L<Module::Build::Cookbook>)
-
-=item ACTIONS
-
-build, clean, code, config_data, diff, dist, distcheck, distclean, distdir,
-distmeta, distsign, disttest, docs, fakeinstall, help, html, install,
-manifest, manpages, pardist, ppd, ppmdist, prereq_report, pure_install,
-realclean, retest, skipcheck, test, testall, testcover, testdb, testpod,
-testpodcoverage, versioninstall
-
-=item OPTIONS
-
-=over 4
-
-=item Command Line Options
-
-quiet, use_rcfile, verbose, allow_mb_mismatch
-
-=item Default Options File (F<.modulebuildrc>)
-
-=back
-
-=item INSTALL PATHS
-
-lib, arch, script, bin, bindoc, libdoc, binhtml, libhtml, installdirs,
-install_path, install_base, destdir, prefix
-
-=item MOTIVATIONS
-
-+, +
-
-=item TO DO
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=head2 Module::Build::API - API Reference for Module Authors
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item CONSTRUCTORS
-
-current(), new(), add_to_cleanup, auto_features, autosplit, build_class,
-build_requires, create_packlist, c_source, conflicts, create_makefile_pl,
-create_readme, dist_abstract, dist_author, dist_name, dist_version,
-dist_version_from, dynamic_config, extra_compiler_flags,
-extra_linker_flags, get_options, type, store, default, include_dirs,
-install_path, installdirs, license, apache, artistic, artistic_2, bsd, gpl,
-lgpl, mit, mozilla, open_source, perl, restrictive, unrestricted, meta_add,
-meta_merge, module_name, PL_files, pm_files, pod_files, recommends,
-recursive_test_files, requires, script_files, sign, test_files,
-use_tap_harness, tap_harness_args, xs_files, new_from_context(%args),
-resume(), subclass()
-
-=item METHODS
-
-add_build_element($type), add_to_cleanup(@files), args(),
-autosplit_file($from, $to), base_dir(), build_requires(), cbuilder(),
-check_installed_status($module, $version), check_installed_version($module,
-$version), compare_versions($v1, $op, $v2), config($key), config($key,
-$value), config() [deprecated], config_data($name), config_data($name =>
-$value), conflicts(), contains_pod($file), copy_if_modified(%parameters),
-create_build_script(), current_action(), depends_on(@actions),
-dir_contains($first_dir, $second_dir), dispatch($action, %args),
-dist_dir(), dist_name(), dist_version(), do_system($cmd, @args),
-feature($name), feature($name => $value), fix_shebang_line(@files),
-have_c_compiler(), install_base_relpaths(), install_base_relpaths($type),
-install_base_relpaths($type => $path), install_destination($type),
-install_path(), install_path($type), install_path($type => $path),
-install_types(), invoked_action(), notes(), notes($key), notes($key =>
-$value), orig_dir(), os_type(), is_vmsish(), is_windowsish(), is_unixish(),
-prefix_relpaths(), prefix_relpaths($installdirs),
-prefix_relpaths($installdirs, $type), prefix_relpaths($installdirs, $type
-=> $path), prepare_metadata(), prereq_failures(), prereq_report(),
-prompt($message, $default), recommends(), requires(), rscan_dir($dir,
-$pattern), runtime_params(), runtime_params($key), script_files(),
-up_to_date($source_file, $derived_file), up_to_date(\@source_files,
-\@derived_files), y_n($message, $default)
-
-=item Autogenerated Accessors
-
-PL_files(), allow_mb_mismatch(), autosplit(), base_dir(), bindoc_dirs(),
-blib(), build_bat(), build_class(), build_elements(), build_requires(),
-build_script(), c_source(), config_dir(), configure_requires(),
-conflicts(), create_makefile_pl(), create_packlist(), create_readme(),
-debugger(), destdir(), get_options(), html_css(), include_dirs(),
-install_base(), install_sets(), installdirs(), libdoc_dirs(), license(),
-magic_number(), mb_version(), meta_add(), meta_merge(), metafile(),
-module_name(), orig_dir(), original_prefix(), perl(), pm_files(),
-pod_files(), pollute(), prefix(), prereq_action_types(), program_name(),
-quiet(), recommends(), recurse_into(), recursive_test_files(), requires(),
-scripts(), sign(), tap_harness_args(), test_file_exts(), use_rcfile(),
-use_tap_harness(), verbose(), xs_files()
-
-=back
-
-=item MODULE METADATA
-
-keywords, resources
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=head2 Module::Build::Authoring - Authoring Module::Build modules
-
-=over 4
-
-=item DESCRIPTION
-
-=item STRUCTURE
-
-=item SUBCLASSING
-
-=item PREREQUISITES
-
-=over 4
-
-=item Types of prerequisites
-
-configure_requires, build_requires, requires, recommends, conflicts
-
-=item Format of prerequisites
-
-=item XS Extensions
-
-=back
-
-=item SAVING CONFIGURATION INFORMATION
-
-=item STARTING MODULE DEVELOPMENT
-
-=item AUTOMATION
-
-=item MIGRATION
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 Module::Build::Base - Default methods for Module::Build
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=head2 Module::Build::Compat - Compatibility with ExtUtils::MakeMaker
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-create_makefile_pl($style, $build), small, passthrough, traditional,
-run_build_pl(args => \@ARGV), args, script, write_makefile(), makefile
-
-=item SCENARIOS
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=head2 Module::Build::ConfigData - Configuration for Module::Build
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-config($name), feature($name), set_config($name, $value),
-set_feature($name, $value), config_names(), feature_names(),
-auto_feature_names(), write()
-
-=item AUTHOR
-
-=back
-
-=head2 Module::Build::Cookbook - Examples of Module::Build Usage
-
-=over 4
-
-=item DESCRIPTION
-
-=item BASIC RECIPES
-
-=over 4
-
-=item Installing modules that use Module::Build
-
-=item Modifying Config.pm values
-
-=item Installing modules using the programmatic interface
-
-=item Installing to a temporary directory
-
-=item Installing to a non-standard directory
-
-=item Installing in the same location as ExtUtils::MakeMaker
-
-=item Running a single test file
-
-=back
-
-=item ADVANCED RECIPES
-
-=over 4
-
-=item Making a CPAN.pm-compatible distribution
-
-=item Changing the order of the build process
-
-=item Adding new file types to the build process
-
-=item Adding new elements to the install process
-
-=back
-
-=item EXAMPLES ON CPAN
-
-=over 4
-
-=item SVN-Notify-Mirror
-
-1. Using C<auto_features>, I check to see whether two optional modules are
-available - SVN::Notify::Config and Net::SSH;, 2. If the S::N::Config
-module is loaded, I automatically generate testfiles for it during Build
-(using the C<PL_files> property), 3. If the C<ssh_feature> is available, I
-ask if the user wishes to perform the ssh tests (since it requires a little
-preliminary setup);, 4. Only if the user has C<ssh_feature> and answers yes
-to the testing, do I generate a test file
-
-=item Modifying an action
-
-=back
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=head2 Module::Build::ModuleInfo, ModuleInfo - Gather package and POD
-information from a perl module files
-
-=over 4
-
-=item DESCRIPTION
-
-new_from_file($filename, collect_pod => 1), new_from_module($module,
-collect_pod => 1, inc => \@dirs), name(), version($package), filename(),
-packages_inside(), pod_inside(), contains_pod(), pod($section),
-find_module_by_name($module, \@dirs), find_module_dir_by_name($module,
-\@dirs)
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=head2 Module::Build::Notes, $notes_name - Configuration for $module_name
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-config(\$name), feature(\$name), set_config(\$name, \$value),
-set_feature(\$name, \$value), config_names(), feature_names(),
-auto_feature_names(), write()
-
-=item AUTHOR
-
-=back
-
-=head2 Module::Build::PPMMaker - Perl Package Manager file creation
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=head2 Module::Build::Platform::Amiga - Builder class for Amiga platforms
-
-=over 4
-
-=item DESCRIPTION
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 Module::Build::Platform::Default - Stub class for unknown platforms
-
-=over 4
-
-=item DESCRIPTION
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 Module::Build::Platform::EBCDIC - Builder class for EBCDIC platforms
-
-=over 4
-
-=item DESCRIPTION
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 Module::Build::Platform::MPEiX - Builder class for MPEiX platforms
-
-=over 4
-
-=item DESCRIPTION
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 Module::Build::Platform::MacOS - Builder class for MacOS platforms
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Overriden Methods
-
-new(), make_executable(), dispatch(), ACTION_realclean()
-
-=back
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 Module::Build::Platform::RiscOS - Builder class for RiscOS platforms
-
-=over 4
-
-=item DESCRIPTION
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 Module::Build::Platform::Unix - Builder class for Unix platforms
-
-=over 4
-
-=item DESCRIPTION
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 Module::Build::Platform::VMS - Builder class for VMS platforms
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Overridden Methods
-
-_set_defaults
-
-=back
-
-=back
-
-cull_args
-
-manpage_separator
-
-prefixify
-
-_quote_args
-
-have_forkpipe
-
-_backticks
-
-do_system
-
-_infer_xs_spec
-
-rscan_dir
-
-dist_dir
-
-man3page_name
-
-expand_test_dir
-
-_detildefy
-
-find_perl_interpreter
-
-localize_file_path
-
-localize_dir_path
-
-=over 4
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 Module::Build::Platform::VOS - Builder class for VOS platforms
-
-=over 4
-
-=item DESCRIPTION
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 Module::Build::Platform::Windows - Builder class for Windows
-platforms
-
-=over 4
-
-=item DESCRIPTION
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 Module::Build::Platform::aix - Builder class for AIX platform
-
-=over 4
-
-=item DESCRIPTION
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 Module::Build::Platform::cygwin - Builder class for Cygwin platform
-
-=over 4
-
-=item DESCRIPTION
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 Module::Build::Platform::darwin - Builder class for Mac OS X
-platform
-
-=over 4
-
-=item DESCRIPTION
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 Module::Build::Platform::os2 - Builder class for OS/2 platform
-
-=over 4
-
-=item DESCRIPTION
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 Module::Build::YAML - Provides just enough YAML support so that
-Module::Build works even if YAML.pm is not installed
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 Module::CoreList - what modules shipped with versions of perl
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CAVEATS
-
-=item HISTORY
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=item SEE ALSO
-
-=back
-
-=head2 Module::Load - runtime require of both modules and files
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Rules
-
-=item Caveats
-
-=item ACKNOWLEDGEMENTS
-
-=item BUG REPORTS
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 Module::Load::Conditional - Looking up module information / loading
-at runtime
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Methods
-
-=item $href = check_install( module => NAME [, version => VERSION, verbose
-=> BOOL ] );
-
-module, version, verbose, file, dir, version, uptodate
-
-=back
-
-=over 4
-
-=item $bool = can_load( modules => { NAME => VERSION [,NAME => VERSION] },
-[verbose => BOOL, nocache => BOOL] )
-
-modules, verbose, nocache
-
-=back
-
-=over 4
-
-=item @list = requires( MODULE );
-
-=back
-
-=over 4
-
-=item Global Variables
-
-=over 4
-
-=item $Module::Load::Conditional::VERBOSE
-
-=item $Module::Load::Conditional::FIND_VERSION
-
-=item $Module::Load::Conditional::CHECK_INC_HASH
-
-=item $Module::Load::Conditional::CACHE
-
-=item $Module::Load::Conditional::ERROR
-
-=back
-
-=item See Also
-
-=item BUG REPORTS
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 Module::Loaded - mark modules as loaded or unloaded
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item FUNCTIONS
-
-=over 4
-
-=item $bool = mark_as_loaded( PACKAGE );
-
-=back
-
-=back
-
-=over 4
-
-=item $bool = mark_as_unloaded( PACKAGE );
-
-=back
-
-=over 4
-
-=item $loc = is_loaded( PACKAGE );
-
-=back
-
-=over 4
-
-=item BUG REPORTS
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 Module::Pluggable - automatically give your module the ability to
-have plugins
-
-=over 4
-
-=item SYNOPSIS
-
-=item EXAMPLE
-
-=item DESCRIPTION
-
-=item ADVANCED USAGE
-
-=item INNER PACKAGES
-
-=item OPTIONS
-
-=over 4
-
-=item sub_name
-
-=item search_path
-
-=item search_dirs
-
-=item instantiate
-
-=item require
-
-=item inner
-
-=item only
-
-=item except
-
-=item package
-
-=item file_regex
-
-=item include_editor_junk
-
-=back
-
-=item METHODs
-
-=over 4
-
-=item search_path
-
-=back
-
-=item FUTURE PLANS
-
-=item AUTHOR
-
-=item COPYING
-
-=item BUGS
-
-=item SEE ALSO
-
-=back
-
-=head2 Module::Pluggable::Object - automatically give your module the
-ability to have plugins
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item OPTIONS
-
-=item AUTHOR
-
-=item COPYING
-
-=item BUGS
-
-=item SEE ALSO
-
-=back
-
-=head2 Module::Pluggable::lib::Devel::InnerPackage, Devel::InnerPackage -
-find all the inner packages of a package
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item list_packages <package name>
-
-=back
-
-=back
-
-=over 4
-
-=item AUTHOR
-
-=item COPYING
-
-=item BUGS
-
-=back
-
-=head2 Module::Pluggable::lib::Module::Pluggable, Module::Pluggable -
-automatically give your module the ability to have plugins
-
-=over 4
-
-=item SYNOPSIS
-
-=item EXAMPLE
-
-=item DESCRIPTION
-
-=item ADVANCED USAGE
-
-=item INNER PACKAGES
-
-=item OPTIONS
-
-=over 4
-
-=item sub_name
-
-=item search_path
-
-=item search_dirs
-
-=item instantiate
-
-=item require
-
-=item inner
-
-=item only
-
-=item except
-
-=item package
-
-=item file_regex
-
-=item include_editor_junk
-
-=back
-
-=item METHODs
-
-=over 4
-
-=item search_path
-
-=back
-
-=item FUTURE PLANS
-
-=item AUTHOR
-
-=item COPYING
-
-=item BUGS
-
-=item SEE ALSO
-
-=back
-
-=head2 Module::Pluggable::lib::Module::Pluggable::Object,
-Module::Pluggable::Object - automatically give your module the ability to
-have plugins
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item OPTIONS
-
-=item AUTHOR
-
-=item COPYING
-
-=item BUGS
-
-=item SEE ALSO
-
-=back
-
-=head2 NDBM_File - Tied access to ndbm files
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-C<O_RDONLY>, C<O_WRONLY>, C<O_RDWR>
-
-=item DIAGNOSTICS
-
-=over 4
-
-=item C<ndbm store returned -1, errno 22, key "..." at ...>
-
-=back
-
-=item BUGS AND WARNINGS
-
-=back
-
-=head2 NEXT - Provide a pseudo-class NEXT (et al) that allows method
-redispatch
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Enforcing redispatch
-
-=item Avoiding repetitions
-
-=item Invoking all versions of a method with a single call
-
-=item Using C<EVERY> methods
-
-=back
-
-=item AUTHOR
-
-=item BUGS AND IRRITATIONS
-
-=item COPYRIGHT
-
-=back
-
-=head2 Net::Cmd - Network Command class (as used by FTP, SMTP etc)
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item USER METHODS
-
-debug ( VALUE ), message (), code (), ok (), status (), datasend ( DATA ),
-dataend ()
-
-=item CLASS METHODS
-
-debug_print ( DIR, TEXT ), debug_text ( TEXT ), command ( CMD [, ARGS, ...
-]), unsupported (), response (), parse_response ( TEXT ), getline (),
-ungetline ( TEXT ), rawdatasend ( DATA ), read_until_dot (), tied_fh ()
-
-=item EXPORTS
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 Net::Config - Local configuration data for libnet
-
-=over 4
-
-=item SYNOPSYS
-
-=item DESCRIPTION
-
-=item METHODS
-
-requires_firewall HOST
-
-=item NetConfig VALUES
-
-nntp_hosts, snpp_hosts, pop3_hosts, smtp_hosts, ph_hosts, daytime_hosts,
-time_hosts, inet_domain, ftp_firewall, ftp_firewall_type, ftp_ext_passive,
-ftp_int_passive, local_netmask, test_hosts, test_exists
-
-=back
-
-=head2 Net::Domain - Attempt to evaluate the current host's internet name
-and domain
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-hostfqdn (), domainname (), hostname (), hostdomain ()
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 Net::FTP - FTP Client class
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item OVERVIEW
-
-=item CONSTRUCTOR
-
-new ([ HOST ] [, OPTIONS ])
-
-=item METHODS
-
-login ([LOGIN [,PASSWORD [, ACCOUNT] ] ]), authorize ( [AUTH [, RESP]]),
-site (ARGS), ascii, binary, rename ( OLDNAME, NEWNAME ), delete ( FILENAME
-), cwd ( [ DIR ] ), cdup (), pwd (), restart ( WHERE ), rmdir ( DIR [,
-RECURSE ]), mkdir ( DIR [, RECURSE ]), alloc ( SIZE [, RECORD_SIZE] ), ls (
-[ DIR ] ), dir ( [ DIR ] ), get ( REMOTE_FILE [, LOCAL_FILE [, WHERE]] ),
-put ( LOCAL_FILE [, REMOTE_FILE ] ), put_unique ( LOCAL_FILE [, REMOTE_FILE
-] ), append ( LOCAL_FILE [, REMOTE_FILE ] ), unique_name (), mdtm ( FILE ),
-size ( FILE ), supported ( CMD ), hash ( [FILEHANDLE_GLOB_REF],[
-BYTES_PER_HASH_MARK] ), feature ( NAME ), nlst ( [ DIR ] ), list ( [ DIR ]
-), retr ( FILE ), stor ( FILE ), stou ( FILE ), appe ( FILE ), port ( [
-PORT ] ), pasv (), pasv_xfer ( SRC_FILE, DEST_SERVER [, DEST_FILE ] ),
-pasv_xfer_unique ( SRC_FILE, DEST_SERVER [, DEST_FILE ] ), pasv_wait (
-NON_PASV_SERVER ), abort (), quit ()
-
-=over 4
-
-=item Methods for the adventurous
-
-quot (CMD [,ARGS])
-
-=back
-
-=item THE dataconn CLASS
-
-read ( BUFFER, SIZE [, TIMEOUT ] ), write ( BUFFER, SIZE [, TIMEOUT ] ),
-bytes_read (), abort (), close ()
-
-=item UNIMPLEMENTED
-
-B<SMNT>, B<HELP>, B<MODE>, B<SYST>, B<STAT>, B<STRU>, B<REIN>
-
-=item REPORTING BUGS
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=item USE EXAMPLES
-
-http://www.csh.rit.edu/~adam/Progs/
-
-=item CREDITS
-
-=item COPYRIGHT
-
-=back
-
-=head2 Net::NNTP - NNTP Client class
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CONSTRUCTOR
-
-new ( [ HOST ] [, OPTIONS ])
-
-=item METHODS
-
-article ( [ MSGID|MSGNUM ], [FH] ), body ( [ MSGID|MSGNUM ], [FH] ), head (
-[ MSGID|MSGNUM ], [FH] ), articlefh ( [ MSGID|MSGNUM ] ), bodyfh ( [
-MSGID|MSGNUM ] ), headfh ( [ MSGID|MSGNUM ] ), nntpstat ( [ MSGID|MSGNUM ]
-), group ( [ GROUP ] ), ihave ( MSGID [, MESSAGE ]), last (), date (),
-postok (), authinfo ( USER, PASS ), list (), newgroups ( SINCE [,
-DISTRIBUTIONS ]), newnews ( SINCE [, GROUPS [, DISTRIBUTIONS ]]), next (),
-post ( [ MESSAGE ] ), postfh (), slave (), quit ()
-
-=over 4
-
-=item Extension methods
-
-newsgroups ( [ PATTERN ] ), distributions (), subscriptions (),
-overview_fmt (), active_times (), active ( [ PATTERN ] ), xgtitle ( PATTERN
-), xhdr ( HEADER, MESSAGE-SPEC ), xover ( MESSAGE-SPEC ), xpath (
-MESSAGE-ID ), xpat ( HEADER, PATTERN, MESSAGE-SPEC), xrover, listgroup ( [
-GROUP ] ), reader
-
-=back
-
-=item UNSUPPORTED
-
-=item DEFINITIONS
-
-MESSAGE-SPEC, PATTERN, Examples, C<[^]-]>, C<*bdc>, C<[0-9a-zA-Z]>, C<a??d>
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 Net::POP3 - Post Office Protocol 3 Client class (RFC1939)
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CONSTRUCTOR
-
-new ( [ HOST ] [, OPTIONS ] 0
-
-=item METHODS
-
-auth ( USERNAME, PASSWORD ), user ( USER ), pass ( PASS ), login ( [ USER
-[, PASS ]] ), apop ( [ USER [, PASS ]] ), banner (), capa (), capabilities
-(), top ( MSGNUM [, NUMLINES ] ), list ( [ MSGNUM ] ), get ( MSGNUM [, FH ]
-), getfh ( MSGNUM ), last (), popstat (), ping ( USER ), uidl ( [ MSGNUM ]
-), delete ( MSGNUM ), reset (), quit ()
-
-=item NOTES
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 Net::Ping - check a remote host for reachability
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Functions
-
-Net::Ping->new([$proto [, $def_timeout [, $bytes [, $device [, $tos
-]]]]]);, $p->ping($host [, $timeout]);, $p->source_verify( { 0 | 1 } );,
-$p->service_check( { 0 | 1 } );, $p->tcp_service_check( { 0 | 1 } );,
-$p->hires( { 0 | 1 } );, $p->bind($local_addr);, $p->open($host);, $p->ack(
-[ $host ] );, $p->nack( $failed_ack_host );, $p->close();,
-$p->port_number([$port_number]), pingecho($host [, $timeout]);
-
-=back
-
-=item NOTES
-
-=item INSTALL
-
-=item BUGS
-
-=item AUTHORS
-
-=item COPYRIGHT
-
-=back
-
-=head2 Net::SMTP - Simple Mail Transfer Protocol Client
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item EXAMPLES
-
-=item CONSTRUCTOR
-
-new ( [ HOST ] [, OPTIONS ] )
-
-=item METHODS
-
-banner (), domain (), hello ( DOMAIN ), host (), etrn ( DOMAIN ), auth (
-USERNAME, PASSWORD ), mail ( ADDRESS [, OPTIONS] ), send ( ADDRESS ),
-send_or_mail ( ADDRESS ), send_and_mail ( ADDRESS ), reset (), recipient (
-ADDRESS [, ADDRESS, [...]] [, OPTIONS ] ), to ( ADDRESS [, ADDRESS [...]]
-), cc ( ADDRESS [, ADDRESS [...]] ), bcc ( ADDRESS [, ADDRESS [...]] ),
-data ( [ DATA ] ), expand ( ADDRESS ), verify ( ADDRESS ), help ( [
-$subject ] ), quit ()
-
-=item ADDRESSES
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 Net::Time - time and daytime network client interface
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-inet_time ( [HOST [, PROTOCOL [, TIMEOUT]]]), inet_daytime ( [HOST [,
-PROTOCOL [, TIMEOUT]]])
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 Net::hostent - by-name interface to Perl's built-in gethost*()
-functions
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item EXAMPLES
-
-=item NOTE
-
-=item AUTHOR
-
-=back
-
-=head2 Net::libnetFAQ, libnetFAQ - libnet Frequently Asked Questions
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Where to get this document
-
-=item How to contribute to this document
-
-=back
-
-=item Author and Copyright Information
-
-=over 4
-
-=item Disclaimer
-
-=back
-
-=item Obtaining and installing libnet
-
-=over 4
-
-=item What is libnet ?
-
-=item Which version of perl do I need ?
-
-=item What other modules do I need ?
-
-=item What machines support libnet ?
-
-=item Where can I get the latest libnet release
-
-=back
-
-=item Using Net::FTP
-
-=over 4
-
-=item How do I download files from an FTP server ?
-
-=item How do I transfer files in binary mode ?
-
-=item How can I get the size of a file on a remote FTP server ?
-
-=item How can I get the modification time of a file on a remote FTP server
-?
-
-=item How can I change the permissions of a file on a remote server ?
-
-=item Can I do a reget operation like the ftp command ?
-
-=item How do I get a directory listing from an FTP server ?
-
-=item Changing directory to "" does not fail ?
-
-=item I am behind a SOCKS firewall, but the Firewall option does not work ?
-
-=item I am behind an FTP proxy firewall, but cannot access machines outside
-?
-
-=item My ftp proxy firewall does not listen on port 21
-
-=item Is it possible to change the file permissions of a file on an FTP
-server ?
-
-=item I have seen scripts call a method message, but cannot find it
-documented ?
-
-=item Why does Net::FTP not implement mput and mget methods
-
-=back
-
-=item Using Net::SMTP
-
-=over 4
-
-=item Why can't the part of an Email address after the @ be used as the
-hostname ?
-
-=item Why does Net::SMTP not do DNS MX lookups ?
-
-=item The verify method always returns true ?
-
-=back
-
-=item Debugging scripts
-
-=over 4
-
-=item How can I debug my scripts that use Net::* modules ?
-
-=back
-
-=item AUTHOR AND COPYRIGHT
-
-=back
-
-=head2 Net::netent - by-name interface to Perl's built-in getnet*()
-functions
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item EXAMPLES
-
-=item NOTE
-
-=item AUTHOR
-
-=back
-
-=head2 Net::protoent - by-name interface to Perl's built-in getproto*()
-functions
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item NOTE
-
-=item AUTHOR
-
-=back
-
-=head2 Net::servent - by-name interface to Perl's built-in getserv*()
-functions
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item EXAMPLES
-
-=item NOTE
-
-=item AUTHOR
-
-=back
-
-=head2 Netrc, Net::Netrc - OO interface to users netrc file
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item THE .netrc FILE
-
-machine name, default, login name, password string, account string, macdef
-name
-
-=item CONSTRUCTOR
-
-lookup ( MACHINE [, LOGIN ])
-
-=item METHODS
-
-login (), password (), account (), lpa ()
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=item COPYRIGHT
-
-=back
-
-=head2 O - Generic interface to Perl Compiler backends
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CONVENTIONS
-
-=item IMPLEMENTATION
-
-=item BUGS
-
-=item AUTHOR
-
-=back
-
-=head2 ODBM_File - Tied access to odbm files
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-C<O_RDONLY>, C<O_WRONLY>, C<O_RDWR>
-
-=item DIAGNOSTICS
-
-=over 4
-
-=item C<odbm store returned -1, errno 22, key "..." at ...>
-
-=back
-
-=item BUGS AND WARNINGS
-
-=back
-
-=head2 Object::Accessor
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item $object = Object::Accessor->new( [ARGS] );
-
-=back
-
-=back
-
-=over 4
-
-=item $bool = $object->mk_accessors( @ACCESSORS | \%ACCESSOR_MAP );
-
-=back
-
-=over 4
-
-=item @list = $self->ls_accessors;
-
-=back
-
-=over 4
-
-=item $ref = $self->ls_allow(KEY)
-
-=back
-
-=over 4
-
-=item $bool = $self->mk_aliases( alias => method, [alias2 => method2, ...]
-);
-
-=back
-
-=over 4
-
-=item $clone = $self->mk_clone;
-
-=back
-
-=over 4
-
-=item $bool = $self->mk_flush;
-
-=back
-
-=over 4
-
-=item $bool = $self->mk_verify;
-
-=back
-
-=over 4
-
-=item $bool = $self->register_callback( sub { ... } );
-
-=back
-
-=over 4
-
-=item $bool = $self->can( METHOD_NAME )
-
-=back
-
-=over 4
-
-=item $val = $self->___get( METHOD_NAME );
-
-=back
-
-=over 4
-
-=item $bool = $self->___set( METHOD_NAME => VALUE );
-
-=back
-
-=over 4
-
-=item $bool = $self->___alias( ALIAS => METHOD );
-
-=back
-
-=over 4
-
-=item LVALUE ACCESSORS
-
-=over 4
-
-=item CAVEATS
-
-Allow handlers, Callbacks
-
-=back
-
-=back
-
-=over 4
-
-=item GLOBAL VARIABLES
-
-=over 4
-
-=item $Object::Accessor::FATAL
-
-=item $Object::Accessor::DEBUG
-
-=back
-
-=item TODO
-
-=over 4
-
-=item Create read-only accessors
-
-=back
-
-=item CAVEATS
-
-=item BUG REPORTS
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 Opcode - Disable named opcodes when compiling perl code
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item NOTE
-
-=item WARNING
-
-=item Operator Names and Operator Lists
-
-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
-
-=item TO DO (maybe)
-
-=back
-
-=over 4
-
-=item Predefined Opcode Tags
-
-:base_core, :base_mem, :base_loop, :base_io, :base_orig, :base_math,
-:base_thread, :default, :filesys_read, :sys_db, :browse, :filesys_open,
-:filesys_write, :subprocess, :ownprocess, :others, :load,
-:still_to_be_decided, :dangerous
-
-=item SEE ALSO
-
-=item AUTHORS
-
-=back
-
-=head2 Opcode::Safe, Safe - Compile and execute code in restricted
-compartments
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-a new namespace, an operator mask
-
-=item WARNING
-
-=over 4
-
-=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, STRICT), rdo
-(FILENAME), root (NAMESPACE), mask (MASK)
-
-=item Some Safety Issues
-
-Memory, CPU, Snooping, Signals, State Changes
-
-=item AUTHOR
-
-=back
-
-=back
-
-=head2 Opcode::ops, ops - Perl pragma to restrict unsafe operations when
-compiling
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=back
-
-=head2 POSIX - Perl interface to IEEE Std 1003.1
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item NOTE
-
-=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, fsync, 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, 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 4
-
-=item POSIX::SigAction
-
-new, handler, mask, flags, safe
-
-=item POSIX::SigRt
-
-%SIGRT, SIGRTMIN, SIGRTMAX
-
-=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, WNOHANG, WUNTRACED, Macros, WIFEXITED, WEXITSTATUS, WIFSIGNALED,
-WTERMSIG, WIFSTOPPED, WSTOPSIG
-
-=back
-
-=head2 Package::Constants - List all constants declared in a package
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CLASS METHODS
-
-=over 4
-
-=item @const = Package::Constants->list( PACKAGE_NAME );
-
-=back
-
-=back
-
-=over 4
-
-=item GLOBAL VARIABLES
-
-=over 4
-
-=item $Package::Constants::DEBUG
-
-=back
-
-=back
-
-=over 4
-
-=item BUG REPORTS
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 Params::Check - A generic input parsing/checking mechanism.
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Template
-
-default, required, strict_type, defined, no_override, store, allow
-
-=item Functions
-
-=over 4
-
-=item check( \%tmpl, \%args, [$verbose] );
-
-Template, Arguments, Verbose
-
-=back
-
-=back
-
-=over 4
-
-=item allow( $test_me, \@criteria );
-
-string, regexp, subroutine, array ref
-
-=back
-
-=over 4
-
-=item last_error()
-
-=back
-
-=over 4
-
-=item Global Variables
-
-=over 4
-
-=item $Params::Check::VERBOSE
-
-=item $Params::Check::STRICT_TYPE
-
-=item $Params::Check::ALLOW_UNKNOWN
-
-=item $Params::Check::STRIP_LEADING_DASHES
-
-=item $Params::Check::NO_DUPLICATES
-
-=item $Params::Check::PRESERVE_CASE
-
-=item $Params::Check::ONLY_ALLOW_DEFINED
-
-=item $Params::Check::SANITY_CHECK_TEMPLATE
-
-=item $Params::Check::WARNINGS_FATAL
-
-=item $Params::Check::CALLER_DEPTH
-
-=back
-
-=item AUTHOR
-
-=item Acknowledgements
-
-=item COPYRIGHT
-
-=back
-
-=head2 PerlIO - On demand loader for PerlIO layers and root of PerlIO::*
-name space
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-:unix, :stdio, :perlio, :crlf, :mmap, :utf8, :bytes, :raw, :pop, :win32
-
-=over 4
-
-=item Custom Layers
-
-:encoding, :via
-
-=item Alternatives to raw
-
-=item Defaults and how to override them
-
-=item Querying the layers of filehandles
-
-=back
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 PerlIO::encoding - encoding layer
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=back
-
-=head2 PerlIO::scalar - in-memory IO, scalar IO
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item IMPLEMENTATION NOTE
-
-=back
-
-=head2 PerlIO::via - Helper class for PerlIO layers implemented in perl
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item EXPECTED METHODS
-
-$class->PUSHED([$mode[,$fh]]), $obj->POPPED([$fh]),
-$obj->UTF8($bellowFlag,[$fh]), $obj->OPEN($path,$mode[,$fh]),
-$obj->BINMODE([,$fh]), $obj->FDOPEN($fd[,$fh]),
-$obj->SYSOPEN($path,$imode,$perm,[,$fh]), $obj->FILENO($fh),
-$obj->READ($buffer,$len,$fh), $obj->WRITE($buffer,$fh), $obj->FILL($fh),
-$obj->CLOSE($fh), $obj->SEEK($posn,$whence,$fh), $obj->TELL($fh),
-$obj->UNREAD($buffer,$fh), $obj->FLUSH($fh), $obj->SETLINEBUF($fh),
-$obj->CLEARERR($fh), $obj->ERROR($fh), $obj->EOF($fh)
-
-=item EXAMPLES
-
-=over 4
-
-=item Example - a Hexadecimal Handle
-
-=back
-
-=back
-
-=head2 PerlIO::via::QuotedPrint - PerlIO layer for quoted-printable strings
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item REQUIRED MODULES
-
-=item SEE ALSO
-
-=item ACKNOWLEDGEMENTS
-
-=item COPYRIGHT
-
-=back
-
-=head2 Pod::Checker, podchecker() - check pod documents for syntax errors
-
-=over 4
-
-=item SYNOPSIS
-
-=item OPTIONS/ARGUMENTS
-
-=over 4
-
-=item podchecker()
-
-B<-warnings> =E<gt> I<val>
-
-=back
-
-=item DESCRIPTION
-
-=item DIAGNOSTICS
-
-=over 4
-
-=item Errors
-
-empty =headn, =over on line I<N> without closing =back, =item without
-previous =over, =back without previous =over, No argument for =begin, =end
-without =begin, Nested =begin's, =for without formatter specification,
-unresolved internal link I<NAME>, Unknown command "I<CMD>", Unknown
-interior-sequence "I<SEQ>", nested commands
-I<CMD>E<lt>...I<CMD>E<lt>...E<gt>...E<gt>, garbled entity I<STRING>, Entity
-number out of range, malformed link LE<lt>E<gt>, nonempty ZE<lt>E<gt>,
-empty XE<lt>E<gt>, Spurious text after =pod / =cut, Spurious character(s)
-after =back
-
-=item Warnings
-
-multiple occurrence of link target I<name>, line containing nothing but
-whitespace in paragraph, file does not start with =head, previous =item has
-no contents, preceding non-item paragraph(s), =item type mismatch (I<one>
-vs. I<two>), I<N> unescaped C<E<lt>E<gt>> in paragraph, Unknown entity, No
-items in =over, No argument for =item, empty section in previous paragraph,
-Verbatim paragraph in NAME section, =headI<n> without preceding higher
-level
-
-=item Hyperlinks
-
-ignoring leading/trailing whitespace in link, (section) in '$page'
-deprecated, alternative text/node '%s' contains non-escaped | or /
-
-=back
-
-=item RETURN VALUE
-
-=item EXAMPLES
-
-=item INTERFACE
-
-=back
-
-C<Pod::Checker-E<gt>new( %options )>
-
-C<$checker-E<gt>poderror( @args )>, C<$checker-E<gt>poderror( {%opts},
-@args )>
-
-C<$checker-E<gt>num_errors()>
-
-C<$checker-E<gt>num_warnings()>
-
-C<$checker-E<gt>name()>
-
-C<$checker-E<gt>node()>
-
-C<$checker-E<gt>idx()>
-
-C<$checker-E<gt>hyperlink()>
-
-=over 4
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Escapes -- for resolving Pod EE<lt>...E<gt> sequences
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item GOODIES
-
-e2char($e_content), e2charnum($e_content), $Name2character{I<name>},
-$Name2character_number{I<name>}, $Latin1Code_to_fallback{I<integer>},
-$Latin1Char_to_fallback{I<character>}, $Code2USASCII{I<integer>}
-
-=item CAVEATS
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Find - find POD documents in directory trees
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=over 4
-
-=item C<pod_find( { %opts } , @directories )>
-
-C<-verbose =E<gt> 1>, C<-perl =E<gt> 1>, C<-script =E<gt> 1>, C<-inc =E<gt>
-1>
-
-=back
-
-=over 4
-
-=item C<simplify_name( $str )>
-
-=back
-
-=over 4
-
-=item C<pod_where( { %opts }, $pod )>
-
-C<-inc =E<gt> 1>, C<-dirs =E<gt> [ $dir1, $dir2, ... ]>, C<-verbose =E<gt>
-1>
-
-=back
-
-=over 4
-
-=item C<contains_pod( $file , $verbose )>
-
-=back
-
-=over 4
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 Pod::Html - module to convert pod files to HTML
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item FUNCTIONS
-
-=over 4
-
-=item pod2html
-
-backlink, cachedir, css, flush, header, help, hiddendirs, htmldir,
-htmlroot, index, infile, libpods, netscape, outfile, podpath, podroot,
-quiet, recurse, title, verbose
-
-=item htmlify
-
-=item anchorify
-
-=back
-
-=item ENVIRONMENT
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=item COPYRIGHT
-
-=back
-
-=head2 Pod::InputObjects - objects representing POD input paragraphs,
-commands, etc.
-
-=over 4
-
-=item SYNOPSIS
-
-=item REQUIRES
-
-=item EXPORTS
-
-=item DESCRIPTION
-
-package B<Pod::InputSource>, package B<Pod::Paragraph>, package
-B<Pod::InteriorSequence>, package B<Pod::ParseTree>
-
-=back
-
-=over 4
-
-=item B<Pod::InputSource>
-
-=back
-
-=over 4
-
-=item B<new()>
-
-=back
-
-=over 4
-
-=item B<name()>
-
-=back
-
-=over 4
-
-=item B<handle()>
-
-=back
-
-=over 4
-
-=item B<was_cutting()>
-
-=back
-
-=over 4
-
-=item B<Pod::Paragraph>
-
-=back
-
-=over 4
-
-=item Pod::Paragraph-E<gt>B<new()>
-
-=back
-
-=over 4
-
-=item $pod_para-E<gt>B<cmd_name()>
-
-=back
-
-=over 4
-
-=item $pod_para-E<gt>B<text()>
-
-=back
-
-=over 4
-
-=item $pod_para-E<gt>B<raw_text()>
-
-=back
-
-=over 4
-
-=item $pod_para-E<gt>B<cmd_prefix()>
-
-=back
-
-=over 4
-
-=item $pod_para-E<gt>B<cmd_separator()>
-
-=back
-
-=over 4
-
-=item $pod_para-E<gt>B<parse_tree()>
-
-=back
-
-=over 4
-
-=item $pod_para-E<gt>B<file_line()>
-
-=back
-
-=over 4
-
-=item B<Pod::InteriorSequence>
-
-=back
-
-=over 4
-
-=item Pod::InteriorSequence-E<gt>B<new()>
-
-=back
-
-=over 4
-
-=item $pod_seq-E<gt>B<cmd_name()>
-
-=back
-
-=over 4
-
-=item $pod_seq-E<gt>B<prepend()>
-
-=back
-
-=over 4
-
-=item $pod_seq-E<gt>B<append()>
-
-=back
-
-=over 4
-
-=item $pod_seq-E<gt>B<nested()>
-
-=back
-
-=over 4
-
-=item $pod_seq-E<gt>B<raw_text()>
-
-=back
-
-=over 4
-
-=item $pod_seq-E<gt>B<left_delimiter()>
-
-=back
-
-=over 4
-
-=item $pod_seq-E<gt>B<right_delimiter()>
-
-=back
-
-=over 4
-
-=item $pod_seq-E<gt>B<parse_tree()>
-
-=back
-
-=over 4
-
-=item $pod_seq-E<gt>B<file_line()>
-
-=back
-
-=over 4
-
-=item Pod::InteriorSequence::B<DESTROY()>
-
-=back
-
-=over 4
-
-=item B<Pod::ParseTree>
-
-=back
-
-=over 4
-
-=item Pod::ParseTree-E<gt>B<new()>
-
-=back
-
-=over 4
-
-=item $ptree-E<gt>B<top()>
-
-=back
-
-=over 4
-
-=item $ptree-E<gt>B<children()>
-
-=back
-
-=over 4
-
-=item $ptree-E<gt>B<prepend()>
-
-=back
-
-=over 4
-
-=item $ptree-E<gt>B<append()>
-
-=back
-
-=over 4
-
-=item $ptree-E<gt>B<raw_text()>
-
-=back
-
-=over 4
-
-=item Pod::ParseTree::B<DESTROY()>
-
-=back
-
-=over 4
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::LaTeX - Convert Pod data to formatted Latex
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=over 4
-
-=item OBJECT METHODS
-
-C<initialize>
-
-=back
-
-=over 4
-
-=item Data Accessors
-
-B<AddPreamble>
-
-=back
-
-B<AddPostamble>
-
-B<Head1Level>
-
-B<Label>
-
-B<LevelNoNum>
-
-B<MakeIndex>
-
-B<ReplaceNAMEwithSection>
-
-B<StartWithNewPage>
-
-B<TableOfContents>
-
-B<UniqueLabels>
-
-B<UserPreamble>
-
-B<UserPostamble>
-
-B<Lists>
-
-=over 4
-
-=item Subclassed methods
-
-=back
-
-B<begin_pod>
-
-B<end_pod>
-
-B<command>
-
-B<verbatim>
-
-B<textblock>
-
-B<interior_sequence>
-
-=over 4
-
-=item List Methods
-
-B<begin_list>
-
-=back
-
-B<end_list>
-
-B<add_item>
-
-=over 4
-
-=item Methods for headings
-
-B<head>
-
-=back
-
-=over 4
-
-=item Internal methods
-
-B<_output>
-
-=back
-
-B<_replace_special_chars>
-
-B<_replace_special_chars_late>
-
-B<_create_label>
-
-B<_create_index>
-
-B<_clean_latex_commands>
-
-B<_split_delimited>
-
-=over 4
-
-=item NOTES
-
-=item SEE ALSO
-
-=item AUTHORS
-
-=item COPYRIGHT
-
-=item REVISION
-
-=back
-
-=head2 Pod::Man - Convert POD data to formatted *roff input
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-center, date, fixed, fixedbold, fixeditalic, fixedbolditalic, name, quotes,
-release, section, stderr, utf8
-
-=item DIAGNOSTICS
-
-roff font should be 1 or 2 chars, not "%s", Invalid quote specification
-"%s"
-
-=item BUGS
-
-=item CAVEATS
-
-=item AUTHOR
-
-=item COPYRIGHT AND LICENSE
-
-=item SEE ALSO
-
-=back
-
-=head2 Pod::ParseLink - Parse an LE<lt>E<gt> formatting code in POD text
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 Pod::ParseUtils - helpers for POD parsing and conversion
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=over 4
-
-=item Pod::List
-
-Pod::List-E<gt>new()
-
-=back
-
-$list-E<gt>file()
-
-$list-E<gt>start()
-
-$list-E<gt>indent()
-
-$list-E<gt>type()
-
-$list-E<gt>rx()
-
-$list-E<gt>item()
-
-$list-E<gt>parent()
-
-$list-E<gt>tag()
-
-=over 4
-
-=item Pod::Hyperlink
-
-Pod::Hyperlink-E<gt>new()
-
-=back
-
-$link-E<gt>parse($string)
-
-$link-E<gt>markup($string)
-
-$link-E<gt>text()
-
-$link-E<gt>warning()
-
-$link-E<gt>file(), $link-E<gt>line()
-
-$link-E<gt>page()
-
-$link-E<gt>node()
-
-$link-E<gt>alttext()
-
-$link-E<gt>type()
-
-$link-E<gt>link()
-
-=over 4
-
-=item Pod::Cache
-
-Pod::Cache-E<gt>new()
-
-=back
-
-$cache-E<gt>item()
-
-$cache-E<gt>find_page($name)
-
-=over 4
-
-=item Pod::Cache::Item
-
-Pod::Cache::Item-E<gt>new()
-
-=back
-
-$cacheitem-E<gt>page()
-
-$cacheitem-E<gt>description()
-
-$cacheitem-E<gt>path()
-
-$cacheitem-E<gt>file()
-
-$cacheitem-E<gt>nodes()
-
-$cacheitem-E<gt>find_node($name)
-
-$cacheitem-E<gt>idx()
-
-=over 4
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 Pod::Parser - base class for creating POD filters and translators
-
-=over 4
-
-=item SYNOPSIS
-
-=item REQUIRES
-
-=item EXPORTS
-
-=item DESCRIPTION
-
-=item QUICK OVERVIEW
-
-=item PARSING OPTIONS
-
-B<-want_nonPODs> (default: unset), B<-process_cut_cmd> (default: unset),
-B<-warnings> (default: unset)
-
-=back
-
-=over 4
-
-=item RECOMMENDED SUBROUTINE/METHOD OVERRIDES
-
-=back
-
-=over 4
-
-=item B<command()>
-
-C<$cmd>, C<$text>, C<$line_num>, C<$pod_para>
-
-=back
-
-=over 4
-
-=item B<verbatim()>
-
-C<$text>, C<$line_num>, C<$pod_para>
-
-=back
-
-=over 4
-
-=item B<textblock()>
-
-C<$text>, C<$line_num>, C<$pod_para>
-
-=back
-
-=over 4
-
-=item B<interior_sequence()>
-
-=back
-
-=over 4
-
-=item OPTIONAL SUBROUTINE/METHOD OVERRIDES
-
-=back
-
-=over 4
-
-=item B<new()>
-
-=back
-
-=over 4
-
-=item B<initialize()>
-
-=back
-
-=over 4
-
-=item B<begin_pod()>
-
-=back
-
-=over 4
-
-=item B<begin_input()>
-
-=back
-
-=over 4
-
-=item B<end_input()>
-
-=back
-
-=over 4
-
-=item B<end_pod()>
-
-=back
-
-=over 4
-
-=item B<preprocess_line()>
-
-=back
-
-=over 4
-
-=item B<preprocess_paragraph()>
-
-=back
-
-=over 4
-
-=item METHODS FOR PARSING AND PROCESSING
-
-=back
-
-=over 4
-
-=item B<parse_text()>
-
-B<-expand_seq> =E<gt> I<code-ref>|I<method-name>, B<-expand_text> =E<gt>
-I<code-ref>|I<method-name>, B<-expand_ptree> =E<gt>
-I<code-ref>|I<method-name>
-
-=back
-
-=over 4
-
-=item B<interpolate()>
-
-=back
-
-=over 4
-
-=item B<parse_paragraph()>
-
-=back
-
-=over 4
-
-=item B<parse_from_filehandle()>
-
-=back
-
-=over 4
-
-=item B<parse_from_file()>
-
-=back
-
-=over 4
-
-=item ACCESSOR METHODS
-
-=back
-
-=over 4
-
-=item B<errorsub()>
-
-=back
-
-=over 4
-
-=item B<cutting()>
-
-=back
-
-=over 4
-
-=item B<parseopts()>
-
-=back
-
-=over 4
-
-=item B<output_file()>
-
-=back
-
-=over 4
-
-=item B<output_handle()>
-
-=back
-
-=over 4
-
-=item B<input_file()>
-
-=back
-
-=over 4
-
-=item B<input_handle()>
-
-=back
-
-=over 4
-
-=item B<input_streams()>
-
-=back
-
-=over 4
-
-=item B<top_stream()>
-
-=back
-
-=over 4
-
-=item PRIVATE METHODS AND DATA
-
-=back
-
-=over 4
-
-=item B<_push_input_stream()>
-
-=back
-
-=over 4
-
-=item B<_pop_input_stream()>
-
-=back
-
-=over 4
-
-=item TREE-BASED PARSING
-
-=item CAVEATS
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Perldoc - Look up Perl documentation in Pod format.
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Perldoc::BaseTo - Base for Pod::Perldoc formatters
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Perldoc::GetOptsOO - Customized option parser for Pod::Perldoc
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Perldoc::ToChecker - let Perldoc check Pod for errors
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Perldoc::ToMan - let Perldoc render Pod as man pages
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CAVEAT
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Perldoc::ToNroff - let Perldoc convert Pod to nroff
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CAVEAT
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Perldoc::ToPod - let Perldoc render Pod as ... Pod!
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Perldoc::ToRtf - let Perldoc render Pod as RTF
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Perldoc::ToText - let Perldoc render Pod as plaintext
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CAVEAT
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Perldoc::ToTk - let Perldoc use Tk::Pod to render Pod
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Perldoc::ToXml - let Perldoc render Pod as XML
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::PlainText - Convert POD data to formatted ASCII text
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-alt, indent, loose, sentence, width
-
-=item DIAGNOSTICS
-
-Bizarre space in item, Can't open %s for reading: %s, Unknown escape: %s,
-Unknown sequence: %s, Unmatched =back
-
-=item RESTRICTIONS
-
-=item NOTES
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Plainer - Perl extension for converting Pod to old style Pod.
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item EXPORT
-
-=back
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 Pod::Select, podselect() - extract selected sections of POD from
-input
-
-=over 4
-
-=item SYNOPSIS
-
-=item REQUIRES
-
-=item EXPORTS
-
-=item DESCRIPTION
-
-=item SECTION SPECIFICATIONS
-
-=item RANGE SPECIFICATIONS
-
-=back
-
-=over 4
-
-=item OBJECT METHODS
-
-=back
-
-=over 4
-
-=item B<curr_headings()>
-
-=back
-
-=over 4
-
-=item B<select()>
-
-=back
-
-=over 4
-
-=item B<add_selection()>
-
-=back
-
-=over 4
-
-=item B<clear_selections()>
-
-=back
-
-=over 4
-
-=item B<match_section()>
-
-=back
-
-=over 4
-
-=item B<is_selected()>
-
-=back
-
-=over 4
-
-=item EXPORTED FUNCTIONS
-
-=back
-
-=over 4
-
-=item B<podselect()>
-
-B<-output>, B<-sections>, B<-ranges>
-
-=back
-
-=over 4
-
-=item PRIVATE METHODS AND DATA
-
-=back
-
-=over 4
-
-=item B<_compile_section_spec()>
-
-=back
-
-=over 4
-
-=item $self->{_SECTION_HEADINGS}
-
-=back
-
-=over 4
-
-=item $self->{_SELECTED_SECTIONS}
-
-=back
-
-=over 4
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Simple - framework for parsing Pod
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item MAIN METHODS
-
-C<< $parser = I<SomeClass>->new(); >>, C<< $parser->output_fh( *OUT ); >>,
-C<< $parser->output_string( \$somestring ); >>, C<< $parser->parse_file(
-I<$some_filename> ); >>, C<< $parser->parse_file( *INPUT_FH ); >>, C<<
-$parser->parse_string_document( I<$all_content> ); >>, C<<
-$parser->parse_lines( I<...@lines...>, undef ); >>, C<<
-$parser->content_seen >>, C<< I<SomeClass>->filter( I<$filename> ); >>, C<<
-I<SomeClass>->filter( I<*INPUT_FH> ); >>, C<< I<SomeClass>->filter(
-I<\$document_content> ); >>
-
-=item SECONDARY METHODS
-
-C<< $parser->no_whining( I<SOMEVALUE> ) >>, C<< $parser->no_errata_section(
-I<SOMEVALUE> ) >>, C<< $parser->complain_stderr( I<SOMEVALUE> ) >>, C<<
-$parser->source_filename >>, C<< $parser->doc_has_started >>, C<<
-$parser->source_dead >>
-
-=item CAVEATS
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-Allison Randal C<allison@perl.org>, Hans Dieter Pearcey C<hdp@cpan.org>
-
-=back
-
-=head2 Pod::Simple::Checker -- check the Pod syntax of a document
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Simple::Debug -- put Pod::Simple into trace/debug mode
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CAVEATS
-
-=item GUTS
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Simple::DumpAsText -- dump Pod-parsing events as text
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Simple::DumpAsXML -- turn Pod into XML
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Simple::HTML - convert Pod to HTML
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CALLING FROM THE COMMAND LINE
-
-=item CALLING FROM PERL
-
-=item METHODS
-
-=item SUBCLASSING
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Simple::HTMLBatch - convert several Pod files to several HTML
-files
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item FROM THE COMMAND LINE
-
-=back
-
-=item MAIN METHODS
-
-$batchconv = Pod::Simple::HTMLBatch->new;, $batchconv->batch_convert(
-I<indirs>, I<outdir> );, $batchconv->batch_convert( undef , ...);,
-$batchconv->batch_convert( q{@INC}, ...);, $batchconv->batch_convert(
-\@dirs , ...);, $batchconv->batch_convert( "somedir" , ...);,
-$batchconv->batch_convert( 'somedir:someother:also' , ...);,
-$batchconv->batch_convert( ... , undef );, $batchconv->batch_convert( ... ,
-'somedir' );
-
-=over 4
-
-=item ACCESSOR METHODS
-
-$batchconv->verbose( I<nonnegative_integer> );, $batchconv->index(
-I<true-or-false> );, $batchconv->contents_file( I<filename> );,
-$batchconv->contents_page_start( I<HTML_string> );,
-$batchconv->contents_page_end( I<HTML_string> );, $batchconv->add_css( $url
-);, $batchconv->add_javascript( $url );, $batchconv->css_flurry(
-I<true-or-false> );, $batchconv->javascript_flurry( I<true-or-false> );,
-$batchconv->no_contents_links( I<true-or-false> );,
-$batchconv->html_render_class( I<classname> );
-
-=back
-
-=item NOTES ON CUSTOMIZATION
-
-=item ASK ME!
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Simple::LinkSection -- represent "section" attributes of L
-codes
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Simple::Methody -- turn Pod::Simple events into method calls
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHOD CALLING
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Simple::PullParser -- a pull-parser interface to parsing Pod
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-my $token = $parser->get_token, $parser->unget_token( $token ),
-$parser->unget_token( $token1, $token2, ... ), $parser->set_source(
-$filename ), $parser->set_source( $filehandle_object ),
-$parser->set_source( \$document_source ), $parser->set_source(
-\@document_lines ), $parser->parse_file(...),
-$parser->parse_string_document(...), $parser->filter(...),
-$parser->parse_from_file(...), my $title_string = $parser->get_title, my
-$title_string = $parser->get_short_title, $author_name =
-$parser->get_author, $description_name = $parser->get_description,
-$version_block = $parser->get_version
-
-=item NOTE
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Simple::PullParserEndToken -- end-tokens from
-Pod::Simple::PullParser
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-$token->tagname, $token->tagname(I<somestring>), $token->tag(...),
-$token->is_tag(I<somestring>) or $token->is_tagname(I<somestring>)
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Simple::PullParserStartToken -- start-tokens from
-Pod::Simple::PullParser
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-$token->tagname, $token->tagname(I<somestring>), $token->tag(...),
-$token->is_tag(I<somestring>) or $token->is_tagname(I<somestring>),
-$token->attr(I<attrname>), $token->attr(I<attrname>, I<newvalue>),
-$token->attr_hash
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Simple::PullParserTextToken -- text-tokens from
-Pod::Simple::PullParser
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-$token->text, $token->text(I<somestring>), $token->text_r()
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Simple::PullParserToken -- tokens from Pod::Simple::PullParser
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-$token->type, $token->is_start, $token->is_text, $token->is_end,
-$token->dump
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Simple::RTF -- format Pod as RTF
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item FORMAT CONTROL ATTRIBUTES
-
-$parser->head1_halfpoint_size( I<halfpoint_integer> );,
-$parser->head2_halfpoint_size( I<halfpoint_integer> );,
-$parser->head3_halfpoint_size( I<halfpoint_integer> );,
-$parser->head4_halfpoint_size( I<halfpoint_integer> );,
-$parser->codeblock_halfpoint_size( I<halfpoint_integer> );,
-$parser->header_halfpoint_size( I<halfpoint_integer> );,
-$parser->normal_halfpoint_size( I<halfpoint_integer> );,
-$parser->no_proofing_exemptions( I<true_or_false> );, $parser->doc_lang(
-I<microsoft_decimal_language_code> )
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Simple::Search - find POD documents in directory trees
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CONSTRUCTOR
-
-=item ACCESSORS
-
-$search->inc( I<true-or-false> );, $search->verbose( I<nonnegative-number>
-);, $search->limit_glob( I<some-glob-string> );, $search->callback(
-I<\&some_routine> );, $search->laborious( I<true-or-false> );,
-$search->shadows( I<true-or-false> );, $search->limit_re( I<some-regxp> );,
-$search->dir_prefix( I<some-string-value> );, $search->progress(
-I<some-progress-object> );, $name2path = $self->name2path;, $path2name =
-$self->path2name;
-
-=item MAIN SEARCH METHODS
-
-=over 4
-
-=item C<< $search->survey( @directories ) >>
-
-C<name2path>, C<path2name>
-
-=item C<< $search->simplify_name( $str ) >>
-
-=item C<< $search->find( $pod ) >>
-
-=item C<< $search->find( $pod, @search_dirs ) >>
-
-=item C<< $self->contains_pod( $file ) >>
-
-=back
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 Pod::Simple::Subclassing -- write a formatter as a Pod::Simple
-subclass
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Events
-
-C<< $parser->_handle_element_start( I<element_name>, I<attr_hashref> ) >>,
-C<< $parser->_handle_element_end( I<element_name> ) >>, C<<
-$parser->_handle_text( I<text_string> ) >>, events with an element_name
-of Document, events with an element_name of Para, events with an
-element_name of B, C, F, or I, events with an element_name of S, events
-with an element_name of X, events with an element_name of L, events with an
-element_name of E or Z, events with an element_name of Verbatim, events
-with an element_name of head1 .. head4, events with an element_name of
-over-bullet, events with an element_name of over-number, events with an
-element_name of over-text, events with an element_name of over-block,
-events with an element_name of item-bullet, events with an element_name of
-item-number, events with an element_name of item-text, events with an
-element_name of for, events with an element_name of Data
-
-=item More Pod::Simple Methods
-
-C<< $parser->accept_targets( I<SOMEVALUE> ) >>, C<<
-$parser->accept_targets_as_text( I<SOMEVALUE> ) >>, C<<
-$parser->accept_codes( I<Codename>, I<Codename>... ) >>, C<<
-$parser->accept_directive_as_data( I<directive_name> ) >>, C<<
-$parser->accept_directive_as_verbatim( I<directive_name> ) >>, C<<
-$parser->accept_directive_as_processed( I<directive_name> ) >>, C<<
-$parser->nbsp_for_S( I<BOOLEAN> ); >>, C<< $parser->version_report() >>,
-C<< $parser->pod_para_count() >>, C<< $parser->line_count() >>, C<<
-$parser->nix_X_codes( I<SOMEVALUE> ) >>, C<< $parser->merge_text(
-I<SOMEVALUE> ) >>, C<< $parser->code_handler( I<CODE_REF> ) >>, C<<
-$parser->cut_handler( I<CODE_REF> ) >>, C<< $parser->whine(
-I<linenumber>, I<complaint string> ) >>, C<< $parser->scream(
-I<linenumber>, I<complaint string> ) >>, C<< $parser->source_dead(1) >>,
-C<< $parser->hide_line_numbers( I<SOMEVALUE> ) >>, C<< $parser->no_whining(
-I<SOMEVALUE> ) >>, C<< $parser->no_errata_section( I<SOMEVALUE> ) >>, C<<
-$parser->complain_stderr( I<SOMEVALUE> ) >>, C<< $parser->bare_output(
-I<SOMEVALUE> ) >>, C<< $parser->preserve_whitespace( I<SOMEVALUE> ) >>
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Simple::Text -- format Pod as plaintext
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Simple::TextContent -- get the text content of Pod
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Simple::XHTML -- format Pod as validating XHTML
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=over 4
-
-=item METHODS
-
-=over 4
-
-=item perldoc_url_prefix
-
-=item perldoc_url_postfix
-
-=item title_prefix, title_postfix
-
-=item html_css
-
-=item html_javascript
-
-=item html_doctype
-
-=item html_header_tags
-
-=item default_title
-
-=item force_title
-
-=item html_header, html_footer
-
-=item index
-
-=back
-
-=back
-
-=over 4
-
-=item SUBCLASSING
-
-=back
-
-=over 4
-
-=item handle_text
-
-=back
-
-=over 4
-
-=item SEE ALSO
-
-=item COPYRIGHT
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Simple::XMLOutStream -- turn Pod into XML
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=item ABOUT EXTENDING POD
-
-=item ASK ME!
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::SimpleTree, Pod::Simple::SimpleTree -- parse Pod into a simple
-parse tree
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=item Tree Contents
-
-=item SEE ALSO
-
-=item COPYRIGHT AND DISCLAIMERS
-
-=item AUTHOR
-
-=back
-
-=head2 Pod::Text - Convert POD data to formatted ASCII text
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-alt, code, indent, loose, margin, quotes, sentence, stderr, utf8, width
-
-=item DIAGNOSTICS
-
-Bizarre space in item, Item called without tag, Can't open %s for reading:
-%s, Invalid quote specification "%s"
-
-=item BUGS
-
-=item CAVEATS
-
-=item NOTES
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 Pod::Text::Color - Convert POD data to formatted color ASCII text
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item BUGS
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 Pod::Text::Overstrike, =for stopwords
-overstrike
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item BUGS
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 Pod::Text::Termcap - Convert POD data to ASCII text with format
-escapes
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item NOTES
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 Pod::Usage, pod2usage() - print a usage message from embedded pod
-documentation
-
-=over 4
-
-=item SYNOPSIS
-
-=item ARGUMENTS
-
-C<-message>, C<-msg>, C<-exitval>, C<-verbose>, C<-sections>, C<-output>,
-C<-input>, C<-pathlist>, C<-noperldoc>
-
-=item DESCRIPTION
-
-=item EXAMPLES
-
-=over 4
-
-=item Recommended Use
-
-=back
-
-=item CAVEATS
-
-=item AUTHOR
-
-=item ACKNOWLEDGMENTS
-
-=back
-
-=head2 SDBM_File - Tied access to sdbm files
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-C<O_RDONLY>, C<O_WRONLY>, C<O_RDWR>
-
-=item DIAGNOSTICS
-
-=over 4
-
-=item C<sdbm store returned -1, errno 22, key "..." at ...>
-
-=back
-
-=item BUGS AND WARNINGS
-
-=back
-
-=head2 Safe - Compile and execute code in restricted compartments
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-a new namespace, an operator mask
-
-=item WARNING
-
-=over 4
-
-=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, STRICT), rdo
-(FILENAME), root (NAMESPACE), mask (MASK)
-
-=item Some Safety Issues
-
-Memory, CPU, Snooping, Signals, State Changes
-
-=item AUTHOR
-
-=back
-
-=back
-
-=head2 Scalar::Util - A selection of general-utility scalar subroutines
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-blessed EXPR, dualvar NUM, STRING, isvstring EXPR, isweak EXPR,
-looks_like_number EXPR, openhandle FH, refaddr EXPR, reftype EXPR,
-set_prototype CODEREF, PROTOTYPE, tainted EXPR, weaken REF
-
-=item KNOWN BUGS
-
-=item SEE ALSO
-
-=item COPYRIGHT
-
-=back
-
-=head2 Search::Dict, look - search for key in dictionary file
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=head2 SelectSaver - save and restore selected file handle
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=head2 SelfLoader - load functions only on demand
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=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
-
-=item AUTHOR
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-B<_make_cmd>
-
-=head2 Shell - run shell commands transparently within perl
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Caveats
-
-=item Escaping Magic Characters
-
-=item Configuration
-
-=back
-
-=item BUGS
-
-=item AUTHOR
-
-=back
-
-=head2 Socket, sockaddr_in, sockaddr_un, inet_aton, inet_ntoa - load the C
-socket.h defines and structure manipulators
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-inet_aton HOSTNAME, inet_ntoa IP_ADDRESS, INADDR_ANY, INADDR_BROADCAST,
-INADDR_LOOPBACK, INADDR_NONE, sockaddr_family SOCKADDR, 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
-
-=back
-
-=head2 Storable - persistence for Perl data structures
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item MEMORY STORE
-
-=item ADVISORY LOCKING
-
-=item SPEED
-
-=item CANONICAL REPRESENTATION
-
-=item CODE REFERENCES
-
-=item FORWARD COMPATIBILITY
-
-utf8 data, restricted hashes, files from future versions of Storable
-
-=item ERROR REPORTING
-
-=item WIZARDS ONLY
-
-=over 4
-
-=item Hooks
-
-C<STORABLE_freeze> I<obj>, I<cloning>, C<STORABLE_thaw> I<obj>, I<cloning>,
-I<serialized>, .., C<STORABLE_attach> I<class>, I<cloning>, I<serialized>
-
-=item Predicates
-
-C<Storable::last_op_in_netorder>, C<Storable::is_storing>,
-C<Storable::is_retrieving>
-
-=item Recursion
-
-=item Deep Cloning
-
-=back
-
-=item Storable magic
-
-$info = Storable::file_magic( $filename ), C<version>, C<version_nv>,
-C<major>, C<minor>, C<hdrsize>, C<netorder>, C<byteorder>, C<intsize>,
-C<longsize>, C<ptrsize>, C<nvsize>, C<file>, $info = Storable::read_magic(
-$buffer ), $info = Storable::read_magic( $buffer, $must_be_file )
-
-=item EXAMPLES
-
-=item WARNING
-
-=item BUGS
-
-=over 4
-
-=item 64 bit data in perl 5.6.0 and 5.6.1
-
-=back
-
-=item CREDITS
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 Switch - A switch statement for Perl
-
-=over 4
-
-=item VERSION
-
-=item SYNOPSIS
-
-=item BACKGROUND
-
-=item DESCRIPTION
-
-=over 4
-
-=item Allowing fall-through
-
-=item Automating fall-through
-
-=item Alternative syntax
-
-=item Higher-order Operations
-
-=back
-
-=item DEPENDENCIES
-
-=item AUTHOR
-
-=item BUGS
-
-=item LIMITATIONS
-
-=item COPYRIGHT
-
-=back
-
-=head2 Symbol - manipulate Perl symbols and their names
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item BUGS
-
-=back
-
-=head2 Sys::Hostname - Try every conceivable way to get hostname
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item AUTHOR
-
-=back
-
-=head2 Syslog, Sys::Syslog - Perl interface to the UNIX syslog(3) calls
-
-=over 4
-
-=item VERSION
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item EXPORTS
-
-=item FUNCTIONS
-
-B<openlog($ident, $logopt, $facility)>, B<syslog($priority, $message)>,
-B<syslog($priority, $format, @args)>, B<Note>,
-B<setlogmask($mask_priority)>, B<setlogsock($sock_type)>,
-B<setlogsock($sock_type, $stream_location)> (added in Perl 5.004_02),
-B<setlogsock($sock_type, $stream_location, $sock_timeout)> (added in 0.25),
-B<Note>, B<closelog()>
-
-=item THE RULES OF SYS::SYSLOG
-
-=item EXAMPLES
-
-=item CONSTANTS
-
-=over 4
-
-=item Facilities
-
-=item Levels
-
-=back
-
-=item DIAGNOSTICS
-
-C<Invalid argument passed to setlogsock>, C<eventlog passed to setlogsock,
-but no Win32 API available>, C<no connection to syslog available>, C<stream
-passed to setlogsock, but %s is not writable>, C<stream passed to
-setlogsock, but could not find any device>, C<tcp passed to setlogsock, but
-tcp service unavailable>, C<syslog: expecting argument %s>, C<syslog:
-invalid level/facility: %s>, C<syslog: too many levels given: %s>,
-C<syslog: too many facilities given: %s>, C<syslog: level must be given>,
-C<udp passed to setlogsock, but udp service unavailable>, C<unix passed to
-setlogsock, but path not available>
-
-=item SEE ALSO
-
-=over 4
-
-=item Manual Pages
-
-=item RFCs
-
-=item Articles
-
-=item Event Log
-
-=back
-
-=item AUTHORS & ACKNOWLEDGEMENTS
-
-=item BUGS
-
-=item SUPPORT
-
-AnnoCPAN: Annotated CPAN documentation, CPAN Ratings, RT: CPAN's request
-tracker, Search CPAN, Kobes' CPAN Search, Perl Documentation
-
-=item COPYRIGHT
-
-=item LICENSE
-
-=back
-
-=head2 Syslog::Syslog, Sys::Syslog - Perl interface to the UNIX syslog(3)
-calls
-
-=over 4
-
-=item VERSION
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item EXPORTS
-
-=item FUNCTIONS
-
-B<openlog($ident, $logopt, $facility)>, B<syslog($priority, $message)>,
-B<syslog($priority, $format, @args)>, B<Note>,
-B<setlogmask($mask_priority)>, B<setlogsock($sock_type)>,
-B<setlogsock($sock_type, $stream_location)> (added in Perl 5.004_02),
-B<setlogsock($sock_type, $stream_location, $sock_timeout)> (added in 0.25),
-B<Note>, B<closelog()>
-
-=item THE RULES OF SYS::SYSLOG
-
-=item EXAMPLES
-
-=item CONSTANTS
-
-=over 4
-
-=item Facilities
-
-=item Levels
-
-=back
-
-=item DIAGNOSTICS
-
-C<Invalid argument passed to setlogsock>, C<eventlog passed to setlogsock,
-but no Win32 API available>, C<no connection to syslog available>, C<stream
-passed to setlogsock, but %s is not writable>, C<stream passed to
-setlogsock, but could not find any device>, C<tcp passed to setlogsock, but
-tcp service unavailable>, C<syslog: expecting argument %s>, C<syslog:
-invalid level/facility: %s>, C<syslog: too many levels given: %s>,
-C<syslog: too many facilities given: %s>, C<syslog: level must be given>,
-C<udp passed to setlogsock, but udp service unavailable>, C<unix passed to
-setlogsock, but path not available>
-
-=item SEE ALSO
-
-=over 4
-
-=item Manual Pages
-
-=item RFCs
-
-=item Articles
-
-=item Event Log
-
-=back
-
-=item AUTHORS & ACKNOWLEDGEMENTS
-
-=item BUGS
-
-=item SUPPORT
-
-AnnoCPAN: Annotated CPAN documentation, CPAN Ratings, RT: CPAN's request
-tracker, Search CPAN, Kobes' CPAN Search, Perl Documentation
-
-=item COPYRIGHT
-
-=item LICENSE
-
-=back
-
-=head2 Syslog::win32::Win32, Sys::Syslog::Win32 - Win32 support for
-Sys::Syslog
-
-=over 4
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=item AUTHORS
-
-=item LICENSE
-
-=back
-
-=head2 TAP::Base - Base class that provides common functionality to
-L<TAP::Parser> and L<TAP::Harness>
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=head2 TAP::Formatter::Color - Run Perl test scripts with color
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item SYNOPSIS
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=head2 TAP::Formatter::Console - Harness output delegate for default
-console output
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item SYNOPSIS
-
-=back
-
-=over 4
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-C<verbosity>, C<verbose>, C<timer>, C<failures>, C<quiet>, C<really_quiet>,
-C<silent>, C<errors>, C<directives>, C<stdout>, C<color>, C<jobs>,
-C<show_count>
-
-=back
-
-=back
-
-=head2 TAP::Formatter::Console::ParallelSession - Harness output delegate
-for parallel console output
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item SYNOPSIS
-
-=back
-
-=over 4
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=head2 TAP::Formatter::Console::Session - Harness output delegate for
-default console output
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item SYNOPSIS
-
-=back
-
-=over 4
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-C<formatter>, C<parser>, C<name>, C<show_count>
-
-=back
-
-=back
-
-=head2 TAP::Harness - Run test scripts with statistics
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item SYNOPSIS
-
-=back
-
-=over 4
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-C<verbosity>, C<timer>, C<failures>, C<show_count>, C<lib>, C<switches>,
-C<test_args>, C<color>, C<exec>, C<merge>, C<aggregator_class>,
-C<formatter_class>, C<multiplexer_class>, C<parser_class>,
-C<scheduler_class>, C<formatter>, C<errors>, C<directives>, C<ignore_exit>,
-C<jobs>, C<fork>, C<rules>, C<stdout>
-
-=back
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-the file name of a test script to run, a reference to a [ file name,
-display name ] array
-
-=over 4
-
-=item SUBCLASSING
-
-=over 4
-
-=item Methods
-
-C<start>, C<tests>
-
-=back
-
-=back
-
-=over 4
-
-=item REPLACING
-
-=item SEE ALSO
-
-=back
-
-=head2 TAP::Object - Base class that provides common functionality to all
-C<TAP::*> modules
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=head2 TAParser, TAP::Parser - Parse L<TAP|Test::Harness::TAP> output
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-C<source>, C<tap>, C<exec>, C<callback>, C<switches>, C<test_args>,
-C<spool>, C<merge>, C<source_class>, C<perl_source_class>,
-C<grammar_class>, C<iterator_factory_class>, C<result_factory_class>
-
-=back
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=over 4
-
-=item INDIVIDUAL RESULTS
-
-=over 4
-
-=item Result types
-
-Version, Plan, Pragma, Test, Comment, Bailout, Unknown
-
-=item Common type methods
-
-=item C<plan> methods
-
-=item C<pragma> methods
-
-=item C<bailout> methods
-
-=item C<unknown> methods
-
-=item C<test> methods
-
-=back
-
-=item TOTAL RESULTS
-
-=over 4
-
-=item Individual Results
-
-=back
-
-=back
-
-=over 4
-
-=item Pragmas
-
-=back
-
-=over 4
-
-=item Summary Results
-
-=back
-
-=over 4
-
-=item C<ignore_exit>
-
-=back
-
-Misplaced plan, No plan, More than one plan, Test numbers out of sequence
-
-=over 4
-
-=item CALLBACKS
-
-C<test>, C<version>, C<plan>, C<comment>, C<bailout>, C<yaml>, C<unknown>,
-C<ELSE>, C<ALL>, C<EOF>
-
-=item TAP GRAMMAR
-
-=item BACKWARDS COMPATABILITY
-
-=over 4
-
-=item Differences
-
-TODO plans, 'Missing' tests
-
-=back
-
-=item SUBCLASSING
-
-=over 4
-
-=item Parser Components
-
-option 1, option 2
-
-=back
-
-=item ACKNOWLEDGEMENTS
-
-Michael Schwern, Andy Lester, chromatic, GEOFFR, Shlomi Fish, Torsten
-Schoenfeld, Jerry Gay, Aristotle, Adam Kennedy, Yves Orton, Adrian Howard,
-Sean & Lil, Andreas J. Koenig, Florian Ragwitz, Corion, Mark Stosberg, Matt
-Kraai, David Wheeler, Alex Vandiver
-
-=item AUTHORS
-
-=item BUGS
-
-=item COPYRIGHT & LICENSE
-
-=back
-
-=head2 TAParser::Aggregator, TAP::Parser::Aggregator - Aggregate
-TAP::Parser results
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=over 4
-
-=item Summary methods
-
-failed, parse_errors, passed, skipped, todo, todo_passed, wait, exit
-
-=back
-
-Failed tests, Parse erros, Bad exit or wait status
-
-=over 4
-
-=item See Also
-
-=back
-
-=head2 TAParser::Grammar, TAP::Parser::Grammar - A grammar for the Test
-Anything Protocol.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=over 4
-
-=item TAP GRAMMAR
-
-=item SUBCLASSING
-
-=item SEE ALSO
-
-=back
-
-=head2 TAParser::Iterator, TAP::Parser::Iterator - Internal base class for
-TAP::Parser Iterators
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=item Instance Methods
-
-=back
-
-=back
-
-=over 4
-
-=item SUBCLASSING
-
-=over 4
-
-=item Example
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 TAParser::Iterator::Array, TAP::Parser::Iterator::Array - Internal
-TAP::Parser array Iterator
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=item Instance Methods
-
-=back
-
-=back
-
-=over 4
-
-=item ATTRIBUTION
-
-=item SEE ALSO
-
-=back
-
-=head2 TAParser::Iterator::Process, TAP::Parser::Iterator::Process -
-Internal TAP::Parser Iterator
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=item Instance Methods
-
-=back
-
-=back
-
-=over 4
-
-=item ATTRIBUTION
-
-=item SEE ALSO
-
-=back
-
-=head2 TAParser::Iterator::Stream, TAP::Parser::Iterator::Stream - Internal
-TAP::Parser Iterator
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=over 4
-
-=item ATTRIBUTION
-
-=item SEE ALSO
-
-=back
-
-=head2 TAParser::IteratorFactory, TAP::Parser::IteratorFactory - Internal
-TAP::Parser Iterator
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=over 4
-
-=item SUBCLASSING
-
-=over 4
-
-=item Example
-
-=back
-
-=item ATTRIBUTION
-
-=item SEE ALSO
-
-=back
-
-=head2 TAParser::Multiplexer, TAP::Parser::Multiplexer - Multiplex multiple
-TAP::Parsers
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=over 4
-
-=item See Also
-
-=back
-
-=head2 TAParser::Result, TAP::Parser::Result - Base class for TAP::Parser
-output objects
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=over 4
-
-=item DESCRIPTION
-
-=item METHODS
-
-=back
-
-=back
-
-=over 4
-
-=item Boolean methods
-
-C<is_plan>, C<is_pragma>, C<is_test>, C<is_comment>, C<is_bailout>,
-C<is_version>, C<is_unknown>, C<is_yaml>
-
-=back
-
-=over 4
-
-=item SUBCLASSING
-
-=over 4
-
-=item Example
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 TAParser::Result::Bailout, TAP::Parser::Result::Bailout - Bailout
-result token.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item OVERRIDDEN METHODS
-
-C<as_string>
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=head2 TAParser::Result::Comment, TAP::Parser::Result::Comment - Comment
-result token.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item OVERRIDDEN METHODS
-
-C<as_string>
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=head2 TAParser::Result::Plan, TAP::Parser::Result::Plan - Plan result
-token.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item OVERRIDDEN METHODS
-
-C<as_string>, C<raw>
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=head2 TAParser::Result::Pragma, TAP::Parser::Result::Pragma - TAP pragma
-token.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item OVERRIDDEN METHODS
-
-C<as_string>, C<raw>
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=head2 TAParser::Result::Test, TAP::Parser::Result::Test - Test result
-token.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item OVERRIDDEN METHODS
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=back
-
-=head2 TAParser::Result::Unknown, TAP::Parser::Result::Unknown - Unknown
-result token.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item OVERRIDDEN METHODS
-
-C<as_string>, C<raw>
-
-=back
-
-=head2 TAParser::Result::Version, TAP::Parser::Result::Version - TAP syntax
-version token.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item OVERRIDDEN METHODS
-
-C<as_string>, C<raw>
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=head2 TAParser::Result::YAML, TAP::Parser::Result::YAML - YAML result
-token.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item OVERRIDDEN METHODS
-
-C<as_string>, C<raw>
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=head2 TAParser::ResultFactory, TAP::Parser::ResultFactory - Factory for
-creating TAP::Parser output objects
-
-=over 4
-
-=item SYNOPSIS
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item METHODS
-
-=item Class Methods
-
-=back
-
-=over 4
-
-=item SUBCLASSING
-
-=over 4
-
-=item Example
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 TAParser::Scheduler, TAP::Parser::Scheduler - Schedule tests during
-parallel testing
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=head2 TAParser::Scheduler::Job, TAP::Parser::Scheduler::Job - A single
-testing job.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=head2 TAParser::Scheduler::Spinner, TAP::Parser::Scheduler::Spinner - A
-no-op job.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=head2 TAParser::Source, TAP::Parser::Source - Stream output from some
-source
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=over 4
-
-=item SUBCLASSING
-
-=over 4
-
-=item Example
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 TAParser::Source::Perl, TAP::Parser::Source::Perl - Stream Perl
-output
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=item Instance Methods
-
-=back
-
-=back
-
-=over 4
-
-=item SUBCLASSING
-
-=over 4
-
-=item Example
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 TAParser::Utils, TAP::Parser::Utils - Internal TAP::Parser utilities
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item INTERFACE
-
-=back
-
-=back
-
-=head2 TAParser::YAMLish::Reader, TAP::Parser::YAMLish::Reader - Read
-YAMLish data from iterator
-
-=over 4
-
-=item VERSION
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=item Instance Methods
-
-=back
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=item COPYRIGHT
-
-=back
-
-=head2 TAParser::YAMLish::Writer, TAP::Parser::YAMLish::Writer - Write
-YAMLish data
-
-=over 4
-
-=item VERSION
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=item Instance Methods
-
-a reference to a scalar to append YAML to, the handle of an open file, a
-reference to an array into which YAML will be pushed, a code reference
-
-=back
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=item COPYRIGHT
-
-=back
-
-=head2 Term::ANSIColor - Color screen output using ANSI escape sequences
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item DIAGNOSTICS
-
-Bad escape sequence %s, Bareword "%s" not allowed while "strict subs" in
-use, Invalid attribute name %s, Name "%s" used only once: possible typo, No
-comma allowed after filehandle, No name for escape sequence %s
-
-=item ENVIRONMENT
-
-ANSI_COLORS_DISABLED
-
-=item RESTRICTIONS
-
-=item NOTES
-
-=item SEE ALSO
-
-=item AUTHORS
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 Term::Cap - Perl termcap interface
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item METHODS
-
-=back
-
-=back
-
-B<Tgetent>, OSPEED, TERM
-
-B<Tpad>, B<$string>, B<$cnt>, B<$FH>
-
-B<Tputs>, B<$cap>, B<$cnt>, B<$FH>
-
-B<Tgoto>, B<$cap>, B<$col>, B<$row>, B<$FH>
-
-B<Trequire>
-
-=over 4
-
-=item EXAMPLES
-
-=item COPYRIGHT AND LICENSE
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 Term::Complete - Perl word completion module
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-E<lt>tabE<gt>, ^D, ^U, E<lt>delE<gt>, E<lt>bsE<gt>
-
-=item DIAGNOSTICS
-
-=item BUGS
-
-=item AUTHOR
-
-=back
-
-=head2 Term::ReadLine - Perl interface to various C<readline> packages.
-If no real package is found, substitutes stubs instead of basic functions.
-
-=over 4
-
-=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>, Attribs, C<Features>
-
-=item Additional supported functions
-
-C<tkRunning>, C<ornaments>, C<newTTY>
-
-=item EXPORTS
-
-=item ENVIRONMENT
-
-=item CAVEATS
-
-=back
-
-=head2 Term::UI - Term::ReadLine UI made easy
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item HOW IT WORKS
-
-=item METHODS
-
-=over 4
-
-=item $reply = $term->get_reply( prompt => 'question?', [choices => \@list,
-default => $list[0], multi => BOOL, print_me => "extra text to print &
-record", allow => $ref] );
-
-=back
-
-=back
-
-=over 4
-
-=item $bool = $term->ask_yn( prompt => "your question", [default =>
-(y|1,n|0), print_me => "extra text to print & record"] )
-
-=back
-
-=over 4
-
-=item ($opts, $munged) = $term->parse_options( STRING );
-
-=back
-
-=over 4
-
-=item $str = $term->history_as_string
-
-=back
-
-=over 4
-
-=item GLOBAL VARIABLES
-
-=over 4
-
-=item $Term::UI::VERBOSE
-
-=item $Term::UI::AUTOREPLY
-
-=item $Term::UI::INVALID
-
-=item $Term::UI::History::HISTORY_FH
-
-=back
-
-=item EXAMPLES
-
-=over 4
-
-=item Basic get_reply sample
-
-=item get_reply with choices
-
-=item get_reply with choices and default
-
-=item get_reply using print_me & multi
-
-=item get_reply & allow
-
-=item an elaborate ask_yn sample
-
-=back
-
-=item See Also
-
-=item BUG REPORTS
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 Term::UI::History
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item FUNCTIONS
-
-=over 4
-
-=item history("message string" [,VERBOSE])
-
-=back
-
-=back
-
-=over 4
-
-=item GLOBAL VARIABLES
-
-$HISTORY_FH
-
-=item See Also
-
-=item AUTHOR
-
-=item COPYRIGHT
-
-=back
-
-=head2 Test - provides a simple framework for writing test scripts
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item QUICK START GUIDE
-
-=over 4
-
-=item Functions
-
-C<plan(...)>, C<tests =E<gt> I<number>>, C<todo =E<gt> [I<1,5,14>]>,
-C<onfail =E<gt> sub { ... }>, C<onfail =E<gt> \&some_sub>
-
-=back
-
-=back
-
-B<_to_value>
-
-C<ok(...)>
-
-C<skip(I<skip_if_true>, I<args...>)>
-
-=over 4
-
-=item TEST TYPES
-
-NORMAL TESTS, SKIPPED TESTS, TODO TESTS
-
-=item ONFAIL
-
-=item BUGS and CAVEATS
-
-=item ENVIRONMENT
-
-=item NOTE
-
-=item SEE ALSO
-
-=item AUTHOR
-
-=back
-
-=head2 Test::Builder - Backend for building test libraries
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Construction
-
-B<new>
-
-=back
-
-=back
-
-B<create>
-
-B<reset>
-
-=over 4
-
-=item Setting up tests
-
-B<plan>
-
-=back
-
-B<expected_tests>
-
-B<no_plan>
-
-B<has_plan>
-
-B<skip_all>
-
-B<exported_to>
-
-=over 4
-
-=item Running tests
-
-B<ok>
-
-=back
-
-B<is_eq>, B<is_num>
-
-B<isnt_eq>, B<isnt_num>
-
-B<like>, B<unlike>
-
-B<cmp_ok>
-
-=over 4
-
-=item Other Testing Methods
-
-B<BAIL_OUT>
-
-=back
-
-B<skip>
-
-B<todo_skip>
-
-B<skip_rest>
-
-=over 4
-
-=item Test building utility methods
-
-B<maybe_regex>
-
-=back
-
-B<_try>
-
-B<is_fh>
-
-=over 4
-
-=item Test style
-
-B<level>
-
-=back
-
-B<use_numbers>
-
-B<no_diag>, B<no_ending>, B<no_header>
-
-=over 4
-
-=item Output
-
-B<diag>
-
-=back
-
-B<note>
-
-B<explain>
-
-B<_print>
-
-B<output>, B<failure_output>, B<todo_output>
-
-reset_outputs
-
-carp, croak
-
-=over 4
-
-=item Test Status and Info
-
-B<current_test>
-
-=back
-
-B<summary>
-
-B<details>
-
-B<todo>
-
-B<find_TODO>
-
-B<in_todo>
-
-B<todo_start>
-
-C<todo_end>
-
-B<caller>
-
-B<_sanity_check>
-
-B<_whoa>
-
-B<_my_exit>
-
-=over 4
-
-=item EXIT CODES
-
-=item THREADS
-
-=item EXAMPLES
-
-=item SEE ALSO
-
-=item AUTHORS
-
-=item COPYRIGHT
-
-=back
-
-=head2 Test::Builder::Module - Base class for test modules
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Importing
-
-=back
-
-=back
-
-=over 4
-
-=item Builder
-
-=back
-
-=head2 Test::Builder::Tester - test testsuites that have been built with
-Test::Builder
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=over 4
-
-=item Functions
-
-test_out, test_err
-
-=back
-
-test_fail
-
-test_diag
-
-test_test, title (synonym 'name', 'label'), skip_out, skip_err
-
-line_num
-
-color
-
-=over 4
-
-=item BUGS
-
-=item AUTHOR
-
-=item NOTES
-
-=item SEE ALSO
-
-=back
-
-=head2 Test::Builder::Tester::Color - turn on colour in
-Test::Builder::Tester
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=over 4
-
-=item AUTHOR
-
-=item BUGS
-
-=item SEE ALSO
-
-=back
-
-=head2 Test::Harness - Run Perl standard test scripts with statistics
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item FUNCTIONS
-
-=over 4
-
-=item runtests( @test_files )
-
-=back
-
-=back
-
-=over 4
-
-=item execute_tests( tests => \@test_files, out => \*FH )
-
-=back
-
-=over 4
-
-=item EXPORT
-
-=item ENVIRONMENT VARIABLES THAT TAP::HARNESS::COMPATIBLE SETS
-
-C<HARNESS_ACTIVE>, C<HARNESS_VERSION>
-
-=item ENVIRONMENT VARIABLES THAT AFFECT TEST::HARNESS
-
-C<HARNESS_TIMER>, C<HARNESS_VERBOSE>, C<HARNESS_OPTIONS>, C<< j<n> >>, C<<
-f >>
-
-=item Taint Mode
-
-=item SEE ALSO
-
-=item BUGS
-
-=item AUTHORS
-
-=item LICENCE AND COPYRIGHT
-
-=back
-
-=head2 Test::Harness::lib::App::Prove, App::Prove - Implements the C<prove>
-command.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item SYNOPSIS
-
-=back
-
-=over 4
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=over 4
-
-=item Attributes
-
-C<archive>, C<argv>, C<backwards>, C<blib>, C<color>, C<directives>,
-C<dry>, C<exec>, C<extension>, C<failures>, C<fork>, C<formatter>,
-C<harness>, C<ignore_exit>, C<includes>, C<jobs>, C<lib>, C<merge>,
-C<modules>, C<parse>, C<plugins>, C<quiet>, C<really_quiet>, C<recurse>,
-C<rules>, C<show_count>, C<show_help>, C<show_man>, C<show_version>,
-C<shuffle>, C<state>, C<taint_fail>, C<taint_warn>, C<test_args>, C<timer>,
-C<verbose>, C<warnings_fail>, C<warnings_warn>
-
-=back
-
-=head2 Test::Harness::lib::App::Prove::State, App::Prove::State - State
-storage for the C<prove> command.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item SYNOPSIS
-
-=back
-
-=over 4
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=over 4
-
-=item C<result_class>
-
-=back
-
-=over 4
-
-=item C<extension>
-
-=back
-
-=over 4
-
-=item C<results>
-
-=back
-
-=over 4
-
-=item C<commit>
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-C<last>, C<failed>, C<passed>, C<all>, C<hot>, C<todo>, C<slow>, C<fast>,
-C<new>, C<old>, C<save>
-
-=back
-
-=head2 Test::Harness::lib::App::Prove::State::Result,
-App::Prove::State::Result - Individual test suite results.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item SYNOPSIS
-
-=back
-
-=over 4
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=over 4
-
-=item C<state_version>
-
-=back
-
-=over 4
-
-=item C<test_class>
-
-=back
-
-=head2 Test::Harness::lib::App::Prove::State::Result::Test,
-App::Prove::State::Result::Test - Individual test results.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item SYNOPSIS
-
-=back
-
-=over 4
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=head2 Test::Harness::lib::TAP::Base, TAP::Base - Base class that provides
-common functionality to L<TAP::Parser> and L<TAP::Harness>
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=head2 Test::Harness::lib::TAP::Formatter::Color, TAP::Formatter::Color -
-Run Perl test scripts with color
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item SYNOPSIS
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=head2 Test::Harness::lib::TAP::Formatter::Console, TAP::Formatter::Console
-- Harness output delegate for default console output
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item SYNOPSIS
-
-=back
-
-=over 4
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-C<verbosity>, C<verbose>, C<timer>, C<failures>, C<quiet>, C<really_quiet>,
-C<silent>, C<errors>, C<directives>, C<stdout>, C<color>, C<jobs>,
-C<show_count>
-
-=back
-
-=back
-
-=head2 Test::Harness::lib::TAP::Formatter::Console::ParallelSession,
-TAP::Formatter::Console::ParallelSession - Harness output delegate for
-parallel console output
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item SYNOPSIS
-
-=back
-
-=over 4
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=head2 Test::Harness::lib::TAP::Formatter::Console::Session,
-TAP::Formatter::Console::Session - Harness output delegate for default
-console output
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item SYNOPSIS
-
-=back
-
-=over 4
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-C<formatter>, C<parser>, C<name>, C<show_count>
-
-=back
-
-=back
-
-=head2 Test::Harness::lib::TAP::Harness, TAP::Harness - Run test scripts
-with statistics
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item SYNOPSIS
-
-=back
-
-=over 4
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-C<verbosity>, C<timer>, C<failures>, C<show_count>, C<lib>, C<switches>,
-C<test_args>, C<color>, C<exec>, C<merge>, C<aggregator_class>,
-C<formatter_class>, C<multiplexer_class>, C<parser_class>,
-C<scheduler_class>, C<formatter>, C<errors>, C<directives>, C<ignore_exit>,
-C<jobs>, C<fork>, C<rules>, C<stdout>
-
-=back
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-the file name of a test script to run, a reference to a [ file name,
-display name ] array
-
-=over 4
-
-=item SUBCLASSING
-
-=over 4
-
-=item Methods
-
-C<start>, C<tests>
-
-=back
-
-=back
-
-=over 4
-
-=item REPLACING
-
-=item SEE ALSO
-
-=back
-
-=head2 Test::Harness::lib::TAP::Object, TAP::Object - Base class that
-provides common functionality to all C<TAP::*> modules
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=head2 Test::Harness::lib::TAParser, TAP::Parser - Parse
-L<TAP|Test::Harness::TAP> output
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-C<source>, C<tap>, C<exec>, C<callback>, C<switches>, C<test_args>,
-C<spool>, C<merge>, C<source_class>, C<perl_source_class>,
-C<grammar_class>, C<iterator_factory_class>, C<result_factory_class>
-
-=back
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=over 4
-
-=item INDIVIDUAL RESULTS
-
-=over 4
-
-=item Result types
-
-Version, Plan, Pragma, Test, Comment, Bailout, Unknown
-
-=item Common type methods
-
-=item C<plan> methods
-
-=item C<pragma> methods
-
-=item C<bailout> methods
-
-=item C<unknown> methods
-
-=item C<test> methods
-
-=back
-
-=item TOTAL RESULTS
-
-=over 4
-
-=item Individual Results
-
-=back
-
-=back
-
-=over 4
-
-=item Pragmas
-
-=back
-
-=over 4
-
-=item Summary Results
-
-=back
-
-=over 4
-
-=item C<ignore_exit>
-
-=back
-
-Misplaced plan, No plan, More than one plan, Test numbers out of sequence
-
-=over 4
-
-=item CALLBACKS
-
-C<test>, C<version>, C<plan>, C<comment>, C<bailout>, C<yaml>, C<unknown>,
-C<ELSE>, C<ALL>, C<EOF>
-
-=item TAP GRAMMAR
-
-=item BACKWARDS COMPATABILITY
-
-=over 4
-
-=item Differences
-
-TODO plans, 'Missing' tests
-
-=back
-
-=item SUBCLASSING
-
-=over 4
-
-=item Parser Components
-
-option 1, option 2
-
-=back
-
-=item ACKNOWLEDGEMENTS
-
-Michael Schwern, Andy Lester, chromatic, GEOFFR, Shlomi Fish, Torsten
-Schoenfeld, Jerry Gay, Aristotle, Adam Kennedy, Yves Orton, Adrian Howard,
-Sean & Lil, Andreas J. Koenig, Florian Ragwitz, Corion, Mark Stosberg, Matt
-Kraai, David Wheeler, Alex Vandiver
-
-=item AUTHORS
-
-=item BUGS
-
-=item COPYRIGHT & LICENSE
-
-=back
-
-=head2 Test::Harness::lib::TAParser::Aggregator, TAP::Parser::Aggregator -
-Aggregate TAP::Parser results
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=over 4
-
-=item Summary methods
-
-failed, parse_errors, passed, skipped, todo, todo_passed, wait, exit
-
-=back
-
-Failed tests, Parse erros, Bad exit or wait status
-
-=over 4
-
-=item See Also
-
-=back
-
-=head2 Test::Harness::lib::TAParser::Grammar, TAP::Parser::Grammar - A
-grammar for the Test Anything Protocol.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=over 4
-
-=item TAP GRAMMAR
-
-=item SUBCLASSING
-
-=item SEE ALSO
-
-=back
-
-=head2 Test::Harness::lib::TAParser::Iterator, TAP::Parser::Iterator -
-Internal base class for TAP::Parser Iterators
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=item Instance Methods
-
-=back
-
-=back
-
-=over 4
-
-=item SUBCLASSING
-
-=over 4
-
-=item Example
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 Test::Harness::lib::TAParser::Iterator::Array,
-TAP::Parser::Iterator::Array - Internal TAP::Parser array Iterator
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=item Instance Methods
-
-=back
-
-=back
-
-=over 4
-
-=item ATTRIBUTION
-
-=item SEE ALSO
-
-=back
-
-=head2 Test::Harness::lib::TAParser::Iterator::Process,
-TAP::Parser::Iterator::Process - Internal TAP::Parser Iterator
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=item Instance Methods
-
-=back
-
-=back
-
-=over 4
-
-=item ATTRIBUTION
-
-=item SEE ALSO
-
-=back
-
-=head2 Test::Harness::lib::TAParser::Iterator::Stream,
-TAP::Parser::Iterator::Stream - Internal TAP::Parser Iterator
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=over 4
-
-=item ATTRIBUTION
-
-=item SEE ALSO
-
-=back
-
-=head2 Test::Harness::lib::TAParser::IteratorFactory,
-TAP::Parser::IteratorFactory - Internal TAP::Parser Iterator
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=over 4
-
-=item SUBCLASSING
-
-=over 4
-
-=item Example
-
-=back
-
-=item ATTRIBUTION
-
-=item SEE ALSO
-
-=back
-
-=head2 Test::Harness::lib::TAParser::Multiplexer, TAP::Parser::Multiplexer
-- Multiplex multiple TAP::Parsers
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=over 4
-
-=item See Also
-
-=back
-
-=head2 Test::Harness::lib::TAParser::Result, TAP::Parser::Result - Base
-class for TAP::Parser output objects
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=over 4
-
-=item DESCRIPTION
-
-=item METHODS
-
-=back
-
-=back
-
-=over 4
-
-=item Boolean methods
-
-C<is_plan>, C<is_pragma>, C<is_test>, C<is_comment>, C<is_bailout>,
-C<is_version>, C<is_unknown>, C<is_yaml>
-
-=back
-
-=over 4
-
-=item SUBCLASSING
-
-=over 4
-
-=item Example
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 Test::Harness::lib::TAParser::Result::Bailout,
-TAP::Parser::Result::Bailout - Bailout result token.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item OVERRIDDEN METHODS
-
-C<as_string>
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=head2 Test::Harness::lib::TAParser::Result::Comment,
-TAP::Parser::Result::Comment - Comment result token.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item OVERRIDDEN METHODS
-
-C<as_string>
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=head2 Test::Harness::lib::TAParser::Result::Plan,
-TAP::Parser::Result::Plan - Plan result token.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item OVERRIDDEN METHODS
-
-C<as_string>, C<raw>
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=head2 Test::Harness::lib::TAParser::Result::Pragma,
-TAP::Parser::Result::Pragma - TAP pragma token.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item OVERRIDDEN METHODS
-
-C<as_string>, C<raw>
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=head2 Test::Harness::lib::TAParser::Result::Test,
-TAP::Parser::Result::Test - Test result token.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item OVERRIDDEN METHODS
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=back
-
-=head2 Test::Harness::lib::TAParser::Result::Unknown,
-TAP::Parser::Result::Unknown - Unknown result token.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item OVERRIDDEN METHODS
-
-C<as_string>, C<raw>
-
-=back
-
-=head2 Test::Harness::lib::TAParser::Result::Version,
-TAP::Parser::Result::Version - TAP syntax version token.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item OVERRIDDEN METHODS
-
-C<as_string>, C<raw>
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=head2 Test::Harness::lib::TAParser::Result::YAML,
-TAP::Parser::Result::YAML - YAML result token.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item OVERRIDDEN METHODS
-
-C<as_string>, C<raw>
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=head2 Test::Harness::lib::TAParser::ResultFactory,
-TAP::Parser::ResultFactory - Factory for creating TAP::Parser output
-objects
-
-=over 4
-
-=item SYNOPSIS
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=item METHODS
-
-=item Class Methods
-
-=back
-
-=over 4
-
-=item SUBCLASSING
-
-=over 4
-
-=item Example
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 Test::Harness::lib::TAParser::Scheduler, TAP::Parser::Scheduler -
-Schedule tests during parallel testing
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=head2 Test::Harness::lib::TAParser::Scheduler::Job,
-TAP::Parser::Scheduler::Job - A single testing job.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=head2 Test::Harness::lib::TAParser::Scheduler::Spinner,
-TAP::Parser::Scheduler::Spinner - A no-op job.
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=head2 Test::Harness::lib::TAParser::Source, TAP::Parser::Source - Stream
-output from some source
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=back
-
-=back
-
-=over 4
-
-=item Instance Methods
-
-=back
-
-=over 4
-
-=item SUBCLASSING
-
-=over 4
-
-=item Example
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 Test::Harness::lib::TAParser::Source::Perl,
-TAP::Parser::Source::Perl - Stream Perl output
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=item Instance Methods
-
-=back
-
-=back
-
-=over 4
-
-=item SUBCLASSING
-
-=over 4
-
-=item Example
-
-=back
-
-=item SEE ALSO
-
-=back
-
-=head2 Test::Harness::lib::TAParser::Utils, TAP::Parser::Utils - Internal
-TAP::Parser utilities
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item INTERFACE
-
-=back
-
-=back
-
-=head2 Test::Harness::lib::TAParser::YAMLish::Reader,
-TAP::Parser::YAMLish::Reader - Read YAMLish data from iterator
-
-=over 4
-
-=item VERSION
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=item Instance Methods
-
-=back
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=item COPYRIGHT
-
-=back
-
-=head2 Test::Harness::lib::TAParser::YAMLish::Writer,
-TAP::Parser::YAMLish::Writer - Write YAMLish data
-
-=over 4
-
-=item VERSION
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=over 4
-
-=item Class Methods
-
-=item Instance Methods
-
-a reference to a scalar to append YAML to, the handle of an open file, a
-reference to an array into which YAML will be pushed, a code reference
-
-=back
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=item COPYRIGHT
-
-=back
-
-=head2 Test::Harness::lib::Test::Harness, Test::Harness - Run Perl standard
-test scripts with statistics
-
-=over 4
-
-=item VERSION
-
-=back
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item FUNCTIONS
-
-=over 4
-
-=item runtests( @test_files )
-
-=back
-
-=back
-
-=over 4
-
-=item execute_tests( tests => \@test_files, out => \*FH )
-
-=back
-
-=over 4
-
-=item EXPORT
-
-=item ENVIRONMENT VARIABLES THAT TAP::HARNESS::COMPATIBLE SETS
-
-C<HARNESS_ACTIVE>, C<HARNESS_VERSION>
-
-=item ENVIRONMENT VARIABLES THAT AFFECT TEST::HARNESS
-
-C<HARNESS_TIMER>, C<HARNESS_VERBOSE>, C<HARNESS_OPTIONS>, C<< j<n> >>, C<<
-f >>
-
-=item Taint Mode
-
-=item SEE ALSO
-
-=item BUGS
-
-=item AUTHORS
-
-=item LICENCE AND COPYRIGHT
-
-=back
-
-=head2 Test::More - yet another framework for writing test scripts
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item I love it when a plan comes together
-
-=back
-
-=back
-
-=over 4
-
-=item Test names
-
-=item I'm ok, you're not ok.
-
-B<ok>
-
-=back
-
-B<is>, B<isnt>
-
-B<like>
-
-B<unlike>
-
-B<cmp_ok>
-
-B<can_ok>
-
-B<isa_ok>
-
-B<new_ok>
-
-B<pass>, B<fail>
-
-=over 4
-
-=item Module tests
-
-B<use_ok>
-
-=back
-
-B<require_ok>
-
-=over 4
-
-=item Complex data structures
-
-B<is_deeply>
-
-=back
-
-=over 4
-
-=item Diagnostics
-
-B<diag>, B<note>
-
-=back
-
-B<explain>
-
-=over 4
-
-=item Conditional tests
-
-B<SKIP: BLOCK>
-
-=back
-
-B<TODO: BLOCK>, B<todo_skip>
-
-When do I use SKIP vs. TODO?
-
-=over 4
-
-=item Test control
-
-B<BAIL_OUT>
-
-=back
-
-=over 4
-
-=item Discouraged comparison functions
-
-B<eq_array>
-
-=back
-
-B<eq_hash>
-
-B<eq_set>
-
-=over 4
-
-=item Extending and Embedding Test::More
-
-B<builder>
-
-=back
-
-=over 4
-
-=item EXIT CODES
-
-=item CAVEATS and NOTES
-
-Backwards compatibility, Overloaded objects, Threads, Test::Harness upgrade
-
-=item HISTORY
-
-=item SEE ALSO
-
-=item AUTHORS
-
-=item BUGS
-
-=item COPYRIGHT
-
-=back
-
-=head2 Test::Simple - Basic utilities for writing tests.
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-B<ok>
-
-=back
-
-=over 4
-
-=item EXAMPLE
-
-=item CAVEATS
-
-=item NOTES
-
-=item HISTORY
-
-=item SEE ALSO
-
-L<Test::More>
-
-=item AUTHORS
-
-=item COPYRIGHT
-
-=back
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Nuts and bolts of testing.
-
-=item Where to start?
-
-=item Names
-
-=item Test the manual
-
-=item Sometimes the tests are wrong
-
-=item Testing lots of values
-
-=item Informative names
-
-=item Skipping tests
-
-=item Todo tests
-
-=item Testing with taint mode.
-
-=back
-
-=item FOOTNOTES
-
-=item AUTHORS
-
-=item COPYRIGHT
-
-=back
-
-=head2 Text::Abbrev, abbrev - create an abbreviation table from a list
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item EXAMPLE
-
-=back
-
-=head2 Text::Balanced - Extract delimited text sequences from strings.
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item General behaviour in list contexts
-
-[0], [1], [2]
-
-=item General behaviour in scalar and void contexts
-
-=item A note about prefixes
-
-=item C<extract_delimited>
-
-=item C<extract_bracketed>
-
-=item C<extract_variable>
-
-[0], [1], [2]
-
-=item C<extract_tagged>
-
-C<reject =E<gt> $listref>, C<ignore =E<gt> $listref>, C<fail =E<gt> $str>,
-[0], [1], [2], [3], [4], [5]
-
-=item C<gen_extract_tagged>
-
-=item C<extract_quotelike>
-
-[0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10]
-
-=item C<extract_quotelike> and "here documents"
-
-[0], [1], [2], [3], [4], [5], [6], [7..10]
-
-=item C<extract_codeblock>
-
-=item C<extract_multiple>
-
-=item C<gen_delimited_pat>
-
-=item C<delimited_pat>
-
-=back
-
-=item DIAGNOSTICS
-
- C<Did not find a suitable bracket: "%s">, C<Did not find prefix: /%s/>,
-C<Did not find opening bracket after prefix: "%s">, C<No quotelike
-operator found after prefix: "%s">, C<Unmatched closing bracket: "%c">,
-C<Unmatched opening bracket(s): "%s">, C<Unmatched embedded quote (%s)>,
-C<Did not find closing delimiter to match '%s'>, C<Mismatched closing
-bracket: expected "%c" but found "%s">, C<No block delimiter found after
-quotelike "%s">, C<Did not find leading dereferencer>, C<Bad identifier
-after dereferencer>, C<Did not find expected opening bracket at %s>,
-C<Improperly nested codeblock at %s>, C<Missing second block for quotelike
-"%s">, C<No match found for opening bracket>, C<Did not find opening tag:
-/%s/>, C<Unable to construct closing tag to match: /%s/>, C<Found invalid
-nested tag: %s>, C<Found unbalanced nested tag: %s>, C<Did not find closing
-tag>
-
-=item AUTHOR
-
-=item BUGS AND IRRITATIONS
-
-=item COPYRIGHT
-
-=back
-
-=head2 Text::ParseWords - parse text into an array of tokens or array of
-arrays
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item EXAMPLES
-
-=item AUTHORS
-
-=back
-
-=head2 Text::Soundex - Implementation of the soundex algorithm.
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item EXAMPLES
-
-=item LIMITATIONS
-
-=item MAINTAINER
-
-=item HISTORY
-
-=back
-
-=head2 Text::Tabs -- expand and unexpand tabs per the unix expand(1) and
-unexpand(1)
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item EXAMPLE
-
-=item LICENSE
-
-=back
-
-=head2 Text::Wrap - line wrapping to form simple paragraphs
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item OVERRIDES
-
-=item EXAMPLES
-
-=item LICENSE
-
-=back
-
-=head2 Thread - Manipulate threads in Perl (for old code only)
-
-=over 4
-
-=item DEPRECATED
-
-=item HISTORY
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item FUNCTIONS
-
-$thread = Thread->new(\&start_sub), $thread = Thread->new(\&start_sub,
-LIST), lock VARIABLE, async BLOCK;, Thread->self, Thread->list, cond_wait
-VARIABLE, cond_signal VARIABLE, cond_broadcast VARIABLE, yield
-
-=item METHODS
-
-join, detach, equal, tid, done
-
-=item DEFUNCT
-
-lock(\&sub), eval, flags
-
-=item SEE ALSO
-
-=back
-
-=head2 Thread::Queue - Thread-safe queues
-
-=over 4
-
-=item VERSION
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-Ordinary scalars, Array refs, Hash refs, Scalar refs, Objects based on the
-above
-
-=item QUEUE CREATION
-
-->new(), ->new(LIST)
-
-=item BASIC METHODS
-
-->enqueue(LIST), ->dequeue(), ->dequeue(COUNT), ->dequeue_nb(),
-->dequeue_nb(COUNT), ->pending()
-
-=item ADVANCED METHODS
-
-->peek(), ->peek(INDEX), ->insert(INDEX, LIST), ->extract(),
-->extract(INDEX), ->extract(INDEX, COUNT)
-
-=item NOTES
-
-=item LIMITATIONS
-
-=item SEE ALSO
-
-=item MAINTAINER
-
-=item LICENSE
-
-=back
-
-=head2 Thread::Semaphore - Thread-safe semaphores
-
-=over 4
-
-=item VERSION
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-->new(), ->new(NUMBER), ->down(), ->down(NUMBER), ->up(), ->up(NUMBER)
-
-=item NOTES
-
-=item SEE ALSO
-
-=item MAINTAINER
-
-=item LICENSE
-
-=back
-
-=head2 Tie::Array - base class for tied arrays
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-TIEARRAY classname, LIST, STORE this, index, value, FETCH this, index,
-FETCHSIZE this, STORESIZE this, count, EXTEND this, count, EXISTS this,
-key, DELETE this, key, CLEAR this, DESTROY this, PUSH this, LIST, POP this,
-SHIFT this, UNSHIFT this, LIST, SPLICE this, offset, length, LIST
-
-=item CAVEATS
-
-=item AUTHOR
-
-=back
-
-=head2 Tie::File - Access the lines of a disk file via a Perl array
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item C<recsep>
-
-=item C<autochomp>
-
-=item C<mode>
-
-=item C<memory>
-
-=item C<dw_size>
-
-=item Option Format
-
-=back
-
-=item Public Methods
-
-=over 4
-
-=item C<flock>
-
-=item C<autochomp>
-
-=item C<defer>, C<flush>, C<discard>, and C<autodefer>
-
-=item C<offset>
-
-=back
-
-=item Tying to an already-opened filehandle
-
-=item Deferred Writing
-
-=over 4
-
-=item Autodeferring
-
-=back
-
-=item CONCURRENT ACCESS TO FILES
-
-=item CAVEATS
-
-=item SUBCLASSING
-
-=item WHAT ABOUT C<DB_File>?
-
-=item AUTHOR
-
-=item LICENSE
-
-=item WARRANTY
-
-=item THANKS
-
-=item TODO
-
-=back
-
-=head2 Tie::Handle - base class definitions for tied handles
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-TIEHANDLE classname, LIST, WRITE this, scalar, length, offset, PRINT this,
-LIST, PRINTF this, format, LIST, READ this, scalar, length, offset,
-READLINE this, GETC this, CLOSE this, OPEN this, filename, BINMODE this,
-EOF this, TELL this, SEEK this, offset, whence, DESTROY this
-
-=item MORE INFORMATION
-
-=item COMPATIBILITY
-
-=back
-
-=head2 Tie::Hash, Tie::StdHash, Tie::ExtraHash - base class definitions for
-tied hashes
-
-=over 4
-
-=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, SCALAR this
-
-=item Inheriting from B<Tie::StdHash>
-
-=item Inheriting from B<Tie::ExtraHash>
-
-=item C<SCALAR>, C<UNTIE> and C<DESTROY>
-
-=item MORE INFORMATION
-
-=back
-
-=head2 Tie::Hash::NamedCapture - Named regexp capture buffers
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item SEE ALSO
-
-=back
-
-=head2 Tie::Memoize - add data to hash when needed
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item Inheriting from B<Tie::Memoize>
-
-=item EXAMPLE
-
-=item BUGS
-
-=item AUTHOR
-
-=back
-
-=head2 Tie::RefHash - use references as hash keys
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item EXAMPLE
-
-=item THREAD SUPPORT
-
-=item STORABLE SUPPORT
-
-=item RELIC SUPPORT
-
-=item MAINTAINER
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 Tie::Scalar, Tie::StdScalar - base class definitions for tied
-scalars
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-TIESCALAR classname, LIST, FETCH this, STORE this, value, DESTROY this
-
-=item MORE INFORMATION
-
-=back
-
-=head2 Tie::StdHandle - base class definitions for tied handles
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=back
-
-=head2 Tie::SubstrHash - Fixed-table-size, fixed-key-length hashing
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item CAVEATS
-
-=back
-
-=head2 Time::HiRes - High resolution alarm, sleep, gettimeofday, interval
-timers
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-gettimeofday (), usleep ( $useconds ), nanosleep ( $nanoseconds ), ualarm (
-$useconds [, $interval_useconds ] ), tv_interval, time (), sleep (
-$floating_seconds ), alarm ( $floating_seconds [,
-$interval_floating_seconds ] ), setitimer ( $which, $floating_seconds [,
-$interval_floating_seconds ] ), getitimer ( $which ), clock_gettime (
-$which ), clock_getres ( $which ), clock_nanosleep ( $which, $nanoseconds,
-$flags = 0), clock(), stat, stat FH, stat EXPR
-
-=item EXAMPLES
-
-=item C API
-
-=item DIAGNOSTICS
-
-=over 4
-
-=item useconds or interval more than ...
-
-=item negative time not invented yet
-
-=item internal error: useconds < 0 (unsigned ... signed ...)
-
-=item useconds or uinterval equal to or more than 1000000
-
-=item unimplemented in this platform
-
-=back
-
-=item CAVEATS
-
-=item SEE ALSO
-
-=item AUTHORS
-
-=item COPYRIGHT AND LICENSE
-
-=back
-
-=head2 Time::Local - efficiently compute time from local and GMT time
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item FUNCTIONS
-
-=over 4
-
-=item C<timelocal()> and C<timegm()>
-
-=item C<timelocal_nocheck()> and C<timegm_nocheck()>
-
-=item Year Value Interpretation
-
-=item Limits of time_t
-
-=item Ambiguous Local Times (DST)
-
-=item Non-Existent Local Times (DST)
-
-=item Negative Epoch Values
-
-=back
-
-=item IMPLEMENTATION
-
-=item BUGS
-
-=item SUPPORT
-
-=item COPYRIGHT
-
-=item AUTHOR
-
-=back
-
-=head2 Time::Piece - Object Oriented time objects
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item USAGE
-
-=over 4
-
-=item Local Locales
-
-=item Date Calculations
-
-=item Date Comparisons
-
-=item Date Parsing
-
-=item YYYY-MM-DDThh:mm:ss
-
-=item Week Number
-
-=item Global Overriding
-
-=back
-
-=item AUTHOR
-
-=item License
-
-=item SEE ALSO
-
-=item BUGS
-
-=back
-
-=head2 Time::Piece::Seconds, Time::Seconds - a simple API to convert
-seconds to other date values
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=item AUTHOR
-
-=item LICENSE
-
-=item Bugs
-
-=back
-
-=head2 Time::Seconds - a simple API to convert seconds to other date values
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item METHODS
-
-=item AUTHOR
-
-=item LICENSE
-
-=item Bugs
-
-=back
-
-=head2 Time::gmtime - by-name interface to Perl's built-in gmtime()
-function
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item NOTE
-
-=item AUTHOR
-
-=back
-
-=head2 Time::localtime - by-name interface to Perl's built-in localtime()
-function
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item NOTE
-
-=item AUTHOR
-
-=back
-
-=head2 Time::tm - internal object used by Time::gmtime and Time::localtime
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item AUTHOR
-
-=back
-
-=head2 UNIVERSAL - base class for ALL classes (blessed references)
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-C<< $obj->isa( TYPE ) >>, C<< CLASS->isa( TYPE ) >>, C<< eval { VAL->isa(
-TYPE ) } >>, C<TYPE>, C<$obj>, C<CLASS>, C<VAL>, C<< $obj->DOES( ROLE ) >>,
-C<< CLASS->DOES( ROLE ) >>, C<< $obj->can( METHOD ) >>, C<< CLASS->can(
-METHOD ) >>, C<< eval { VAL->can( METHOD ) } >>, C<VERSION ( [ REQUIRE ] )>
-
-=item EXPORTS
-
-=back
-
-=head2 Unicode::Collate - Unicode Collation Algorithm
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Constructor and Tailoring
-
-UCA_Version, alternate, backwards, entry, hangul_terminator, ignoreChar,
-ignoreName, katakana_before_hiragana, level, normalization, overrideCJK,
-overrideHangul, preprocess, rearrange, table, undefChar, undefName,
-upper_before_lower, variable
-
-=item Methods for Collation
-
-C<@sorted = $Collator-E<gt>sort(@not_sorted)>, C<$result =
-$Collator-E<gt>cmp($a, $b)>, C<$result = $Collator-E<gt>eq($a, $b)>,
-C<$result = $Collator-E<gt>ne($a, $b)>, C<$result = $Collator-E<gt>lt($a,
-$b)>, C<$result = $Collator-E<gt>le($a, $b)>, C<$result =
-$Collator-E<gt>gt($a, $b)>, C<$result = $Collator-E<gt>ge($a, $b)>,
-C<$sortKey = $Collator-E<gt>getSortKey($string)>, C<$sortKeyForm =
-$Collator-E<gt>viewSortKey($string)>
-
-=item Methods for Searching
-
-C<$position = $Collator-E<gt>index($string, $substring[, $position])>,
-C<($position, $length) = $Collator-E<gt>index($string, $substring[,
-$position])>, C<$match_ref = $Collator-E<gt>match($string, $substring)>,
-C<($match) = $Collator-E<gt>match($string, $substring)>, C<@match =
-$Collator-E<gt>gmatch($string, $substring)>, C<$count =
-$Collator-E<gt>subst($string, $substring, $replacement)>, C<$count =
-$Collator-E<gt>gsubst($string, $substring, $replacement)>
-
-=item Other Methods
-
-C<%old_tailoring = $Collator-E<gt>change(%new_tailoring)>, C<$version =
-$Collator-E<gt>version()>, C<UCA_Version()>, C<Base_Unicode_Version()>
-
-=back
-
-=item EXPORT
-
-=item INSTALL
-
-=item CAVEATS
-
-Normalization, Conformance Test
-
-=item AUTHOR, COPYRIGHT AND LICENSE
-
-=item SEE ALSO
-
-Unicode Collation Algorithm - UTS #10, The Default Unicode Collation
-Element Table (DUCET), The conformance test for the UCA, Hangul Syllable
-Type, Unicode Normalization Forms - UAX #15
-
-=back
-
-=head2 Unicode::Normalize - Unicode Normalization Forms
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Normalization Forms
-
-C<$NFD_string = NFD($string)>, C<$NFC_string = NFC($string)>,
-C<$NFKD_string = NFKD($string)>, C<$NFKC_string = NFKC($string)>,
-C<$FCD_string = FCD($string)>, C<$FCC_string = FCC($string)>,
-C<$normalized_string = normalize($form_name, $string)>
-
-=item Decomposition and Composition
-
-C<$decomposed_string = decompose($string [, $useCompatMapping])>,
-C<$reordered_string = reorder($string)>, C<$composed_string =
-compose($string)>
-
-=item Quick Check
-
-C<$result = checkNFD($string)>, C<$result = checkNFC($string)>, C<$result =
-checkNFKD($string)>, C<$result = checkNFKC($string)>, C<$result =
-checkFCD($string)>, C<$result = checkFCC($string)>, C<$result =
-check($form_name, $string)>
-
-=item Character Data
-
-C<$canonical_decomposition = getCanon($code_point)>,
-C<$compatibility_decomposition = getCompat($code_point)>,
-C<$code_point_composite = getComposite($code_point_here,
-$code_point_next)>, C<$combining_class = getCombinClass($code_point)>,
-C<$may_be_composed_with_prev_char = isComp2nd($code_point)>,
-C<$is_exclusion = isExclusion($code_point)>, C<$is_singleton =
-isSingleton($code_point)>, C<$is_non_starter_decomposition =
-isNonStDecomp($code_point)>, C<$is_Full_Composition_Exclusion =
-isComp_Ex($code_point)>, C<$NFD_is_NO = isNFD_NO($code_point)>,
-C<$NFC_is_NO = isNFC_NO($code_point)>, C<$NFC_is_MAYBE =
-isNFC_MAYBE($code_point)>, C<$NFKD_is_NO = isNFKD_NO($code_point)>,
-C<$NFKC_is_NO = isNFKC_NO($code_point)>, C<$NFKC_is_MAYBE =
-isNFKC_MAYBE($code_point)>
-
-=back
-
-=item EXPORT
-
-=item CAVEATS
-
-Perl's version vs. Unicode version, Correction of decomposition mapping,
-Revised definition of canonical composition
-
-=item AUTHOR
-
-=item SEE ALSO
-
-http://www.unicode.org/reports/tr15/,
-http://www.unicode.org/Public/UNIDATA/CompositionExclusions.txt,
-http://www.unicode.org/Public/UNIDATA/DerivedNormalizationProps.txt,
-http://www.unicode.org/Public/UNIDATA/NormalizationCorrections.txt,
-http://www.unicode.org/review/pr-29.html, http://www.unicode.org/notes/tn5/
-
-=back
-
-=head2 Unicode::UCD - Unicode character database
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item code point argument
-
-=item B<charinfo()>
-
-B<code>, B<name>, B<category>, B<combining>, B<bidi>, B<decomposition>,
-B<decimal>, B<digit>, B<numeric>, B<mirrored>, B<unicode10>, B<comment>,
-B<upper>, B<lower>, B<title>, B<block>, B<script>
-
-=back
-
-=back
-
-=over 4
-
-=item B<charblock()>
-
-=back
-
-=over 4
-
-=item B<charscript()>
-
-=back
-
-=over 4
-
-=item B<charblocks()>
-
-=back
-
-=over 4
-
-=item B<charscripts()>
-
-=back
-
-=over 4
-
-=item B<charinrange()>
-
-=back
-
-=over 4
-
-=item B<general_categories()>
-
-=back
-
-=over 4
-
-=item B<bidi_types()>
-
-=back
-
-=over 4
-
-=item B<compexcl()>
-
-=back
-
-=over 4
-
-=item B<casefold()>
-
-B<code>, B<full>, B<simple>, B<mapping>, B<status>, B<*>, B<*>, B<turkic>
-
-=back
-
-=over 4
-
-=item B<casespec()>
-
-B<code>, B<lower>, B<title>, B<lower>, B<condition>
-
-=back
-
-=over 4
-
-=item B<namedseq()>
-
-=back
-
-=over 4
-
-=item Unicode::UCD::UnicodeVersion
-
-=back
-
-=over 4
-
-=item B<Blocks versus Scripts>
-
-=item B<Matching Scripts and Blocks>
-
-=item Implementation Note
-
-=back
-
-=over 4
-
-=item BUGS
-
-=item AUTHOR
-
-=back
-
-=head2 User::grent - by-name interface to Perl's built-in getgr*()
-functions
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=item NOTE
-
-=item AUTHOR
-
-=back
-
-=head2 User::pwent - by-name interface to Perl's built-in getpw*()
-functions
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item System Specifics
-
-=back
-
-=item NOTE
-
-=item AUTHOR
-
-=item HISTORY
-
-March 18th, 2000
-
-=back
-
-=head2 Win32 - Interfaces to some Win32 API Functions
-
-=over 4
-
-=item DESCRIPTION
-
-=over 4
-
-=item Alphabetical Listing of Win32 Functions
-
-Win32::AbortSystemShutdown(MACHINE), Win32::BuildNumber(),
-Win32::CopyFile(FROM, TO, OVERWRITE), Win32::CreateDirectory(DIRECTORY),
-Win32::CreateFile(FILE), Win32::DomainName(),
-Win32::ExpandEnvironmentStrings(STRING), Win32::FormatMessage(ERRORCODE),
-Win32::FsType(), Win32::FreeLibrary(HANDLE),
-Win32::GetANSIPathName(FILENAME), Win32::GetArchName(),
-Win32::GetChipName(), Win32::GetCwd(), Win32::GetCurrentProcessId(),
-Win32::GetCurrentThreadId(), Win32::GetFileVersion(FILENAME),
-Win32::GetFolderPath(FOLDER [, CREATE]), Win32::GetFullPathName(FILENAME),
-Win32::GetLastError(), Win32::GetLongPathName(PATHNAME),
-Win32::GetNextAvailDrive(), Win32::GetOSVersion(), Win32::GetOSName(),
-Win32::GetShortPathName(PATHNAME), Win32::GetProcAddress(INSTANCE,
-PROCNAME), Win32::GetTickCount(), Win32::GuidGen(), Win32::IsAdminUser(),
-Win32::IsWinNT(), Win32::IsWin95(), Win32::LoadLibrary(LIBNAME),
-Win32::LoginName(), Win32::LookupAccountName(SYSTEM, ACCOUNT, DOMAIN, SID,
-SIDTYPE), Win32::LookupAccountSID(SYSTEM, SID, ACCOUNT, DOMAIN, SIDTYPE),
-Win32::MsgBox(MESSAGE [, FLAGS [, TITLE]]), Win32::NodeName(),
-Win32::OutputDebugString(STRING), Win32::RegisterServer(LIBRARYNAME),
-Win32::SetChildShowWindow(SHOWWINDOW), Win32::SetCwd(NEWDIRECTORY),
-Win32::SetLastError(ERROR), Win32::Sleep(TIME), Win32::Spawn(COMMAND, ARGS,
-PID), Win32::UnregisterServer(LIBRARYNAME)
-
-=back
-
-=back
-
-=head2 Win32API::File - Low-level access to Win32 system API calls for
-files/dirs.
-
-=over 4
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Object Oriented/Tied Handle Interface
-
-=item Exports
-
-C<":Func">, attrLetsToBits, C<$uBits= attrLetsToBits( $sAttributeLetters
-)>, C<"a">, C<"c">, C<"h">, C<"o">, C<"r">, C<"s">, C<"t">, createFile,
-C<$hObject= createFile( $sPath )>, C<$hObject= createFile( $sPath,
-$rvhvOptions )>, C<$hObject= createFile( $sPath, $svAccess )>, C<$hObject=
-createFile( $sPath, $svAccess, $rvhvOptions )>, C<$hObject= createFile(
-$sPath, $svAccess, $svShare )>, C<$hObject= createFile( $sPath, $svAccess,
-$svShare, $rvhvOptions )>, C<"q">, C<"r">, C<"w">, C<"k">, C<"t">, C<"n">,
-C<"c">, C<"e">, C<"kc">, C<"ke">, C<"tc">, C<"te">, C<"nc">, C<"ne">, Flags
-=> $uFlags, Attributes => $sAttributes, Security => $pSecurityAttributes,
-Model => $hModelFile, Access => $sAccess, Access => $uAccess, Create =>
-$sCreate, Create => $uCreate, Share => $sShare, Share => $uShare,
-getLogicalDrives, C<@roots= getLogicalDrives()>, CloseHandle,
-C<CloseHandle( $hObject )>, CopyFile, C<CopyFile( $sOldFileName,
-$sNewFileName, $bFailIfExists )>, CreateFile, C<$hObject= CreateFile(
-$sPath, $uAccess, $uShare, $pSecAttr, $uCreate, $uFlags, $hModel )>,
-C<"//./PhysicalDrive0">, C<"//./C:">, C<"//./A:">, C<"//./PIPE/PipeName">,
-DefineDosDevice, C<DefineDosDevice( $uFlags, $sDosDeviceName, $sTargetPath
-)>, C<DDD_RAW_TARGET_PATH>, C<DDD_REMOVE_DEFINITION>,
-C<DDD_EXACT_MATCH_ON_REMOVE>, DeleteFile, C<DeleteFile( $sFileName )>,
-DeviceIoControl, C<DeviceIoControl( $hDevice, $uIoControlCode, $pInBuf,
-$lInBuf, $opOutBuf, $lOutBuf, $olRetBytes, $pOverlapped )>, FdGetOsFHandle,
-C<$hNativeHandle= FdGetOsFHandle( $ivFd )>, fileConstant, C<$value=
-fileConstant( $sConstantName )>, fileLastError, C<$svError=
-fileLastError();>, C<fileLastError( $uError );>, GetDriveType,
-C<$uDriveType= GetDriveType( $sRootPath )>, C<DRIVE_UNKNOWN>,
-C<DRIVE_NO_ROOT_DIR>, C<DRIVE_REMOVABLE>, C<DRIVE_FIXED>, C<DRIVE_REMOTE>,
-C<DRIVE_CDROM>, C<DRIVE_RAMDISK>, GetFileAttributes, C<$uAttrs =
-GetFileAttributes( $sPath )>, C<FILE_ATTRIBUTE_ARCHIVE>,
-C<FILE_ATTRIBUTE_COMPRESSED>, C<FILE_ATTRIBUTE_DEVICE>,
-C<FILE_ATTRIBUTE_DIRECTORY>, C<FILE_ATTRIBUTE_ENCRYPTED>,
-C<FILE_ATTRIBUTE_HIDDEN>, C<FILE_ATTRIBUTE_NORMAL>,
-C<FILE_ATTRIBUTE_NOT_CONTENT_INDEXED>, C<FILE_ATTRIBUTE_OFFLINE>,
-C<FILE_ATTRIBUTE_READONLY>, C<FILE_ATTRIBUTE_REPARSE_POINT>,
-C<FILE_ATTRIBUTE_SPARSE_FILE>, C<FILE_ATTRIBUTE_SYSTEM>,
-C<FILE_ATTRIBUTE_TEMPORARY>, GetFileType, C<$uFileType= GetFileType( $hFile
-)>, C<FILE_TYPE_UNKNOWN>, C<FILE_TYPE_DISK>, C<FILE_TYPE_CHAR>,
-C<FILE_TYPE_PIPE>, getFileSize, C<$size= getFileSize( $hFile )>,
-GetFileSize, C<$iSizeLow= GetFileSize($win32Handle, $iSizeHigh)>,
-GetOverlappedResult, C<$bRetval= GetOverlappedResult( $win32Handle,
-$pOverlapped, $numBytesTransferred, $bWait )>, GetLogicalDrives,
-C<$uDriveBits= GetLogicalDrives()>, GetLogicalDriveStrings, C<$olOutLength=
-GetLogicalDriveStrings( $lBufSize, $osBuffer )>, GetHandleInformation,
-C<GetHandleInformation( $hObject, $ouFlags )>, GetOsFHandle,
-C<$hNativeHandle= GetOsFHandle( FILE )>, GetVolumeInformation,
-C<GetVolumeInformation( $sRootPath, $osVolName, $lVolName, $ouSerialNum,
-$ouMaxNameLen, $ouFsFlags, $osFsType, $lFsType )>, C<FS_CASE_IS_PRESERVED>,
-C<FS_CASE_SENSITIVE>, C<FS_UNICODE_STORED_ON_DISK>, C<FS_PERSISTENT_ACLS>,
-C<FS_FILE_COMPRESSION>, C<FS_VOL_IS_COMPRESSED>, IsRecognizedPartition,
-C<IsRecognizedPartition( $ivPartitionType )>, IsContainerPartition,
-C<IsContainerPartition( $ivPartitionType )>, MoveFile, C<MoveFile(
-$sOldName, $sNewName )>, MoveFileEx, C<MoveFileEx( $sOldName, $sNewName,
-$uFlags )>, C<MOVEFILE_REPLACE_EXISTING>, C<MOVEFILE_COPY_ALLOWED>,
-C<MOVEFILE_DELAY_UNTIL_REBOOT>, C<MOVEFILE_WRITE_THROUGH>, OsFHandleOpen,
-C<OsFHandleOpen( FILE, $hNativeHandle, $sMode )>, OsFHandleOpenFd, C<$ivFD=
-OsFHandleOpenFd( $hNativeHandle, $uMode )>, QueryDosDevice, C<$olTargetLen=
-QueryDosDevice( $sDosDeviceName, $osTargetPath, $lTargetBuf )>, ReadFile,
-C<ReadFile( $hFile, $opBuffer, $lBytes, $olBytesRead, $pOverlapped )>,
-SetErrorMode, C<$uOldMode= SetErrorMode( $uNewMode )>,
-C<SEM_FAILCRITICALERRORS>, C<SEM_NOALIGNMENTFAULTEXCEPT>,
-C<SEM_NOGPFAULTERRORBOX>, C<SEM_NOOPENFILEERRORBOX>, setFilePointer,
-C<$uNewPos = setFilePointer( $hFile, $ivOffset, $uFromWhere )>,
-SetFilePointer, C<$uNewPos = SetFilePointer( $hFile, $ivOffset,
-$ioivOffsetHigh, $uFromWhere )>, SetHandleInformation,
-C<SetHandleInformation( $hObject, $uMask, $uFlags )>, WriteFile,
-C<WriteFile( $hFile, $pBuffer, $lBytes, $ouBytesWritten, $pOverlapped )>,
-C<":FuncA">, C<":FuncW">, CopyFileW, C<CopyFileW( $swOldFileName,
-$swNewFileName, $bFailIfExists )>, CreateFileW, C<$hObject= CreateFileW(
-$swPath, $uAccess, $uShare, $pSecAttr, $uCreate, $uFlags, $hModel )>,
-DefineDosDeviceW, C<DefineDosDeviceW( $uFlags, $swDosDeviceName,
-$swTargetPath )>, DeleteFileW, C<DeleteFileW( $swFileName )>,
-GetDriveTypeW, C<$uDriveType= GetDriveTypeW( $swRootPath )>,
-GetFileAttributesW, C<$uAttrs= GetFileAttributesW( $swPath )>,
-GetLogicalDriveStringsW, C<$olwOutLength= GetLogicalDriveStringsW(
-$lwBufSize, $oswBuffer )>, GetVolumeInformationW, C<GetVolumeInformationW(
-$swRootPath, $oswVolName, $lwVolName, $ouSerialNum, $ouMaxNameLen,
-$ouFsFlags, $oswFsType, $lwFsType )>, MoveFileW, C<MoveFileW( $swOldName,
-$swNewName )>, MoveFileExW, C<MoveFileExW( $swOldName, $swNewName, $uFlags
-)>, QueryDosDeviceW, C<$olwTargetLen= QueryDosDeviceW( $swDeviceName,
-$oswTargetPath, $lwTargetBuf )>, C<":Misc">, C<":DDD_">, C<":DRIVE_">,
-C<":FILE_">, C<":FILE_ATTRIBUTE_">, C<":FILE_FLAG_">, C<":FILE_SHARE_">,
-C<":FILE_TYPE_">, C<":FS_">, C<":HANDLE_FLAG_">, HANDLE_FLAG_INHERIT,
-HANDLE_FLAG_PROTECT_FROM_CLOSE, C<":IOCTL_STORAGE_">,
-C<IOCTL_STORAGE_CHECK_VERIFY>, C<IOCTL_STORAGE_MEDIA_REMOVAL>,
-C<IOCTL_STORAGE_EJECT_MEDIA>, C<IOCTL_STORAGE_LOAD_MEDIA>,
-C<IOCTL_STORAGE_RESERVE>, C<IOCTL_STORAGE_RELEASE>,
-C<IOCTL_STORAGE_FIND_NEW_DEVICES>, C<IOCTL_STORAGE_GET_MEDIA_TYPES>,
-C<$ucCylsLow[$i]>, C<$ivcCylsHigh[$i]>, C<$uMediaType[$i]>,
-C<$uTracksPerCyl[$i]>, C<$uSectsPerTrack[$i]>, C<$uBytesPerSect[$i]>,
-C<":IOCTL_DISK_">, C<IOCTL_DISK_GET_DRIVE_GEOMETRY>, C<$ucCylsLow>,
-C<$ivcCylsHigh>, C<$uMediaType>, C<$uTracksPerCyl>, C<$uSectsPerTrack>,
-C<$uBytesPerSect>, C<IOCTL_DISK_GET_PARTITION_INFO>, C<$uStartLow> and
-C<$ivStartHigh>, C<$ucHiddenSects>, C<$uPartitionSeqNumber>,
-C<$uPartitionType>, C<$bActive>, C<$bRecognized>, C<$bToRewrite>,
-C<IOCTL_DISK_SET_PARTITION_INFO>, C<IOCTL_DISK_GET_DRIVE_LAYOUT>,
-C<$cPartitions>, C<$uDiskSignature>, C<IOCTL_DISK_GET_MEDIA_TYPES>,
-C<IOCTL_DISK_SET_DRIVE_LAYOUT>, C<IOCTL_DISK_VERIFY>, C<$uStartOffsetLow>
-and C<$ivStartOffsetHigh>, C<$uLength>, C<IOCTL_DISK_FORMAT_TRACKS>,
-C<IOCTL_DISK_REASSIGN_BLOCKS>, C<IOCTL_DISK_PERFORMANCE>,
-C<IOCTL_DISK_IS_WRITABLE>, C<IOCTL_DISK_LOGGING>, DISK_LOGGING_START,
-DISK_LOGGING_STOP, DISK_LOGGING_DUMP, DISK_LOGGING_BINNING,
-C<IOCTL_DISK_FORMAT_TRACKS_EX>, C<IOCTL_DISK_HISTOGRAM_STRUCTURE>,
-C<IOCTL_DISK_HISTOGRAM_DATA>, C<IOCTL_DISK_HISTOGRAM_RESET>,
-C<IOCTL_DISK_REQUEST_STRUCTURE>, C<IOCTL_DISK_REQUEST_DATA>, C<":FSCTL_">,
-C<FSCTL_SET_REPARSE_POINT>, C<FSCTL_GET_REPARSE_POINT>,
-C<FSCTL_DELETE_REPARSE_POINT>, C<":GENERIC_">, C<":MEDIA_TYPE">,
-C<Unknown>, C<F5_1Pt2_512>, C<F3_1Pt44_512>, C<F3_2Pt88_512>,
-C<F3_20Pt8_512>, C<F3_720_512>, C<F5_360_512>, C<F5_320_512>,
-C<F5_320_1024>, C<F5_180_512>, C<F5_160_512>, C<RemovableMedia>,
-C<FixedMedia>, C<F3_120M_512>, C<":MOVEFILE_">, C<":SECURITY_">,
-C<":SEM_">, C<":PARTITION_">, C<":ALL">
-
-=back
-
-=item BUGS
-
-=item AUTHOR
-
-=item SEE ALSO
-
-=back
-
-=head2 Win32CORE - Win32 CORE function stubs
-
-=over 4
-
-=item DESCRIPTION
-
-=item HISTORY
-
-=back
-
-=head2 XSLoader - Dynamically load C libraries into Perl code
-
-=over 4
-
-=item VERSION
-
-=item SYNOPSIS
-
-=item DESCRIPTION
-
-=over 4
-
-=item Migration from C<DynaLoader>
-
-=item Backward compatible boilerplate
-
-=back
-
-=item Order of initialization: early load()
-
-=over 4
-
-=item The most hairy case
-
-=back
-
-=item DIAGNOSTICS
-
-C<Can't find '%s' symbol in %s>, C<Can't load '%s' for module %s: %s>,
-C<Undefined symbols present after loading %s: %s>,
-C<XSLoader::load('Your::Module', $Your::Module::VERSION)>
-
-=item LIMITATIONS
-
-=item BUGS
-
-=item SEE ALSO
-
-=item AUTHORS
-
-=item COPYRIGHT & LICENSE
-
-=back
-
-=head1 AUXILIARY DOCUMENTATION
-
-Here should be listed all the extra programs' documentation, but they
-don't all have manual pages yet:
-
-=over 4
-
-=item a2p
-
-=item c2ph
-
-=item dprofpp
-
-=item h2ph
-
-=item h2xs
-
-=item perlbug
-
-=item perldoc
-
-=item pl2pm
-
-=item pod2html
-
-=item pod2man
-
-=item s2p
-
-=item splain
-
-=item xsubpp
-
-=back
-
-=head1 AUTHOR
-
-Larry Wall <F<larry@wall.org>>, with the help of oodles
-of other folks.
-
diff --git a/pod/perltodo.pod b/pod/perltodo.pod
index 440cae1514..0a75e7092b 100644
--- a/pod/perltodo.pod
+++ b/pod/perltodo.pod
@@ -400,6 +400,20 @@ C<$Config{link}> and institute a fall-back plan if it weren't found."
Although I can see that as confusing, given that C<$Config{d_link}> is true
when (hard) links are available.
+=head2 Configure Windows using PowerShell
+
+Currently, Windows uses hard-coded config files based to build the
+config.h for compiling Perl. Makefiles are also hard-coded and need to be
+hand edited prior to building Perl. While this makes it easy to create a perl.exe
+that works across multiple Windows versions, being able to accurately
+configure a perl.exe for a specific Windows versions and VS C++ would be
+a nice enhancement. With PowerShell available on Windows XP and up, this
+may now be possible. Step 1 might be to investigate whether this is possible
+and use this to clean up our current makefile situation. Step 2 would be to
+see if there would be a way to use our existing metaconfig units to configure a
+Windows Perl or whether we go in a separate direction and make it so. Of
+course, we all know what step 3 is.
+
=head1 Tasks that need a little C knowledge
These tasks would need a little C knowledge, but don't need any specific
diff --git a/pod/perlvar.pod b/pod/perlvar.pod
index 9be3bc1eff..7c61a05096 100644
--- a/pod/perlvar.pod
+++ b/pod/perlvar.pod
@@ -241,7 +241,7 @@ See L</@-> for a replacement.
=item ${^MATCH}
X<${^MATCH}>
-This is similar to C<$&> (C<$POSTMATCH>) except that it does not incur the
+This is similar to C<$&> (C<$MATCH>) except that it does not incur the
performance penalty associated with that variable, and is only guaranteed
to return a defined value when the pattern was compiled or executed with
the C</p> modifier.
@@ -1037,8 +1037,9 @@ subscripting and when evaluating the index() and substr() functions.
As of release 5 of Perl, assignment to C<$[> is treated as a compiler
directive, and cannot influence the behavior of any other file.
-(That's why you can only assign compile-time constants to it.)
-Its use is highly discouraged.
+(That's why you can only assign compile-time constants to it.) Its
+use is deprecated, and will trigger a warning (if the deprecation
+L<warnings> category is enabled. You did C<use warnings>, right?)
Note that, unlike other compile-time directives (such as L<strict>),
assignment to C<$[> can be seen from outer lexical scopes in the same file.
diff --git a/vms/perlvms.pod b/pod/perlvms.pod
index b8993d818d..b8993d818d 100644
--- a/vms/perlvms.pod
+++ b/pod/perlvms.pod
diff --git a/pod/perlxs.pod b/pod/perlxs.pod
index c367f4c1ca..a6e21a35ee 100644
--- a/pod/perlxs.pod
+++ b/pod/perlxs.pod
@@ -1211,6 +1211,12 @@ To disable version checking:
VERSIONCHECK: DISABLE
+Note that if the version of the PM module is an NV (a floating point
+number), it will be stringified with a possible loss of precision
+(currently chopping to nine decimal places) so that it may not match
+the version of the XS module anymore. Quoting the $VERSION declaration
+to make it a string is recommended if long version numbers are used.
+
=head2 The PROTOTYPES: Keyword
The PROTOTYPES: keyword corresponds to B<xsubpp>'s C<-prototypes> and
diff --git a/pod/perlxstut.pod b/pod/perlxstut.pod
index 7db3eb3537..090b14a9e7 100644
--- a/pod/perlxstut.pod
+++ b/pod/perlxstut.pod
@@ -196,7 +196,7 @@ been deleted):
%
You can safely ignore the line about "prototyping behavior" - it is
-explained in the section "The PROTOTYPES: Keyword" in L<perlxs>.
+explained in L<perlxs/"The PROTOTYPES: Keyword">.
If you are on a Win32 system, and the build process fails with linker
errors for functions in the C library, check if your Perl is configured
@@ -428,7 +428,7 @@ line starts with optional whitespace, and may have an optional terminating
semicolon.
The list of output parameters occurs at the very end of the function, just
-before after the OUTPUT: directive. The use of RETVAL tells Perl that you
+after the OUTPUT: directive. The use of RETVAL tells Perl that you
wish to send this value back as the return value of the XSUB function. In
Example 3, we wanted the "return value" placed in the original variable
which we passed in, so we listed it (and not RETVAL) in the OUTPUT: section.
diff --git a/pod/roffitall b/pod/roffitall
index 8f897da2f2..c533e2875f 100644
--- a/pod/roffitall
+++ b/pod/roffitall
@@ -118,7 +118,6 @@ toroff=`
$mandir/splain.1 \
$mandir/xsubpp.1 \
\
- $libdir/attrs.3 \
$libdir/autouse.3 \
$libdir/base.3 \
$libdir/blib.3 \
diff --git a/pp.h b/pp.h
index 118c027201..f3da1a7f80 100644
--- a/pp.h
+++ b/pp.h
@@ -471,6 +471,36 @@ Does not use C<TARG>. See also C<XPUSHu>, C<mPUSHu> and C<PUSHu>.
#define tryAMAGICunDEREF_var(meth_enum) \
tryAMAGICunW_var(meth_enum,setAGAIN,0,(void)0)
+#define tryAMAGICftest(chr) \
+ STMT_START { \
+ assert(chr != '?'); \
+ if (SvAMAGIC(TOPs)) { \
+ const char tmpchr = (chr); \
+ SV * const tmpsv = amagic_call(TOPs, \
+ newSVpvn_flags(&tmpchr, 1, SVs_TEMP), \
+ ftest_amg, AMGf_unary); \
+ \
+ if (tmpsv) { \
+ const OP *next = PL_op->op_next; \
+ \
+ SPAGAIN; \
+ \
+ if (next->op_type >= OP_FTRREAD && \
+ next->op_type <= OP_FTBINARY && \
+ next->op_private & OPpFT_STACKED \
+ ) { \
+ if (SvTRUE(tmpsv)) \
+ /* leave the object alone */ \
+ RETURN; \
+ } \
+ \
+ SETs(tmpsv); \
+ RETURN; \
+ } \
+ } \
+ } STMT_END
+
+
#define opASSIGN (PL_op->op_flags & OPf_STACKED)
#define SETsv(sv) STMT_START { \
if (opASSIGN || (SvFLAGS(TARG) & SVs_PADMY)) \
diff --git a/pp_ctl.c b/pp_ctl.c
index 1c68602e75..5e8d5570a0 100644
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -1251,9 +1251,9 @@ PP(pp_flop)
static const char * const context_name[] = {
"pseudo-block",
- "when",
+ NULL, /* CXt_WHEN never actually needs "block" */
NULL, /* CXt_BLOCK never actually needs "block" */
- "given",
+ NULL, /* CXt_GIVEN never actually needs "block" */
NULL, /* CXt_LOOP_FOR never actually needs "loop" */
NULL, /* CXt_LOOP_PLAIN never actually needs "loop" */
NULL, /* CXt_LOOP_LAZYSV never actually needs "loop" */
@@ -1280,8 +1280,6 @@ S_dopoptolabel(pTHX_ const char *label)
case CXt_FORMAT:
case CXt_EVAL:
case CXt_NULL:
- case CXt_GIVEN:
- case CXt_WHEN:
if (ckWARN(WARN_EXITING))
Perl_warner(aTHX_ packWARN(WARN_EXITING), "Exiting %s via %s",
context_name[CxTYPE(cx)], OP_NAME(PL_op));
@@ -3304,17 +3302,6 @@ PP(pp_require)
tryname = name;
tryrsfp = doopen_pm(name, len);
}
-#ifdef MACOS_TRADITIONAL
- if (!tryrsfp) {
- char newname[256];
-
- MacPerl_CanonDir(name, newname, 1);
- if (path_is_absolute(newname)) {
- tryname = newname;
- tryrsfp = doopen_pm(newname, strlen(newname));
- }
- }
-#endif
if (!tryrsfp) {
AV * const ar = GvAVn(PL_incgv);
I32 i;
@@ -3445,12 +3432,6 @@ PP(pp_require)
}
else {
if (!path_is_absolute(name)
-#ifdef MACOS_TRADITIONAL
- /* We consider paths of the form :a:b ambiguous and interpret them first
- as global then as local
- */
- || (*name == ':' && name[1] != ':' && strchr(name+2, ':'))
-#endif
) {
const char *dir;
STRLEN dirlen;
@@ -3462,21 +3443,14 @@ PP(pp_require)
dirlen = 0;
}
-#ifdef MACOS_TRADITIONAL
- char buf1[256];
- char buf2[256];
-
- MacPerl_CanonDir(name, buf2, 1);
- Perl_sv_setpvf(aTHX_ namesv, "%s%s", MacPerl_CanonDir(dir, buf1, 0), buf2+(buf2[0] == ':'));
-#else
-# ifdef VMS
+#ifdef VMS
char *unixdir;
if ((unixdir = tounixpath(dir, NULL)) == NULL)
continue;
sv_setpv(namesv, unixdir);
sv_catpv(namesv, unixname);
-# else
-# ifdef __SYMBIAN32__
+#else
+# ifdef __SYMBIAN32__
if (PL_origfilename[0] &&
PL_origfilename[1] == ':' &&
!(dir[0] && dir[1] == ':'))
@@ -3488,7 +3462,7 @@ PP(pp_require)
Perl_sv_setpvf(aTHX_ namesv,
"%s\\%s",
dir, name);
-# else
+# else
/* The equivalent of
Perl_sv_setpvf(aTHX_ namesv, "%s/%s", dir, name);
but without the need to parse the format string, or
@@ -3509,7 +3483,6 @@ PP(pp_require)
/* Don't even actually have to turn SvPOK_on() as we
access it directly with SvPVX() below. */
}
-# endif
# endif
#endif
TAINT_PROPER("require");
@@ -4942,12 +4915,8 @@ S_path_is_absolute(const char *name)
PERL_ARGS_ASSERT_PATH_IS_ABSOLUTE;
if (PERL_FILE_IS_ABSOLUTE(name)
-#ifdef MACOS_TRADITIONAL
- || (*name == ':')
-#else
|| (*name == '.' && (name[1] == '/' ||
(name[1] == '.' && name[2] == '/')))
-#endif
)
{
return TRUE;
diff --git a/pp_hot.c b/pp_hot.c
index c52a0d6625..7afa42225a 100644
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -3044,17 +3044,16 @@ S_method_common(pTHX_ SV* meth, U32* hashp)
SV* ob;
GV* gv;
HV* stash;
- STRLEN namelen;
const char* packname = NULL;
SV *packsv = NULL;
STRLEN packlen;
- const char * const name = SvPV_const(meth, namelen);
SV * const sv = *(PL_stack_base + TOPMARK + 1);
PERL_ARGS_ASSERT_METHOD_COMMON;
if (!sv)
- Perl_croak(aTHX_ "Can't call method \"%s\" on an undefined value", name);
+ Perl_croak(aTHX_ "Can't call method \"%"SVf"\" on an undefined value",
+ SVfARG(meth));
SvGETMAGIC(sv);
if (SvROK(sv))
@@ -3083,7 +3082,8 @@ S_method_common(pTHX_ SV* meth, U32* hashp)
: !isIDFIRST(*packname)
))
{
- Perl_croak(aTHX_ "Can't call method \"%s\" %s", name,
+ Perl_croak(aTHX_ "Can't call method \"%"SVf"\" %s",
+ SVfARG(meth),
SvOK(sv) ? "without a package or object reference"
: "on an undefined value");
}
@@ -3108,6 +3108,7 @@ S_method_common(pTHX_ SV* meth, U32* hashp)
&& (ob = MUTABLE_SV(GvIO((const GV *)ob)))
&& SvOBJECT(ob))))
{
+ const char * const name = SvPV_nolen_const(meth);
Perl_croak(aTHX_ "Can't call method \"%s\" on unblessed reference",
(SvSCREAM(meth) && strEQ(name,"isa")) ? "DOES" :
name);
@@ -3131,7 +3132,8 @@ S_method_common(pTHX_ SV* meth, U32* hashp)
}
}
- gv = gv_fetchmethod_flags(stash ? stash : MUTABLE_HV(packsv), name,
+ gv = gv_fetchmethod_flags(stash ? stash : MUTABLE_HV(packsv),
+ SvPV_nolen_const(meth),
GV_AUTOLOAD | GV_CROAK);
assert(gv);
diff --git a/pp_sys.c b/pp_sys.c
index 6bfdf35a77..bcd99a53cb 100644
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -29,10 +29,8 @@
#include "EXTERN.h"
#define PERL_IN_PP_SYS_C
#include "perl.h"
-#if !defined(PERL_MICRO) && defined(Quad_t)
-# include "time64.h"
-# include "time64.c"
-#endif
+#include "time64.h"
+#include "time64.c"
#ifdef I_SHADOW
/* Shadow password support for solaris - pdo@cs.umd.edu
@@ -804,11 +802,6 @@ PP(pp_tie)
break;
case SVt_PVGV:
if (isGV_with_GP(varsv)) {
-#ifdef GV_UNIQUE_CHECK
- if (GvUNIQUE((const GV *)varsv)) {
- Perl_croak(aTHX_ "Attempt to tie unique GV");
- }
-#endif
methname = "TIEHANDLE";
how = PERL_MAGIC_tiedscalar;
/* For tied filehandles, we apply tiedscalar magic to the IO
@@ -2983,8 +2976,19 @@ PP(pp_ftrread)
int stat_mode = S_IRUSR;
bool effective = FALSE;
+ char opchar = '?';
dSP;
+ switch (PL_op->op_type) {
+ case OP_FTRREAD: opchar = 'R'; break;
+ case OP_FTRWRITE: opchar = 'W'; break;
+ case OP_FTREXEC: opchar = 'X'; break;
+ case OP_FTEREAD: opchar = 'r'; break;
+ case OP_FTEWRITE: opchar = 'w'; break;
+ case OP_FTEEXEC: opchar = 'x'; break;
+ }
+ tryAMAGICftest(opchar);
+
STACKED_FTEST_CHECK;
switch (PL_op->op_type) {
@@ -3017,7 +3021,7 @@ PP(pp_ftrread)
access_mode = W_OK;
#endif
stat_mode = S_IWUSR;
- /* Fall through */
+ /* fall through */
case OP_FTEREAD:
#ifndef PERL_EFF_ACCESS
@@ -3077,8 +3081,20 @@ PP(pp_ftis)
dVAR;
I32 result;
const int op_type = PL_op->op_type;
+ char opchar = '?';
dSP;
+
+ switch (op_type) {
+ case OP_FTIS: opchar = 'e'; break;
+ case OP_FTSIZE: opchar = 's'; break;
+ case OP_FTMTIME: opchar = 'M'; break;
+ case OP_FTCTIME: opchar = 'C'; break;
+ case OP_FTATIME: opchar = 'A'; break;
+ }
+ tryAMAGICftest(opchar);
+
STACKED_FTEST_CHECK;
+
result = my_stat();
SPAGAIN;
if (result < 0)
@@ -3115,8 +3131,25 @@ PP(pp_ftrowned)
{
dVAR;
I32 result;
+ char opchar = '?';
dSP;
+ switch (PL_op->op_type) {
+ case OP_FTROWNED: opchar = 'O'; break;
+ case OP_FTEOWNED: opchar = 'o'; break;
+ case OP_FTZERO: opchar = 'z'; break;
+ case OP_FTSOCK: opchar = 'S'; break;
+ case OP_FTCHR: opchar = 'c'; break;
+ case OP_FTBLK: opchar = 'b'; break;
+ case OP_FTFILE: opchar = 'f'; break;
+ case OP_FTDIR: opchar = 'd'; break;
+ case OP_FTPIPE: opchar = 'p'; break;
+ case OP_FTSUID: opchar = 'u'; break;
+ case OP_FTSGID: opchar = 'g'; break;
+ case OP_FTSVTX: opchar = 'k'; break;
+ }
+ tryAMAGICftest(opchar);
+
/* I believe that all these three are likely to be defined on most every
system these days. */
#ifndef S_ISUID
@@ -3133,6 +3166,7 @@ PP(pp_ftrowned)
#endif
STACKED_FTEST_CHECK;
+
result = my_stat();
SPAGAIN;
if (result < 0)
@@ -3199,8 +3233,13 @@ PP(pp_ftrowned)
PP(pp_ftlink)
{
dVAR;
- I32 result = my_lstat();
dSP;
+ I32 result;
+
+ tryAMAGICftest('l');
+ result = my_lstat();
+ SPAGAIN;
+
if (result < 0)
RETPUSHUNDEF;
if (S_ISLNK(PL_statcache.st_mode))
@@ -3216,6 +3255,8 @@ PP(pp_fttty)
GV *gv;
SV *tmpsv = NULL;
+ tryAMAGICftest('t');
+
STACKED_FTEST_CHECK;
if (PL_op->op_flags & OPf_REF)
@@ -3265,6 +3306,8 @@ PP(pp_fttext)
GV *gv;
PerlIO *fp;
+ tryAMAGICftest(PL_op->op_type == OP_FTTEXT ? 'T' : 'B');
+
STACKED_FTEST_CHECK;
if (PL_op->op_flags & OPf_REF)
@@ -4026,7 +4069,7 @@ PP(pp_fork)
PP(pp_wait)
{
-#if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(MACOS_TRADITIONAL) && !defined(__LIBCATAMOUNT__)
+#if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
dVAR; dSP; dTARGET;
Pid_t childpid;
int argflags;
@@ -4054,7 +4097,7 @@ PP(pp_wait)
PP(pp_waitpid)
{
-#if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(MACOS_TRADITIONAL) && !defined(__LIBCATAMOUNT__)
+#if (!defined(DOSISH) || defined(OS2) || defined(WIN32)) && !defined(__LIBCATAMOUNT__)
dVAR; dSP; dTARGET;
const int optype = POPi;
const Pid_t pid = TOPi;
@@ -4424,15 +4467,9 @@ PP(pp_gmtime)
{
dVAR;
dSP;
-#if defined(PERL_MICRO) || !defined(Quad_t)
- Time_t when;
- const struct tm *err;
- struct tm tmbuf;
-#else
Time64_T when;
struct TM tmbuf;
struct TM *err;
-#endif
const char *opname = PL_op->op_type == OP_LOCALTIME ? "localtime" : "gmtime";
static const char * const dayname[] =
{"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
@@ -4440,45 +4477,26 @@ PP(pp_gmtime)
{"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
-#if defined(PERL_MICRO) || !defined(Quad_t)
- if (MAXARG < 1)
- (void)time(&when);
- else
- when = (Time_t)SvIVx(POPs);
-
- if (PL_op->op_type == OP_LOCALTIME)
- err = localtime(&when);
- else
- err = gmtime(&when);
-
- if (!err)
- tmbuf = *err;
-#else
if (MAXARG < 1) {
time_t now;
(void)time(&now);
when = (Time64_T)now;
}
else {
- /* XXX POPq uses an SvIV so it won't work with 32 bit integer scalars
- using a double causes an unfortunate loss of accuracy on high numbers.
- What we really need is an SvQV.
- */
- double input = POPn;
+ double input = Perl_floor(POPn);
when = (Time64_T)input;
- if( when != input ) {
+ if (when != input && ckWARN(WARN_OVERFLOW)) {
Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
"%s(%.0f) too large", opname, input);
}
}
if (PL_op->op_type == OP_LOCALTIME)
- err = localtime64_r(&when, &tmbuf);
+ err = S_localtime64_r(&when, &tmbuf);
else
- err = gmtime64_r(&when, &tmbuf);
-#endif
+ err = S_gmtime64_r(&when, &tmbuf);
- if( err == NULL ) {
+ if (err == NULL && ckWARN(WARN_OVERFLOW)) {
/* XXX %lld broken for quads */
Perl_warner(aTHX_ packWARN(WARN_OVERFLOW),
"%s(%.0f) failed", opname, (double)when);
@@ -5328,7 +5346,11 @@ PP(pp_ggrent)
PUSHs(sv);
if (grent) {
if (which == OP_GGRNAM)
+#if Gid_t_sign <= 0
sv_setiv(sv, (IV)grent->gr_gid);
+#else
+ sv_setuv(sv, (UV)grent->gr_gid);
+#endif
else
sv_setpv(sv, grent->gr_name);
}
@@ -5344,7 +5366,11 @@ PP(pp_ggrent)
PUSHs(sv_mortalcopy(&PL_sv_no));
#endif
+#if Gid_t_sign <= 0
mPUSHi(grent->gr_gid);
+#else
+ mPUSHu(grent->gr_gid);
+#endif
#if !(defined(_CRAYMPP) && defined(USE_REENTRANT_API))
/* In UNICOS/mk (_CRAYMPP) the multithreading
diff --git a/proto.h b/proto.h
index f5cb2d2098..520b6fae93 100644
--- a/proto.h
+++ b/proto.h
@@ -4028,7 +4028,6 @@ PERL_CALLCONV OP * Perl_my_attrs(pTHX_ OP *o, OP *attrs)
#define PERL_ARGS_ASSERT_MY_ATTRS \
assert(o)
-PERL_CALLCONV void Perl_boot_core_xsutils(pTHX);
#if defined(USE_ITHREADS)
PERL_CALLCONV PERL_CONTEXT* Perl_cx_dup(pTHX_ PERL_CONTEXT* cx, I32 ix, I32 max, CLONE_PARAMS* param)
__attribute__warn_unused_result__
@@ -5968,10 +5967,9 @@ PERL_CALLCONV int Perl_my_socketpair(int family, int type, int protocol, int fd[
PERL_CALLCONV int Perl_my_dirfd(pTHX_ DIR* dir);
#ifdef PERL_OLD_COPY_ON_WRITE
PERL_CALLCONV SV* Perl_sv_setsv_cow(pTHX_ SV* dstr, SV* sstr)
- __attribute__nonnull__(pTHX_1)
__attribute__nonnull__(pTHX_2);
#define PERL_ARGS_ASSERT_SV_SETSV_COW \
- assert(dstr); assert(sstr)
+ assert(sstr)
#endif
diff --git a/regen_lib.pl b/regen_lib.pl
index 6735bb9294..7d396c0447 100644
--- a/regen_lib.pl
+++ b/regen_lib.pl
@@ -1,22 +1,12 @@
#!/usr/bin/perl -w
use strict;
-use vars qw($Is_W32 $Is_OS2 $Is_Cygwin $Is_NetWare $Needs_Write $Verbose
- @Changed);
-use Config; # Remember, this is running using an existing perl
+use vars qw($Needs_Write $Verbose @Changed);
use File::Compare;
use Symbol;
# Common functions needed by the regen scripts
-$Is_W32 = $^O eq 'MSWin32';
-$Is_OS2 = $^O eq 'os2';
-$Is_Cygwin = $^O eq 'cygwin';
-$Is_NetWare = $Config{osname} eq 'NetWare';
-if ($Is_NetWare) {
- $Is_W32 = 0;
-}
-
-$Needs_Write = $Is_OS2 || $Is_W32 || $Is_Cygwin || $Is_NetWare;
+$Needs_Write = $^O eq 'cygwin' || $^O eq 'os2' || $^O eq 'MSWin32';
$Verbose = 0;
@ARGV = grep { not($_ eq '-q' and $Verbose = -1) }
diff --git a/regen_perly.pl b/regen_perly.pl
index fb01dbd824..859495faf1 100644
--- a/regen_perly.pl
+++ b/regen_perly.pl
@@ -66,11 +66,11 @@ die "$0: must be run on an ASCII system\n" unless ord 'A' == 65;
# the test below to allow that version too. DAPM Feb 04.
my $version = `$bison -V`;
-unless ($version =~ /\b(1\.875[a-z]?|2\.[013])\b/) { die <<EOF; }
+unless ($version =~ /\b(1\.875[a-z]?|2\.[0134])\b/) { die <<EOF; }
You have the wrong version of bison in your path; currently 1.875
-2.0, 2.1 or 2.3 is required. Try installing
- http://ftp.gnu.org/gnu/bison/bison-2.1.tar.gz
+2.0, 2.1, 2.3 or 2.4 is required. Try installing
+ http://ftp.gnu.org/gnu/bison/bison-2.4.1.tar.gz
or similar. Your bison identifies itself as:
$version
@@ -112,6 +112,9 @@ open TMPH_FILE, $tmph_file or die "Can't open $tmph_file: $!\n";
chmod 0644, $h_file;
open H_FILE, ">$h_file" or die "Can't open $h_file: $!\n";
my $endcore_done = 0;
+# Token macros need to be generated manually on bison 2.4
+my $gather_tokens = ($version =~ /\b2\.4\b/ ? undef : 0);
+my $tokens;
while (<TMPH_FILE>) {
print H_FILE "#ifdef PERL_CORE\n" if $. == 1;
if (!$endcore_done and /YYSTYPE_IS_DECLARED/) {
@@ -119,6 +122,19 @@ while (<TMPH_FILE>) {
$endcore_done = 1;
}
next if /^#line \d+ ".*"/;
+ if (not defined $gather_tokens) {
+ $gather_tokens = 1 if /^\s* enum \s* yytokentype \s* \{/x;
+ }
+ elsif ($gather_tokens) {
+ if (/^\# \s* endif/x) { # The #endif just after the end of the token enum
+ $gather_tokens = 0;
+ $_ .= "\n/* Tokens. */\n$tokens";
+ }
+ else {
+ my ($tok, $val) = /(\w+) \s* = \s* (\d+)/x;
+ $tokens .= "#define $tok $val\n" if $tok;
+ }
+ }
print H_FILE $_;
}
close TMPH_FILE;
@@ -153,13 +169,16 @@ sub extract {
$clines =~ m@
switch \s* \( \s* \w+ \s* \) \s* { \s*
(
- case \s* \d+ \s* : \s*
+ case \s* \d+ \s* :
+ \s*
+ (?: \s* /\* .*? \*/ \s* )* # optional C-comments
+ \s*
\#line [^\n]+"\Q$y_file\E"
.*?
)
}
\s*
- ( \s* /\* .*? \*/ \s* )* # optional C-comments
+ (?: \s* /\* .*? \*/ \s* )* # optional C-comments
\s*
(
\#line[^\n]+\.c"
@@ -172,6 +191,9 @@ sub extract {
or die "Can't extract actions from $tmpc_file\n";
$actlines = $1;
+ # Remove extraneous comments from bison 2.4
+ $actlines =~ s!\s* /\* \s* Line \s* \d+ \s* of \s* yacc\.c \s* \*/!!gx;
+
# C<#line 188 "perlytmp.c"> gets picked up by make depend, so remove them.
$actlines =~ s/^#line \d+ "\Q$tmpc_file\E".*$//gm;
diff --git a/regexec.c b/regexec.c
index 45ece8e450..93fadab584 100644
--- a/regexec.c
+++ b/regexec.c
@@ -2841,6 +2841,11 @@ S_regmatch(pTHX_ regmatch_info *reginfo, regnode *prog)
state_num = OP(scan);
reenter_switch:
+
+ assert(PL_reglastparen == &rex->lastparen);
+ assert(PL_reglastcloseparen == &rex->lastcloseparen);
+ assert(PL_regoffs == rex->offs);
+
switch (state_num) {
case BOL:
if (locinput == PL_bostr)
@@ -3889,9 +3894,12 @@ S_regmatch(pTHX_ regmatch_info *reginfo, regnode *prog)
regcpblow(ST.cp);
cur_eval = ST.prev_eval;
cur_curlyx = ST.prev_curlyx;
-
+
+ /* rex was changed so update the pointer in PL_reglastparen and PL_reglastcloseparen */
PL_reglastparen = &rex->lastparen;
PL_reglastcloseparen = &rex->lastcloseparen;
+ /* also update PL_regoffs */
+ PL_regoffs = rex->offs;
/* XXXX This is too dramatic a measure... */
PL_reg_maxiter = 0;
@@ -3907,6 +3915,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, regnode *prog)
SETREX(rex_sv,ST.prev_rex);
rex = (struct regexp *)SvANY(rex_sv);
rexi = RXi_GET(rex);
+ /* rex was changed so update the pointer in PL_reglastparen and PL_reglastcloseparen */
PL_reglastparen = &rex->lastparen;
PL_reglastcloseparen = &rex->lastcloseparen;
@@ -4469,8 +4478,11 @@ NULL
cur_eval->u.eval.close_paren == (U32)ST.me->flags)
goto fake_end;
- if ( ST.count < (ST.minmod ? ARG1(ST.me) : ARG2(ST.me)) )
- goto curlym_do_A; /* try to match another A */
+ {
+ I32 max = (ST.minmod ? ARG1(ST.me) : ARG2(ST.me));
+ if ( max == REG_INFTY || ST.count < max )
+ goto curlym_do_A; /* try to match another A */
+ }
goto curlym_do_B; /* try to match B */
case CURLYM_A_fail: /* just failed to match an A */
@@ -4909,6 +4921,11 @@ NULL
cur_curlyx = cur_eval->u.eval.prev_curlyx;
ReREFCNT_inc(rex_sv);
st->u.eval.cp = regcppush(0); /* Save *all* the positions. */
+
+ /* rex was changed so update the pointer in PL_reglastparen and PL_reglastcloseparen */
+ PL_reglastparen = &rex->lastparen;
+ PL_reglastcloseparen = &rex->lastcloseparen;
+
REGCP_SET(st->u.eval.lastcp);
PL_reginput = locinput;
diff --git a/sv.c b/sv.c
index 9253168c17..8c9b17abed 100644
--- a/sv.c
+++ b/sv.c
@@ -157,7 +157,7 @@ Public API:
=cut
-============================================================================ */
+ * ========================================================================= */
/*
* "A time to plant, and a time to uproot what was planted..."
@@ -3621,12 +3621,6 @@ S_glob_assign_glob(pTHX_ SV *const dstr, SV *const sstr, const int dtype)
SvFAKE_on(dstr); /* can coerce to non-glob */
}
-#ifdef GV_UNIQUE_CHECK
- if (GvUNIQUE((const GV *)dstr)) {
- Perl_croak(aTHX_ "%s", PL_no_modify);
- }
-#endif
-
if(GvGP(MUTABLE_GV(sstr))) {
/* If source has method cache entry, clear it */
if(GvCVGEN(sstr)) {
@@ -3680,12 +3674,6 @@ S_glob_assign_ref(pTHX_ SV *const dstr, SV *const sstr)
PERL_ARGS_ASSERT_GLOB_ASSIGN_REF;
-#ifdef GV_UNIQUE_CHECK
- if (GvUNIQUE((const GV *)dstr)) {
- Perl_croak(aTHX_ "%s", PL_no_modify);
- }
-#endif
-
if (intro) {
GvINTRO_off(dstr); /* one-shot flag */
GvLINE(dstr) = CopLINE(PL_curcop);
@@ -4074,7 +4062,7 @@ Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV* sstr, const I32 flags)
&& ((flags & SV_COW_SHARED_HASH_KEYS)
? (!((sflags & CAN_COW_MASK) == CAN_COW_FLAGS
&& (SvFLAGS(dstr) & CAN_COW_MASK) == CAN_COW_FLAGS
- && SvTYPE(sstr) >= SVt_PVIV))
+ && SvTYPE(sstr) >= SVt_PVIV && SvTYPE(sstr) != SVt_PVFM))
: 1)
#endif
) {
@@ -4097,12 +4085,6 @@ Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV* sstr, const I32 flags)
}
#ifdef PERL_OLD_COPY_ON_WRITE
if (!isSwipe) {
- /* I believe I should acquire a global SV mutex if
- it's a COW sv (not a shared hash key) to stop
- it going un copy-on-write.
- If the source SV has gone un copy on write between up there
- and down here, then (assert() that) it is of the correct
- form to make it copy on write again */
if ((sflags & (SVf_FAKE | SVf_READONLY))
!= (SVf_FAKE | SVf_READONLY)) {
SvREADONLY_on(sstr);
@@ -4145,7 +4127,6 @@ Perl_sv_setsv_flags(pTHX_ SV *dstr, register SV* sstr, const I32 flags)
SvCUR_set(dstr, cur);
SvREADONLY_on(dstr);
SvFAKE_on(dstr);
- /* Relesase a global SV mutex. */
}
else
{ /* Passes the swipe test. */
@@ -4549,7 +4530,6 @@ Perl_sv_force_normal_flags(pTHX_ register SV *const sv, const U32 flags)
#ifdef PERL_OLD_COPY_ON_WRITE
if (SvREADONLY(sv)) {
- /* At this point I believe I should acquire a global SV mutex. */
if (SvFAKE(sv)) {
const char * const pvx = SvPVX_const(sv);
const STRLEN len = SvLEN(sv);
@@ -4590,7 +4570,6 @@ Perl_sv_force_normal_flags(pTHX_ register SV *const sv, const U32 flags)
}
else if (IN_PERL_RUNTIME)
Perl_croak(aTHX_ "%s", PL_no_modify);
- /* At this point I believe that I can drop the global SV mutex. */
}
#else
if (SvREADONLY(sv)) {
@@ -5656,6 +5635,9 @@ Perl_sv_clear(pTHX_ register SV *const sv)
stash = SvSTASH(sv);
destructor = StashHANDLER(stash,DESTROY);
if (destructor
+ /* A constant subroutine can have no side effects, so
+ don't bother calling it. */
+ && !CvCONST(destructor)
/* Don't bother calling an empty destructor */
&& (CvISXSUB(destructor)
|| CvSTART(destructor)->op_next->op_type != OP_LEAVESUB))
@@ -5796,8 +5778,6 @@ Perl_sv_clear(pTHX_ register SV *const sv)
#ifdef PERL_OLD_COPY_ON_WRITE
else if (SvPVX_const(sv)) {
if (SvIsCOW(sv)) {
- /* I believe I need to grab the global SV mutex here and
- then recheck the COW status. */
if (DEBUG_C_TEST) {
PerlIO_printf(Perl_debug_log, "Copy on write: clear\n");
sv_dump(sv);
@@ -5808,7 +5788,6 @@ Perl_sv_clear(pTHX_ register SV *const sv)
unshare_hek(SvSHARED_HEK_FROM_PV(SvPVX_const(sv)));
}
- /* And drop it here. */
SvFAKE_off(sv);
} else if (SvLEN(sv)) {
Safefree(SvPVX_const(sv));
@@ -9691,12 +9670,6 @@ Perl_sv_vcatpvfn(pTHX_ SV *const sv, const char *const pat, const STRLEN patlen,
if (args) {
eptr = va_arg(*args, char*);
if (eptr)
-#ifdef MACOS_TRADITIONAL
- /* On MacOS, %#s format is used for Pascal strings */
- if (alt)
- elen = *eptr++;
- else
-#endif
elen = strlen(eptr);
else {
eptr = (char *)nullstr;
@@ -10317,7 +10290,7 @@ ptr_table_* functions.
=cut
-============================================================================*/
+ * =========================================================================*/
#if defined(USE_ITHREADS)
@@ -10522,7 +10495,8 @@ Perl_gp_dup(pTHX_ GP *const gp, CLONE_PARAMS *const param)
ptr_table_store(PL_ptr_table, gp, ret);
/* clone */
- ret->gp_refcnt = 0; /* must be before any other dups! */
+ /* ret->gp_refcnt must be 0 before any other dups are called. We're relying
+ on Newxz() to do this for us. */
ret->gp_sv = sv_dup_inc(gp->gp_sv, param);
ret->gp_io = io_dup_inc(gp->gp_io, param);
ret->gp_form = cv_dup_inc(gp->gp_form, param);
@@ -10906,9 +10880,6 @@ Perl_sv_dup(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
break;
case SVt_PVGV:
- if (GvUNIQUE((const GV *)sstr)) {
- NOOP; /* Do sharing here, and fall through */
- }
case SVt_PVIO:
case SVt_PVFM:
case SVt_PVHV:
@@ -10984,8 +10955,7 @@ Perl_sv_dup(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
LvTARG(dstr) = sv_dup_inc(LvTARG(dstr), param);
case SVt_PVGV:
if(isGV_with_GP(sstr)) {
- if (GvNAME_HEK(dstr))
- GvNAME_HEK(dstr) = hek_dup(GvNAME_HEK(dstr), param);
+ GvNAME_HEK(dstr) = hek_dup(GvNAME_HEK(dstr), param);
/* Don't call sv_add_backref here as it's going to be
created as part of the magic cloning of the symbol
table. */
@@ -11083,7 +11053,7 @@ Perl_sv_dup(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
SvFLAGS(dstr) |= SVf_OOK;
hvname = saux->xhv_name;
- daux->xhv_name = hvname ? hek_dup(hvname, param) : hvname;
+ daux->xhv_name = hek_dup(hvname, param);
daux->xhv_riter = saux->xhv_riter;
daux->xhv_eiter = saux->xhv_eiter
@@ -11120,8 +11090,7 @@ Perl_sv_dup(pTHX_ const SV *const sstr, CLONE_PARAMS *const param)
CvROOT(dstr) = OpREFCNT_inc(CvROOT(dstr));
OP_REFCNT_UNLOCK;
if (CvCONST(dstr) && CvISXSUB(dstr)) {
- CvXSUBANY(dstr).any_ptr = GvUNIQUE(CvGV(dstr)) ?
- SvREFCNT_inc(CvXSUBANY(dstr).any_ptr) :
+ CvXSUBANY(dstr).any_ptr =
sv_dup_inc((const SV *)CvXSUBANY(dstr).any_ptr, param);
}
/* don't dup if copying back - CvGV isn't refcounted, so the
diff --git a/symbian/config.pl b/symbian/config.pl
index f35efb62e8..22a42c4058 100644
--- a/symbian/config.pl
+++ b/symbian/config.pl
@@ -717,7 +717,7 @@ perl${VERSION}lib.sis perllib.sis: \$(PM)
perl${VERSION}ext.sis perlext.sis: perldll_arm buildext_sis
perl symbian\\makesis.pl perl${VERSION}ext
-EXT = Compress::Raw::Zlib Cwd Data::Dumper Devel::Peek Digest::MD5 Errno Fcntl File::Glob Filter::Util::Call IO List::Util MIME::Base64 PerlIO::scalar PerlIO::via SDBM_File Socket Storable Time::HiRes XSLoader attrs
+EXT = Compress::Raw::Zlib Cwd Data::Dumper Devel::Peek Digest::MD5 Errno Fcntl File::Glob Filter::Util::Call IO List::Util MIME::Base64 PerlIO::scalar PerlIO::via SDBM_File Socket Storable Time::HiRes XSLoader attributes
buildext: perldll symbian\\xsbuild.pl lib\\Config.pm
perl \$(XLIB) symbian\\xsbuild.pl \$(XSBOPT) \$(EXT)
diff --git a/symbian/config.sh b/symbian/config.sh
index 1a6d2404ed..9885d4df36 100644
--- a/symbian/config.sh
+++ b/symbian/config.sh
@@ -157,6 +157,7 @@ d_futimes='undef'
d__fwalk='undef'
d_gdbm_ndbm_h_uses_prototypes='undef'
d_gdbmndbm_h_uses_prototypes='undef'
+d_getaddrinfo='undef'
d_getcwd='define'
d_getespwnam='undef'
d_getfsstat='undef'
@@ -178,6 +179,7 @@ d_getlogin_r='undef'
d_getlogin='undef'
d_getmntent='undef'
d_getmnt='undef'
+d_getnameinfo='undef'
d_getnbyaddr='undef'
d_getnbyname='undef'
d_getnent='undef'
@@ -224,6 +226,8 @@ d_ilogbl='undef'
d_inc_version_list='undef'
d_index='undef'
d_inetaton='undef'
+d_inetntop='undef'
+d_inetpton='undef'
d_int64_t='undef'
d_isascii='undef'
d_isfinite='undef'
diff --git a/symbian/install.cfg b/symbian/install.cfg
index b235ecf1a6..4b86b8211e 100644
--- a/symbian/install.cfg
+++ b/symbian/install.cfg
@@ -69,7 +69,7 @@ lib warnings/register.pm
#
# Extensions.
#
-ext attrs
+ext attributes
ext Compress/Raw/Zlib -zlib-src
ext Cwd
ext Data/Dumper
diff --git a/t/TEST b/t/TEST
index 7ce93663a5..4e86fd0291 100755
--- a/t/TEST
+++ b/t/TEST
@@ -166,7 +166,6 @@ unless (@ARGV) {
warn "$0: cannot open $mani: $!\n";
}
unless ($::core) {
- _find_tests('Module_Pluggable');
_find_tests('pod');
_find_tests('x2p');
_find_tests('japh') if $::torture;
@@ -339,6 +338,14 @@ EOT
my %todo;
while (<RESULTS>) {
next if /^\s*$/; # skip blank lines
+ if (/^1..$/ && ($^O eq 'VMS')) {
+ # VMS pipe bug inserts blank lines.
+ my $l2 = <RESULTS>;
+ if ($l2 =~ /^\s*$/) {
+ $l2 = <RESULTS>;
+ }
+ $_ = '1..' . $l2;
+ }
if ($::verbose) {
print $_;
}
diff --git a/t/base/lex.t b/t/base/lex.t
index f45e56cdf7..1b8045be71 100755
--- a/t/base/lex.t
+++ b/t/base/lex.t
@@ -1,6 +1,6 @@
#!./perl
-print "1..56\n";
+print "1..57\n";
$x = 'x';
@@ -267,3 +267,8 @@ foo::::::bar;
eval "\$x =\xE2foo";
if ($@ =~ /Unrecognized character \\xE2 in column 5/) { print "ok $test\n"; } else { print "not ok $test\n"; }
$test++;
+
+# Is "[~" scanned correctly?
+@a = (1,2,3);
+print "not " unless($a[~~2] == 3);
+print "ok 57\n";
diff --git a/t/harness b/t/harness
index b087cc5b15..5e5ddf4c82 100644
--- a/t/harness
+++ b/t/harness
@@ -6,8 +6,8 @@
BEGIN {
chdir 't' if -d 't';
@INC = '../lib'; # pick up only this build's lib
- $ENV{PERL5LIB} = '../lib'; # so children will see it too
}
+delete $ENV{PERL5LIB};
my $torture; # torture testing?
@@ -209,7 +209,6 @@ if (@ARGV) {
} else {
warn "$0: cannot open $mani: $!\n";
}
- push @last, <Module_Pluggable/*.t>;
push @last, <pod/*.t>;
push @last, <x2p/*.t>;
@@ -244,6 +243,12 @@ if ($jobs) {
}
);
}
+ $h->callback(
+ parser_args => sub {
+ my ( $args, $test ) = @_;
+ push @{ $args->{switches} }, '-I../lib';
+ }
+ );
$h->runtests(@tests);
} else {
Test::Harness::runtests @tests;
diff --git a/t/io/perlio_leaks.t b/t/io/perlio_leaks.t
index 7bd034658a..6bb6369e55 100644
--- a/t/io/perlio_leaks.t
+++ b/t/io/perlio_leaks.t
@@ -15,11 +15,14 @@ TODO: {
my $base_fd = do{ open my $in, '<', $0 or die $!; fileno $in };
for(1 .. 3){
- local $TODO = "[perl #56644] PerlIO resource leaks on open() and then :pop in :unix and :stdio" if $_ > 1;
- open my $fh, "<$layer", $0 or die $!;
+ local $TODO;
+ if ($_ > 1 && $layer =~ /^:(unix|stdio)$/) {
+ $TODO = "[perl #56644] PerlIO resource leaks on open() and then :pop in :unix and :stdio"
+ }
+ open my $fh, "<$layer", $0 or die $!;
- is fileno($fh), $base_fd, $layer;
- binmode $fh, ':pop';
+ is fileno($fh), $base_fd, $layer;
+ binmode $fh, ':pop';
}
}
}
diff --git a/t/lib/autodie/basic_exceptions.t b/t/lib/autodie/basic_exceptions.t
index 0981e8d6ef..56876be481 100644
--- a/t/lib/autodie/basic_exceptions.t
+++ b/t/lib/autodie/basic_exceptions.t
@@ -1,13 +1,15 @@
#!/usr/bin/perl -w
use strict;
-use Test::More tests => 13;
+use Test::More tests => 17;
use constant NO_SUCH_FILE => "this_file_had_better_not_exist";
+my $line;
+
eval {
use autodie ':io';
- open(my $fh, '<', NO_SUCH_FILE);
+ $line = __LINE__; open(my $fh, '<', NO_SUCH_FILE);
};
like($@, qr/Can't open '\w+' for reading: /, "Prety printed open msg");
@@ -21,7 +23,24 @@ is($@->file, $0, "Correct file");
is($@->function, 'CORE::open', "Correct dying sub");
is($@->package, __PACKAGE__, "Correct package");
is($@->caller,__PACKAGE__."::__ANON__", "Correct caller");
+is($@->line, $line, "Correct line");
is($@->args->[1], '<', 'Correct mode arg');
is($@->args->[2], NO_SUCH_FILE, 'Correct filename arg');
ok($@->matches('open'), 'Looks like an error from open');
ok($@->matches(':io'), 'Looks like an error from :io');
+
+# Testing of caller info with a real subroutine.
+
+my $line2;
+
+sub xyzzy {
+ use autodie ':io';
+ $line2 = __LINE__; open(my $fh, '<', NO_SUCH_FILE);
+ return;
+};
+
+eval { xyzzy(); };
+
+isa_ok($@, 'autodie::exception');
+is($@->caller, __PACKAGE__."::xyzzy", "Subroutine caller test");
+is($@->line, $line2, "Subroutine line test");
diff --git a/t/lib/autodie/caller.t b/t/lib/autodie/caller.t
new file mode 100644
index 0000000000..1874353627
--- /dev/null
+++ b/t/lib/autodie/caller.t
@@ -0,0 +1,34 @@
+#!/usr/bin/perl -w
+use strict;
+use warnings;
+use autodie;
+use Test::More 'no_plan';
+use FindBin qw($Bin);
+use lib "$Bin/lib";
+use Caller_helper;
+
+use constant NO_SUCH_FILE => "kiwifoo_is_so_much_fun";
+
+eval {
+ foo();
+};
+
+isa_ok($@, 'autodie::exception');
+
+is($@->caller, 'main::foo', "Caller should be main::foo");
+
+sub foo {
+ use autodie;
+ open(my $fh, '<', NO_SUCH_FILE);
+}
+
+eval {
+ Caller_helper::foo();
+};
+
+isa_ok($@, 'autodie::exception');
+
+is($@->line, $Caller_helper::line, "External line number check");
+is($@->file, $INC{"Caller_helper.pm"}, "External filename check");
+is($@->package, "Caller_helper", "External package check");
+is($@->caller, "Caller_helper::foo", "External subname check");
diff --git a/t/lib/autodie/lib/Caller_helper.pm b/t/lib/autodie/lib/Caller_helper.pm
new file mode 100644
index 0000000000..6ee9c69c07
--- /dev/null
+++ b/t/lib/autodie/lib/Caller_helper.pm
@@ -0,0 +1,13 @@
+package Caller_helper;
+
+our $line;
+
+sub foo {
+ use autodie;
+
+ $line = __LINE__; open(my $fh, '<', "no_such_file_here");
+
+ return;
+}
+
+1;
diff --git a/t/lib/autodie/scope_leak.t b/t/lib/autodie/scope_leak.t
index 3d7b55510c..529daa3ecd 100644
--- a/t/lib/autodie/scope_leak.t
+++ b/t/lib/autodie/scope_leak.t
@@ -35,3 +35,44 @@ eval {
};
is($@,"","Other package open should be unaffected");
+
+# Due to odd filenames reported when doing string evals,
+# older versions of autodie would not propogate into string evals.
+
+eval q{
+ open(my $fh, '<', NO_SUCH_FILE);
+};
+
+TODO: {
+ local $TODO = "No known way of propagating into string eval in 5.8"
+ if $] < 5.010;
+
+ ok($@, "Failing-open string eval should throw an exception");
+ isa_ok($@, 'autodie::exception');
+}
+
+eval q{
+ no autodie;
+
+ open(my $fh, '<', NO_SUCH_FILE);
+};
+
+is("$@","","disabling autodie in string context should work");
+
+eval {
+ open(my $fh, '<', NO_SUCH_FILE);
+};
+
+ok($@,"...but shouldn't disable it for the calling code.");
+isa_ok($@, 'autodie::exception');
+
+eval q{
+ no autodie;
+
+ use autodie qw(open);
+
+ open(my $fh, '<', NO_SUCH_FILE);
+};
+
+ok($@,"Wacky flipping of autodie in string eval should work too!");
+isa_ok($@, 'autodie::exception');
diff --git a/t/lib/autodie/user-context.t b/t/lib/autodie/user-context.t
new file mode 100644
index 0000000000..96a0390fa0
--- /dev/null
+++ b/t/lib/autodie/user-context.t
@@ -0,0 +1,59 @@
+#!/usr/bin/perl -w
+use strict;
+use warnings;
+use Test::More 'no_plan';
+use File::Copy;
+use constant NO_SUCH_FILE => 'this_file_had_better_not_exist';
+use constant EXCEPTION => 'autodie::exception';
+
+# http://perlmonks.org/?node_id=744246 describes a situation where
+# using autodie on user-defined functions can fail, depending upon
+# their context. These tests attempt to detect this bug.
+
+eval {
+ use autodie qw(copy);
+ copy(NO_SUCH_FILE, 'xyzzy');
+};
+
+isa_ok($@,EXCEPTION,"Copying a non-existent file should throw an error");
+
+eval {
+ use autodie qw(copy);
+ my $x = copy(NO_SUCH_FILE, 'xyzzy');
+};
+
+isa_ok($@,EXCEPTION,"This shouldn't change with scalar context");
+
+eval {
+ use autodie qw(copy);
+ my @x = copy(NO_SUCH_FILE, 'xyzzy');
+};
+
+TODO: {
+ local $TODO = "Fixed in 'hints' branch";
+
+ isa_ok($@,EXCEPTION,"This shouldn't change with array context");
+}
+
+# For good measure, test with built-ins.
+
+eval {
+ use autodie qw(open);
+ open(my $fh, '<', 'xyzzy');
+};
+
+isa_ok($@,EXCEPTION,"Opening a non-existent file should throw an error");
+
+eval {
+ use autodie qw(open);
+ my $x = open(my $fh, '<', 'xyzzy');
+};
+
+isa_ok($@,EXCEPTION,"This shouldn't change with scalar context");
+
+eval {
+ use autodie qw(open);
+ my @x = open(my $fh, '<', 'xyzzy');
+};
+
+isa_ok($@,EXCEPTION,"This shouldn't change with array context");
diff --git a/t/lib/common.pl b/t/lib/common.pl
index 36d45f3c99..ef95c9d541 100644
--- a/t/lib/common.pl
+++ b/t/lib/common.pl
@@ -15,9 +15,7 @@ our $pragma_name;
$| = 1;
my $Is_MacOS = $^O eq 'MacOS';
-my $tmpfile = "tmp0000";
-1 while -e ++$tmpfile;
-END { 1 while unlink $tmpfile }
+my $tmpfile = tempfile();
my @prgs = () ;
my @w_files = () ;
@@ -73,17 +71,20 @@ for (@prgs){
}
my($prog,$expected) = split(/\nEXPECT(?:\n|$)/, $_, 2);
- my ($todo, $todo_reason);
- $todo = $prog =~ s/^#\s*TODO\s*(.*)\n//m and $todo_reason = $1;
- # If the TODO reason starts ? then it's taken as a code snippet to evaluate
- # This provides the flexibility to have conditional TODOs
- if ($todo_reason && $todo_reason =~ s/^\?//) {
- my $temp = eval $todo_reason;
- if ($@) {
- die "# In TODO code reason:\n# $todo_reason\n$@";
+ my %reason;
+ foreach my $what (qw(skip todo)) {
+ $prog =~ s/^#\s*\U$what\E\s*(.*)\n//m and $reason{$what} = $1;
+ # If the SKIP reason starts ? then it's taken as a code snippet to
+ # evaluate. This provides the flexibility to have conditional SKIPs
+ if ($reason{$what} && $reason{$what} =~ s/^\?//) {
+ my $temp = eval $reason{$what};
+ if ($@) {
+ die "# In \U$what\E code reason:\n# $reason{$what}\n$@";
+ }
+ $reason{$what} = $temp;
}
- $todo_reason = $temp;
}
+
if ( $prog =~ /--FILE--/) {
my(@files) = split(/\n--FILE--\s*([^\s\n]*)\s*\n/, $prog) ;
shift @files ;
@@ -126,7 +127,7 @@ for (@prgs){
my $status = $?;
$results =~ s/\n+$//;
# allow expected output to be written as if $prog is on STDIN
- $results =~ s/tmp\d+/-/g;
+ $results =~ s/$::tempfile_regexp/-/g;
if ($^O eq 'VMS') {
# some tests will trigger VMS messages that won't be expected
$results =~ s/\n?%[A-Z]+-[SIWEF]-[A-Z]+,.*//;
@@ -184,9 +185,9 @@ for (@prgs){
$ok = $results eq $expected;
}
- print_err_line( $switch, $prog, $expected, $results, $todo ) unless $ok;
+ local $::TODO = $reason{todo};
+ print_err_line( $switch, $prog, $expected, $results, $::TODO ) unless $ok;
- our $TODO = $todo ? $todo_reason : 0;
ok($ok);
foreach (@temps)
diff --git a/t/lib/compress/generic.pl b/t/lib/compress/generic.pl
index befe281b2a..54abab0a54 100644
--- a/t/lib/compress/generic.pl
+++ b/t/lib/compress/generic.pl
@@ -18,7 +18,7 @@ BEGIN
$extra = 1
if $st ;
- plan(tests => 670 + $extra) ;
+ plan(tests => 666 + $extra) ;
}
sub myGZreadFile
@@ -57,13 +57,6 @@ sub run
like $@, mkEvalErr("^$CompressClass: output buffer is read-only") ;
my($out, $gz);
- $out = "" ;
- eval qq[\$a = new $CompressClass ] . '$out ;' ;
- like $@, mkEvalErr("^$CompressClass: output filename is undef or null string");
-
- $out = undef ;
- eval qq[\$a = new $CompressClass \$out ;] ;
- like $@, mkEvalErr("^$CompressClass: output filename is undef or null string");
my $x ;
$gz = new $CompressClass(\$x);
@@ -76,7 +69,6 @@ sub run
eval ' $gz->write({})' ;
like $@, mkEvalErr("^${CompressClass}::write: not a scalar reference");
- #like $@, mkEvalErr("^${CompressClass}::write: input parameter not a filename, filehandle, array ref or scalar ref");
eval ' $gz->syswrite("abc", 1, 5)' ;
like $@, mkEvalErr("^${CompressClass}::write: offset outside string");
@@ -90,18 +82,13 @@ sub run
title "Testing $UncompressClass Errors";
my $out = "" ;
- eval qq[\$a = new $UncompressClass \$out ;] ;
- like $@, mkEvalErr("^$UncompressClass: input filename is undef or null string");
- $out = undef ;
- eval qq[\$a = new $UncompressClass \$out ;] ;
- like $@, mkEvalErr("^$UncompressClass: input filename is undef or null string");
my $lex = new LexFile my $name ;
ok ! -e $name, " $name does not exist";
- eval qq[\$a = new $UncompressClass "$name" ;] ;
- is $$UnError, "input file '$name' does not exist";
+ $a = new $UncompressClass "$name" ;
+ is $a, undef;
my $gc ;
my $guz = new $CompressClass(\$gc);
diff --git a/t/lib/compress/merge.pl b/t/lib/compress/merge.pl
index 7811966e84..6134292466 100644
--- a/t/lib/compress/merge.pl
+++ b/t/lib/compress/merge.pl
@@ -89,15 +89,7 @@ sub run
ok ! $gz, " Did not create $CompressClass object";
- {
- if ($to_file) {
- is $$Error, "Output file '$out_file' is not writable",
- " Got non-writable filename message" ;
- }
- else {
- ok $$Error, " Got error message" ;
- }
- }
+ ok $$Error, " Got error message" ;
}
chmod 0777, $out_file ;
@@ -137,7 +129,7 @@ sub run
ok ! $CompressClass->new($buffer, Merge => 1), " constructor fails";
{
- like $$Error, '/Cannot create InflateScan object: (Header Error|unexpected end of file)/', " got Bad Magic" ;
+ like $$Error, '/Cannot create InflateScan object: (Header Error|unexpected end of file|Inflation Error: data error)/', " got Bad Magic" ;
}
}
diff --git a/t/lib/compress/multi.pl b/t/lib/compress/multi.pl
index cfb5666f6c..3e9bbfd464 100644
--- a/t/lib/compress/multi.pl
+++ b/t/lib/compress/multi.pl
@@ -13,7 +13,7 @@ BEGIN {
$extra = 1
if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 };
- plan tests => 694 + $extra ;
+ plan tests => 1324 + $extra ;
use_ok('IO::Uncompress::AnyUncompress', qw($AnyUncompressError)) ;
@@ -47,6 +47,9 @@ EOM
even more stuff
EOM
+ my $b0length = length $buffers[0];
+ my $bufcount = @buffers;
+
{
my $cc ;
my $gz ;
@@ -136,6 +139,46 @@ EOM
}
foreach my $unc ($UncompressClass, 'IO::Uncompress::AnyUncompress') {
+ foreach my $blk (1, 20, $b0length - 1, $b0length, $b0length +1) {
+ title " Testing $CompressClass with $unc, BlockSize $blk and $i streams, from $fb";
+ $cc = $output ;
+ if ($fb eq 'filehandle')
+ {
+ $cc = new IO::File "<$name" ;
+ }
+ my @opts = $unc ne $UncompressClass
+ ? (RawInflate => 1)
+ : ();
+ my $gz = new $unc($cc,
+ @opts,
+ Strict => 1,
+ AutoClose => 1,
+ Append => 1,
+ MultiStream => 1,
+ Transparent => 0)
+ or diag $$UnError;
+ isa_ok $gz, $UncompressClass, ' $gz' ;
+
+ my $un = '';
+ my $b = $blk;
+ # Want the first read to be in the middle of a stream
+ # and the second to cross a stream boundary
+ $b = 1000 while $gz->read($un, $b) > 0 ;
+ #print "[[$un]]\n" while $gz->read($un) > 0 ;
+ ok ! $gz->error(), " ! error()"
+ or diag "Error is " . $gz->error() ;
+ ok $gz->eof(), " eof()";
+ ok $gz->close(), " close() ok"
+ or diag "errno $!\n" ;
+
+ is $gz->streamCount(), $i +1, " streamCount ok " . ($i +1)
+ or diag "Stream count is " . $gz->streamCount();
+ ok $un eq join('', @buffs), " expected output" ;
+
+ }
+ }
+
+ foreach my $unc ($UncompressClass, 'IO::Uncompress::AnyUncompress') {
title " Testing $CompressClass with $unc nextStream and $i streams, from $fb";
$cc = $output ;
if ($fb eq 'filehandle')
@@ -195,7 +238,8 @@ EOM
is $gz->tell(), 0, " tell is 0";
}
- is $gz->nextStream(), 0, " nextStream ok";
+ is $gz->nextStream(), 0, " nextStream ok"
+ or diag $gz->error() ;
ok $gz->eof(), " eof()";
ok $gz->close(), " close() ok"
or diag "errno $!\n" ;
diff --git a/t/lib/compress/oneshot.pl b/t/lib/compress/oneshot.pl
index 0646958d89..4f8bb83ac6 100644
--- a/t/lib/compress/oneshot.pl
+++ b/t/lib/compress/oneshot.pl
@@ -16,7 +16,7 @@ BEGIN {
$extra = 1
if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 };
- plan tests => 970 + $extra ;
+ plan tests => 986 + $extra ;
use_ok('IO::Uncompress::AnyUncompress', qw(anyuncompress $AnyUncompressError)) ;
@@ -42,6 +42,9 @@ sub run
my $Func = getTopFuncRef($bit);
my $TopType = getTopFuncName($bit);
+ #my $inverse = getInverse($bit);
+ #my $InverseFunc = getTopFuncRef($inverse);
+
title "Testing $TopType Error Cases";
my $a;
@@ -510,6 +513,7 @@ sub run
my $TopTypeInverse = getInverse($bit);
my $FuncInverse = getTopFuncRef($TopTypeInverse);
+ my $ErrorInverse = getErrorRef($TopTypeInverse);
my $lex = new LexFile(my $file1, my $file2) ;
@@ -606,6 +610,34 @@ sub run
my @headers = getHeaders($file3);
is @headers, $ms ? @input : 1, " Header count ok";
}
+
+ SKIP:
+ {
+ title "Truncated file";
+ skip '', 7
+ if $CompressClass =~ /lzop|lzf/i ;
+
+ my @in ;
+ push @in, "abcde" x 10;
+ push @in, "defgh" x 1000;
+ push @in, "12345" x 50000;
+
+ my $out;
+
+ for (@in) {
+ ok &$Func(\$_ , \$out, Append => 1 ), ' Compressed ok'
+ or diag $$Error;
+ }
+ #ok &$Func(\@in, \$out, MultiStream => 1 ), ' Compressed ok'
+ substr($out, -179) = '';
+
+ my $got;
+ my $status ;
+ ok $status = &$FuncInverse(\$out => \$got, MultiStream => 0), " Uncompressed stream 1 ok";
+ is $got, "abcde" x 10 ;
+ ok ! &$FuncInverse(\$out => \$got, MultiStream => 1), " Didn't uncompress";
+ is $$ErrorInverse, "unexpected end of file", " Got unexpected eof";
+ }
}
}
diff --git a/t/lib/h2ph.h b/t/lib/h2ph.h
index 495789a206..78429ca310 100644
--- a/t/lib/h2ph.h
+++ b/t/lib/h2ph.h
@@ -26,6 +26,10 @@
#undef MAX
#define MAX(a,b) ((a) > (b) ? (a) : (b))
+/* Test #undef'ining an existing constant function */
+#define NOTTRUE 0
+#undef NOTTRUE
+
/* Test #ifdef */
#ifdef __SOME_UNIMPORTANT_PROPERTY
#define MIN(a,b) ((a) < (b) ? (a) : (b))
@@ -68,9 +72,11 @@ function Tru64_Pascal(n: Integer): Integer;
* with `use lib qw(/opt/perl5/lib/site_perl/i586-linux/linux);' or whatever
* your equivalent is...
*/
+#if 0
#include <sys/socket.h>
#import "sys/ioctl.h"
#include_next <sys/fcntl.h>
+#endif
/* typedefs should be ignored */
typedef struct a_struct {
diff --git a/t/lib/h2ph.pht b/t/lib/h2ph.pht
index 145e6824ae..3723fca84a 100644
--- a/t/lib/h2ph.pht
+++ b/t/lib/h2ph.pht
@@ -1,6 +1,6 @@
require '_h2ph_pre.ph';
-no warnings 'redefine';
+no warnings qw(redefine misc);
unless(defined(&SQUARE)) {
sub SQUARE {
@@ -22,6 +22,8 @@ unless(defined(&_H2PH_H_)) {
my($a,$b) = @_;
eval q((($a) > ($b) ? ($a) : ($b)));
}' unless defined(&MAX);
+ eval 'sub NOTTRUE () {0;}' unless defined(&NOTTRUE);
+ undef(&NOTTRUE) if defined(&NOTTRUE);
if(defined(&__SOME_UNIMPORTANT_PROPERTY)) {
eval 'sub MIN {
my($a,$b) = @_;
@@ -47,15 +49,17 @@ unless(defined(&_H2PH_H_)) {
} else {
eval 'sub WHATEVER () {1000;}' unless defined(&WHATEVER);
}
- require 'sys/socket.ph';
- require 'sys/ioctl.ph';
- eval {
- my(@REM);
- my(%INCD) = map { $INC{$_} => 1 } (grep { $_ eq "sys/fcntl.ph" } keys(%INC));
- @REM = map { "$_/sys/fcntl.ph" } (grep { not exists($INCD{"$_/sys/fcntl.ph"}) and -f "$_/sys/fcntl.ph" } @INC);
- require "$REM[0]" if @REM;
- };
- warn($@) if $@;
+ if(0) {
+ require 'sys/socket.ph';
+ require 'sys/ioctl.ph';
+ eval {
+ my(@REM);
+ my(%INCD) = map { $INC{$_} => 1 } (grep { $_ eq "sys/fcntl.ph" } keys(%INC));
+ @REM = map { "$_/sys/fcntl.ph" } (grep { not exists($INCD{"$_/sys/fcntl.ph"}) and -f "$_/sys/fcntl.ph" } @INC);
+ require "$REM[0]" if @REM;
+ };
+ warn($@) if $@;
+ }
eval("sub sun () { 0; }") unless defined(&sun);
eval("sub mon () { 1; }") unless defined(&mon);
eval("sub tue () { 2; }") unless defined(&tue);
diff --git a/t/lib/warnings/op b/t/lib/warnings/op
index cc968c7ed0..64217c744e 100644
--- a/t/lib/warnings/op
+++ b/t/lib/warnings/op
@@ -1094,3 +1094,12 @@ Deprecated use of my() in false conditional at - line 6.
Deprecated use of my() in false conditional at - line 7.
Deprecated use of my() in false conditional at - line 8.
Deprecated use of my() in false conditional at - line 9.
+########
+# op.c
+$[ = 1;
+use warnings 'deprecated';
+$[ = 2;
+no warnings 'deprecated';
+$[ = 3;
+EXPECT
+Use of assignment to $[ is deprecated at - line 4.
diff --git a/t/lib/warnings/toke b/t/lib/warnings/toke
index 04c41d5cf5..e5ca40002e 100644
--- a/t/lib/warnings/toke
+++ b/t/lib/warnings/toke
@@ -848,10 +848,23 @@ EXPECT
########
# toke.c
our $foo :unique;
+sub pam :locked;
+sub glipp :locked {
+}
+sub whack_eth ($) : locked {
+}
use warnings 'deprecated';
our $bar :unique;
+sub zapeth :locked;
+sub ker_plop :locked {
+}
+sub swa_a_p ($) : locked {
+}
EXPECT
-Use of :unique is deprecated at - line 4.
+Use of :unique is deprecated at - line 9.
+Use of :locked is deprecated at - line 10.
+Use of :locked is deprecated at - line 11.
+Use of :locked is deprecated at - line 13.
########
# toke.c
use warnings "syntax";
diff --git a/t/op/attrs.t b/t/op/attrs.t
index a27b61e580..5ba0fdacf9 100644
--- a/t/op/attrs.t
+++ b/t/op/attrs.t
@@ -10,7 +10,7 @@ BEGIN {
require './test.pl';
}
-plan 90;
+plan 83;
$SIG{__WARN__} = sub { die @_ };
@@ -19,13 +19,7 @@ sub eval_ok ($;$) {
is( $@, '', @_);
}
-eval_ok 'sub t1 ($) : locked { $_[0]++ }';
-eval_ok 'sub t2 : locked { $_[0]++ }';
-eval_ok 'sub t3 ($) : locked ;';
-eval_ok 'sub t4 : locked ;';
-our $anon1; eval_ok '$anon1 = sub ($) : locked:method { $_[0]++ }';
-our $anon2; eval_ok '$anon2 = sub : locked : method { $_[0]++ }';
-our $anon3; eval_ok '$anon3 = sub : method { $_[0]->[1] }';
+our $anon1; eval_ok '$anon1 = sub : method { $_[0]++ }';
eval 'sub e1 ($) : plugh ;';
like $@, qr/^Invalid CODE attributes?: ["']?plugh["']? at/;
@@ -97,20 +91,16 @@ sub X::foo { 1 }
eval 'package Z; sub Y::bar : foo';
like $@, qr/^X at /;
-eval 'package Z; sub Y::baz : locked {}';
-my @attrs = eval 'attributes::get \&Y::baz';
-is "@attrs", "locked";
-
@attrs = eval 'attributes::get $anon1';
-is "@attrs", "locked method";
+is "@attrs", "method";
sub Z::DESTROY { }
sub Z::FETCH_CODE_ATTRIBUTES { return 'Z' }
-my $thunk = eval 'bless +sub : method locked { 1 }, "Z"';
+my $thunk = eval 'bless +sub : method { 1 }, "Z"';
is ref($thunk), "Z";
@attrs = eval 'attributes::get $thunk';
-is "@attrs", "locked method Z";
+is "@attrs", "method Z";
# Test attributes on predeclared subroutines:
eval 'package A; sub PS : lvalue';
@@ -158,21 +148,28 @@ eval 'my $$foo : bar = 1';
like $@, qr/Can't declare scalar dereference in "my"/;
-my @code = qw(lvalue locked method);
-my @other = qw(shared unique);
+my @code = qw(lvalue method);
+my @other = qw(shared);
+my @deprecated = qw(locked unique);
my %valid;
$valid{CODE} = {map {$_ => 1} @code};
$valid{SCALAR} = {map {$_ => 1} @other};
$valid{ARRAY} = $valid{HASH} = $valid{SCALAR};
+my %deprecated;
+$deprecated{CODE} = { locked => 1 };
+$deprecated{ARRAY} = $deprecated{HASH} = $deprecated{SCALAR} = { unique => 1 };
our ($scalar, @array, %hash);
foreach my $value (\&foo, \$scalar, \@array, \%hash) {
my $type = ref $value;
foreach my $negate ('', '-') {
- foreach my $attr (@code, @other) {
+ foreach my $attr (@code, @other, @deprecated) {
my $attribute = $negate . $attr;
eval "use attributes __PACKAGE__, \$value, '$attribute'";
- if ($valid{$type}{$attr}) {
+ if ($deprecated{$type}{$attr}) {
+ like $@, qr/^Attribute "$attr" is deprecated at \(eval \d+\)/,
+ "$type attribute $attribute deprecated";
+ } elsif ($valid{$type}{$attr}) {
if ($attribute eq '-shared') {
like $@, qr/^A variable may not be unshared/;
} else {
diff --git a/t/op/each_array.t b/t/op/each_array.t
index b0665e1a07..2389473725 100644
--- a/t/op/each_array.t
+++ b/t/op/each_array.t
@@ -1,4 +1,4 @@
-#!./perl -w
+#!./perl
BEGIN {
chdir 't' if -d 't';
@@ -6,6 +6,8 @@ BEGIN {
require './test.pl';
}
use strict;
+use warnings;
+no warnings 'deprecated';
use vars qw(@array @r $k $v);
plan tests => 48;
diff --git a/t/op/filetest.t b/t/op/filetest.t
index c73d747ba7..4678f9285e 100755
--- a/t/op/filetest.t
+++ b/t/op/filetest.t
@@ -10,7 +10,7 @@ BEGIN {
}
use Config;
-plan(tests => 28);
+plan(tests => 28 + 27*14);
ok( -d 'op' );
ok( -f 'TEST' );
@@ -95,3 +95,102 @@ unlink $tempfile;
ok( -f _ );
sub _ { "this is not a file name" }
ok( -f _ );
+
+my $over;
+{
+ package OverFtest;
+
+ use overload
+ -X => sub {
+ $over = [overload::StrVal($_[0]), $_[1]];
+ "-$_[1]";
+ };
+}
+{
+ package OverString;
+
+ # No fallback. -X should fall back to string overload even without
+ # it.
+ use overload q/""/ => sub { $over = 1; "TEST" };
+}
+{
+ package OverBoth;
+
+ use overload
+ q/""/ => sub { "TEST" },
+ -X => sub { "-$_[1]" };
+}
+{
+ package OverNeither;
+
+ # Need fallback. Previous versions of perl required 'fallback' to do
+ # -X operations on an object with no "" overload.
+ use overload
+ '+' => sub { 1 },
+ fallback => 1;
+}
+
+my $ft = bless [], "OverFtest";
+my $ftstr = overload::StrVal($ft);
+my $str = bless [], "OverString";
+my $both = bless [], "OverBoth";
+my $neither = bless [], "OverNeither";
+my $nstr = overload::StrVal($neither);
+
+open my $gv, "<", "TEST";
+bless $gv, "OverString";
+open my $io, "<", "TEST";
+$io = *{$io}{IO};
+bless $io, "OverString";
+
+eval { require Fcntl };
+
+for my $op (split //, "rwxoRWXOezsfdlpSbctugkTMBAC") {
+ $over = [];
+ ok( my $rv = eval "-$op \$ft", "overloaded -$op succeeds" )
+ or diag( $@ );
+ is( $over->[0], $ftstr, "correct object for overloaded -$op" );
+ is( $over->[1], $op, "correct op for overloaded -$op" );
+ is( $rv, "-$op", "correct return value for overloaded -$op");
+
+ my ($exp, $is) = (1, "is");
+ if (
+ $op eq "u" and not eval { Fcntl::S_ISUID() } or
+ $op eq "g" and not eval { Fcntl::S_ISGID() } or
+ $op eq "k" and not eval { Fcntl::S_ISVTX() }
+ ) {
+ ($exp, $is) = (0, "not");
+ }
+
+ $over = 0;
+ $rv = eval "-$op \$str";
+ ok( !$@, "-$op succeeds with string overloading" )
+ or diag( $@ );
+ is( $rv, eval "-$op 'TEST'", "correct -$op on string overload" );
+ is( $over, $exp, "string overload $is called for -$op" );
+
+ ($exp, $is) = $op eq "l" ? (1, "is") : (0, "not");
+
+ $over = 0;
+ eval "-$op \$gv";
+ is( $over, $exp, "string overload $is called for -$op on GLOB" );
+
+ # IO refs always get string overload called. This might be a bug.
+ $op eq "t" || $op eq "T" || $op eq "B"
+ and ($exp, $is) = (1, "is");
+
+ $over = 0;
+ eval "-$op \$io";
+ is( $over, $exp, "string overload $is called for -$op on IO");
+
+ $rv = eval "-$op \$both";
+ is( $rv, "-$op", "correct -$op on string/-X overload" );
+
+ $rv = eval "-$op \$neither";
+ ok( !$@, "-$op succeeds with random overloading" )
+ or diag( $@ );
+ is( $rv, eval "-$op \$nstr", "correct -$op with random overloading" );
+
+ is( eval "-r -$op \$ft", "-r", "stacked overloaded -$op" );
+ is( eval "-$op -r \$ft", "-$op", "overloaded stacked -$op" );
+}
diff --git a/t/op/pat.t b/t/op/pat.t
index 859ec0016b..88fbe5d9f8 100755
--- a/t/op/pat.t
+++ b/t/op/pat.t
@@ -13,7 +13,7 @@ sub run_tests;
$| = 1;
-my $EXPECTED_TESTS = 3965; # Update this when adding/deleting tests.
+my $EXPECTED_TESTS = 4061; # Update this when adding/deleting tests.
BEGIN {
chdir 't' if -d 't';
@@ -494,7 +494,6 @@ sub run_tests {
nok "b$a=" =~ /a$a=/;
ok "b$a=" =~ /ba+=/;
- local $TODO = "See bug 60464" if $l > 32767;
ok "ba$a=" =~ /b(?:a|b)+=/;
}
}
@@ -4021,14 +4020,12 @@ sub run_tests {
{
local $BugId = '60034';
- local $TODO = "See bug 60034";
my $a = "xyzt" x 8192;
ok $a =~ /\A(?>[a-z])*\z/,
'(?>) does not cause wrongness on long string';
my $b = $a . chr 256;
chop $b;
{
- local $TODO;
iseq $a, $b;
}
ok $b =~ /\A(?>[a-z])*\z/,
@@ -4123,6 +4120,222 @@ sub run_tests {
ok $1 eq "A1";
ok $2 eq "B";
}
+
+
+ {
+ use re 'eval';
+ local $Message = 'Test if $^N and $+ work in (?{{})';
+ our @ctl_n = ();
+ our @plus = ();
+ our $nested_tags;
+ $nested_tags = qr{
+ <
+ ((\w)+)
+ (?{
+ push @ctl_n, (defined $^N ? $^N : "undef");
+ push @plus, (defined $+ ? $+ : "undef");
+ })
+ >
+ (??{$nested_tags})*
+ </\s* \w+ \s*>
+ }x;
+
+
+ my $c = 0;
+ for my $test (
+ [ 1, qr#^$nested_tags$#, "bla blubb bla", "a b a" ],
+ [ 1, qr#^($nested_tags)$#, "bla blubb <bla><blubb></blubb></bla>", "a b a" ],
+ [ 1, qr#^(|)$nested_tags$#, "bla blubb bla", "a b a" ],
+ [ 1, qr#^(?:|)$nested_tags$#, "bla blubb bla", "a b a" ],
+ [ 1, qr#^<(bl|bla)>$nested_tags<(/\1)>$#, "blubb /bla", "b /bla" ],
+ [ 1, qr#(??{"(|)"})$nested_tags$#, "bla blubb bla", "a b a" ],
+ [ 1, qr#^(??{"(bla|)"})$nested_tags$#, "bla blubb bla", "a b a" ],
+ [ 1, qr#^(??{"(|)"})(??{$nested_tags})$#, "bla blubb undef", "a b undef" ],
+ [ 1, qr#^(??{"(?:|)"})$nested_tags$#, "bla blubb bla", "a b a" ],
+ [ 1, qr#^((??{"(?:bla|)"}))((??{$nested_tags}))$#, "bla blubb <bla><blubb></blubb></bla>", "a b <bla><blubb></blubb></bla>" ],
+ [ 1, qr#^((??{"(?!)?"}))((??{$nested_tags}))$#, "bla blubb <bla><blubb></blubb></bla>", "a b <bla><blubb></blubb></bla>" ],
+ [ 1, qr#^((??{"(?:|<(/?bla)>)"}))((??{$nested_tags}))\1$#, "bla blubb <bla><blubb></blubb></bla>", "a b <bla><blubb></blubb></bla>" ],
+ [ 0, qr#^((??{"(?!)"}))?((??{$nested_tags}))(?!)$#, "bla blubb undef", "a b undef" ],
+
+ ) {
+ $c++;
+ @ctl_n = ();
+ @plus = ();
+ my $match = (("<bla><blubb></blubb></bla>" =~ $test->[1]) ? 1 : 0);
+ push @ctl_n, (defined $^N ? $^N : "undef");
+ push @plus, (defined $+ ? $+ : "undef");
+ ok($test->[0] == $match, "match $c");
+ if ($test->[0] != $match) {
+ # unset @ctl_n and @plus
+ @ctl_n = @plus = ();
+ }
+ iseq("@ctl_n", $test->[2], "ctl_n $c");
+ iseq("@plus", $test->[3], "plus $c");
+ }
+ }
+
+ {
+ use re 'eval';
+ local $BugId = '56194';
+
+ our $f;
+ local $f;
+ $f = sub {
+ defined $_[0] ? $_[0] : "undef";
+ };
+
+ ok("123" =~ m/^(\d)(((??{1 + $^N})))+$/);
+
+ our @ctl_n;
+ our @plus;
+
+ my $re = qr#(1)((??{ push @ctl_n, $f->($^N); push @plus, $f->($+); $^N + 1}))*(?{$^N})#;
+ my $re2 = qr#(1)((??{ push @ctl_n, $f->($^N); push @plus, $f->($+); $^N + 1}))*(?{$^N})(|a(b)c|def)(??{"$^R"})#;
+ my $re3 = qr#(1)((??{ push @ctl_n, $f->($^N); push @plus, $f->($+); $^N + 1})){2}(?{$^N})(|a(b)c|def)(??{"$^R"})#;
+ our $re5;
+ local $re5 = qr#(1)((??{ push @ctl_n, $f->($^N); push @plus, $f->($+); $^N + 1})){2}(?{$^N})#;
+ my $re6 = qr#(??{ push @ctl_n, $f->($^N); push @plus, $f->($+); $^N + 1})#;
+ my $re7 = qr#(??{ push @ctl_n, $f->($^N); push @plus, $f->($+); $^N + 1})#;
+ my $re8 = qr/(\d+)/;
+ my $c = 0;
+ for my $test (
+ [
+ "1233",
+ qr#^(1)((??{ push @ctl_n, $f->($^N); push @plus, $f->($+); $^N + 1}))+(??{$^N})$#,
+ "1 2 3 3",
+ "1 2 3 3",
+ "\$1 = 1, \$2 = 3, \$3 = undef, \$4 = undef, \$5 = undef",
+ ],
+ [
+ "1233",
+ qr#^(1)((??{ push @ctl_n, $f->($^N); push @plus, $f->($+); $^N + 1}))+(abc|def|)?(??{$+})$#,
+ "1 2 3 3",
+ "1 2 3 3",
+ "\$1 = 1, \$2 = 3, \$3 = undef, \$4 = undef, \$5 = undef",
+ ],
+ [
+ "1233",
+ qr#^(1)((??{ push @ctl_n, $f->($^N); push @plus, $f->($+); $^N + 1}))+(|abc|def)?(??{$+})$#,
+ "1 2 3 3",
+ "1 2 3 3",
+ "\$1 = 1, \$2 = 3, \$3 = undef, \$4 = undef, \$5 = undef",
+ ],
+ [
+ "1233",
+ qr#^(1)((??{ push @ctl_n, $f->($^N); push @plus, $f->($+); $^N + 1}))+(abc|def|)?(??{$^N})$#,
+ "1 2 3 3",
+ "1 2 3 3",
+ "\$1 = 1, \$2 = 3, \$3 = undef, \$4 = undef, \$5 = undef",
+ ],
+ [
+ "1233",
+ qr#^(1)((??{ push @ctl_n, $f->($^N); push @plus, $f->($+); $^N + 1}))+(|abc|def)?(??{$^N})$#,
+ "1 2 3 3",
+ "1 2 3 3",
+ "\$1 = 1, \$2 = 3, \$3 = undef, \$4 = undef, \$5 = undef",
+ ],
+ [
+ "123abc3",
+ qr#^($re)(|a(b)c|def)(??{$^R})$#,
+ "1 2 3 abc",
+ "1 2 3 b",
+ "\$1 = 123, \$2 = 1, \$3 = 3, \$4 = abc, \$5 = b",
+ ],
+ [
+ "123abc3",
+ qr#^($re2)$#,
+ "1 2 3 123abc3",
+ "1 2 3 b",
+ "\$1 = 123abc3, \$2 = 1, \$3 = 3, \$4 = abc, \$5 = b",
+ ],
+ [
+ "123abc3",
+ qr#^($re3)$#,
+ "1 2 123abc3",
+ "1 2 b",
+ "\$1 = 123abc3, \$2 = 1, \$3 = 3, \$4 = abc, \$5 = b",
+ ],
+ [
+ "123abc3",
+ qr#^(??{$re5})(|abc|def)(??{"$^R"})$#,
+ "1 2 abc",
+ "1 2 abc",
+ "\$1 = abc, \$2 = undef, \$3 = undef, \$4 = undef, \$5 = undef",
+ ],
+ [
+ "123abc3",
+ qr#^(??{$re5})(|a(b)c|def)(??{"$^R"})$#,
+ "1 2 abc",
+ "1 2 b",
+ "\$1 = abc, \$2 = b, \$3 = undef, \$4 = undef, \$5 = undef",
+ ],
+ [
+ "1234",
+ qr#^((\d+)((??{push @ctl_n, $f->($^N); push @plus, $f->($+);$^N + 1}))((??{push @ctl_n, $f->($^N); push @plus, $f->($+);$^N + 1}))((??{push @ctl_n, $f->($^N); push @plus, $f->($+);$^N + 1})))$#,
+ "1234 123 12 1 2 3 1234",
+ "1234 123 12 1 2 3 4",
+ "\$1 = 1234, \$2 = 1, \$3 = 2, \$4 = 3, \$5 = 4",
+ ],
+ [
+ "1234556",
+ qr#^(\d+)($re6)($re6)($re6)$re6(($re6)$re6)$#,
+ "1234556 123455 12345 1234 123 12 1 2 3 4 4 5 56",
+ "1234556 123455 12345 1234 123 12 1 2 3 4 4 5 5",
+ "\$1 = 1, \$2 = 2, \$3 = 3, \$4 = 4, \$5 = 56",
+ ],
+ [
+ "12345562",
+ qr#^((??{$re8}))($re7)($re7)($re7)$re7($re7)($re7(\2))$#,
+ "12345562 1234556 123455 12345 1234 123 12 1 2 3 4 4 5 62",
+ "12345562 1234556 123455 12345 1234 123 12 1 2 3 4 4 5 2",
+ "\$1 = 1, \$2 = 2, \$3 = 3, \$4 = 4, \$5 = 5",
+ ],
+ ) {
+ $c++;
+ @ctl_n = ();
+ @plus = ();
+ undef $^R;
+ my $match = $test->[0] =~ $test->[1];
+ my $str = join(", ", '$1 = '.$f->($1), '$2 = '.$f->($2), '$3 = '.$f->($3), '$4 = '.$f->($4),'$5 = '.$f->($5));
+ push @ctl_n, $f->($^N);
+ push @plus, $f->($+);
+ ok($match, "match $c");
+ if (not $match) {
+ # unset $str, @ctl_n and @plus
+ $str = "";
+ @ctl_n = @plus = ();
+ }
+ iseq("@ctl_n", $test->[2], "ctl_n $c");
+ iseq("@plus", $test->[3], "plus $c");
+ iseq($str, $test->[4], "str $c");
+ }
+ SKIP: {
+ if ($] le '5.010') {
+ skip "test segfaults on perl < 5.10", 4;
+ }
+
+ @ctl_n = ();
+ @plus = ();
+
+ our $re4;
+ local $re4 = qr#(1)((??{push @ctl_n, $f->($^N); push @plus, $f->($+);$^N + 1})){2}(?{$^N})(|abc|def)(??{"$^R"})#;
+ undef $^R;
+ my $match = "123abc3" =~ m/^(??{$re4})$/;
+ my $str = join(", ", '$1 = '.$f->($1), '$2 = '.$f->($2), '$3 = '.$f->($3), '$4 = '.$f->($4),'$5 = '.$f->($5),'$^R = '.$f->($^R));
+ push @ctl_n, $f->($^N);
+ push @plus, $f->($+);
+ ok($match);
+ if (not $match) {
+ # unset $str
+ @ctl_n = ();
+ @plus = ();
+ $str = "";
+ }
+ iseq("@ctl_n", "1 2 undef");
+ iseq("@plus", "1 2 undef");
+ iseq($str, "\$1 = undef, \$2 = undef, \$3 = undef, \$4 = undef, \$5 = undef, \$^R = undef");
+ }
+ }
#
# This should be the last test.
#
diff --git a/t/op/qr_gc.t b/t/op/qr_gc.t
index 7de3f845f5..db2e96ed2c 100644
--- a/t/op/qr_gc.t
+++ b/t/op/qr_gc.t
@@ -4,15 +4,17 @@ BEGIN {
chdir 't' if -d 't';
@INC = '../lib';
require './test.pl';
+ undef &Regexp::DESTROY;
}
plan tests => 2;
-$TODO = "leaking since 32751";
+if ($] >= 5.011) { # doesn't leak on 5.10.x
+ $TODO = "leaking since 32751";
+}
my $destroyed;
{
- no warnings 'redefine';
sub Regexp::DESTROY { $destroyed++ }
}
diff --git a/t/op/substr.t b/t/op/substr.t
index 81c87be87b..c3fa6e10e7 100755
--- a/t/op/substr.t
+++ b/t/op/substr.t
@@ -1,4 +1,4 @@
-#!./perl -w
+#!./perl
#P = start of string Q = start of substr R = end of substr S = end of string
@@ -7,6 +7,7 @@ BEGIN {
@INC = '../lib';
}
use warnings ;
+no warnings 'deprecated';
$a = 'abcdefxyz';
$SIG{__WARN__} = sub {
diff --git a/t/op/switch.t b/t/op/switch.t
index de44082bc7..f4cedba209 100644
--- a/t/op/switch.t
+++ b/t/op/switch.t
@@ -8,7 +8,7 @@ BEGIN {
use strict;
use warnings;
-use Test::More tests => 113;
+use Test::More tests => 124;
# The behaviour of the feature pragma should be tested by lib/switch.t
# using the tests in t/lib/switch/*. This file tests the behaviour of
@@ -860,6 +860,107 @@ SKIP: {
ok($obj->{reversed}, "$test: reversed");
}
}
+
+# Postfix when
+{
+ my $ok;
+ given (undef) {
+ $ok = 1 when undef;
+ }
+ is($ok, 1, "postfix undef");
+}
+{
+ my $ok;
+ given (2) {
+ $ok += 1 when 7;
+ $ok += 2 when 9.1685;
+ $ok += 4 when $_ > 4;
+ $ok += 8 when $_ < 2.5;
+ }
+ is($ok, 8, "postfix numeric");
+}
+{
+ my $ok;
+ given ("apple") {
+ $ok = 1, continue when $_ eq "apple";
+ $ok += 2;
+ $ok = 0 when "banana";
+ }
+ is($ok, 3, "postfix string");
+}
+{
+ my $ok;
+ given ("pear") {
+ do { $ok = 1; continue } when /pea/;
+ $ok += 2;
+ $ok = 0 when /pie/;
+ default { $ok += 4 }
+ $ok = 0;
+ }
+ is($ok, 7, "postfix regex");
+}
+# be_true is defined at the beginning of the file
+{
+ my $x = "what";
+ given(my $x = "foo") {
+ do {
+ is($x, "foo", "scope inside ... when my \$x = ...");
+ continue;
+ } when be_true(my $x = "bar");
+ is($x, "bar", "scope after ... when my \$x = ...");
+ }
+}
+{
+ my $x = 0;
+ given(my $x = 1) {
+ my $x = 2, continue when be_true();
+ is($x, undef, "scope after my \$x = ... when ...");
+ }
+}
+
+# Tests for last and next in when clauses
+my $letter;
+
+$letter = '';
+for ("a".."e") {
+ given ($_) {
+ $letter = $_;
+ when ("b") { last }
+ }
+ $letter = "z";
+}
+is($letter, "b", "last in when");
+
+$letter = '';
+LETTER1: for ("a".."e") {
+ given ($_) {
+ $letter = $_;
+ when ("b") { last LETTER1 }
+ }
+ $letter = "z";
+}
+is($letter, "b", "last LABEL in when");
+
+$letter = '';
+for ("a".."e") {
+ given ($_) {
+ when (/b|d/) { next }
+ $letter .= $_;
+ }
+ $letter .= ',';
+}
+is($letter, "a,c,e,", "next in when");
+
+$letter = '';
+LETTER2: for ("a".."e") {
+ given ($_) {
+ when (/b|d/) { next LETTER2 }
+ $letter .= $_;
+ }
+ $letter .= ',';
+}
+is($letter, "a,c,e,", "next LABEL in when");
+
# Okay, that'll do for now. The intricacies of the smartmatch
# semantics are tested in t/op/smartmatch.t
__END__
diff --git a/t/op/threads.t b/t/op/threads.t
index 814b59550f..c8ed34a7a1 100644
--- a/t/op/threads.t
+++ b/t/op/threads.t
@@ -16,7 +16,7 @@ BEGIN {
exit 0;
}
- plan(13);
+ plan(14);
}
use strict;
@@ -185,5 +185,10 @@ threads->new(\&safe_re)->join();
# tests in threads don't get counted, so
curr_test(curr_test() + 1);
+# This used to crash in 5.10.0 [perl #64954]
+
+undef *a;
+threads->new(sub {})->join;
+pass("undefing a typeglob doesn't cause a crash during cloning");
# EOF
diff --git a/t/op/time.t b/t/op/time.t
index 00c5b0501c..2ea173307e 100755..100644
--- a/t/op/time.t
+++ b/t/op/time.t
@@ -6,7 +6,7 @@ BEGIN {
require './test.pl';
}
-plan tests => 42;
+plan tests => 44;
($beguser,$begsys) = times;
@@ -81,8 +81,9 @@ ok(gmtime() =~ /^(Sun|Mon|Tue|Wed|Thu|Fri|Sat)[ ]
# Test gmtime over a range of times.
{
- # gm/localtime should go all the way from -2**63 to 2**63-1
- # but floating point hacks mean it gets unreliable for large numbers.
+ # The range should be limited only by the 53-bit mantissa of an IEEE double (or
+ # whatever kind of double you've got). Here we just prove that we're comfortably
+ # beyond the range possible with 32-bit time_t.
my %tests = (
# time_t gmtime list scalar
-2**35 => [52, 13, 20, 7, 2, -1019, 5, 65, 0, "Fri Mar 7 20:13:52 881"],
@@ -130,3 +131,17 @@ ok(gmtime() =~ /^(Sun|Mon|Tue|Wed|Thu|Fri|Sat)[ ]
like scalar localtime($time), $scalar, " scalar";
}
}
+
+# Test floating point args
+{
+ eval {
+ $SIG{__WARN__} = sub { die @_; };
+ localtime(1.23);
+ };
+ is($@, '', 'Ignore fractional time');
+ eval {
+ $SIG{__WARN__} = sub { die @_; };
+ gmtime(1.23);
+ };
+ is($@, '', 'Ignore fractional time');
+}
diff --git a/t/op/write.t b/t/op/write.t
index 429936c97b..07b5f73710 100755
--- a/t/op/write.t
+++ b/t/op/write.t
@@ -61,7 +61,7 @@ for my $tref ( @NumTests ){
my $bas_tests = 20;
# number of tests in section 3
-my $bug_tests = 4 + 3 * 3 * 5 * 2 * 3 + 2;
+my $bug_tests = 4 + 3 * 3 * 5 * 2 * 3 + 2 + 1;
# number of tests in section 4
my $hmb_tests = 35;
@@ -607,6 +607,23 @@ $= = 10;
select $oldfh;
close STDOUT_DUP;
+fresh_perl_like(<<'EOP', qr/^Format STDOUT redefined at/, {stderr => 1}, '#64562 - Segmentation fault with redefined formats and warnings');
+#!./perl
+
+use strict;
+use warnings; # crashes!
+
+format =
+.
+
+write;
+
+format =
+.
+
+write;
+EOP
+
#############################
## Section 4
## Add new tests *above* here
diff --git a/t/run/runenv.t b/t/run/runenv.t
index 1d2a6a7ece..03706ed08a 100644
--- a/t/run/runenv.t
+++ b/t/run/runenv.t
@@ -15,7 +15,7 @@ BEGIN {
require './test.pl'
}
-plan tests => 75;
+plan tests => 76;
my $STDOUT = tempfile();
my $STDERR = tempfile();
@@ -157,6 +157,15 @@ try({PERL5OPT => '-t'},
'-1',
'');
+try({PERL5OPT => '-W'},
+ ['-e', 'local $^W = 0; no warnings; print $x'],
+ '',
+ <<ERROR
+Name "main::x" used only once: possible typo at -e line 1.
+Use of uninitialized value \$x in print at -e line 1.
+ERROR
+);
+
try({PERLLIB => "foobar$Config{path_sep}42"},
['-e', 'print grep { $_ eq "foobar" } @INC'],
'foobar',
diff --git a/time64.c b/time64.c
index 0f5881222e..ca31acf0ad 100755
--- a/time64.c
+++ b/time64.c
@@ -33,9 +33,9 @@ long' type can use localtime64_r() and gmtime64_r() which correctly
converts the time even on 32-bit systems. Whether you have 64-bit time
values will depend on the operating system.
-localtime64_r() is a 64-bit equivalent of localtime_r().
+S_localtime64_r() is a 64-bit equivalent of localtime_r().
-gmtime64_r() is a 64-bit equivalent of gmtime_r().
+S_gmtime64_r() is a 64-bit equivalent of gmtime_r().
*/
@@ -110,27 +110,27 @@ static const int dow_year_start[SOLAR_CYCLE_LENGTH] = {
/* Multi varadic macros are a C99 thing, alas */
#ifdef TIME_64_DEBUG
-# define TRACE(format) (fprintf(stderr, format))
-# define TRACE1(format, var1) (fprintf(stderr, format, var1))
-# define TRACE2(format, var1, var2) (fprintf(stderr, format, var1, var2))
-# define TRACE3(format, var1, var2, var3) (fprintf(stderr, format, var1, var2, var3))
+# define TIME64_TRACE(format) (fprintf(stderr, format))
+# define TIME64_TRACE1(format, var1) (fprintf(stderr, format, var1))
+# define TIME64_TRACE2(format, var1, var2) (fprintf(stderr, format, var1, var2))
+# define TIME64_TRACE3(format, var1, var2, var3) (fprintf(stderr, format, var1, var2, var3))
#else
-# define TRACE(format) ((void)0)
-# define TRACE1(format, var1) ((void)0)
-# define TRACE2(format, var1, var2) ((void)0)
-# define TRACE3(format, var1, var2, var3) ((void)0)
+# define TIME64_TRACE(format) ((void)0)
+# define TIME64_TRACE1(format, var1) ((void)0)
+# define TIME64_TRACE2(format, var1, var2) ((void)0)
+# define TIME64_TRACE3(format, var1, var2, var3) ((void)0)
#endif
-static int is_exception_century(Year year)
+static int S_is_exception_century(Year year)
{
int is_exception = ((year % 100 == 0) && !(year % 400 == 0));
- TRACE1("# is_exception_century: %s\n", is_exception ? "yes" : "no");
+ TIME64_TRACE1("# is_exception_century: %s\n", is_exception ? "yes" : "no");
return(is_exception);
}
-Time64_T timegm64(struct TM *date) {
+static Time64_T S_timegm64(struct TM *date) {
int days = 0;
Time64_T seconds = 0;
Year year;
@@ -166,7 +166,7 @@ Time64_T timegm64(struct TM *date) {
#ifdef DEBUGGING
-static int check_tm(struct TM *tm)
+static int S_check_tm(struct TM *tm)
{
/* Don't forget leap seconds */
assert(tm->tm_sec >= 0);
@@ -203,7 +203,7 @@ static int check_tm(struct TM *tm)
/* The exceptional centuries without leap years cause the cycle to
shift by 16
*/
-static Year cycle_offset(Year year)
+static Year S_cycle_offset(Year year)
{
const Year start_year = 2000;
Year year_diff = year - start_year;
@@ -215,7 +215,7 @@ static Year cycle_offset(Year year)
exceptions = year_diff / 100;
exceptions -= year_diff / 400;
- TRACE3("# year: %lld, exceptions: %lld, year_diff: %lld\n",
+ TIME64_TRACE3("# year: %lld, exceptions: %lld, year_diff: %lld\n",
year, exceptions, year_diff);
return exceptions * 16;
@@ -238,17 +238,17 @@ static Year cycle_offset(Year year)
It doesn't need the same leap year status since we only care about
January 1st.
*/
-static int safe_year(Year year)
+static int S_safe_year(Year year)
{
int safe_year;
- Year year_cycle = year + cycle_offset(year);
+ Year year_cycle = year + S_cycle_offset(year);
/* Change non-leap xx00 years to an equivalent */
- if( is_exception_century(year) )
+ if( S_is_exception_century(year) )
year_cycle += 11;
/* Also xx01 years, since the previous year will be wrong */
- if( is_exception_century(year - 1) )
+ if( S_is_exception_century(year - 1) )
year_cycle += 17;
year_cycle %= SOLAR_CYCLE_LENGTH;
@@ -261,14 +261,14 @@ static int safe_year(Year year)
assert(safe_year <= 2037 && safe_year >= 2010);
- TRACE3("# year: %lld, year_cycle: %lld, safe_year: %d\n",
+ TIME64_TRACE3("# year: %lld, year_cycle: %lld, safe_year: %d\n",
year, year_cycle, safe_year);
return safe_year;
}
-void copy_little_tm_to_big_TM(const struct tm *src, struct TM *dest) {
+static void S_copy_little_tm_to_big_TM(const struct tm *src, struct TM *dest) {
if( src == NULL ) {
memset(dest, 0, sizeof(*dest));
}
@@ -300,40 +300,9 @@ void copy_little_tm_to_big_TM(const struct tm *src, struct TM *dest) {
}
-void copy_big_TM_to_little_tm(const struct TM *src, struct tm *dest) {
- if( src == NULL ) {
- memset(dest, 0, sizeof(*dest));
- }
- else {
-# ifdef USE_TM64
- dest->tm_sec = src->tm_sec;
- dest->tm_min = src->tm_min;
- dest->tm_hour = src->tm_hour;
- dest->tm_mday = src->tm_mday;
- dest->tm_mon = src->tm_mon;
- dest->tm_year = (int)src->tm_year;
- dest->tm_wday = src->tm_wday;
- dest->tm_yday = src->tm_yday;
- dest->tm_isdst = src->tm_isdst;
-
-# ifdef HAS_TM_TM_GMTOFF
- dest->tm_gmtoff = src->tm_gmtoff;
-# endif
-
-# ifdef HAS_TM_TM_ZONE
- dest->tm_zone = src->tm_zone;
-# endif
-
-# else
- /* They're the same type */
- memcpy(dest, src, sizeof(*dest));
-# endif
- }
-}
-
-
+#ifndef HAS_LOCALTIME_R
/* Simulate localtime_r() to the best of our ability */
-struct tm * fake_localtime_r(const time_t *clock, struct tm *result) {
+static struct tm * S_localtime_r(const time_t *clock, struct tm *result) {
dTHX; /* in case the following is defined as Perl_my_localtime(aTHX_ ...) */
const struct tm *static_result = localtime(clock);
@@ -348,10 +317,11 @@ struct tm * fake_localtime_r(const time_t *clock, struct tm *result) {
return result;
}
}
+#endif
-
+#ifndef HAS_GMTIME_R
/* Simulate gmtime_r() to the best of our ability */
-struct tm * fake_gmtime_r(const time_t *clock, struct tm *result) {
+static struct tm * S_gmtime_r(const time_t *clock, struct tm *result) {
dTHX; /* in case the following is defined as Perl_my_gmtime(aTHX_ ...) */
const struct tm *static_result = gmtime(clock);
@@ -366,9 +336,9 @@ struct tm * fake_gmtime_r(const time_t *clock, struct tm *result) {
return result;
}
}
+#endif
-
-struct TM *gmtime64_r (const Time64_T *in_time, struct TM *p)
+static struct TM *S_gmtime64_r (const Time64_T *in_time, struct TM *p)
{
int v_tm_sec, v_tm_min, v_tm_hour, v_tm_mon, v_tm_wday;
Time64_T v_tm_tday;
@@ -386,8 +356,8 @@ struct TM *gmtime64_r (const Time64_T *in_time, struct TM *p)
struct tm safe_date;
GMTIME_R(&safe_time, &safe_date);
- copy_little_tm_to_big_TM(&safe_date, p);
- assert(check_tm(p));
+ S_copy_little_tm_to_big_TM(&safe_date, p);
+ assert(S_check_tm(p));
return p;
}
@@ -401,19 +371,19 @@ struct TM *gmtime64_r (const Time64_T *in_time, struct TM *p)
p->tm_zone = "UTC";
#endif
- v_tm_sec = (int)(time % 60);
- time /= 60;
- v_tm_min = (int)(time % 60);
- time /= 60;
- v_tm_hour = (int)(time % 24);
- time /= 24;
- v_tm_tday = time;
+ v_tm_sec = (int)fmod(time, 60.0);
+ time = time >= 0 ? floor(time / 60.0) : ceil(time / 60.0);
+ v_tm_min = (int)fmod(time, 60.0);
+ time = time >= 0 ? floor(time / 60.0) : ceil(time / 60.0);
+ v_tm_hour = (int)fmod(time, 24.0);
+ time = time >= 0 ? floor(time / 24.0) : ceil(time / 24.0);
+ v_tm_tday = (int)time;
WRAP (v_tm_sec, v_tm_min, 60);
WRAP (v_tm_min, v_tm_hour, 60);
WRAP (v_tm_hour, v_tm_tday, 24);
- v_tm_wday = (int)((v_tm_tday + 4) % 7);
+ v_tm_wday = (int)fmod((v_tm_tday + 4.0), 7.0);
if (v_tm_wday < 0)
v_tm_wday += 7;
m = v_tm_tday;
@@ -425,7 +395,7 @@ struct TM *gmtime64_r (const Time64_T *in_time, struct TM *p)
if (m >= 0) {
/* Gregorian cycles, this is huge optimization for distant times */
- cycles = (int)(m / (Time64_T) days_in_gregorian_cycle);
+ cycles = (int)floor(m / (Time64_T) days_in_gregorian_cycle);
if( cycles ) {
m -= (cycles * (Time64_T) days_in_gregorian_cycle);
year += (cycles * years_in_gregorian_cycle);
@@ -449,7 +419,7 @@ struct TM *gmtime64_r (const Time64_T *in_time, struct TM *p)
year--;
/* Gregorian cycles */
- cycles = (int)((m / (Time64_T) days_in_gregorian_cycle) + 1);
+ cycles = (int)ceil((m / (Time64_T) days_in_gregorian_cycle) + 1);
if( cycles ) {
m -= (cycles * (Time64_T) days_in_gregorian_cycle);
year += (cycles * years_in_gregorian_cycle);
@@ -489,13 +459,13 @@ struct TM *gmtime64_r (const Time64_T *in_time, struct TM *p)
p->tm_mon = v_tm_mon;
p->tm_wday = v_tm_wday;
- assert(check_tm(p));
+ assert(S_check_tm(p));
return p;
}
-struct TM *localtime64_r (const Time64_T *time, struct TM *local_tm)
+static struct TM *S_localtime64_r (const Time64_T *time, struct TM *local_tm)
{
time_t safe_time;
struct tm safe_date;
@@ -509,18 +479,18 @@ struct TM *localtime64_r (const Time64_T *time, struct TM *local_tm)
if( SHOULD_USE_SYSTEM_LOCALTIME(*time) ) {
safe_time = (time_t)*time;
- TRACE1("Using system localtime for %lld\n", *time);
+ TIME64_TRACE1("Using system localtime for %lld\n", *time);
LOCALTIME_R(&safe_time, &safe_date);
- copy_little_tm_to_big_TM(&safe_date, local_tm);
- assert(check_tm(local_tm));
+ S_copy_little_tm_to_big_TM(&safe_date, local_tm);
+ assert(S_check_tm(local_tm));
return local_tm;
}
- if( gmtime64_r(time, &gm_tm) == NULL ) {
- TRACE1("gmtime64_r returned null for %lld\n", *time);
+ if( S_gmtime64_r(time, &gm_tm) == NULL ) {
+ TIME64_TRACE1("gmtime64_r returned null for %lld\n", *time);
return NULL;
}
@@ -530,21 +500,21 @@ struct TM *localtime64_r (const Time64_T *time, struct TM *local_tm)
gm_tm.tm_year < (1970 - 1900)
)
{
- TRACE1("Mapping tm_year %lld to safe_year\n", (Year)gm_tm.tm_year);
- gm_tm.tm_year = safe_year((Year)(gm_tm.tm_year + 1900)) - 1900;
+ TIME64_TRACE1("Mapping tm_year %lld to safe_year\n", (Year)gm_tm.tm_year);
+ gm_tm.tm_year = S_safe_year((Year)(gm_tm.tm_year + 1900)) - 1900;
}
- safe_time = (time_t)timegm64(&gm_tm);
+ safe_time = (time_t)S_timegm64(&gm_tm);
if( LOCALTIME_R(&safe_time, &safe_date) == NULL ) {
- TRACE1("localtime_r(%d) returned NULL\n", (int)safe_time);
+ TIME64_TRACE1("localtime_r(%d) returned NULL\n", (int)safe_time);
return NULL;
}
- copy_little_tm_to_big_TM(&safe_date, local_tm);
+ S_copy_little_tm_to_big_TM(&safe_date, local_tm);
local_tm->tm_year = orig_year;
if( local_tm->tm_year != orig_year ) {
- TRACE2("tm_year overflow: tm_year %lld, orig_year %lld\n",
+ TIME64_TRACE2("tm_year overflow: tm_year %lld, orig_year %lld\n",
(Year)local_tm->tm_year, (Year)orig_year);
#ifdef EOVERFLOW
@@ -579,7 +549,7 @@ struct TM *localtime64_r (const Time64_T *time, struct TM *local_tm)
if( !IS_LEAP(local_tm->tm_year) && local_tm->tm_yday == 365 )
local_tm->tm_yday--;
- assert(check_tm(local_tm));
+ assert(S_check_tm(local_tm));
return local_tm;
}
diff --git a/time64.h b/time64.h
index 329d4259f8..07bb33fd84 100644
--- a/time64.h
+++ b/time64.h
@@ -8,7 +8,7 @@
/* Set our custom types */
typedef INT_64_T Int64;
typedef Int64 Time64_T;
-typedef Int64 Year;
+typedef I32 Year;
/* A copy of the tm struct but with a 64 bit year */
@@ -45,22 +45,22 @@ struct TM64 {
#endif
-/* Declare public functions */
-struct TM *gmtime64_r (const Time64_T *, struct TM *);
-struct TM *localtime64_r (const Time64_T *, struct TM *);
-Time64_T timegm64 (struct TM *);
+/* Declare functions */
+static struct TM *S_gmtime64_r (const Time64_T *, struct TM *);
+static struct TM *S_localtime64_r (const Time64_T *, struct TM *);
+static Time64_T S_timegm64 (struct TM *);
/* Not everyone has gm/localtime_r(), provide a replacement */
#ifdef HAS_LOCALTIME_R
# define LOCALTIME_R(clock, result) (L_R_TZSET localtime_r(clock, result))
#else
-# define LOCALTIME_R(clock, result) (L_R_TZSET fake_localtime_r(clock, result))
+# define LOCALTIME_R(clock, result) (L_R_TZSET S_localtime_r(clock, result))
#endif
#ifdef HAS_GMTIME_R
# define GMTIME_R(clock, result) gmtime_r(clock, result)
#else
-# define GMTIME_R(clock, result) fake_gmtime_r(clock, result)
+# define GMTIME_R(clock, result) S_gmtime_r(clock, result)
#endif
#endif
diff --git a/time64_config.h b/time64_config.h
index 6a1cd9d063..42cc12c88e 100644
--- a/time64_config.h
+++ b/time64_config.h
@@ -15,10 +15,10 @@
/* INT_64_T
- A 64 bit integer type to use to store time and others.
+ A numeric type to store time and others.
Must be defined.
*/
-#define INT_64_T Quad_t
+#define INT_64_T NV
/* USE_TM64
@@ -77,9 +77,9 @@
can handle. We will use your system functions if the time falls
inside these ranges.
*/
-#define SYSTEM_LOCALTIME_MAX CAT2(LOCALTIME_MAX,UL)
-#define SYSTEM_LOCALTIME_MIN CAT2(LOCALTIME_MIN,UL)
-#define SYSTEM_GMTIME_MAX CAT2(GMTIME_MAX,UL)
-#define SYSTEM_GMTIME_MIN CAT2(GMTIME_MIN,UL)
+#define SYSTEM_LOCALTIME_MAX CAT2(LOCALTIME_MAX,.0)
+#define SYSTEM_LOCALTIME_MIN CAT2(LOCALTIME_MIN,.0)
+#define SYSTEM_GMTIME_MAX CAT2(GMTIME_MAX,.0)
+#define SYSTEM_GMTIME_MIN CAT2(GMTIME_MIN,.0)
#endif /* TIME64_CONFIG_H */
diff --git a/toke.c b/toke.c
index 3c3e0ad2e2..c803a80010 100644
--- a/toke.c
+++ b/toke.c
@@ -128,12 +128,7 @@ static I32 utf16rev_textfilter(pTHX_ int idx, SV *sv, int maxlen);
* 1999-02-27 mjd-perl-patch@plover.com */
#define isCONTROLVAR(x) (isUPPER(x) || strchr("[\\]^_?", (x)))
-/* On MacOS, respect nonbreaking spaces */
-#ifdef MACOS_TRADITIONAL
-#define SPACE_OR_TAB(c) ((c)==' '||(c)=='\312'||(c)=='\t')
-#else
#define SPACE_OR_TAB(c) ((c)==' '||(c)=='\t')
-#endif
/* LEX_* are values for PL_lex_state, the state of the lexer.
* They are arranged oddly so that the guard on the switch statement
@@ -3948,7 +3943,6 @@ Perl_yylex(pTHX)
*s = '#'; /* Don't try to parse shebang line */
}
#endif /* ALTERNATE_SHEBANG */
-#ifndef MACOS_TRADITIONAL
if (!d &&
*s == '#' &&
ipathend > ipath &&
@@ -3979,7 +3973,6 @@ Perl_yylex(pTHX)
PERL_FPU_POST_EXEC
Perl_croak(aTHX_ "Can't exec %s", ipath);
}
-#endif
if (d) {
while (*d && !isSPACE(*d))
d++;
@@ -4042,9 +4035,6 @@ Perl_yylex(pTHX)
"\t(Maybe you didn't strip carriage returns after a network transfer?)\n");
#endif
case ' ': case '\t': case '\f': case 013:
-#ifdef MACOS_TRADITIONAL
- case '\312':
-#endif
#ifdef PERL_MAD
PL_realtokenstart = -1;
if (!PL_thiswhite)
@@ -4287,7 +4277,10 @@ Perl_yylex(pTHX)
BOop(OP_BIT_XOR);
case '[':
PL_lex_brackets++;
- /* FALL THROUGH */
+ {
+ const char tmp = *s++;
+ OPERATOR(tmp);
+ }
case '~':
if (s[1] == '~'
&& (PL_expect == XOPERATOR || PL_expect == XTERMORDORDOR))
@@ -4373,11 +4366,6 @@ Perl_yylex(pTHX)
if (len == 6 && strnEQ(SvPVX(sv), "unique", len)) {
sv_free(sv);
if (PL_in_my == KEY_our) {
-#ifdef USE_ITHREADS
- GvUNIQUE_on(cGVOPx_gv(pl_yylval.opval));
-#else
- /* skip to avoid loading attributes.pm */
-#endif
deprecate(":unique");
}
else
@@ -4392,7 +4380,7 @@ Perl_yylex(pTHX)
}
else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "locked", len)) {
sv_free(sv);
- CvLOCKED_on(PL_compcv);
+ deprecate(":locked");
}
else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "method", len)) {
sv_free(sv);
diff --git a/uconfig.sh b/uconfig.sh
index b3e7278f04..f4cefcbcab 100755
--- a/uconfig.sh
+++ b/uconfig.sh
@@ -149,6 +149,7 @@ d_ftime='undef'
d_futimes='undef'
d_gdbm_ndbm_h_uses_prototypes='undef'
d_gdbmndbm_h_uses_prototypes='undef'
+d_getaddrinfo='undef'
d_getcwd='undef'
d_getespwnam='undef'
d_getfsstat='undef'
@@ -170,6 +171,7 @@ d_getlogin_r='undef'
d_getlogin='undef'
d_getmntent='undef'
d_getmnt='undef'
+d_getnameinfo='undef'
d_getnbyaddr='undef'
d_getnbyname='undef'
d_getnent='undef'
@@ -216,6 +218,8 @@ d_ilogbl='undef'
d_inc_version_list='undef'
d_index='undef'
d_inetaton='undef'
+d_inetntop='undef'
+d_inetpton='undef'
d_int64_t='undef'
d_isascii='undef'
d_isfinite='undef'
diff --git a/universal.c b/universal.c
index d333d2342c..1a76cfd884 100644
--- a/universal.c
+++ b/universal.c
@@ -233,11 +233,9 @@ XS(XS_Internals_SvREADONLY);
XS(XS_Internals_SvREFCNT);
XS(XS_Internals_hv_clear_placehold);
XS(XS_PerlIO_get_layers);
-XS(XS_Regexp_DESTROY);
XS(XS_Internals_hash_seed);
XS(XS_Internals_rehash_seed);
XS(XS_Internals_HvREHASH);
-XS(XS_Internals_inc_sub_generation);
XS(XS_re_is_regexp);
XS(XS_re_regname);
XS(XS_re_regnames);
@@ -298,7 +296,9 @@ Perl_boot_core_UNIVERSAL(pTHX)
XS_Internals_hv_clear_placehold, file, "\\%");
newXSproto("PerlIO::get_layers",
XS_PerlIO_get_layers, file, "*;@");
- newXS("Regexp::DESTROY", XS_Regexp_DESTROY, file);
+ /* Providing a Regexp::DESTROY fixes #21347. See test in t/op/ref.t */
+ CvFILE(newCONSTSUB(get_hv("Regexp::", GV_ADD), "DESTROY", NULL))
+ = (char *)file;
newXSproto("Internals::hash_seed",XS_Internals_hash_seed, file, "");
newXSproto("Internals::rehash_seed",XS_Internals_rehash_seed, file, "");
newXSproto("Internals::HvREHASH", XS_Internals_HvREHASH, file, "\\%");
@@ -927,12 +927,6 @@ XS(XS_Internals_hv_clear_placehold)
}
}
-XS(XS_Regexp_DESTROY)
-{
- PERL_UNUSED_CONTEXT;
- PERL_UNUSED_ARG(cv);
-}
-
XS(XS_PerlIO_get_layers)
{
dVAR;
@@ -1025,7 +1019,7 @@ XS(XS_PerlIO_get_layers)
(SvUTF8(*argsvp) ? SVf_UTF8 : 0)
| SVs_TEMP)
: &PL_sv_undef);
- XPUSHs(namok
+ XPUSHs(flgok
? sv_2mortal(SvREFCNT_inc_simple_NN(*flgsvp))
: &PL_sv_undef);
nitem += 3;
diff --git a/util.c b/util.c
index b170b2afb2..782ffde51d 100644
--- a/util.c
+++ b/util.c
@@ -2255,7 +2255,7 @@ Perl_my_swabn(void *ptr, int n)
PerlIO *
Perl_my_popen_list(pTHX_ const char *mode, int n, SV **args)
{
-#if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(OS2) && !defined(VMS) && !defined(__OPEN_VM) && !defined(EPOC) && !defined(MACOS_TRADITIONAL) && !defined(NETWARE) && !defined(__LIBCATAMOUNT__)
+#if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(OS2) && !defined(VMS) && !defined(__OPEN_VM) && !defined(EPOC) && !defined(NETWARE) && !defined(__LIBCATAMOUNT__)
dVAR;
int p[2];
register I32 This, that;
@@ -2395,7 +2395,7 @@ Perl_my_popen_list(pTHX_ const char *mode, int n, SV **args)
}
/* VMS' my_popen() is in VMS.c, same with OS/2. */
-#if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(__OPEN_VM) && !defined(EPOC) && !defined(MACOS_TRADITIONAL) && !defined(__LIBCATAMOUNT__)
+#if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(__OPEN_VM) && !defined(EPOC) && !defined(__LIBCATAMOUNT__)
PerlIO *
Perl_my_popen(pTHX_ const char *cmd, const char *mode)
{
@@ -2700,11 +2700,6 @@ dup2(int oldfd, int newfd)
#ifndef PERL_MICRO
#ifdef HAS_SIGACTION
-#ifdef MACOS_TRADITIONAL
-/* We don't want restart behavior on MacOS */
-#undef SA_RESTART
-#endif
-
Sighandler_t
Perl_rsignal(pTHX_ int signo, Sighandler_t handler)
{
@@ -2855,7 +2850,7 @@ Perl_rsignal_restore(pTHX_ int signo, Sigsave_t *save)
#endif /* !PERL_MICRO */
/* VMS' my_pclose() is in VMS.c; same with OS/2 */
-#if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(__OPEN_VM) && !defined(EPOC) && !defined(MACOS_TRADITIONAL) && !defined(__LIBCATAMOUNT__)
+#if (!defined(DOSISH) || defined(HAS_FORK) || defined(AMIGAOS)) && !defined(VMS) && !defined(__OPEN_VM) && !defined(EPOC) && !defined(__LIBCATAMOUNT__)
I32
Perl_my_pclose(pTHX_ PerlIO *ptr)
{
@@ -2913,7 +2908,7 @@ Perl_my_pclose(pTHX_ PerlIO *ptr)
#endif
#endif /* !DOSISH */
-#if (!defined(DOSISH) || defined(OS2) || defined(WIN32) || defined(NETWARE)) && !defined(MACOS_TRADITIONAL) && !defined(__LIBCATAMOUNT__)
+#if (!defined(DOSISH) || defined(OS2) || defined(WIN32) || defined(NETWARE)) && !defined(__LIBCATAMOUNT__)
I32
Perl_wait4pid(pTHX_ Pid_t pid, int *statusp, int flags)
{
@@ -3231,26 +3226,16 @@ Perl_find_script(pTHX_ const char *scriptname, bool dosearch,
}
#endif
-#ifdef MACOS_TRADITIONAL
- if (dosearch && !strchr(scriptname, ':') &&
- (s = PerlEnv_getenv("Commands")))
-#else
if (dosearch && !strchr(scriptname, '/')
#ifdef DOSISH
&& !strchr(scriptname, '\\')
#endif
&& (s = PerlEnv_getenv("PATH")))
-#endif
{
bool seen_dot = 0;
bufend = s + strlen(s);
while (s < bufend) {
-#ifdef MACOS_TRADITIONAL
- s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf, s, bufend,
- ',',
- &len);
-#else
#if defined(atarist) || defined(DOSISH)
for (len = 0; *s
# ifdef atarist
@@ -3267,15 +3252,10 @@ Perl_find_script(pTHX_ const char *scriptname, bool dosearch,
':',
&len);
#endif /* ! (atarist || DOSISH) */
-#endif /* MACOS_TRADITIONAL */
if (s < bufend)
s++;
if (len + 1 + strlen(scriptname) + MAX_EXT_LEN >= sizeof tmpbuf)
continue; /* don't search dir with too-long name */
-#ifdef MACOS_TRADITIONAL
- if (len && tmpbuf[len - 1] != ':')
- tmpbuf[len++] = ':';
-#else
if (len
# if defined(atarist) || defined(__MINT__) || defined(DOSISH)
&& tmpbuf[len - 1] != '/'
@@ -3285,7 +3265,6 @@ Perl_find_script(pTHX_ const char *scriptname, bool dosearch,
tmpbuf[len++] = '/';
if (len == 2 && tmpbuf[0] == '.')
seen_dot = 1;
-#endif
(void)my_strlcpy(tmpbuf + len, scriptname, sizeof(tmpbuf) - len);
#endif /* !VMS */
@@ -3310,7 +3289,7 @@ Perl_find_script(pTHX_ const char *scriptname, bool dosearch,
continue;
if (S_ISREG(PL_statbuf.st_mode)
&& cando(S_IRUSR,TRUE,&PL_statbuf)
-#if !defined(DOSISH) && !defined(MACOS_TRADITIONAL)
+#if !defined(DOSISH)
&& cando(S_IXUSR,TRUE,&PL_statbuf)
#endif
)
diff --git a/util.h b/util.h
index db91c18ee8..6eab055686 100644
--- a/util.h
+++ b/util.h
@@ -32,11 +32,7 @@
(*(f) == '/' \
|| ((f)[0] && (f)[1] == ':')) /* drive name */
# else /* NEITHER DOSISH NOR EPOCISH NOR SYMBIANISH */
-# ifdef MACOS_TRADITIONAL
-# define PERL_FILE_IS_ABSOLUTE(f) (strchr(f, ':') && *(f) != ':')
-# else /* !MACOS_TRADITIONAL */
-# define PERL_FILE_IS_ABSOLUTE(f) (*(f) == '/')
-# endif /* MACOS_TRADITIONAL */
+# define PERL_FILE_IS_ABSOLUTE(f) (*(f) == '/')
# endif /* DOSISH */
# endif /* NETWARE */
# endif /* WIN32 */
diff --git a/utils/h2ph.PL b/utils/h2ph.PL
index a3ff285ec0..cd4b5a0b2c 100644
--- a/utils/h2ph.PL
+++ b/utils/h2ph.PL
@@ -123,7 +123,7 @@ while (defined (my $file = next_file())) {
print OUT
"require '_h2ph_pre.ph';\n\n",
- "no warnings 'redefine';\n\n";
+ "no warnings qw(redefine misc);\n\n";
while (defined (local $_ = next_line($file))) {
if (s/^\s*\#\s*//) {
@@ -743,7 +743,7 @@ sub queue_includes_from
# Determine include directories; $Config{usrinc} should be enough for (all
-# non-GCC?) C compilers, but gcc uses an additional include directory.
+# non-GCC?) C compilers, but gcc uses additional include directories.
sub inc_dirs
{
my $from_gcc = `LC_ALL=C $Config{cc} -v 2>&1`;
@@ -755,7 +755,7 @@ sub inc_dirs
$from_gcc = '';
};
};
- length($from_gcc) ? ($from_gcc, $Config{usrinc}) : ($Config{usrinc});
+ length($from_gcc) ? ($from_gcc, $from_gcc . "-fixed", $Config{usrinc}) : ($Config{usrinc});
}
@@ -809,6 +809,7 @@ sub build_preamble_if_necessary
quotemeta($define{$_}), "\" } }\n\n";
}
}
+ print PREAMBLE "\n1;\n"; # avoid 'did not return a true value' when empty
close PREAMBLE or die "Cannot close $preamble: $!";
}
diff --git a/utils/h2xs.PL b/utils/h2xs.PL
index 4bb7897838..125dbf4dc7 100644
--- a/utils/h2xs.PL
+++ b/utils/h2xs.PL
@@ -913,7 +913,7 @@ if( @path_h ){
my ($key, $declared_val) = $item =~ /(\w+)\s*(?:=\s*(.*))?/;
$val = defined($declared_val) && length($declared_val) ? $declared_val : 1 + $val;
$seen_define{$key} = $val;
- $const_names{$key}++;
+ $const_names{$key} = { name => $key, macro => 1 };
}
} # while (...)
} # if (!defined $opt_e or $opt_e)
@@ -1077,7 +1077,14 @@ if( ! $opt_X ){ # use XS, unless it was disabled
}
}
}
-my @const_names = sort keys %const_names;
+my (@const_specs, @const_names);
+
+for (sort(keys(%const_names))) {
+ my $v = $const_names{$_};
+
+ push(@const_specs, ref($v) ? $v : $_);
+ push(@const_names, $_);
+}
-d $modpmdir || mkpath([$modpmdir], 0, 0775);
open(PM, ">$modpmname") || die "Can't create $ext$modpname/$modpmname: $!\n";
@@ -1466,7 +1473,7 @@ if( ! $opt_c ) {
XS_FILE => $xsfallback,
DEFAULT_TYPE => $opt_t,
NAME => $module,
- NAMES => \@const_names,
+ NAMES => \@const_specs,
);
print XS "#include \"$constscfname\"\n";
}
@@ -1951,7 +1958,7 @@ if (!$opt_c) {
XS_FILE => $constsxsfname,
DEFAULT_TYPE => $opt_t,
NAME => $module,
- NAMES => \@const_names,
+ NAMES => \@const_specs,
);
print PL <<"END";
if (eval {require ExtUtils::Constant; 1}) {
diff --git a/utils/perlbug.PL b/utils/perlbug.PL
index 97cf0c85d7..78c3b428a1 100644
--- a/utils/perlbug.PL
+++ b/utils/perlbug.PL
@@ -604,6 +604,12 @@ for $entry on http://rt.cpan.org, and report your issue there.
EOF
$entry = '';
+ } elsif (my $bug_tracker = $Module::CoreList::bug_tracker{$entry}) {
+ paraprint <<"EOF";
+$entry included with core Perl is copied directly from the CPAN distribution.
+Please report bugs in $entry directly to its maintainers using $bug_tracker
+EOF
+ $entry = '';
} elsif ($entry) {
$category ||= 'library';
$report_about_module = $entry;
diff --git a/vms/descrip_mms.template b/vms/descrip_mms.template
index d811c44863..0e4bde6542 100644
--- a/vms/descrip_mms.template
+++ b/vms/descrip_mms.template
@@ -249,6 +249,14 @@ XSUBPP = $(MINIPERL) "-I[.ext.re]" [.lib.extutils]xsubpp -noprototypes
# in the distribution, so it's OK if this doesn't work; it's here to make
# life easier for those who modify Perl and rebuild it.
INSTPERL = perl
+# Macros to invoke a copy of perl during the build. Targets which
+# are built using these macros should depend on $(PERL_EXE) EXT
+.IFDEF __DEBUG__
+PERL_EXE = Sys$Disk:[]n$(DBG)perl$(E)
+.ELSE
+PERL_EXE = Sys$Disk:[]perl$(E)
+.ENDIF
+PERL = MCR $(PERL_EXE) "-I[.lib]"
# Space-separated list of "static" extensions to build into perlshr (case counts).
MYEXT = DynaLoader
@@ -281,14 +289,14 @@ FULLLIBS2 = $(LIBS2)|$(THRLIBS1)|$(THRLIBS2)
c0 = $(MALLOC_C) $(SOCKC) av.c deb.c doio.c doop.c dump.c globals.c gv.c hv.c mro.c
c1 = mg.c locale.c mathoms.c miniperlmain.c numeric.c op.c pad.c perl.c perlapi.c perlio.c
c2 = perly.c pp.c pp_ctl.c pp_hot.c pp_pack.c pp_sort.c pp_sys.c regcomp.c regexec.c reentr.c
-c3 = run.c scope.c sv.c taint.c toke.c universal.c utf8.c util.c vms.c xsutils.c
+c3 = run.c scope.c sv.c taint.c toke.c universal.c utf8.c util.c vms.c
c = $(c0) $(c1) $(c2) $(c3)
obj0 = perl$(O)
obj1 = $(MALLOC_O) $(SOCKO) av$(O) deb$(O) doio$(O) doop$(O) dump$(O) mro$(O) globals$(O) gv$(O) hv$(O)
obj2 = locale$(O) mathoms$(O) mg$(O) miniperlmain$(O) numeric$(O) op$(O) pad$(O) perlapi$(O) perlio$(O)
obj3 = perly$(O) pp$(O) pp_ctl$(O) pp_hot$(O) reentr$(O) pp_pack$(O) pp_sort$(O) pp_sys$(O) regcomp$(O)
-obj4 = regexec$(O) run$(O) scope$(O) sv$(O) taint$(O) toke$(O) universal$(O) utf8$(O) util$(O) vms$(O) xsutils$(O)
+obj4 = regexec$(O) run$(O) scope$(O) sv$(O) taint$(O) toke$(O) universal$(O) utf8$(O) util$(O) vms$(O)
mini_obj = perlmini$(O) $(obj1) $(obj2) $(obj3) $(obj4)
obj = $(obj0) $(obj1) $(obj2) $(obj3) $(obj4)
@@ -361,13 +369,13 @@ utils4 = [.utils]enc2xs.com [.utils]piconv.com [.utils]cpan.com [.utils]prove.co
utils5 = [.utils]corelist.com [.utils]config_data.com [.utils]cpanp.com [.utils]cpan2dist.com [.utils]cpanp-run-perl.com
.ifdef NOX2P
-all : base extras archcorefiles preplibrary perlpods
+all : base extras archcorefiles preplibrary [.pod]perltoc.pod
@ QUALIFIERS := $(MMSQUALIFIERS)
@ QUALIFIERS = QUALIFIERS - """" - """"
@ write sys$output " "
@ write sys$output " Everything is up to date. '$(MMS)''QUALIFIERS' test' to run test suite."
.else
-all : base extras x2p archcorefiles preplibrary perlpods
+all : base extras x2p archcorefiles preplibrary [.pod]perltoc.pod
@ QUALIFIERS := $(MMSQUALIFIERS)
@ QUALIFIERS = QUALIFIERS - """" - """"
@ write sys$output " "
@@ -412,15 +420,15 @@ pod16 = [.lib.pods]perllinux.pod [.lib.pods]perllocale.pod [.lib.pods]perllol.po
pod17 = [.lib.pods]perlmacosx.pod [.lib.pods]perlmint.pod [.lib.pods]perlmod.pod [.lib.pods]perlmodinstall.pod [.lib.pods]perlmodlib.pod
pod18 = [.lib.pods]perlmodstyle.pod [.lib.pods]perlmpeix.pod [.lib.pods]perlnetware.pod [.lib.pods]perlnewmod.pod [.lib.pods]perlnumber.pod
pod19 = [.lib.pods]perlobj.pod [.lib.pods]perlop.pod [.lib.pods]perlopenbsd.pod [.lib.pods]perlopentut.pod [.lib.pods]perlos2.pod [.lib.pods]perlos390.pod
-pod20 = [.lib.pods]perlos400.pod [.lib.pods]perlothrtut.pod [.lib.pods]perlpacktut.pod [.lib.pods]perlperf.pod [.lib.pods]perlplan9.pod
-pod21 = [.lib.pods]perlpod.pod [.lib.pods]perlpodspec.pod [.lib.pods]perlport.pod [.lib.pods]perlpragma.pod [.lib.pods]perlqnx.pod [.lib.pods]perlre.pod
-pod22 = [.lib.pods]perlreapi.pod [.lib.pods]perlrebackslash.pod [.lib.pods]perlrecharclass.pod [.lib.pods]perlref.pod [.lib.pods]perlreftut.pod
-pod23 = [.lib.pods]perlreguts.pod [.lib.pods]perlrepository.pod [.lib.pods]perlrequick.pod [.lib.pods]perlreref.pod [.lib.pods]perlretut.pod
-pod24 = [.lib.pods]perlriscos.pod [.lib.pods]perlrun.pod [.lib.pods]perlsec.pod [.lib.pods]perlsolaris.pod [.lib.pods]perlstyle.pod [.lib.pods]perlsub.pod
-pod25 = [.lib.pods]perlsymbian.pod [.lib.pods]perlsyn.pod [.lib.pods]perlthrtut.pod [.lib.pods]perltie.pod [.lib.pods]perltoc.pod [.lib.pods]perltodo.pod
-pod26 = [.lib.pods]perltooc.pod [.lib.pods]perltoot.pod [.lib.pods]perltrap.pod [.lib.pods]perltru64.pod [.lib.pods]perltw.pod [.lib.pods]perlunicode.pod
-pod27 = [.lib.pods]perlunifaq.pod [.lib.pods]perluniintro.pod [.lib.pods]perlunitut.pod [.lib.pods]perlutil.pod [.lib.pods]perluts.pod [.lib.pods]perlvar.pod
-pod28 = [.lib.pods]perlvmesa.pod [.lib.pods]perlvms.pod [.lib.pods]perlvos.pod [.lib.pods]perlwin32.pod [.lib.pods]perlxs.pod [.lib.pods]perlxstut.pod
+pod20 = [.lib.pods]perlos400.pod [.lib.pods]perlpacktut.pod [.lib.pods]perlperf.pod [.lib.pods]perlplan9.pod [.lib.pods]perlpod.pod
+pod21 = [.lib.pods]perlpodspec.pod [.lib.pods]perlport.pod [.lib.pods]perlpragma.pod [.lib.pods]perlqnx.pod [.lib.pods]perlre.pod [.lib.pods]perlreapi.pod
+pod22 = [.lib.pods]perlrebackslash.pod [.lib.pods]perlrecharclass.pod [.lib.pods]perlref.pod [.lib.pods]perlreftut.pod [.lib.pods]perlreguts.pod
+pod23 = [.lib.pods]perlrepository.pod [.lib.pods]perlrequick.pod [.lib.pods]perlreref.pod [.lib.pods]perlretut.pod [.lib.pods]perlriscos.pod
+pod24 = [.lib.pods]perlrun.pod [.lib.pods]perlsec.pod [.lib.pods]perlsolaris.pod [.lib.pods]perlstyle.pod [.lib.pods]perlsub.pod [.lib.pods]perlsymbian.pod
+pod25 = [.lib.pods]perlsyn.pod [.lib.pods]perlthrtut.pod [.lib.pods]perltie.pod [.lib.pods]perltoc.pod [.lib.pods]perltodo.pod [.lib.pods]perltooc.pod
+pod26 = [.lib.pods]perltoot.pod [.lib.pods]perltrap.pod [.lib.pods]perltru64.pod [.lib.pods]perltw.pod [.lib.pods]perlunicode.pod [.lib.pods]perlunifaq.pod
+pod27 = [.lib.pods]perluniintro.pod [.lib.pods]perlunitut.pod [.lib.pods]perlutil.pod [.lib.pods]perluts.pod [.lib.pods]perlvar.pod [.lib.pods]perlvmesa.pod
+pod28 = [.lib.pods]perlvms.pod [.lib.pods]perlvos.pod [.lib.pods]perlwin32.pod [.lib.pods]perlxs.pod [.lib.pods]perlxstut.pod
pod = $(pod0) $(pod1) $(pod2) $(pod3) $(pod4) $(pod5) $(pod6) $(pod7) $(pod8) $(pod9) $(pod10) $(pod11) $(pod12) $(pod13) $(pod14) $(pod15) $(pod16) $(pod17) $(pod18) $(pod19) $(pod20) $(pod21) $(pod22) $(pod23) $(pod24) $(pod25) $(pod26) $(pod27) $(pod28)
# Would be useful to automate the generation of this rule from pod/buildtoc
@@ -428,8 +436,15 @@ pod = $(pod0) $(pod1) $(pod2) $(pod3) $(pod4) $(pod5) $(pod6) $(pod7) $(pod8) $(
[.pod]perldelta.pod : [.pod]perl5100delta.pod
Copy/NoConfirm/Log $(MMS$SOURCE) $(MMS$TARGET)
-perlpods : $(pod)
- @ $(NOOP)
+[.pod]perlapi.pod : embed.fnc autodoc.pl $(MINIPERL_EXE)
+ $(MINIPERL) autodoc.pl
+
+[.pod]perlintern.pod : embed.fnc autodoc.pl $(MINIPERL_EXE)
+ $(MINIPERL) autodoc.pl
+
+[.pod]perltoc.pod : [.pod]perldelta.pod [.pod]perlapi.pod [.pod]perlintern.pod extra.pods $(PERL_EXE)
+ @ define/user_mode $(DBG)PERLSHR SYS$DISK:[]$(DBG)perlshr$(E)
+ $(PERL) [.pod]buildtoc "-q" "--build-toc"
archcorefiles : $(ac) $(ARCHAUTO)time.stamp
@ $(NOOP)
@@ -1180,10 +1195,6 @@ makeppport : $(MINIPERL_EXE) $(ARCHDIR)Config.pm
@ If F$Search("[.lib]pods.dir").eqs."" Then Create/Directory [.lib.pods]
Copy/NoConfirm/Log $(MMS$SOURCE) [.lib.pods]
-[.lib.pods]perlothrtut.pod : [.pod]perlothrtut.pod
- @ If F$Search("[.lib]pods.dir").eqs."" Then Create/Directory [.lib.pods]
- Copy/NoConfirm/Log $(MMS$SOURCE) [.lib.pods]
-
[.lib.pods]perlpacktut.pod : [.pod]perlpacktut.pod
@ If F$Search("[.lib]pods.dir").eqs."" Then Create/Directory [.lib.pods]
Copy/NoConfirm/Log $(MMS$SOURCE) [.lib.pods]
@@ -1360,7 +1371,7 @@ makeppport : $(MINIPERL_EXE) $(ARCHDIR)Config.pm
@ If F$Search("[.lib]pods.dir").eqs."" Then Create/Directory [.lib.pods]
Copy/NoConfirm/Log $(MMS$SOURCE) [.lib.pods]
-[.lib.pods]perlvms.pod : [.vms]perlvms.pod
+[.lib.pods]perlvms.pod : [.pod]perlvms.pod
@ If F$Search("[.lib]pods.dir").eqs."" Then Create/Directory [.lib.pods]
Copy/NoConfirm/Log $(MMS$SOURCE) [.lib.pods]
@@ -1380,7 +1391,7 @@ makeppport : $(MINIPERL_EXE) $(ARCHDIR)Config.pm
@ If F$Search("[.lib]pods.dir").eqs."" Then Create/Directory [.lib.pods]
Copy/NoConfirm/Log $(MMS$SOURCE) [.lib.pods]
-install.html : $(perlpods)
+install.html : [.pod]perltoc.pod
@ @perl_setup.com
@ If F$Search("perl_root:[lib]html.dir").eqs."" Then Create/Directory perl_root:[lib.html]
$(MINIPERL) installhtml. "--podroot=. --recurse --htmldir=/perl_root/lib/html --htmlroot=.. --verbose"
@@ -1747,8 +1758,6 @@ util$(O) : util.c $(h)
$(CC) $(CORECFLAGS) $(MMS$SOURCE)
vms$(O) : vms.c $(h)
$(CC) $(CORECFLAGS) $(MMS$SOURCE)
-xsutils$(O) : xsutils.c $(h)
- $(CC) $(CORECFLAGS) $(MMS$SOURCE)
[.x2p]hash$(O) : [.x2p]hash.c [.x2p]EXTERN.h [.x2p]a2p.h [.x2p]hash.h [.x2p]str.h [.x2p]util.h config.h handy.h vmsish.h $(SOCKH)
$(CC) $(X2PCFLAGS) $(MMS$SOURCE)
@@ -1855,7 +1864,10 @@ clean : tidy cleantest cleanup_unpacked_files
- If F$Search("[.vms.ext...]*.C").nes."" Then Delete/NoConfirm/Log [.vms.ext...]*.C;*
- If F$Search("[.vms.ext...]*$(O)").nes."" Then Delete/NoConfirm/Log [.vms.ext...]*$(O);*
- If F$Search("[.pod]*.com").nes."" Then Delete/NoConfirm/Log [.pod]*.com;*
+ - If F$Search("[.pod]perlapi.pod").nes."" Then Delete/NoConfirm/Log [.pod]perlapi.pod;*
- If F$Search("[.pod]perldelta.pod").nes."" Then Delete/NoConfirm/Log [.pod]perldelta.pod;*
+ - If F$Search("[.pod]perlintern.pod").nes."" Then Delete/NoConfirm/Log [.pod]perlintern.pod;*
+ - If F$Search("[.pod]perltoc.pod").nes."" Then Delete/NoConfirm/Log [.pod]perltoc.pod;*
- @extra_pods CLEAN
- If F$Search("unpushed.h").nes."" Then Delete/NoConfirm/Log unpushed.h;*
- If F$Search("[.lib]Config_git.pl").nes."" Then Delete/NoConfirm/Log [.lib]Config_git.pl;*
diff --git a/win32/Makefile b/win32/Makefile
index 0812437cd1..4ba35b769b 100644
--- a/win32/Makefile
+++ b/win32/Makefile
@@ -688,8 +688,7 @@ MICROCORE_SRC = \
..\toke.c \
..\universal.c \
..\utf8.c \
- ..\util.c \
- ..\xsutils.c
+ ..\util.c
EXTRACORE_SRC = $(EXTRACORE_SRC) perllib.c
@@ -1091,7 +1090,6 @@ utils: $(PERLEXE) $(X2P)
cd ..\utils
$(MAKE) PERL=$(MINIPERL)
cd ..\pod
- copy ..\vms\perlvms.pod .\perlvms.pod
copy ..\README.aix ..\pod\perlaix.pod
copy ..\README.amiga ..\pod\perlamiga.pod
copy ..\README.apollo ..\pod\perlapollo.pod
@@ -1130,7 +1128,6 @@ utils: $(PERLEXE) $(X2P)
copy ..\README.tw ..\pod\perltw.pod
copy ..\README.uts ..\pod\perluts.pod
copy ..\README.vmesa ..\pod\perlvmesa.pod
- copy ..\README.vms ..\pod\perlvms.pod
copy ..\README.vos ..\pod\perlvos.pod
copy ..\README.win32 ..\pod\perlwin32.pod
copy ..\pod\perl5110delta.pod ..\pod\perldelta.pod
@@ -1139,6 +1136,8 @@ utils: $(PERLEXE) $(X2P)
$(PERLEXE) lib_pm.PL
cd ..\win32
$(PERLEXE) $(PL2BAT) $(UTILS)
+ $(PERLEXE) ..\autodoc.pl ..
+ $(PERLEXE) ..\pod\buildtoc --build-toc -q
# Note that the pod cleanup in this next section is parsed (and regenerated
# by pod/buildtoc so please check that script before making changes here
@@ -1154,7 +1153,7 @@ distclean: realclean
-del /f $(EXTDIR)\DynaLoader\XSLoader.pm
-del /f $(LIBDIR)\Encode.pm $(LIBDIR)\encoding.pm $(LIBDIR)\Errno.pm
-del /f $(LIBDIR)\Config.pod $(LIBDIR)\POSIX.pod $(LIBDIR)\threads.pm
- -del /f $(LIBDIR)\.exists $(LIBDIR)\attrs.pm $(LIBDIR)\DynaLoader.pm
+ -del /f $(LIBDIR)\.exists $(LIBDIR)\attributes.pm $(LIBDIR)\DynaLoader.pm
-del /f $(LIBDIR)\XSLoader.pm $(LIBDIR)\lib.pm
-del /f $(LIBDIR)\Fcntl.pm $(LIBDIR)\IO.pm $(LIBDIR)\Opcode.pm
-del /f $(LIBDIR)\ops.pm $(LIBDIR)\Safe.pm
@@ -1200,16 +1199,16 @@ distclean: realclean
-if exist $(LIBDIR)\XS rmdir /s /q $(LIBDIR)\XS
-if exist $(LIBDIR)\Win32API rmdir /s /q $(LIBDIR)\Win32API
-cd $(PODDIR) && del /f *.html *.bat podchecker \
- perlaix.pod perlamiga.pod perlapollo.pod perlbeos.pod \
- perlbs2000.pod perlce.pod perlcn.pod perlcygwin.pod \
- perldelta.pod perldgux.pod perldos.pod perlepoc.pod \
- perlfreebsd.pod perlhaiku.pod perlhpux.pod perlhurd.pod \
- perlirix.pod perljp.pod perlko.pod perllinux.pod \
- perlmachten.pod perlmacos.pod perlmacosx.pod perlmint.pod \
- perlmpeix.pod perlnetware.pod perlopenbsd.pod perlos2.pod \
- perlos390.pod perlos400.pod perlplan9.pod perlqnx.pod \
- perlriscos.pod perlsolaris.pod perlsymbian.pod perltru64.pod \
- perltw.pod perluts.pod perlvmesa.pod perlvms.pod perlvms.pod \
+ perlaix.pod perlamiga.pod perlapi.pod perlapollo.pod \
+ perlbeos.pod perlbs2000.pod perlce.pod perlcn.pod \
+ perlcygwin.pod perldelta.pod perldgux.pod perldos.pod \
+ perlepoc.pod perlfreebsd.pod perlhaiku.pod perlhpux.pod \
+ perlhurd.pod perlintern.pod perlirix.pod perljp.pod perlko.pod \
+ perllinux.pod perlmachten.pod perlmacos.pod perlmacosx.pod \
+ perlmint.pod perlmpeix.pod perlnetware.pod perlopenbsd.pod \
+ perlos2.pod perlos390.pod perlos400.pod perlplan9.pod \
+ perlqnx.pod perlriscos.pod perlsolaris.pod perlsymbian.pod \
+ perltoc.pod perltru64.pod perltw.pod perluts.pod perlvmesa.pod \
perlvos.pod perlwin32.pod \
pod2html pod2latex pod2man pod2text pod2usage \
podchecker podselect
diff --git a/win32/Makefile.ce b/win32/Makefile.ce
index 5ec747860d..7b5c2bcdab 100644
--- a/win32/Makefile.ce
+++ b/win32/Makefile.ce
@@ -593,8 +593,7 @@ MICROCORE_SRC = \
..\toke.c \
..\universal.c \
..\utf8.c \
- ..\util.c \
- ..\xsutils.c
+ ..\util.c
EXTRACORE_SRC = $(EXTRACORE_SRC) perllib.c
@@ -654,7 +653,7 @@ CORE_NOCFG_H = \
.\include\sys\socket.h \
.\win32.h
-DYNAMIC_EXT = Socket IO Fcntl Opcode SDBM_File POSIX attrs B re \
+DYNAMIC_EXT = Socket IO Fcntl Opcode SDBM_File POSIX attributes B re \
Data/Dumper Devel/Peek ByteLoader Devel/DProf File/Glob \
Sys/Hostname
@@ -822,7 +821,6 @@ $(DLLDIR)\win32thread.obj \
$(DLLDIR)\wince.obj \
$(DLLDIR)\win32io.obj \
$(DLLDIR)\wincesck.obj \
-$(DLLDIR)\xsutils.obj \
$(DLLDIR)\perllib.obj \
$(DLLDIR)\DynaLoader.obj
!IF "$(PERL_MALLOC)" == "define"
diff --git a/win32/config.bc b/win32/config.bc
index fe1652bc7f..6743f14de7 100644
--- a/win32/config.bc
+++ b/win32/config.bc
@@ -199,6 +199,7 @@ d_ftime='define'
d_futimes='undef'
d_gdbm_ndbm_h_uses_prototypes='undef'
d_gdbmndbm_h_uses_prototypes='undef'
+d_getaddrinfo='undef'
d_getcwd='define'
d_getespwnam='undef'
d_getfsstat='undef'
@@ -220,6 +221,7 @@ d_getlogin='define'
d_getlogin_r='undef'
d_getmnt='undef'
d_getmntent='undef'
+d_getnameinfo='undef'
d_getnbyaddr='undef'
d_getnbyname='undef'
d_getnent='undef'
@@ -265,6 +267,8 @@ d_ilogbl='undef'
d_inc_version_list='undef'
d_index='undef'
d_inetaton='undef'
+d_inetntop='undef'
+d_inetpton='undef'
d_int64_t='undef'
d_isascii='define'
d_isfinite='undef'
@@ -530,7 +534,7 @@ doublesize='8'
drand01='(rand()/(double)((unsigned)1<<RANDBITS))'
drand48_r_proto='0'
dtrace=''
-dynamic_ext='Socket IO Fcntl Opcode SDBM_File attrs'
+dynamic_ext='Socket IO Fcntl Opcode SDBM_File attributes'
eagain='EAGAIN'
ebcdic='undef'
echo='echo'
diff --git a/win32/config.ce b/win32/config.ce
index 70e9acd479..cee1175077 100644
--- a/win32/config.ce
+++ b/win32/config.ce
@@ -201,6 +201,7 @@ d_ftime='define'
d_futimes='undef'
d_gdbm_ndbm_h_uses_prototypes='undef'
d_gdbmndbm_h_uses_prototypes='undef'
+d_getaddrinfo='undef'
d_getcwd='define'
d_getespwnam='undef'
d_getfsstat='undef'
@@ -222,6 +223,7 @@ d_getlogin='define'
d_getlogin_r='undef'
d_getmntent='undef'
d_getmnt='undef'
+d_getnameinfo='undef'
d_getnbyaddr='undef'
d_getnbyname='undef'
d_getnent='undef'
@@ -268,6 +270,8 @@ d_ilogbl='undef'
d_inc_version_list='undef'
d_index='undef'
d_inetaton='undef'
+d_inetntop='undef'
+d_inetpton='undef'
d_int64_t='undef'
d_isascii='define'
d_isfinite='undef'
@@ -532,7 +536,7 @@ doublesize='8'
drand01='(rand()/(double)((unsigned)1<<RANDBITS))'
drand48_r_proto='0'
dtrace=''
-dynamic_ext='Socket IO Fcntl Opcode SDBM_File attrs'
+dynamic_ext='Socket IO Fcntl Opcode SDBM_File attributes'
eagain='EAGAIN'
ebcdic='undef'
echo='echo'
diff --git a/win32/config.gc b/win32/config.gc
index 8f0edfa9a6..018f17499f 100644
--- a/win32/config.gc
+++ b/win32/config.gc
@@ -199,6 +199,7 @@ d_ftime='define'
d_futimes='undef'
d_gdbm_ndbm_h_uses_prototypes='undef'
d_gdbmndbm_h_uses_prototypes='undef'
+d_getaddrinfo='undef'
d_getcwd='define'
d_getespwnam='undef'
d_getfsstat='undef'
@@ -220,6 +221,7 @@ d_getlogin='define'
d_getlogin_r='undef'
d_getmnt='undef'
d_getmntent='undef'
+d_getnameinfo='undef'
d_getnbyaddr='undef'
d_getnbyname='undef'
d_getnent='undef'
@@ -265,6 +267,8 @@ d_ilogbl='undef'
d_inc_version_list='undef'
d_index='undef'
d_inetaton='undef'
+d_inetntop='undef'
+d_inetpton='undef'
d_int64_t='undef'
d_isascii='define'
d_isfinite='undef'
@@ -530,7 +534,7 @@ doublesize='8'
drand01='(rand()/(double)((unsigned)1<<RANDBITS))'
drand48_r_proto='0'
dtrace=''
-dynamic_ext='Socket IO Fcntl Opcode SDBM_File attrs'
+dynamic_ext='Socket IO Fcntl Opcode SDBM_File attributes'
eagain='EAGAIN'
ebcdic='undef'
echo='echo'
diff --git a/win32/config.vc b/win32/config.vc
index f67690c1bf..e0c6354051 100644
--- a/win32/config.vc
+++ b/win32/config.vc
@@ -199,6 +199,7 @@ d_ftime='define'
d_futimes='undef'
d_gdbm_ndbm_h_uses_prototypes='undef'
d_gdbmndbm_h_uses_prototypes='undef'
+d_getaddrinfo='undef'
d_getcwd='define'
d_getespwnam='undef'
d_getfsstat='undef'
@@ -220,6 +221,7 @@ d_getlogin='define'
d_getlogin_r='undef'
d_getmnt='undef'
d_getmntent='undef'
+d_getnameinfo='undef'
d_getnbyaddr='undef'
d_getnbyname='undef'
d_getnent='undef'
@@ -265,6 +267,8 @@ d_ilogbl='undef'
d_inc_version_list='undef'
d_index='undef'
d_inetaton='undef'
+d_inetntop='undef'
+d_inetpton='undef'
d_int64_t='undef'
d_isascii='define'
d_isfinite='undef'
@@ -530,7 +534,7 @@ doublesize='8'
drand01='(rand()/(double)((unsigned)1<<RANDBITS))'
drand48_r_proto='0'
dtrace=''
-dynamic_ext='Socket IO Fcntl Opcode SDBM_File attrs'
+dynamic_ext='Socket IO Fcntl Opcode SDBM_File attributes'
eagain='EAGAIN'
ebcdic='undef'
echo='echo'
diff --git a/win32/config.vc64 b/win32/config.vc64
index d07e39dae6..44ab7f297c 100644
--- a/win32/config.vc64
+++ b/win32/config.vc64
@@ -199,6 +199,7 @@ d_ftime='define'
d_futimes='undef'
d_gdbm_ndbm_h_uses_prototypes='undef'
d_gdbmndbm_h_uses_prototypes='undef'
+d_getaddrinfo='undef'
d_getcwd='define'
d_getespwnam='undef'
d_getfsstat='undef'
@@ -220,6 +221,7 @@ d_getlogin='define'
d_getlogin_r='undef'
d_getmnt='undef'
d_getmntent='undef'
+d_getnameinfo='undef'
d_getnbyaddr='undef'
d_getnbyname='undef'
d_getnent='undef'
@@ -265,6 +267,8 @@ d_ilogbl='undef'
d_inc_version_list='undef'
d_index='undef'
d_inetaton='undef'
+d_inetntop='undef'
+d_inetpton='undef'
d_int64_t='undef'
d_isascii='define'
d_isfinite='undef'
@@ -530,7 +534,7 @@ doublesize='8'
drand01='(rand()/(double)((unsigned)1<<RANDBITS))'
drand48_r_proto='0'
dtrace=''
-dynamic_ext='Socket IO Fcntl Opcode SDBM_File attrs'
+dynamic_ext='Socket IO Fcntl Opcode SDBM_File attributes'
eagain='EAGAIN'
ebcdic='undef'
echo='echo'
diff --git a/win32/dl_win32.xs b/win32/dl_win32.xs
index 6c094d22fd..60ec703b92 100644
--- a/win32/dl_win32.xs
+++ b/win32/dl_win32.xs
@@ -187,4 +187,19 @@ dl_error()
OUTPUT:
RETVAL
+#if defined(USE_ITHREADS)
+
+void
+CLONE(...)
+ CODE:
+ MY_CXT_CLONE;
+
+ /* MY_CXT_CLONE just does a memcpy on the whole structure, so to avoid
+ * using Perl variables that belong to another thread, we create our
+ * own for this thread.
+ */
+ MY_CXT.x_dl_last_error = newSVpvn("", 0);
+
+#endif
+
# end.
diff --git a/win32/makefile.mk b/win32/makefile.mk
index 3b7b0b4a5d..a6ab156cd7 100644
--- a/win32/makefile.mk
+++ b/win32/makefile.mk
@@ -846,8 +846,7 @@ MICROCORE_SRC = \
..\toke.c \
..\universal.c \
..\utf8.c \
- ..\util.c \
- ..\xsutils.c
+ ..\util.c
EXTRACORE_SRC += perllib.c
@@ -1415,7 +1414,6 @@ doc: $(PERLEXE)
# so please check that script before making structural changes here
utils: $(PERLEXE) $(X2P)
cd ..\utils && $(MAKE) PERL=$(MINIPERL)
- copy ..\vms\perlvms.pod ..\pod\perlvms.pod
copy ..\README.aix ..\pod\perlaix.pod
copy ..\README.amiga ..\pod\perlamiga.pod
copy ..\README.apollo ..\pod\perlapollo.pod
@@ -1454,13 +1452,14 @@ utils: $(PERLEXE) $(X2P)
copy ..\README.tw ..\pod\perltw.pod
copy ..\README.uts ..\pod\perluts.pod
copy ..\README.vmesa ..\pod\perlvmesa.pod
- copy ..\README.vms ..\pod\perlvms.pod
copy ..\README.vos ..\pod\perlvos.pod
copy ..\README.win32 ..\pod\perlwin32.pod
copy ..\pod\perl5110delta.pod ..\pod\perldelta.pod
cd ..\pod && $(MAKE) -f ..\win32\pod.mak converters
cd ..\lib && $(PERLEXE) lib_pm.PL
$(PERLEXE) $(PL2BAT) $(UTILS)
+ $(PERLEXE) ..\autodoc.pl ..
+ $(PERLEXE) ..\pod\buildtoc --build-toc -q
# Note that the pod cleanup in this next section is parsed (and regenerated
# by pod/buildtoc so please check that script before making changes here
@@ -1476,7 +1475,7 @@ distclean: realclean
-del /f $(EXTDIR)\DynaLoader\XSLoader.pm
-del /f $(LIBDIR)\Encode.pm $(LIBDIR)\encoding.pm $(LIBDIR)\Errno.pm
-del /f $(LIBDIR)\Config.pod $(LIBDIR)\POSIX.pod $(LIBDIR)\threads.pm
- -del /f $(LIBDIR)\.exists $(LIBDIR)\attrs.pm $(LIBDIR)\DynaLoader.pm
+ -del /f $(LIBDIR)\.exists $(LIBDIR)\attributes.pm $(LIBDIR)\DynaLoader.pm
-del /f $(LIBDIR)\XSLoader.pm $(LIBDIR)\lib.pm
-del /f $(LIBDIR)\Fcntl.pm $(LIBDIR)\IO.pm $(LIBDIR)\Opcode.pm
-del /f $(LIBDIR)\ops.pm $(LIBDIR)\Safe.pm
@@ -1522,16 +1521,16 @@ distclean: realclean
-if exist $(LIBDIR)\XS rmdir /s /q $(LIBDIR)\XS
-if exist $(LIBDIR)\Win32API rmdir /s /q $(LIBDIR)\Win32API
-cd $(PODDIR) && del /f *.html *.bat podchecker \
- perlaix.pod perlamiga.pod perlapollo.pod perlbeos.pod \
- perlbs2000.pod perlce.pod perlcn.pod perlcygwin.pod \
- perldelta.pod perldgux.pod perldos.pod perlepoc.pod \
- perlfreebsd.pod perlhaiku.pod perlhpux.pod perlhurd.pod \
- perlirix.pod perljp.pod perlko.pod perllinux.pod \
- perlmachten.pod perlmacos.pod perlmacosx.pod perlmint.pod \
- perlmpeix.pod perlnetware.pod perlopenbsd.pod perlos2.pod \
- perlos390.pod perlos400.pod perlplan9.pod perlqnx.pod \
- perlriscos.pod perlsolaris.pod perlsymbian.pod perltru64.pod \
- perltw.pod perluts.pod perlvmesa.pod perlvms.pod perlvms.pod \
+ perlaix.pod perlamiga.pod perlapi.pod perlapollo.pod \
+ perlbeos.pod perlbs2000.pod perlce.pod perlcn.pod \
+ perlcygwin.pod perldelta.pod perldgux.pod perldos.pod \
+ perlepoc.pod perlfreebsd.pod perlhaiku.pod perlhpux.pod \
+ perlhurd.pod perlintern.pod perlirix.pod perljp.pod perlko.pod \
+ perllinux.pod perlmachten.pod perlmacos.pod perlmacosx.pod \
+ perlmint.pod perlmpeix.pod perlnetware.pod perlopenbsd.pod \
+ perlos2.pod perlos390.pod perlos400.pod perlplan9.pod \
+ perlqnx.pod perlriscos.pod perlsolaris.pod perlsymbian.pod \
+ perltoc.pod perltru64.pod perltw.pod perluts.pod perlvmesa.pod \
perlvos.pod perlwin32.pod \
pod2html pod2latex pod2man pod2text pod2usage \
podselect
diff --git a/win32/pod.mak b/win32/pod.mak
index 6f709f0370..835b7116aa 100644
--- a/win32/pod.mak
+++ b/win32/pod.mak
@@ -98,7 +98,6 @@ POD = \
perlobj.pod \
perlop.pod \
perlopentut.pod \
- perlothrtut.pod \
perlpacktut.pod \
perlperf.pod \
perlpod.pod \
@@ -134,6 +133,7 @@ POD = \
perlunitut.pod \
perlutil.pod \
perlvar.pod \
+ perlvms.pod \
perlxs.pod \
perlxstut.pod
@@ -221,7 +221,6 @@ MAN = \
perlobj.man \
perlop.man \
perlopentut.man \
- perlothrtut.man \
perlpacktut.man \
perlperf.man \
perlpod.man \
@@ -257,6 +256,7 @@ MAN = \
perlunitut.man \
perlutil.man \
perlvar.man \
+ perlvms.man \
perlxs.man \
perlxstut.man
@@ -344,7 +344,6 @@ HTML = \
perlobj.html \
perlop.html \
perlopentut.html \
- perlothrtut.html \
perlpacktut.html \
perlperf.html \
perlpod.html \
@@ -379,6 +378,7 @@ HTML = \
perlunitut.html \
perlutil.html \
perlvar.html \
+ perlvms.html \
perlxs.html \
perlxstut.html
# not perltoc.html
@@ -467,7 +467,6 @@ TEX = \
perlobj.tex \
perlop.tex \
perlopentut.tex \
- perlothrtut.tex \
perlpacktut.tex \
perlperf.tex \
perlpod.tex \
@@ -503,6 +502,7 @@ TEX = \
perlunitut.tex \
perlutil.tex \
perlvar.tex \
+ perlvms.tex \
perlxs.tex \
perlxstut.tex
diff --git a/win32/win32.c b/win32/win32.c
index 2e66fc0a57..cef828b998 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -1765,9 +1765,11 @@ win32_putenv(const char *name)
* Has these advantages over putenv() & co.:
* * enables us to store a truly empty value in the
* environment (like in UNIX).
- * * we don't have to deal with RTL globals, bugs and leaks.
+ * * we don't have to deal with RTL globals, bugs and leaks
+ * (specifically, see http://support.microsoft.com/kb/235601).
* * Much faster.
- * Why you may want to enable USE_WIN32_RTL_ENV:
+ * Why you may want to use the RTL environment handling
+ * (previously enabled by USE_WIN32_RTL_ENV):
* * environ[] and RTL functions will not reflect changes,
* which might be an issue if extensions want to access
* the env. via RTL. This cuts both ways, since RTL will
diff --git a/win32/win32iop-o.h b/win32/win32iop-o.h
index 47c0de91b8..57b073ba87 100644
--- a/win32/win32iop-o.h
+++ b/win32/win32iop-o.h
@@ -127,10 +127,8 @@ DllExport void win32_seekdir(DIR *dirp, long loc);
DllExport void win32_rewinddir(DIR *dirp);
DllExport int win32_closedir(DIR *dirp);
-#ifndef USE_WIN32_RTL_ENV
DllExport char* win32_getenv(const char *name);
DllExport int win32_putenv(const char *name);
-#endif
DllExport unsigned win32_sleep(unsigned int);
DllExport int win32_times(struct tms *timebuf);
@@ -332,12 +330,10 @@ END_EXTERN_C
#undef crypt
#define crypt(t,s) win32_crypt(t,s)
-#ifndef USE_WIN32_RTL_ENV
#undef getenv
#define getenv win32_getenv
#undef putenv
#define putenv win32_putenv
-#endif
#endif /* WIN32IO_IS_STDIO */
#endif /* WIN32IOP_H */
diff --git a/win32/wince.c b/win32/wince.c
index 8512b4d940..b9163d75c0 100644
--- a/win32/wince.c
+++ b/win32/wince.c
@@ -893,8 +893,6 @@ win32_longpath(char *path)
return path;
}
-#ifndef USE_WIN32_RTL_ENV
-
DllExport char *
win32_getenv(const char *name)
{
@@ -907,8 +905,6 @@ win32_putenv(const char *name)
return xceputenv(name);
}
-#endif
-
static long
filetime_to_clock(PFILETIME ft)
{
diff --git a/x2p/find2perl.PL b/x2p/find2perl.PL
index 5add931397..e9275d0c5c 100644
--- a/x2p/find2perl.PL
+++ b/x2p/find2perl.PL
@@ -42,20 +42,6 @@ use vars qw/$statdone/;
use File::Spec::Functions 'curdir';
my $startperl = "#! $perlpath -w";
-#
-# Modified September 26, 1993 to provide proper handling of years after 1999
-# Tom Link <tml+@pitt.edu>
-# University of Pittsburgh
-#
-# Modified April 7, 1998 with nasty hacks to implement the troublesome -follow
-# Billy Constantine <wdconsta@cs.adelaide.edu.au> <billy@smug.adelaide.edu.au>
-# University of Adelaide, Adelaide, South Australia
-#
-# Modified 1999-06-10, 1999-07-07 to migrate to cleaner perl5 usage
-# Ken Pizzini <ken@halcyon.com>
-#
-# Modified 2000-01-28 to use the 'follow' option of File::Find
-
sub tab ();
sub n ($$);
sub fileglob_to_re ($);
@@ -921,7 +907,7 @@ Predicates which take a numeric argument N can come in three forms:
=head1 SEE ALSO
-find
+find, File::Find.
=cut
!NO!SUBS!