From 904fd0757fe037dbfbf156b31f72e5ff5c7cd796 Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 1 Mar 2010 01:54:19 +0000 Subject: commit more files of the tlperl.straw dir, still not complete git-svn-id: svn://tug.org/texlive/trunk@17244 c570f23f-e606-0410-a88d-b1316a301751 --- Master/tlpkg/tlperl.straw/README.TeXLive | 32 + Master/tlpkg/tlperl.straw/bin/a2p.exe | Bin 0 -> 104448 bytes Master/tlpkg/tlperl.straw/bin/bdf2gdfont.bat | 205 + Master/tlpkg/tlperl.straw/bin/bdf2gdfont.pl | 189 + Master/tlpkg/tlperl.straw/bin/c2ph.bat | 1383 + Master/tlpkg/tlperl.straw/bin/config_data | 249 + Master/tlpkg/tlperl.straw/bin/config_data.bat | 265 + Master/tlpkg/tlperl.straw/bin/corelist | 272 + Master/tlpkg/tlperl.straw/bin/corelist.bat | 288 + Master/tlpkg/tlperl.straw/bin/cpan | 229 + Master/tlpkg/tlperl.straw/bin/cpan.bat | 245 + Master/tlpkg/tlperl.straw/bin/cpan2dist | 671 + Master/tlpkg/tlperl.straw/bin/cpan2dist.bat | 687 + Master/tlpkg/tlperl.straw/bin/cpandb | 272 + Master/tlpkg/tlperl.straw/bin/cpandb.bat | 288 + Master/tlpkg/tlperl.straw/bin/cpaninject | 137 + Master/tlpkg/tlperl.straw/bin/cpaninject.bat | 153 + Master/tlpkg/tlperl.straw/bin/cpanp | 104 + Master/tlpkg/tlperl.straw/bin/cpanp-run-perl | 10 + Master/tlpkg/tlperl.straw/bin/cpanp-run-perl.bat | 27 + Master/tlpkg/tlperl.straw/bin/cpanp.bat | 120 + Master/tlpkg/tlperl.straw/bin/cpansign | 95 + Master/tlpkg/tlperl.straw/bin/cpansign.bat | 111 + Master/tlpkg/tlperl.straw/bin/crc32 | 31 + Master/tlpkg/tlperl.straw/bin/crc32.bat | 47 + Master/tlpkg/tlperl.straw/bin/dbilogstrip | 50 + Master/tlpkg/tlperl.straw/bin/dbilogstrip.bat | 66 + Master/tlpkg/tlperl.straw/bin/dbiprof | 263 + Master/tlpkg/tlperl.straw/bin/dbiprof.bat | 279 + Master/tlpkg/tlperl.straw/bin/dbiproxy | 184 + Master/tlpkg/tlperl.straw/bin/dbiproxy.bat | 200 + Master/tlpkg/tlperl.straw/bin/dprofpp.bat | 945 + Master/tlpkg/tlperl.straw/bin/enc2xs | 1407 + Master/tlpkg/tlperl.straw/bin/enc2xs.bat | 1423 + Master/tlpkg/tlperl.straw/bin/exe_update.bat | 114 + Master/tlpkg/tlperl.straw/bin/exe_update.pl | 98 + Master/tlpkg/tlperl.straw/bin/exetype.bat | 124 + Master/tlpkg/tlperl.straw/bin/find2perl.bat | 895 + Master/tlpkg/tlperl.straw/bin/findrule | 138 + Master/tlpkg/tlperl.straw/bin/findrule.bat | 154 + Master/tlpkg/tlperl.straw/bin/gedi | 315 + Master/tlpkg/tlperl.straw/bin/gedi.bat | 331 + Master/tlpkg/tlperl.straw/bin/h2ph.bat | 959 + Master/tlpkg/tlperl.straw/bin/h2xs.bat | 2203 + Master/tlpkg/tlperl.straw/bin/instmodsh | 192 + Master/tlpkg/tlperl.straw/bin/instmodsh.bat | 208 + Master/tlpkg/tlperl.straw/bin/json_xs | 179 + Master/tlpkg/tlperl.straw/bin/json_xs.bat | 195 + Master/tlpkg/tlperl.straw/bin/largeprimes | 68 + Master/tlpkg/tlperl.straw/bin/largeprimes.bat | 84 + Master/tlpkg/tlperl.straw/bin/libnetcfg.bat | 737 + Master/tlpkg/tlperl.straw/bin/lwp-download | 320 + Master/tlpkg/tlperl.straw/bin/lwp-download.bat | 336 + Master/tlpkg/tlperl.straw/bin/lwp-dump | 107 + Master/tlpkg/tlperl.straw/bin/lwp-dump.bat | 123 + Master/tlpkg/tlperl.straw/bin/lwp-mirror | 103 + Master/tlpkg/tlperl.straw/bin/lwp-mirror.bat | 119 + Master/tlpkg/tlperl.straw/bin/lwp-request | 531 + Master/tlpkg/tlperl.straw/bin/lwp-request.bat | 547 + Master/tlpkg/tlperl.straw/bin/lwp-rget | 607 + Master/tlpkg/tlperl.straw/bin/lwp-rget.bat | 623 + Master/tlpkg/tlperl.straw/bin/makerandom | 50 + Master/tlpkg/tlperl.straw/bin/makerandom.bat | 66 + Master/tlpkg/tlperl.straw/bin/parinstallppd | 124 + Master/tlpkg/tlperl.straw/bin/parinstallppd.bat | 140 + Master/tlpkg/tlperl.straw/bin/perl.exe | Bin 0 -> 9216 bytes Master/tlpkg/tlperl.straw/bin/perl5.10.1.exe | Bin 0 -> 9216 bytes Master/tlpkg/tlperl.straw/bin/perl510.dll | Bin 0 -> 1324032 bytes Master/tlpkg/tlperl.straw/bin/perlbug.bat | 1478 + Master/tlpkg/tlperl.straw/bin/perldoc | 7 + Master/tlpkg/tlperl.straw/bin/perldoc.bat | 23 + Master/tlpkg/tlperl.straw/bin/perlglob.bat | 69 + Master/tlpkg/tlperl.straw/bin/perlglob.exe | Bin 0 -> 6144 bytes Master/tlpkg/tlperl.straw/bin/perlivp.bat | 456 + Master/tlpkg/tlperl.straw/bin/perlthanks.bat | 1478 + Master/tlpkg/tlperl.straw/bin/piconv | 299 + Master/tlpkg/tlperl.straw/bin/piconv.bat | 315 + Master/tlpkg/tlperl.straw/bin/pip | 23 + Master/tlpkg/tlperl.straw/bin/pip.bat | 39 + Master/tlpkg/tlperl.straw/bin/pl2bat.bat | 430 + Master/tlpkg/tlperl.straw/bin/pl2pm.bat | 394 + Master/tlpkg/tlperl.straw/bin/pler | 27 + Master/tlpkg/tlperl.straw/bin/pler.bat | 43 + Master/tlpkg/tlperl.straw/bin/pod2html.bat | 160 + Master/tlpkg/tlperl.straw/bin/pod2latex.bat | 398 + Master/tlpkg/tlperl.straw/bin/pod2man | 549 + Master/tlpkg/tlperl.straw/bin/pod2man.bat | 565 + Master/tlpkg/tlperl.straw/bin/pod2text | 273 + Master/tlpkg/tlperl.straw/bin/pod2text.bat | 289 + Master/tlpkg/tlperl.straw/bin/pod2usage.bat | 157 + Master/tlpkg/tlperl.straw/bin/podchecker.bat | 161 + Master/tlpkg/tlperl.straw/bin/podselect.bat | 120 + Master/tlpkg/tlperl.straw/bin/ppd2par | 167 + Master/tlpkg/tlperl.straw/bin/ppd2par.bat | 183 + Master/tlpkg/tlperl.straw/bin/ppm.bat | 1066 + Master/tlpkg/tlperl.straw/bin/ppm.pl | 1050 + Master/tlpkg/tlperl.straw/bin/prove | 338 + Master/tlpkg/tlperl.straw/bin/prove.bat | 354 + Master/tlpkg/tlperl.straw/bin/psed.bat | 2018 + Master/tlpkg/tlperl.straw/bin/pstruct.bat | 1383 + Master/tlpkg/tlperl.straw/bin/ptar | 114 + Master/tlpkg/tlperl.straw/bin/ptar.bat | 130 + Master/tlpkg/tlperl.straw/bin/ptardiff | 112 + Master/tlpkg/tlperl.straw/bin/ptardiff.bat | 128 + Master/tlpkg/tlperl.straw/bin/ptked | 368 + Master/tlpkg/tlperl.straw/bin/ptked.bat | 384 + Master/tlpkg/tlperl.straw/bin/ptksh | 730 + Master/tlpkg/tlperl.straw/bin/ptksh.bat | 746 + Master/tlpkg/tlperl.straw/bin/pwhich | 141 + Master/tlpkg/tlperl.straw/bin/pwhich.bat | 157 + Master/tlpkg/tlperl.straw/bin/runperl.bat | 83 + Master/tlpkg/tlperl.straw/bin/s2p.bat | 2018 + Master/tlpkg/tlperl.straw/bin/search.bat | 1887 + Master/tlpkg/tlperl.straw/bin/shasum | 268 + Master/tlpkg/tlperl.straw/bin/shasum.bat | 284 + Master/tlpkg/tlperl.straw/bin/splain.bat | 665 + Master/tlpkg/tlperl.straw/bin/tkjpeg | 67 + Master/tlpkg/tlperl.straw/bin/tkjpeg.bat | 83 + Master/tlpkg/tlperl.straw/bin/widget | 608 + Master/tlpkg/tlperl.straw/bin/widget.bat | 624 + Master/tlpkg/tlperl.straw/bin/wperl.exe | Bin 0 -> 9216 bytes Master/tlpkg/tlperl.straw/bin/xsubpp.bat | 175 + Master/tlpkg/tlperl.straw/lib/Algorithm/Diff.pm | 1713 + Master/tlpkg/tlperl.straw/lib/Algorithm/DiffOld.pm | 305 + Master/tlpkg/tlperl.straw/lib/Algorithm/cdiff.pl | 385 + Master/tlpkg/tlperl.straw/lib/Algorithm/diff.pl | 47 + Master/tlpkg/tlperl.straw/lib/Algorithm/diffnew.pl | 528 + .../tlpkg/tlperl.straw/lib/Algorithm/htmldiff.pl | 100 + Master/tlpkg/tlperl.straw/lib/AnyDBM_File.pm | 93 + Master/tlpkg/tlperl.straw/lib/Archive/Extract.pm | 1511 + Master/tlpkg/tlperl.straw/lib/Archive/Tar.pm | 2146 + .../tlpkg/tlperl.straw/lib/Archive/Tar/Constant.pm | 86 + Master/tlpkg/tlperl.straw/lib/Archive/Tar/File.pm | 660 + Master/tlpkg/tlperl.straw/lib/Archive/Zip.pm | 2059 + .../tlpkg/tlperl.straw/lib/Archive/Zip/Archive.pm | 978 + .../lib/Archive/Zip/BufferedFileHandle.pm | 131 + .../lib/Archive/Zip/DirectoryMember.pm | 80 + Master/tlpkg/tlperl.straw/lib/Archive/Zip/FAQ.pod | 467 + .../tlperl.straw/lib/Archive/Zip/FileMember.pm | 64 + .../tlpkg/tlperl.straw/lib/Archive/Zip/Member.pm | 1083 + .../tlperl.straw/lib/Archive/Zip/MemberRead.pm | 333 + .../tlperl.straw/lib/Archive/Zip/MockFileHandle.pm | 69 + .../tlperl.straw/lib/Archive/Zip/NewFileMember.pm | 79 + .../tlperl.straw/lib/Archive/Zip/StringMember.pm | 64 + Master/tlpkg/tlperl.straw/lib/Archive/Zip/Tree.pm | 49 + .../tlperl.straw/lib/Archive/Zip/ZipFileMember.pm | 416 + .../tlpkg/tlperl.straw/lib/Attribute/Handlers.pm | 924 + Master/tlpkg/tlperl.straw/lib/AutoSplit.pm | 592 + Master/tlpkg/tlperl.straw/lib/BerkeleyDB.pm | 1833 + Master/tlpkg/tlperl.straw/lib/BerkeleyDB.pod | 2518 + Master/tlpkg/tlperl.straw/lib/Bundle/DBD/Pg.pm | 39 + Master/tlpkg/tlperl.straw/lib/Bundle/DBD/mysql.pm | 30 + Master/tlpkg/tlperl.straw/lib/Bundle/DBI.pm | 51 + Master/tlpkg/tlperl.straw/lib/Bundle/LWP.pm | 43 + Master/tlpkg/tlperl.straw/lib/CGI/Apache.pm | 27 + Master/tlpkg/tlperl.straw/lib/CGI/Carp.pm | 606 + Master/tlpkg/tlperl.straw/lib/CGI/Cookie.pm | 546 + Master/tlpkg/tlperl.straw/lib/CGI/Fast.pm | 220 + Master/tlpkg/tlperl.straw/lib/CGI/Pretty.pm | 312 + Master/tlpkg/tlperl.straw/lib/CGI/Push.pm | 325 + Master/tlpkg/tlperl.straw/lib/CGI/Switch.pm | 28 + Master/tlpkg/tlperl.straw/lib/CGI/Util.pm | 365 + Master/tlpkg/tlperl.straw/lib/CORE.pod | 62 + Master/tlpkg/tlperl.straw/lib/CORE/EXTERN.h | 61 + Master/tlpkg/tlperl.straw/lib/CORE/INTERN.h | 54 + Master/tlpkg/tlperl.straw/lib/CORE/XSUB.h | 649 + Master/tlpkg/tlperl.straw/lib/CORE/arpa/inet.h | 4 + Master/tlpkg/tlperl.straw/lib/CORE/av.h | 136 + Master/tlpkg/tlperl.straw/lib/CORE/cc_runtime.h | 83 + Master/tlpkg/tlperl.straw/lib/CORE/config.h | 4619 ++ Master/tlpkg/tlperl.straw/lib/CORE/cop.h | 905 + Master/tlpkg/tlperl.straw/lib/CORE/cv.h | 275 + Master/tlpkg/tlperl.straw/lib/CORE/dirent.h | 53 + Master/tlpkg/tlperl.straw/lib/CORE/dosish.h | 214 + Master/tlpkg/tlperl.straw/lib/CORE/embed.h | 4778 ++ Master/tlpkg/tlperl.straw/lib/CORE/embedvar.h | 848 + Master/tlpkg/tlperl.straw/lib/CORE/fakesdio.h | 133 + Master/tlpkg/tlperl.straw/lib/CORE/fakethr.h | 75 + Master/tlpkg/tlperl.straw/lib/CORE/form.h | 27 + Master/tlpkg/tlperl.straw/lib/CORE/git_version.h | 8 + Master/tlpkg/tlperl.straw/lib/CORE/gv.h | 227 + Master/tlpkg/tlperl.straw/lib/CORE/handy.h | 912 + Master/tlpkg/tlperl.straw/lib/CORE/hv.h | 577 + Master/tlpkg/tlperl.straw/lib/CORE/intrpvar.h | 704 + Master/tlpkg/tlperl.straw/lib/CORE/iperlsys.h | 1420 + Master/tlpkg/tlperl.straw/lib/CORE/keywords.h | 269 + Master/tlpkg/tlperl.straw/lib/CORE/libperl510.a | Bin 0 -> 1017186 bytes Master/tlpkg/tlperl.straw/lib/CORE/malloc_ctl.h | 64 + Master/tlpkg/tlperl.straw/lib/CORE/mg.h | 72 + Master/tlpkg/tlperl.straw/lib/CORE/mydtrace.h | 42 + Master/tlpkg/tlperl.straw/lib/CORE/netdb.h | 12 + Master/tlpkg/tlperl.straw/lib/CORE/nostdio.h | 136 + Master/tlpkg/tlperl.straw/lib/CORE/op.h | 756 + Master/tlpkg/tlperl.straw/lib/CORE/opcode.h | 1911 + Master/tlpkg/tlperl.straw/lib/CORE/opnames.h | 433 + Master/tlpkg/tlperl.straw/lib/CORE/overload.h | 88 + Master/tlpkg/tlperl.straw/lib/CORE/pad.h | 360 + Master/tlpkg/tlperl.straw/lib/CORE/parser.h | 118 + Master/tlpkg/tlperl.straw/lib/CORE/patchlevel.h | 147 + Master/tlpkg/tlperl.straw/lib/CORE/perl.h | 6090 +++ Master/tlpkg/tlperl.straw/lib/CORE/perlapi.h | 835 + Master/tlpkg/tlperl.straw/lib/CORE/perlhost.h | 2456 + Master/tlpkg/tlperl.straw/lib/CORE/perlio.h | 394 + Master/tlpkg/tlperl.straw/lib/CORE/perliol.h | 297 + Master/tlpkg/tlperl.straw/lib/CORE/perlsdio.h | 164 + Master/tlpkg/tlperl.straw/lib/CORE/perlsfio.h | 84 + Master/tlpkg/tlperl.straw/lib/CORE/perlvars.h | 188 + Master/tlpkg/tlperl.straw/lib/CORE/perly.h | 214 + Master/tlpkg/tlperl.straw/lib/CORE/pp.h | 511 + Master/tlpkg/tlperl.straw/lib/CORE/pp_proto.h | 410 + Master/tlpkg/tlperl.straw/lib/CORE/proto.h | 6650 +++ Master/tlpkg/tlperl.straw/lib/CORE/reentr.h | 1540 + Master/tlpkg/tlperl.straw/lib/CORE/regcharclass.h | 454 + Master/tlpkg/tlperl.straw/lib/CORE/regcomp.h | 846 + Master/tlpkg/tlperl.straw/lib/CORE/regexp.h | 681 + Master/tlpkg/tlperl.straw/lib/CORE/regnodes.h | 664 + Master/tlpkg/tlperl.straw/lib/CORE/scope.h | 240 + Master/tlpkg/tlperl.straw/lib/CORE/sv.h | 2144 + Master/tlpkg/tlperl.straw/lib/CORE/sys/socket.h | 189 + Master/tlpkg/tlperl.straw/lib/CORE/thread.h | 488 + Master/tlpkg/tlperl.straw/lib/CORE/uconfig.h | 4595 ++ Master/tlpkg/tlperl.straw/lib/CORE/unixish.h | 156 + Master/tlpkg/tlperl.straw/lib/CORE/utf8.h | 352 + Master/tlpkg/tlperl.straw/lib/CORE/utfebcdic.h | 494 + Master/tlpkg/tlperl.straw/lib/CORE/util.h | 53 + Master/tlpkg/tlperl.straw/lib/CORE/uudmap.h | 18 + Master/tlpkg/tlperl.straw/lib/CORE/vdir.h | 726 + Master/tlpkg/tlperl.straw/lib/CORE/vmem.h | 1259 + Master/tlpkg/tlperl.straw/lib/CORE/warnings.h | 123 + Master/tlpkg/tlperl.straw/lib/CORE/win32.h | 588 + Master/tlpkg/tlperl.straw/lib/CORE/win32iop-o.h | 340 + Master/tlpkg/tlperl.straw/lib/CORE/win32iop.h | 340 + Master/tlpkg/tlperl.straw/lib/CORE/win32thread.h | 197 + Master/tlpkg/tlperl.straw/lib/CORE/wince.h | 146 + Master/tlpkg/tlperl.straw/lib/CPAN/API/HOWTO.pod | 44 + Master/tlpkg/tlperl.straw/lib/CPAN/Admin.pm | 230 + Master/tlpkg/tlperl.straw/lib/CPAN/Author.pm | 236 + Master/tlpkg/tlperl.straw/lib/CPAN/Bundle.pm | 287 + Master/tlpkg/tlperl.straw/lib/CPAN/CacheMgr.pm | 246 + Master/tlpkg/tlperl.straw/lib/CPAN/Checksums.pm | 432 + Master/tlpkg/tlperl.straw/lib/CPAN/Complete.pm | 175 + Master/tlpkg/tlperl.straw/lib/CPAN/Config.pm | 87 + Master/tlpkg/tlperl.straw/lib/CPAN/Debug.pm | 79 + Master/tlpkg/tlperl.straw/lib/CPAN/DeferredCode.pm | 16 + Master/tlpkg/tlperl.straw/lib/CPAN/DistnameInfo.pm | 194 + Master/tlpkg/tlperl.straw/lib/CPAN/Distribution.pm | 3879 ++ Master/tlpkg/tlperl.straw/lib/CPAN/Distroprefs.pm | 451 + Master/tlpkg/tlperl.straw/lib/CPAN/Distrostatus.pm | 45 + .../lib/CPAN/Exception/RecursiveDependency.pm | 85 + .../lib/CPAN/Exception/blocked_urllist.pm | 46 + .../lib/CPAN/Exception/yaml_not_installed.pm | 73 + Master/tlpkg/tlperl.straw/lib/CPAN/FTP.pm | 1074 + Master/tlpkg/tlperl.straw/lib/CPAN/FTP/netrc.pm | 63 + Master/tlpkg/tlperl.straw/lib/CPAN/FirstTime.pm | 1797 + Master/tlpkg/tlperl.straw/lib/CPAN/HandleConfig.pm | 735 + Master/tlpkg/tlperl.straw/lib/CPAN/Index.pm | 619 + Master/tlpkg/tlperl.straw/lib/CPAN/InfoObj.pm | 224 + Master/tlpkg/tlperl.straw/lib/CPAN/Inject.pm | 514 + Master/tlpkg/tlperl.straw/lib/CPAN/Kwalify.pm | 136 + .../tlperl.straw/lib/CPAN/Kwalify/distroprefs.dd | 150 + .../tlperl.straw/lib/CPAN/Kwalify/distroprefs.yml | 92 + .../tlpkg/tlperl.straw/lib/CPAN/LWP/UserAgent.pm | 135 + Master/tlpkg/tlperl.straw/lib/CPAN/Mirrors.pm | 260 + Master/tlpkg/tlperl.straw/lib/CPAN/Module.pm | 688 + Master/tlpkg/tlperl.straw/lib/CPAN/Nox.pm | 51 + Master/tlpkg/tlperl.straw/lib/CPAN/Prompt.pm | 29 + Master/tlpkg/tlperl.straw/lib/CPAN/Queue.pm | 198 + Master/tlpkg/tlperl.straw/lib/CPAN/SQLite.pm | 323 + Master/tlpkg/tlperl.straw/lib/CPAN/SQLite/DBI.pm | 169 + .../tlperl.straw/lib/CPAN/SQLite/DBI/Index.pm | 237 + .../tlperl.straw/lib/CPAN/SQLite/DBI/Search.pm | 283 + Master/tlpkg/tlperl.straw/lib/CPAN/SQLite/Index.pm | 264 + Master/tlpkg/tlperl.straw/lib/CPAN/SQLite/Info.pm | 338 + Master/tlpkg/tlperl.straw/lib/CPAN/SQLite/META.pm | 480 + .../tlpkg/tlperl.straw/lib/CPAN/SQLite/Populate.pm | 958 + .../tlpkg/tlperl.straw/lib/CPAN/SQLite/Search.pm | 520 + Master/tlpkg/tlperl.straw/lib/CPAN/SQLite/State.pm | 410 + Master/tlpkg/tlperl.straw/lib/CPAN/SQLite/Util.pm | 367 + Master/tlpkg/tlperl.straw/lib/CPAN/Shell.pm | 1974 + Master/tlpkg/tlperl.straw/lib/CPAN/Tarzip.pm | 442 + Master/tlpkg/tlperl.straw/lib/CPAN/URL.pm | 31 + Master/tlpkg/tlperl.straw/lib/CPAN/Version.pm | 173 + Master/tlpkg/tlperl.straw/lib/CPANPLUS.pm | 271 + Master/tlpkg/tlperl.straw/lib/Carp.pm | 237 + .../tlpkg/tlperl.straw/lib/Class/ErrorHandler.pm | 100 + Master/tlpkg/tlperl.straw/lib/Class/ISA.pm | 218 + Master/tlpkg/tlperl.straw/lib/Class/Loader.pm | 221 + Master/tlpkg/tlperl.straw/lib/Class/LoaderTest.pm | 41 + Master/tlpkg/tlperl.straw/lib/Class/Struct.pm | 636 + Master/tlpkg/tlperl.straw/lib/Config.pm | 99 + Master/tlpkg/tlperl.straw/lib/Config.pod | 8824 ++++ Master/tlpkg/tlperl.straw/lib/Config_heavy.pl | 1274 + .../tlpkg/tlperl.straw/lib/Convert/ASCII/Armor.pm | 37 + .../tlpkg/tlperl.straw/lib/Convert/ASCII/Armour.pm | 247 + Master/tlpkg/tlperl.straw/lib/Convert/ASN1.pm | 444 + Master/tlpkg/tlperl.straw/lib/Convert/ASN1.pod | 480 + .../tlpkg/tlperl.straw/lib/Convert/ASN1/Debug.pm | 226 + Master/tlpkg/tlperl.straw/lib/Convert/ASN1/IO.pm | 261 + .../tlpkg/tlperl.straw/lib/Convert/ASN1/_decode.pm | 675 + .../tlpkg/tlperl.straw/lib/Convert/ASN1/_encode.pm | 406 + .../tlpkg/tlperl.straw/lib/Convert/ASN1/parser.pm | 916 + Master/tlpkg/tlperl.straw/lib/Convert/PEM.pm | 472 + Master/tlpkg/tlperl.straw/lib/Convert/PEM/CBC.pm | 227 + .../tlperl.straw/lib/Crypt/CAST5_PP/Tables.pm | 375 + Master/tlpkg/tlperl.straw/lib/Crypt/DES_EDE3.pm | 118 + Master/tlpkg/tlperl.straw/lib/Cwd.pm | 824 + Master/tlpkg/tlperl.straw/lib/DB.pm | 809 + Master/tlpkg/tlperl.straw/lib/DBI/Changes.pm | 2024 + .../tlperl.straw/lib/DBI/Const/GetInfo/ANSI.pm | 236 + .../tlperl.straw/lib/DBI/Const/GetInfo/ODBC.pm | 1363 + .../tlperl.straw/lib/DBI/Const/GetInfoReturn.pm | 105 + .../tlperl.straw/lib/DBI/Const/GetInfoType.pm | 54 + Master/tlpkg/tlperl.straw/lib/DBI/DBD.pm | 3385 ++ Master/tlpkg/tlperl.straw/lib/DBI/DBD/Metadata.pm | 493 + Master/tlpkg/tlperl.straw/lib/DBI/FAQ.pm | 975 + Master/tlpkg/tlperl.straw/lib/DBI/Gofer/Execute.pm | 900 + Master/tlpkg/tlperl.straw/lib/DBI/Gofer/Request.pm | 200 + .../tlpkg/tlperl.straw/lib/DBI/Gofer/Response.pm | 218 + .../tlperl.straw/lib/DBI/Gofer/Serializer/Base.pm | 64 + .../lib/DBI/Gofer/Serializer/DataDumper.pm | 53 + .../lib/DBI/Gofer/Serializer/Storable.pm | 59 + .../tlperl.straw/lib/DBI/Gofer/Transport/Base.pm | 176 + .../lib/DBI/Gofer/Transport/pipeone.pm | 61 + .../tlperl.straw/lib/DBI/Gofer/Transport/stream.pm | 76 + Master/tlpkg/tlperl.straw/lib/DBI/Profile.pm | 943 + Master/tlpkg/tlperl.straw/lib/DBI/ProfileData.pm | 737 + Master/tlpkg/tlperl.straw/lib/DBI/ProfileDumper.pm | 342 + .../tlperl.straw/lib/DBI/ProfileDumper/Apache.pm | 230 + Master/tlpkg/tlperl.straw/lib/DBI/ProfileSubs.pm | 50 + Master/tlpkg/tlperl.straw/lib/DBI/ProxyServer.pm | 890 + Master/tlpkg/tlperl.straw/lib/DBI/PurePerl.pm | 1205 + Master/tlpkg/tlperl.straw/lib/DBI/Roadmap.pm | 394 + Master/tlpkg/tlperl.straw/lib/DBI/SQL/Nano.pm | 692 + .../tlpkg/tlperl.straw/lib/DBI/Util/CacheMemory.pm | 117 + .../tlpkg/tlperl.straw/lib/DBI/Util/_accessor.pm | 65 + Master/tlpkg/tlperl.straw/lib/DBI/W32ODBC.pm | 181 + Master/tlpkg/tlperl.straw/lib/DBM_Filter.pm | 605 + Master/tlpkg/tlperl.straw/lib/Data/Buffer.pm | 465 + Master/tlpkg/tlperl.straw/lib/Data/Compare.pm | 436 + .../tlperl.straw/lib/Data/Compare/Plugins.pod | 101 + .../lib/Data/Compare/Plugins/Scalar/Properties.pm | 94 + Master/tlpkg/tlperl.straw/lib/Data/Dumper.pm | 1306 + Master/tlpkg/tlperl.straw/lib/Data/Random.pm | 850 + .../tlpkg/tlperl.straw/lib/Data/Random/WordList.pm | 185 + Master/tlpkg/tlperl.straw/lib/Data/Random/dict | 45427 +++++++++++++++++++ Master/tlpkg/tlperl.straw/lib/Digest.pm | 316 + .../tlpkg/tlperl.straw/lib/Digest/BubbleBabble.pm | 105 + Master/tlpkg/tlperl.straw/lib/Digest/HMAC.pm | 111 + Master/tlpkg/tlperl.straw/lib/Digest/HMAC_MD5.pm | 71 + Master/tlpkg/tlperl.straw/lib/Digest/HMAC_SHA1.pm | 71 + Master/tlpkg/tlperl.straw/lib/Digest/MD2.pm | 72 + Master/tlpkg/tlperl.straw/lib/Digest/MD5.pm | 376 + Master/tlpkg/tlperl.straw/lib/Digest/SHA.pm | 669 + Master/tlpkg/tlperl.straw/lib/Digest/SHA1.pm | 246 + Master/tlpkg/tlperl.straw/lib/Digest/base.pm | 100 + Master/tlpkg/tlperl.straw/lib/Digest/file.pm | 85 + Master/tlpkg/tlperl.straw/lib/DirHandle.pm | 92 + Master/tlpkg/tlperl.straw/lib/English.pm | 230 + Master/tlpkg/tlperl.straw/lib/Errno.pm | 2768 ++ Master/tlpkg/tlperl.straw/lib/Exporter/Heavy.pm | 251 + Master/tlpkg/tlperl.straw/lib/Fatal.pm | 1374 + Master/tlpkg/tlperl.straw/lib/Filter/Simple.pm | 797 + Master/tlpkg/tlperl.straw/lib/Filter/Util/Call.pm | 498 + Master/tlpkg/tlperl.straw/lib/GDBM_File.pm | 86 + Master/tlpkg/tlperl.straw/lib/Getopt/Long.pm | 2649 ++ Master/tlpkg/tlperl.straw/lib/Getopt/Std.pm | 295 + Master/tlpkg/tlperl.straw/lib/HTML/Entities.pm | 500 + Master/tlpkg/tlperl.straw/lib/HTML/Filter.pm | 112 + Master/tlpkg/tlperl.straw/lib/HTML/Form.pm | 1551 + Master/tlpkg/tlperl.straw/lib/HTML/HeadParser.pm | 301 + Master/tlpkg/tlperl.straw/lib/HTML/LinkExtor.pm | 185 + Master/tlpkg/tlperl.straw/lib/HTML/Parser.pm | 1240 + Master/tlpkg/tlperl.straw/lib/HTML/PullParser.pm | 209 + Master/tlpkg/tlperl.straw/lib/HTML/Tagset.pm | 471 + Master/tlpkg/tlperl.straw/lib/HTML/TokeParser.pm | 369 + Master/tlpkg/tlperl.straw/lib/HTTP/Config.pm | 436 + Master/tlpkg/tlperl.straw/lib/HTTP/Cookies.pm | 781 + .../tlperl.straw/lib/HTTP/Cookies/Microsoft.pm | 329 + .../tlperl.straw/lib/HTTP/Cookies/Netscape.pm | 114 + Master/tlpkg/tlperl.straw/lib/HTTP/Daemon.pm | 903 + Master/tlpkg/tlperl.straw/lib/HTTP/Date.pm | 389 + Master/tlpkg/tlperl.straw/lib/HTTP/Headers.pm | 827 + Master/tlpkg/tlperl.straw/lib/HTTP/Headers/Auth.pm | 98 + Master/tlpkg/tlperl.straw/lib/HTTP/Headers/ETag.pm | 94 + Master/tlpkg/tlperl.straw/lib/HTTP/Headers/Util.pm | 199 + Master/tlpkg/tlperl.straw/lib/HTTP/Message.pm | 1073 + Master/tlpkg/tlperl.straw/lib/HTTP/Negotiate.pm | 529 + Master/tlpkg/tlperl.straw/lib/HTTP/Request.pm | 242 + .../tlpkg/tlperl.straw/lib/HTTP/Request/Common.pm | 511 + Master/tlpkg/tlperl.straw/lib/HTTP/Response.pm | 639 + Master/tlpkg/tlperl.straw/lib/HTTP/Status.pm | 254 + Master/tlpkg/tlperl.straw/lib/Hash/Util.pm | 520 + .../tlpkg/tlperl.straw/lib/Hash/Util/FieldHash.pm | 860 + Master/tlpkg/tlperl.straw/lib/I18N/Collate.pm | 196 + Master/tlpkg/tlperl.straw/lib/I18N/LangTags.pm | 887 + .../tlpkg/tlperl.straw/lib/I18N/LangTags/Detect.pm | 237 + .../tlpkg/tlperl.straw/lib/I18N/LangTags/List.pm | 1779 + Master/tlpkg/tlperl.straw/lib/IO.pm | 68 + Master/tlpkg/tlperl.straw/lib/IPC/Cmd.pm | 1646 + Master/tlpkg/tlperl.straw/lib/IPC/Open2.pm | 121 + Master/tlpkg/tlperl.straw/lib/IPC/Open3.pm | 376 + Master/tlpkg/tlperl.straw/lib/IPC/Run3.pm | 850 + .../tlperl.straw/lib/IPC/Run3/ProfArrayBuffer.pm | 86 + .../tlperl.straw/lib/IPC/Run3/ProfLogReader.pm | 157 + .../tlpkg/tlperl.straw/lib/IPC/Run3/ProfLogger.pm | 139 + Master/tlpkg/tlperl.straw/lib/IPC/Run3/ProfPP.pm | 156 + .../tlperl.straw/lib/IPC/Run3/ProfReporter.pm | 256 + Master/tlpkg/tlperl.straw/lib/IPC/System/Simple.pm | 1076 + Master/tlpkg/tlperl.straw/lib/JSON.pm | 2088 + Master/tlpkg/tlperl.straw/lib/JSON/PP.pm | 2144 + Master/tlpkg/tlperl.straw/lib/JSON/PP/Boolean.pm | 26 + Master/tlpkg/tlperl.straw/lib/JSON/PP5005.pm | 148 + Master/tlpkg/tlperl.straw/lib/JSON/PP56.pm | 198 + Master/tlpkg/tlperl.straw/lib/JSON/PP58.pm | 93 + Master/tlpkg/tlperl.straw/lib/JSON/XS.pm | 1478 + Master/tlpkg/tlperl.straw/lib/JSON/XS/Boolean.pm | 26 + Master/tlpkg/tlperl.straw/lib/LWP.pm | 654 + Master/tlpkg/tlperl.straw/lib/Log/Message.pm | 600 + .../tlpkg/tlperl.straw/lib/Log/Message/Config.pm | 197 + .../tlpkg/tlperl.straw/lib/Log/Message/Handlers.pm | 191 + Master/tlpkg/tlperl.straw/lib/Log/Message/Item.pm | 192 + .../tlpkg/tlperl.straw/lib/Log/Message/Simple.pm | 293 + Master/tlpkg/tlperl.straw/lib/MIME/Base64.pm | 175 + Master/tlpkg/tlperl.straw/lib/MIME/QuotedPrint.pm | 114 + Master/tlpkg/tlperl.straw/lib/Math/BigFloat.pm | 4402 ++ .../tlpkg/tlperl.straw/lib/Math/BigFloat/Trace.pm | 58 + Master/tlpkg/tlperl.straw/lib/Math/BigInt.pm | 5115 +++ Master/tlpkg/tlperl.straw/lib/Math/BigInt/Calc.pm | 2612 ++ .../tlpkg/tlperl.straw/lib/Math/BigInt/CalcEmu.pm | 329 + .../tlpkg/tlperl.straw/lib/Math/BigInt/FastCalc.pm | 125 + Master/tlpkg/tlperl.straw/lib/Math/BigInt/GMP.pm | 157 + Master/tlpkg/tlperl.straw/lib/Math/BigInt/Trace.pm | 47 + Master/tlpkg/tlperl.straw/lib/Math/BigRat.pm | 2020 + Master/tlpkg/tlperl.straw/lib/Math/Complex.pm | 2093 + Master/tlpkg/tlperl.straw/lib/Math/GMP.pm | 411 + Master/tlpkg/tlperl.straw/lib/Math/Pari.pm | 1195 + Master/tlpkg/tlperl.straw/lib/Math/PariInit.pm | 57 + Master/tlpkg/tlperl.straw/lib/Math/Trig.pm | 768 + .../tlpkg/tlperl.straw/lib/Math/libPARI.dumb.pod | 8045 ++++ Master/tlpkg/tlperl.straw/lib/Math/libPARI.pod | 8045 ++++ .../tlpkg/tlperl.straw/lib/Memoize/AnyDBM_File.pm | 31 + Master/tlpkg/tlperl.straw/lib/Memoize/Expire.pm | 365 + .../tlpkg/tlperl.straw/lib/Memoize/ExpireFile.pm | 52 + .../tlpkg/tlperl.straw/lib/Memoize/ExpireTest.pm | 49 + Master/tlpkg/tlperl.straw/lib/Memoize/NDBM_File.pm | 77 + Master/tlpkg/tlperl.straw/lib/Memoize/SDBM_File.pm | 75 + Master/tlpkg/tlperl.straw/lib/Memoize/Storable.pm | 72 + Master/tlpkg/tlperl.straw/lib/Opcode.pm | 590 + Master/tlpkg/tlperl.straw/lib/PAR.pm | 1244 + Master/tlpkg/tlperl.straw/lib/POSIX.pm | 1042 + Master/tlpkg/tlperl.straw/lib/POSIX.pod | 2210 + Master/tlpkg/tlperl.straw/lib/PPM/RelocPerl.pm | 85 + Master/tlpkg/tlperl.straw/lib/PPM/XML/Element.pm | 238 + Master/tlpkg/tlperl.straw/lib/PPM/XML/PPD.pm | 622 + Master/tlpkg/tlperl.straw/lib/PPM/XML/PPMConfig.pm | 425 + .../tlperl.straw/lib/PPM/XML/RepositorySummary.pm | 31 + .../tlperl.straw/lib/PPM/XML/ValidatingElement.pm | 330 + Master/tlpkg/tlperl.straw/lib/Package/Constants.pm | 106 + Master/tlpkg/tlperl.straw/lib/Params/Check.pm | 712 + Master/tlpkg/tlperl.straw/lib/Params/Util.pm | 812 + Master/tlpkg/tlperl.straw/lib/Parse/Binary.pm | 960 + .../tlperl.straw/lib/Parse/Binary/FixedFormat.pm | 319 + .../lib/Parse/Binary/FixedFormat/Variants.pm | 149 + Master/tlpkg/tlperl.straw/lib/Parse/CPAN/Meta.pm | 437 + Master/tlpkg/tlperl.straw/lib/PerlIO.pm | 344 + Master/tlpkg/tlperl.straw/lib/PerlIO/encoding.pm | 53 + Master/tlpkg/tlperl.straw/lib/PerlIO/scalar.pm | 41 + Master/tlpkg/tlperl.straw/lib/PerlIO/via.pm | 243 + .../tlperl.straw/lib/PerlIO/via/QuotedPrint.pm | 94 + Master/tlpkg/tlperl.straw/lib/Pod/Checker.pm | 1268 + Master/tlpkg/tlperl.straw/lib/Pod/Escapes.pm | 721 + Master/tlpkg/tlperl.straw/lib/Pod/Find.pm | 535 + Master/tlpkg/tlperl.straw/lib/Pod/Functions.pm | 376 + Master/tlpkg/tlperl.straw/lib/Pod/Html.pm | 2233 + Master/tlpkg/tlperl.straw/lib/Pod/InputObjects.pm | 936 + Master/tlpkg/tlperl.straw/lib/Pod/LaTeX.pm | 1876 + Master/tlpkg/tlperl.straw/lib/Pod/Man.pm | 1764 + Master/tlpkg/tlperl.straw/lib/Pod/ParseLink.pm | 192 + Master/tlpkg/tlperl.straw/lib/Pod/ParseUtils.pm | 855 + Master/tlpkg/tlperl.straw/lib/Pod/Parser.pm | 1829 + Master/tlpkg/tlperl.straw/lib/Pod/Perldoc.pm | 1952 + .../tlpkg/tlperl.straw/lib/Pod/Perldoc/BaseTo.pm | 81 + .../tlperl.straw/lib/Pod/Perldoc/GetOptsOO.pm | 148 + .../tlperl.straw/lib/Pod/Perldoc/ToChecker.pm | 75 + Master/tlpkg/tlperl.straw/lib/Pod/Perldoc/ToMan.pm | 190 + .../tlpkg/tlperl.straw/lib/Pod/Perldoc/ToNroff.pm | 103 + Master/tlpkg/tlperl.straw/lib/Pod/Perldoc/ToPod.pm | 93 + Master/tlpkg/tlperl.straw/lib/Pod/Perldoc/ToRtf.pm | 88 + .../tlpkg/tlperl.straw/lib/Pod/Perldoc/ToText.pm | 95 + Master/tlpkg/tlperl.straw/lib/Pod/Perldoc/ToTk.pm | 132 + Master/tlpkg/tlperl.straw/lib/Pod/Perldoc/ToXml.pm | 66 + Master/tlpkg/tlperl.straw/lib/Pod/PlainText.pm | 738 + Master/tlpkg/tlperl.straw/lib/Pod/Plainer.pm | 100 + Master/tlpkg/tlperl.straw/lib/Pod/Select.pm | 746 + Master/tlpkg/tlperl.straw/lib/Pod/Simple.pm | 1535 + Master/tlpkg/tlperl.straw/lib/Pod/Simple.pod | 274 + .../tlpkg/tlperl.straw/lib/Pod/Simple/BlackBox.pm | 1946 + .../tlpkg/tlperl.straw/lib/Pod/Simple/Checker.pm | 196 + Master/tlpkg/tlperl.straw/lib/Pod/Simple/Debug.pm | 178 + .../tlperl.straw/lib/Pod/Simple/DumpAsText.pm | 155 + .../tlpkg/tlperl.straw/lib/Pod/Simple/DumpAsXML.pm | 170 + Master/tlpkg/tlperl.straw/lib/Pod/Simple/HTML.pm | 979 + .../tlpkg/tlperl.straw/lib/Pod/Simple/HTMLBatch.pm | 1372 + .../tlperl.straw/lib/Pod/Simple/HTMLLegacy.pm | 104 + .../tlperl.straw/lib/Pod/Simple/LinkSection.pm | 174 + .../tlpkg/tlperl.straw/lib/Pod/Simple/Methody.pm | 152 + .../tlpkg/tlperl.straw/lib/Pod/Simple/Progress.pm | 93 + .../tlperl.straw/lib/Pod/Simple/PullParser.pm | 844 + .../lib/Pod/Simple/PullParserEndToken.pm | 120 + .../lib/Pod/Simple/PullParserStartToken.pm | 161 + .../lib/Pod/Simple/PullParserTextToken.pm | 128 + .../tlperl.straw/lib/Pod/Simple/PullParserToken.pm | 163 + Master/tlpkg/tlperl.straw/lib/Pod/Simple/RTF.pm | 699 + Master/tlpkg/tlperl.straw/lib/Pod/Simple/Search.pm | 1043 + .../tlperl.straw/lib/Pod/Simple/SimpleTree.pm | 180 + .../tlperl.straw/lib/Pod/Simple/Subclassing.pod | 946 + Master/tlpkg/tlperl.straw/lib/Pod/Simple/Text.pm | 185 + .../tlperl.straw/lib/Pod/Simple/TextContent.pm | 112 + .../tlpkg/tlperl.straw/lib/Pod/Simple/TiedOutFH.pm | 105 + .../tlpkg/tlperl.straw/lib/Pod/Simple/Transcode.pm | 35 + .../tlperl.straw/lib/Pod/Simple/TranscodeDumb.pm | 63 + .../tlperl.straw/lib/Pod/Simple/TranscodeSmart.pm | 44 + Master/tlpkg/tlperl.straw/lib/Pod/Simple/XHTML.pm | 717 + .../tlperl.straw/lib/Pod/Simple/XMLOutStream.pm | 185 + Master/tlpkg/tlperl.straw/lib/Pod/Text.pm | 878 + Master/tlpkg/tlperl.straw/lib/Pod/Text/Color.pm | 155 + .../tlpkg/tlperl.straw/lib/Pod/Text/Overstrike.pm | 208 + Master/tlpkg/tlperl.straw/lib/Pod/Text/Termcap.pm | 195 + Master/tlpkg/tlperl.straw/lib/Pod/Usage.pm | 730 + Master/tlpkg/tlperl.straw/lib/Probe/Perl.pm | 272 + Master/tlpkg/tlperl.straw/lib/SDBM_File.pm | 116 + Master/tlpkg/tlperl.straw/lib/Safe.pm | 663 + Master/tlpkg/tlperl.straw/lib/SelfLoader.pm | 435 + Master/tlpkg/tlperl.straw/lib/Shell.pm | 270 + Master/tlpkg/tlperl.straw/lib/Sort/Versions.pm | 151 + Master/tlpkg/tlperl.straw/lib/Storable.pm | 1188 + Master/tlpkg/tlperl.straw/lib/Sys/Hostname.pm | 165 + Master/tlpkg/tlperl.straw/lib/TAP/Base.pm | 129 + .../tlpkg/tlperl.straw/lib/TAP/Formatter/Base.pm | 449 + .../tlpkg/tlperl.straw/lib/TAP/Formatter/Color.pm | 148 + .../tlperl.straw/lib/TAP/Formatter/Console.pm | 91 + .../lib/TAP/Formatter/Console/ParallelSession.pm | 202 + .../lib/TAP/Formatter/Console/Session.pm | 219 + .../tlpkg/tlperl.straw/lib/TAP/Formatter/File.pm | 58 + .../tlperl.straw/lib/TAP/Formatter/File/Session.pm | 110 + .../tlperl.straw/lib/TAP/Formatter/Session.pm | 183 + Master/tlpkg/tlperl.straw/lib/TAP/Harness.pm | 948 + .../tlpkg/tlperl.straw/lib/TAP/Harness/Beyond.pod | 416 + Master/tlpkg/tlperl.straw/lib/TAP/Object.pm | 158 + Master/tlpkg/tlperl.straw/lib/TAP/Parser.pm | 1894 + .../tlperl.straw/lib/TAP/Parser/Aggregator.pm | 416 + .../tlpkg/tlperl.straw/lib/TAP/Parser/Grammar.pm | 582 + .../tlpkg/tlperl.straw/lib/TAP/Parser/Iterator.pm | 165 + .../tlperl.straw/lib/TAP/Parser/Iterator/Array.pm | 102 + .../lib/TAP/Parser/Iterator/Process.pm | 381 + .../tlperl.straw/lib/TAP/Parser/Iterator/Stream.pm | 108 + .../tlperl.straw/lib/TAP/Parser/IteratorFactory.pm | 342 + .../tlperl.straw/lib/TAP/Parser/Multiplexer.pm | 195 + Master/tlpkg/tlperl.straw/lib/TAP/Parser/Result.pm | 300 + .../tlperl.straw/lib/TAP/Parser/Result/Bailout.pm | 63 + .../tlperl.straw/lib/TAP/Parser/Result/Comment.pm | 61 + .../tlperl.straw/lib/TAP/Parser/Result/Plan.pm | 120 + .../tlperl.straw/lib/TAP/Parser/Result/Pragma.pm | 63 + .../tlperl.straw/lib/TAP/Parser/Result/Test.pm | 274 + .../tlperl.straw/lib/TAP/Parser/Result/Unknown.pm | 51 + .../tlperl.straw/lib/TAP/Parser/Result/Version.pm | 63 + .../tlperl.straw/lib/TAP/Parser/Result/YAML.pm | 62 + .../tlperl.straw/lib/TAP/Parser/ResultFactory.pm | 189 + .../tlpkg/tlperl.straw/lib/TAP/Parser/Scheduler.pm | 312 + .../tlperl.straw/lib/TAP/Parser/Scheduler/Job.pm | 107 + .../lib/TAP/Parser/Scheduler/Spinner.pm | 53 + Master/tlpkg/tlperl.straw/lib/TAP/Parser/Source.pm | 385 + .../tlperl.straw/lib/TAP/Parser/Source/Perl.pm | 326 + .../tlperl.straw/lib/TAP/Parser/SourceHandler.pm | 194 + .../lib/TAP/Parser/SourceHandler/Executable.pm | 185 + .../lib/TAP/Parser/SourceHandler/File.pm | 136 + .../lib/TAP/Parser/SourceHandler/Handle.pm | 125 + .../lib/TAP/Parser/SourceHandler/Perl.pm | 310 + .../lib/TAP/Parser/SourceHandler/RawTAP.pm | 131 + .../lib/TAP/Parser/SourceHandler/pgTAP.pm | 253 + Master/tlpkg/tlperl.straw/lib/TAP/Parser/Utils.pm | 72 + .../tlperl.straw/lib/TAP/Parser/YAMLish/Reader.pm | 333 + .../tlperl.straw/lib/TAP/Parser/YAMLish/Writer.pm | 255 + Master/tlpkg/tlperl.straw/lib/TASKS.pod | 55 + Master/tlpkg/tlperl.straw/lib/Term/ANSIColor.pm | 725 + Master/tlpkg/tlperl.straw/lib/Term/Cap.pm | 799 + Master/tlpkg/tlperl.straw/lib/Term/Complete.pm | 188 + Master/tlpkg/tlperl.straw/lib/Term/ReadKey.pm | 572 + Master/tlpkg/tlperl.straw/lib/Term/ReadLine.pm | 413 + .../tlpkg/tlperl.straw/lib/Term/ReadLine/Perl.pm | 153 + .../tlperl.straw/lib/Term/ReadLine/readline.pm | 4615 ++ Master/tlpkg/tlperl.straw/lib/Term/UI.pm | 620 + Master/tlpkg/tlperl.straw/lib/Term/UI/History.pm | 137 + Master/tlpkg/tlperl.straw/lib/Test/Builder.pm | 2501 + .../tlperl.straw/lib/Test/Builder/IO/Scalar.pm | 658 + .../tlpkg/tlperl.straw/lib/Test/Builder/Module.pm | 173 + .../tlpkg/tlperl.straw/lib/Test/Builder/Tester.pm | 603 + .../tlperl.straw/lib/Test/Builder/Tester/Color.pm | 51 + Master/tlpkg/tlperl.straw/lib/Test/Deep.pm | 517 + Master/tlpkg/tlperl.straw/lib/Test/Deep.pod | 932 + Master/tlpkg/tlperl.straw/lib/Test/Deep/All.pm | 64 + Master/tlpkg/tlperl.straw/lib/Test/Deep/Any.pm | 65 + Master/tlpkg/tlperl.straw/lib/Test/Deep/Array.pm | 36 + .../tlpkg/tlperl.straw/lib/Test/Deep/ArrayEach.pm | 27 + .../lib/Test/Deep/ArrayElementsOnly.pm | 54 + .../tlperl.straw/lib/Test/Deep/ArrayLength.pm | 29 + .../tlperl.straw/lib/Test/Deep/ArrayLengthOnly.pm | 60 + Master/tlpkg/tlperl.straw/lib/Test/Deep/Blessed.pm | 47 + Master/tlpkg/tlperl.straw/lib/Test/Deep/Boolean.pm | 46 + Master/tlpkg/tlperl.straw/lib/Test/Deep/Cache.pm | 78 + .../tlperl.straw/lib/Test/Deep/Cache/Simple.pm | 81 + Master/tlpkg/tlperl.straw/lib/Test/Deep/Class.pm | 29 + Master/tlpkg/tlperl.straw/lib/Test/Deep/Cmp.pm | 130 + Master/tlpkg/tlperl.straw/lib/Test/Deep/Code.pm | 58 + Master/tlpkg/tlperl.straw/lib/Test/Deep/Hash.pm | 104 + .../tlpkg/tlperl.straw/lib/Test/Deep/HashEach.pm | 29 + .../tlperl.straw/lib/Test/Deep/HashElements.pm | 94 + .../tlpkg/tlperl.straw/lib/Test/Deep/HashKeys.pm | 68 + .../tlperl.straw/lib/Test/Deep/HashKeysOnly.pm | 126 + Master/tlpkg/tlperl.straw/lib/Test/Deep/Ignore.pm | 20 + Master/tlpkg/tlperl.straw/lib/Test/Deep/Isa.pm | 33 + .../tlperl.straw/lib/Test/Deep/ListMethods.pm | 24 + Master/tlpkg/tlperl.straw/lib/Test/Deep/MM.pm | 64 + Master/tlpkg/tlperl.straw/lib/Test/Deep/Methods.pm | 78 + Master/tlpkg/tlperl.straw/lib/Test/Deep/NoTest.pm | 41 + Master/tlpkg/tlperl.straw/lib/Test/Deep/Number.pm | 80 + Master/tlpkg/tlperl.straw/lib/Test/Deep/Ref.pm | 36 + Master/tlpkg/tlperl.straw/lib/Test/Deep/RefType.pm | 46 + Master/tlpkg/tlperl.straw/lib/Test/Deep/Regexp.pm | 85 + .../tlperl.straw/lib/Test/Deep/RegexpMatches.pm | 51 + .../tlpkg/tlperl.straw/lib/Test/Deep/RegexpOnly.pm | 47 + .../tlpkg/tlperl.straw/lib/Test/Deep/RegexpRef.pm | 43 + .../tlperl.straw/lib/Test/Deep/RegexpRefOnly.pm | 43 + .../tlperl.straw/lib/Test/Deep/RegexpVersion.pm | 13 + .../tlpkg/tlperl.straw/lib/Test/Deep/ScalarRef.pm | 29 + .../tlperl.straw/lib/Test/Deep/ScalarRefOnly.pm | 36 + Master/tlpkg/tlperl.straw/lib/Test/Deep/Set.pm | 185 + Master/tlpkg/tlperl.straw/lib/Test/Deep/Shallow.pm | 51 + Master/tlpkg/tlperl.straw/lib/Test/Deep/Stack.pm | 84 + Master/tlpkg/tlperl.straw/lib/Test/Deep/String.pm | 34 + Master/tlpkg/tlperl.straw/lib/Test/Exception.pm | 464 + Master/tlpkg/tlperl.straw/lib/Test/Harness.pm | 591 + Master/tlpkg/tlperl.straw/lib/Test/Manifest.pm | 336 + Master/tlpkg/tlperl.straw/lib/Test/More.pm | 1776 + Master/tlpkg/tlperl.straw/lib/Test/NoWarnings.pm | 305 + .../tlperl.straw/lib/Test/NoWarnings/Warning.pm | 79 + Master/tlpkg/tlperl.straw/lib/Test/Script.pm | 238 + Master/tlpkg/tlperl.straw/lib/Test/Simple.pm | 214 + Master/tlpkg/tlperl.straw/lib/Test/Tester.pm | 645 + .../tlpkg/tlperl.straw/lib/Test/Tester/Capture.pm | 223 + .../tlperl.straw/lib/Test/Tester/CaptureRunner.pm | 76 + .../tlpkg/tlperl.straw/lib/Test/Tester/Delegate.pm | 32 + Master/tlpkg/tlperl.straw/lib/Test/Tutorial.pod | 604 + Master/tlpkg/tlperl.straw/lib/Test/Warn.pm | 535 + Master/tlpkg/tlperl.straw/lib/Test/YAML.pm | 270 + Master/tlpkg/tlperl.straw/lib/Thread/Queue.pm | 481 + Master/tlpkg/tlperl.straw/lib/Thread/Semaphore.pm | 170 + Master/tlpkg/tlperl.straw/lib/Tie/Array.pm | 287 + Master/tlpkg/tlperl.straw/lib/Tie/EncryptedHash.pm | 451 + Master/tlpkg/tlperl.straw/lib/Tie/File.pm | 2632 ++ Master/tlpkg/tlperl.straw/lib/Tie/Handle.pm | 201 + Master/tlpkg/tlperl.straw/lib/Tie/Hash.pm | 257 + .../tlperl.straw/lib/Tie/Hash/NamedCapture.pm | 62 + Master/tlpkg/tlperl.straw/lib/Tie/Memoize.pm | 128 + Master/tlpkg/tlperl.straw/lib/Tie/RefHash.pm | 274 + Master/tlpkg/tlperl.straw/lib/Tie/Registry.pm | 45 + Master/tlpkg/tlperl.straw/lib/Tie/Scalar.pm | 140 + Master/tlpkg/tlperl.straw/lib/Tie/StdHandle.pm | 71 + Master/tlpkg/tlperl.straw/lib/Tie/SubstrHash.pm | 215 + Master/tlpkg/tlperl.straw/lib/Tie/Watch.pm | 560 + Master/tlpkg/tlperl.straw/lib/Time/HiRes.pm | 591 + Master/tlpkg/tlperl.straw/lib/Time/Local.pm | 371 + Master/tlpkg/tlperl.straw/lib/Time/Piece.pm | 874 + Master/tlpkg/tlperl.straw/lib/Time/Seconds.pm | 230 + Master/tlpkg/tlperl.straw/lib/Time/gmtime.pm | 91 + Master/tlpkg/tlperl.straw/lib/Time/localtime.pm | 86 + Master/tlpkg/tlperl.straw/lib/Time/tm.pm | 33 + Master/tlpkg/tlperl.straw/lib/Tk/804delta.pod | 110 + Master/tlpkg/tlperl.straw/lib/Tk/Adjuster.pm | 438 + Master/tlpkg/tlperl.straw/lib/Tk/Adjuster.pod | 223 + Master/tlpkg/tlperl.straw/lib/Tk/After.pm | 104 + Master/tlpkg/tlperl.straw/lib/Tk/Animation.pm | 230 + Master/tlpkg/tlperl.straw/lib/Tk/Animation.pod | 92 + Master/tlpkg/tlperl.straw/lib/Tk/Balloon.pm | 633 + Master/tlpkg/tlperl.straw/lib/Tk/Balloon.pod | 282 + Master/tlpkg/tlperl.straw/lib/Tk/Bitmap.pm | 10 + Master/tlpkg/tlperl.straw/lib/Tk/Bitmap.pod | 103 + Master/tlpkg/tlperl.straw/lib/Tk/BrowseEntry.pm | 522 + Master/tlpkg/tlperl.straw/lib/Tk/BrowseEntry.pod | 210 + Master/tlpkg/tlperl.straw/lib/Tk/Button.pm | 247 + Master/tlpkg/tlperl.straw/lib/Tk/Button.pod | 255 + Master/tlpkg/tlperl.straw/lib/Tk/Camel.xpm | 41 + Master/tlpkg/tlperl.straw/lib/Tk/Canvas.pm | 1436 + Master/tlpkg/tlperl.straw/lib/Tk/Canvas.pod | 2393 + Master/tlpkg/tlperl.straw/lib/Tk/Checkbutton.pm | 42 + Master/tlpkg/tlperl.straw/lib/Tk/Checkbutton.pod | 347 + Master/tlpkg/tlperl.straw/lib/Tk/Clipboard.pm | 122 + Master/tlpkg/tlperl.straw/lib/Tk/Clipboard.pod | 89 + Master/tlpkg/tlperl.straw/lib/Tk/CmdLine.pm | 497 + Master/tlpkg/tlperl.straw/lib/Tk/CmdLine.pod | 454 + Master/tlpkg/tlperl.straw/lib/Tk/ColorEdit.xpm | 58 + Master/tlpkg/tlperl.straw/lib/Tk/ColorEditor.pm | 768 + Master/tlpkg/tlperl.straw/lib/Tk/ColorEditor.pod | 120 + Master/tlpkg/tlperl.straw/lib/Tk/Common.pod | 16 + Master/tlpkg/tlperl.straw/lib/Tk/Compound.pm | 40 + Master/tlpkg/tlperl.straw/lib/Tk/Compound.pod | 298 + Master/tlpkg/tlperl.straw/lib/Tk/Config.pm | 13 + Master/tlpkg/tlperl.straw/lib/Tk/ConfigSpecs.pod | 262 + Master/tlpkg/tlperl.straw/lib/Tk/Configure.pm | 69 + Master/tlpkg/tlperl.straw/lib/Tk/Credits | 7 + Master/tlpkg/tlperl.straw/lib/Tk/DItem.pod | 439 + Master/tlpkg/tlperl.straw/lib/Tk/Derived.pm | 512 + Master/tlpkg/tlperl.straw/lib/Tk/Derived.pod | 89 + Master/tlpkg/tlperl.straw/lib/Tk/Dialog.pm | 68 + Master/tlpkg/tlperl.straw/lib/Tk/Dialog.pod | 107 + Master/tlpkg/tlperl.straw/lib/Tk/DialogBox.pm | 146 + Master/tlpkg/tlperl.straw/lib/Tk/DialogBox.pod | 156 + Master/tlpkg/tlperl.straw/lib/Tk/DirTree.pm | 259 + Master/tlpkg/tlperl.straw/lib/Tk/DirTree.pod | 172 + Master/tlpkg/tlperl.straw/lib/Tk/Dirlist.pm | 113 + Master/tlpkg/tlperl.straw/lib/Tk/DragDrop.pm | 332 + .../tlpkg/tlperl.straw/lib/Tk/DragDrop/Common.pm | 61 + .../tlperl.straw/lib/Tk/DragDrop/LocalDrop.pm | 61 + Master/tlpkg/tlperl.straw/lib/Tk/DragDrop/Rect.pm | 110 + .../tlpkg/tlperl.straw/lib/Tk/DragDrop/SunConst.pm | 34 + .../tlpkg/tlperl.straw/lib/Tk/DragDrop/SunDrop.pm | 200 + .../tlpkg/tlperl.straw/lib/Tk/DragDrop/SunSite.pm | 107 + .../tlperl.straw/lib/Tk/DragDrop/Win32Drop.pm | 8 + .../tlperl.straw/lib/Tk/DragDrop/Win32Site.pm | 50 + .../tlpkg/tlperl.straw/lib/Tk/DragDrop/XDNDDrop.pm | 145 + .../tlpkg/tlperl.straw/lib/Tk/DragDrop/XDNDSite.pm | 159 + Master/tlpkg/tlperl.straw/lib/Tk/DropSite.pm | 257 + Master/tlpkg/tlperl.straw/lib/Tk/DropSite.pod | 33 + Master/tlpkg/tlperl.straw/lib/Tk/DummyEncode.pm | 46 + Master/tlpkg/tlperl.straw/lib/Tk/English.pm | 307 + Master/tlpkg/tlperl.straw/lib/Tk/Entry.pm | 615 + Master/tlpkg/tlperl.straw/lib/Tk/Entry.pod | 693 + Master/tlpkg/tlperl.straw/lib/Tk/Error.pod | 145 + Master/tlpkg/tlperl.straw/lib/Tk/ErrorDialog.pm | 125 + Master/tlpkg/tlperl.straw/lib/Tk/Event.pm | 14 + Master/tlpkg/tlperl.straw/lib/Tk/Event/IO.pm | 132 + Master/tlpkg/tlperl.straw/lib/Tk/Eventloop.pod | 62 + Master/tlpkg/tlperl.straw/lib/Tk/FBox.pm | 1063 + Master/tlpkg/tlperl.straw/lib/Tk/FBox.pod | 67 + Master/tlpkg/tlperl.straw/lib/Tk/FileSelect.pm | 577 + Master/tlpkg/tlperl.straw/lib/Tk/FileSelect.pod | 146 + Master/tlpkg/tlperl.straw/lib/Tk/FloatEntry.pm | 109 + Master/tlpkg/tlperl.straw/lib/Tk/Font.pm | 163 + Master/tlpkg/tlperl.straw/lib/Tk/Font.pod | 407 + Master/tlpkg/tlperl.straw/lib/Tk/Frame.pm | 378 + Master/tlpkg/tlperl.straw/lib/Tk/Frame.pod | 146 + Master/tlpkg/tlperl.straw/lib/Tk/HList.pm | 685 + Master/tlpkg/tlperl.straw/lib/Tk/HList.pod | 1050 + Master/tlpkg/tlperl.straw/lib/Tk/IO.pm | 182 + Master/tlpkg/tlperl.straw/lib/Tk/IO.pod | 51 + Master/tlpkg/tlperl.straw/lib/Tk/IconList.pm | 712 + Master/tlpkg/tlperl.straw/lib/Tk/IconList.pod | 82 + Master/tlpkg/tlperl.straw/lib/Tk/Image.pm | 74 + Master/tlpkg/tlperl.straw/lib/Tk/Image.pod | 145 + Master/tlpkg/tlperl.straw/lib/Tk/InputO.pod | 50 + Master/tlpkg/tlperl.straw/lib/Tk/Internals.pod | 142 + Master/tlpkg/tlperl.straw/lib/Tk/ItemStyle.pm | 38 + Master/tlpkg/tlperl.straw/lib/Tk/JPEG.pm | 57 + Master/tlpkg/tlperl.straw/lib/Tk/LabEntry.pm | 31 + Master/tlpkg/tlperl.straw/lib/Tk/LabFrame.pm | 138 + Master/tlpkg/tlperl.straw/lib/Tk/LabFrame.pod | 110 + Master/tlpkg/tlperl.straw/lib/Tk/LabRadio.pm | 63 + Master/tlpkg/tlperl.straw/lib/Tk/Label.pm | 21 + Master/tlpkg/tlperl.straw/lib/Tk/Label.pod | 133 + Master/tlpkg/tlperl.straw/lib/Tk/Labelframe.pm | 16 + Master/tlpkg/tlperl.straw/lib/Tk/Labelframe.pod | 206 + Master/tlpkg/tlperl.straw/lib/Tk/Listbox.pm | 910 + Master/tlpkg/tlperl.straw/lib/Tk/Listbox.pod | 794 + Master/tlpkg/tlperl.straw/lib/Tk/MMtry.pm | 58 + Master/tlpkg/tlperl.straw/lib/Tk/MMutil.pm | 602 + Master/tlpkg/tlperl.straw/lib/Tk/MainWindow.pm | 212 + Master/tlpkg/tlperl.straw/lib/Tk/MainWindow.pod | 85 + Master/tlpkg/tlperl.straw/lib/Tk/MakeDepend.pm | 292 + Master/tlpkg/tlperl.straw/lib/Tk/Menu.pm | 1201 + Master/tlpkg/tlperl.straw/lib/Tk/Menu.pod | 876 + Master/tlpkg/tlperl.straw/lib/Tk/Menu/Item.pm | 178 + Master/tlpkg/tlperl.straw/lib/Tk/Menu/Item.pod | 96 + Master/tlpkg/tlperl.straw/lib/Tk/Menubar.pm | 15 + Master/tlpkg/tlperl.straw/lib/Tk/Menubutton.pm | 401 + Master/tlpkg/tlperl.straw/lib/Tk/Menubutton.pod | 249 + Master/tlpkg/tlperl.straw/lib/Tk/Message.pm | 20 + Master/tlpkg/tlperl.straw/lib/Tk/Message.pod | 151 + Master/tlpkg/tlperl.straw/lib/Tk/MsgBox.pm | 505 + Master/tlpkg/tlperl.straw/lib/Tk/MsgBox.pod | 83 + Master/tlpkg/tlperl.straw/lib/Tk/Mwm.pod | 109 + Master/tlpkg/tlperl.straw/lib/Tk/NBFrame.pm | 20 + Master/tlpkg/tlperl.straw/lib/Tk/NoteBook.pm | 480 + Master/tlpkg/tlperl.straw/lib/Tk/NoteBook.pod | 231 + Master/tlpkg/tlperl.straw/lib/Tk/Optionmenu.pm | 128 + Master/tlpkg/tlperl.straw/lib/Tk/Optionmenu.pod | 100 + Master/tlpkg/tlperl.straw/lib/Tk/PNG.pm | 50 + Master/tlpkg/tlperl.straw/lib/Tk/Pane.pm | 544 + Master/tlpkg/tlperl.straw/lib/Tk/Panedwindow.pm | 221 + Master/tlpkg/tlperl.straw/lib/Tk/Panedwindow.pod | 326 + Master/tlpkg/tlperl.straw/lib/Tk/Photo.pm | 22 + Master/tlpkg/tlperl.straw/lib/Tk/Photo.pod | 475 + Master/tlpkg/tlperl.straw/lib/Tk/Pixmap.pm | 19 + Master/tlpkg/tlperl.straw/lib/Tk/Pixmap.pod | 64 + Master/tlpkg/tlperl.straw/lib/Tk/Popup.pod | 89 + Master/tlpkg/tlperl.straw/lib/Tk/Pretty.pm | 93 + Master/tlpkg/tlperl.straw/lib/Tk/ProgressBar.pm | 498 + Master/tlpkg/tlperl.straw/lib/Tk/README.Adjust | 77 + Master/tlpkg/tlperl.straw/lib/Tk/ROText.pm | 43 + Master/tlpkg/tlperl.straw/lib/Tk/ROText.pod | 31 + Master/tlpkg/tlperl.straw/lib/Tk/Radiobutton.pm | 45 + Master/tlpkg/tlperl.straw/lib/Tk/Radiobutton.pod | 333 + Master/tlpkg/tlperl.straw/lib/Tk/Region.pm | 182 + Master/tlpkg/tlperl.straw/lib/Tk/Reindex.pm | 233 + .../tlpkg/tlperl.straw/lib/Tk/ReindexedROText.pm | 13 + Master/tlpkg/tlperl.straw/lib/Tk/ReindexedText.pm | 13 + Master/tlpkg/tlperl.straw/lib/Tk/Scale.pm | 278 + Master/tlpkg/tlperl.straw/lib/Tk/Scale.pod | 356 + Master/tlpkg/tlperl.straw/lib/Tk/Scrollbar.pm | 429 + Master/tlpkg/tlperl.straw/lib/Tk/Scrollbar.pod | 429 + Master/tlpkg/tlperl.straw/lib/Tk/Scrolled.pod | 86 + Master/tlpkg/tlperl.straw/lib/Tk/Spinbox.pm | 115 + Master/tlpkg/tlperl.straw/lib/Tk/Spinbox.pod | 819 + Master/tlpkg/tlperl.straw/lib/Tk/Stats.pm | 26 + Master/tlpkg/tlperl.straw/lib/Tk/Submethods.pm | 45 + Master/tlpkg/tlperl.straw/lib/Tk/Submethods.pod | 27 + Master/tlpkg/tlperl.straw/lib/Tk/SunConst.pod | 18 + Master/tlpkg/tlperl.straw/lib/Tk/TList.pm | 416 + Master/tlpkg/tlperl.straw/lib/Tk/TList.pod | 597 + Master/tlpkg/tlperl.straw/lib/Tk/Table.pm | 598 + Master/tlpkg/tlperl.straw/lib/Tk/Table.pod | 97 + Master/tlpkg/tlperl.straw/lib/Tk/Tcl-perl.pod | 200 + Master/tlpkg/tlperl.straw/lib/Tk/Text.pm | 1662 + Master/tlpkg/tlperl.straw/lib/Tk/Text.pod | 2215 + Master/tlpkg/tlperl.straw/lib/Tk/Text/Tag.pm | 46 + Master/tlpkg/tlperl.straw/lib/Tk/TextEdit.pm | 509 + Master/tlpkg/tlperl.straw/lib/Tk/TextList.pm | 982 + Master/tlpkg/tlperl.straw/lib/Tk/TextUndo.pm | 1022 + Master/tlpkg/tlperl.straw/lib/Tk/TextUndo.pod | 73 + Master/tlpkg/tlperl.straw/lib/Tk/Tiler.pm | 203 + Master/tlpkg/tlperl.straw/lib/Tk/Tiler.pod | 32 + Master/tlpkg/tlperl.straw/lib/Tk/TixGrid.pm | 1597 + Master/tlpkg/tlperl.straw/lib/Tk/TixGrid.pod | 539 + Master/tlpkg/tlperl.straw/lib/Tk/Tk.xbm | 44 + Master/tlpkg/tlperl.straw/lib/Tk/Tk.xpm | 41 + Master/tlpkg/tlperl.straw/lib/Tk/TkXSUB.def | 62 + Master/tlpkg/tlperl.straw/lib/Tk/Toplevel.pm | 211 + Master/tlpkg/tlperl.straw/lib/Tk/Toplevel.pod | 199 + Master/tlpkg/tlperl.straw/lib/Tk/Trace.pm | 405 + Master/tlpkg/tlperl.straw/lib/Tk/Tree.pm | 313 + Master/tlpkg/tlperl.straw/lib/Tk/Tree.pod | 274 + Master/tlpkg/tlperl.straw/lib/Tk/UserGuide.pod | 493 + Master/tlpkg/tlperl.straw/lib/Tk/Widget.pm | 1770 + Master/tlpkg/tlperl.straw/lib/Tk/Widget.pod | 678 + Master/tlpkg/tlperl.straw/lib/Tk/WidgetDemo.pod | 59 + Master/tlpkg/tlperl.straw/lib/Tk/Wm.pm | 174 + Master/tlpkg/tlperl.straw/lib/Tk/Wm.pod | 668 + Master/tlpkg/tlperl.straw/lib/Tk/X.pm | 391 + Master/tlpkg/tlperl.straw/lib/Tk/X.pod | 373 + Master/tlpkg/tlperl.straw/lib/Tk/X11/X.h | 677 + Master/tlpkg/tlperl.straw/lib/Tk/X11/Xatom.h | 79 + Master/tlpkg/tlperl.straw/lib/Tk/X11/Xfuncproto.h | 60 + Master/tlpkg/tlperl.straw/lib/Tk/X11/Xlib.h | 1214 + Master/tlpkg/tlperl.straw/lib/Tk/X11/Xutil.h | 855 + Master/tlpkg/tlperl.straw/lib/Tk/X11/cursorfont.h | 79 + Master/tlpkg/tlperl.straw/lib/Tk/X11/keysym.h | 39 + Master/tlpkg/tlperl.straw/lib/Tk/X11/keysymdef.h | 1169 + Master/tlpkg/tlperl.straw/lib/Tk/X11/license.terms | 39 + Master/tlpkg/tlperl.straw/lib/Tk/X11Font.pm | 184 + Master/tlpkg/tlperl.straw/lib/Tk/X11Font.pod | 88 + Master/tlpkg/tlperl.straw/lib/Tk/Xcamel.gif | Bin 0 -> 4193 bytes Master/tlpkg/tlperl.straw/lib/Tk/Xlib.pm | 15 + Master/tlpkg/tlperl.straw/lib/Tk/Xrm.pm | 9 + Master/tlpkg/tlperl.straw/lib/Tk/Xrm.pod | 45 + Master/tlpkg/tlperl.straw/lib/Tk/act_folder.xbm | 5 + Master/tlpkg/tlperl.straw/lib/Tk/act_folder.xpm | 22 + Master/tlpkg/tlperl.straw/lib/Tk/after.pod | 168 + Master/tlpkg/tlperl.straw/lib/Tk/anim.gif | Bin 0 -> 2533 bytes Master/tlpkg/tlperl.straw/lib/Tk/arrowdownwin.xbm | 5 + Master/tlpkg/tlperl.straw/lib/Tk/balArrow.xbm | 4 + Master/tlpkg/tlperl.straw/lib/Tk/bind.pod | 583 + Master/tlpkg/tlperl.straw/lib/Tk/bindtags.pod | 107 + Master/tlpkg/tlperl.straw/lib/Tk/callbacks.pod | 104 + Master/tlpkg/tlperl.straw/lib/Tk/cbxarrow.xbm | 6 + Master/tlpkg/tlperl.straw/lib/Tk/chooseColor.pod | 64 + .../tlpkg/tlperl.straw/lib/Tk/chooseDirectory.pod | 85 + Master/tlpkg/tlperl.straw/lib/Tk/composite.pod | 171 + .../tlpkg/tlperl.straw/lib/Tk/demos/LabEnLabRad.pm | 41 + .../tlperl.straw/lib/Tk/demos/images/QuitPB.xpm | 48 + .../tlperl.straw/lib/Tk/demos/images/QuitPBa.xpm | 48 + .../tlpkg/tlperl.straw/lib/Tk/demos/images/c.icon | 16 + .../tlperl.straw/lib/Tk/demos/images/cursor.cur | Bin 0 -> 326 bytes .../tlperl.straw/lib/Tk/demos/images/cursor.mask | 6 + .../tlperl.straw/lib/Tk/demos/images/cursor.xbm | 8 + .../tlperl.straw/lib/Tk/demos/images/dir.icon | 16 + .../tlperl.straw/lib/Tk/demos/images/dir.mask | 16 + .../tlperl.straw/lib/Tk/demos/images/earth.gif | Bin 0 -> 51712 bytes .../tlperl.straw/lib/Tk/demos/images/earthris.gif | Bin 0 -> 6343 bytes Master/tlpkg/tlperl.straw/lib/Tk/demos/images/face | 173 + .../tlperl.straw/lib/Tk/demos/images/flagdown | 27 + .../tlpkg/tlperl.straw/lib/Tk/demos/images/flagup | 27 + .../tlpkg/tlperl.straw/lib/Tk/demos/images/grey.25 | 6 + .../tlpkg/tlperl.straw/lib/Tk/demos/images/grey.5 | 6 + .../tlpkg/tlperl.straw/lib/Tk/demos/images/letters | 27 + .../tlperl.straw/lib/Tk/demos/images/mickey.gif | Bin 0 -> 9344 bytes .../tlpkg/tlperl.straw/lib/Tk/demos/images/ned.xpm | 69 + .../tlperl.straw/lib/Tk/demos/images/noletters | 27 + .../tlperl.straw/lib/Tk/demos/images/page.icon | 16 + .../tlperl.straw/lib/Tk/demos/images/page.mask | 16 + .../tlpkg/tlperl.straw/lib/Tk/demos/images/pattern | 6 + .../tlperl.straw/lib/Tk/demos/images/teapot.ppm | 31 + .../tlperl.straw/lib/Tk/demos/widget_lib/Ball.pm | 143 + .../tlperl.straw/lib/Tk/demos/widget_lib/HList.pl | 65 + .../tlperl.straw/lib/Tk/demos/widget_lib/HList2.pl | 124 + .../tlperl.straw/lib/Tk/demos/widget_lib/Plot.pm | 198 + .../lib/Tk/demos/widget_lib/WidgetDemo.pm | 130 + .../tlperl.straw/lib/Tk/demos/widget_lib/arrows.pl | 242 + .../lib/Tk/demos/widget_lib/balloon.pl | 168 + .../tlperl.straw/lib/Tk/demos/widget_lib/bind.pl | 65 + .../lib/Tk/demos/widget_lib/bitmaps.pl | 44 + .../tlperl.straw/lib/Tk/demos/widget_lib/bounce.pl | 274 + .../lib/Tk/demos/widget_lib/browseentry.pl | 34 + .../lib/Tk/demos/widget_lib/browseentry2.pl | 39 + .../tlperl.straw/lib/Tk/demos/widget_lib/button.pl | 28 + .../tlperl.straw/lib/Tk/demos/widget_lib/check.pl | 44 + .../lib/Tk/demos/widget_lib/choosedir.pl | 39 + .../lib/Tk/demos/widget_lib/clrpick.pl | 45 + .../tlperl.straw/lib/Tk/demos/widget_lib/colors.pl | 85 + .../lib/Tk/demos/widget_lib/cscroll.pl | 86 + .../tlperl.straw/lib/Tk/demos/widget_lib/ctext.pl | 170 + .../lib/Tk/demos/widget_lib/dialog1.pl | 33 + .../lib/Tk/demos/widget_lib/dialog2.pl | 33 + .../lib/Tk/demos/widget_lib/dirtree.pl | 7 + .../tlperl.straw/lib/Tk/demos/widget_lib/entry1.pl | 28 + .../tlperl.straw/lib/Tk/demos/widget_lib/entry2.pl | 33 + .../tlperl.straw/lib/Tk/demos/widget_lib/entry3.pl | 199 + .../lib/Tk/demos/widget_lib/filebox.pl | 106 + .../tlperl.straw/lib/Tk/demos/widget_lib/floor.pl | 1324 + .../tlperl.straw/lib/Tk/demos/widget_lib/form.pl | 31 + .../lib/Tk/demos/widget_lib/form_mgr.pl | 21 + .../tlperl.straw/lib/Tk/demos/widget_lib/hello.pl | 51 + .../tlperl.straw/lib/Tk/demos/widget_lib/hscale.pl | 48 + .../tlperl.straw/lib/Tk/demos/widget_lib/icon.pl | 64 + .../tlperl.straw/lib/Tk/demos/widget_lib/image1.pl | 28 + .../tlperl.straw/lib/Tk/demos/widget_lib/image2.pl | 104 + .../tlperl.straw/lib/Tk/demos/widget_lib/items.pl | 358 + .../lib/Tk/demos/widget_lib/keysyms.pl | 20 + .../lib/Tk/demos/widget_lib/labelframe.pl | 74 + .../tlperl.straw/lib/Tk/demos/widget_lib/labels.pl | 43 + .../lib/Tk/demos/widget_lib/labframe.pl | 13 + .../tlperl.straw/lib/Tk/demos/widget_lib/mega.pl | 135 + .../tlperl.straw/lib/Tk/demos/widget_lib/menbut.pl | 122 + .../tlperl.straw/lib/Tk/demos/widget_lib/menus.pl | 196 + .../tlperl.straw/lib/Tk/demos/widget_lib/menus2.pl | 216 + .../tlperl.straw/lib/Tk/demos/widget_lib/msgBox.pl | 82 + .../lib/Tk/demos/widget_lib/notebook.pl | 59 + .../tlperl.straw/lib/Tk/demos/widget_lib/paned1.pl | 26 + .../tlperl.straw/lib/Tk/demos/widget_lib/paned2.pl | 65 + .../tlperl.straw/lib/Tk/demos/widget_lib/photo1.pl | 30 + .../tlperl.straw/lib/Tk/demos/widget_lib/photo2.pl | 156 + .../tlperl.straw/lib/Tk/demos/widget_lib/plot.pl | 28 + .../lib/Tk/demos/widget_lib/progress.pl | 46 + .../tlperl.straw/lib/Tk/demos/widget_lib/puzzle.pl | 86 + .../tlperl.straw/lib/Tk/demos/widget_lib/radio.pl | 78 + .../tlperl.straw/lib/Tk/demos/widget_lib/ruler.pl | 146 + .../lib/Tk/demos/widget_lib/sayings.pl | 48 + .../tlperl.straw/lib/Tk/demos/widget_lib/search.pl | 177 + .../lib/Tk/demos/widget_lib/showVars.pl | 37 + .../tlperl.straw/lib/Tk/demos/widget_lib/slide.pl | 178 + .../tlperl.straw/lib/Tk/demos/widget_lib/spin.pl | 36 + .../tlperl.straw/lib/Tk/demos/widget_lib/states.pl | 28 + .../tlperl.straw/lib/Tk/demos/widget_lib/style.pl | 154 + .../tlperl.straw/lib/Tk/demos/widget_lib/texts.pl | 71 + .../tlperl.straw/lib/Tk/demos/widget_lib/trace1.pl | 49 + .../tlperl.straw/lib/Tk/demos/widget_lib/trace2.pl | 188 + .../lib/Tk/demos/widget_lib/transtile.pl | 113 + .../tlperl.straw/lib/Tk/demos/widget_lib/twind.pl | 186 + .../lib/Tk/demos/widget_lib/unicodeout.pl | 64 + .../lib/Tk/demos/widget_lib/virtevents1.pl | 59 + .../tlperl.straw/lib/Tk/demos/widget_lib/vscale.pl | 48 + .../tlperl.straw/lib/Tk/demos/widtrib/Gedi.pl | 429 + .../tlperl.straw/lib/Tk/demos/widtrib/TEMPLATE.pl | 92 + .../tlperl.straw/lib/Tk/demos/widtrib/Tiler.pl | 15 + .../tlpkg/tlperl.straw/lib/Tk/demos/widtrib/all.pl | 315 + .../tlperl.straw/lib/Tk/demos/widtrib/cursor.pl | 61 + .../lib/Tk/demos/widtrib/lib/npuz/Xcamel.npuz | Bin 0 -> 26699 bytes .../tlperl.straw/lib/Tk/demos/widtrib/npuz.pl | 226 + .../tlperl.straw/lib/Tk/demos/widtrib/plop.pl | 381 + Master/tlpkg/tlperl.straw/lib/Tk/event.pod | 417 + Master/tlpkg/tlperl.straw/lib/Tk/exit.pod | 42 + Master/tlpkg/tlperl.straw/lib/Tk/file.xbm | 5 + Master/tlpkg/tlperl.straw/lib/Tk/file.xpm | 18 + Master/tlpkg/tlperl.straw/lib/Tk/fileevent.pod | 112 + Master/tlpkg/tlperl.straw/lib/Tk/focus.pod | 166 + Master/tlpkg/tlperl.straw/lib/Tk/folder.xbm | 5 + Master/tlpkg/tlperl.straw/lib/Tk/folder.xpm | 21 + Master/tlpkg/tlperl.straw/lib/Tk/form.pod | 397 + Master/tlpkg/tlperl.straw/lib/Tk/getOpenFile.pod | 182 + Master/tlpkg/tlperl.straw/lib/Tk/grab.pod | 140 + Master/tlpkg/tlperl.straw/lib/Tk/grid.pod | 409 + Master/tlpkg/tlperl.straw/lib/Tk/icon.gif | Bin 0 -> 1924 bytes Master/tlpkg/tlperl.straw/lib/Tk/install.pm | 37 + Master/tlpkg/tlperl.straw/lib/Tk/license.terms | 35 + Master/tlpkg/tlperl.straw/lib/Tk/mega.pod | 423 + Master/tlpkg/tlperl.straw/lib/Tk/messageBox.pod | 67 + Master/tlpkg/tlperl.straw/lib/Tk/openfile.xbm | 5 + Master/tlpkg/tlperl.straw/lib/Tk/openfolder.xbm | 5 + Master/tlpkg/tlperl.straw/lib/Tk/openfolder.xpm | 21 + Master/tlpkg/tlperl.straw/lib/Tk/option.pod | 217 + Master/tlpkg/tlperl.straw/lib/Tk/options.pod | 787 + Master/tlpkg/tlperl.straw/lib/Tk/overview.pod | 138 + Master/tlpkg/tlperl.straw/lib/Tk/pTk.pod | 550 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/Lang.h | 206 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/Lang.m | 192 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/Lang.t | 217 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/Lang_f.h | 14 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/Tcl-pTk | 260 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/Xlib.h | 149 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/Xlib.m | 661 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/Xlib.t | 657 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/Xlib_f.h | 14 + .../tlpkg/tlperl.straw/lib/Tk/pTk/compat/limits.h | 22 + .../tlpkg/tlperl.straw/lib/Tk/pTk/compat/stdlib.h | 45 + .../tlpkg/tlperl.straw/lib/Tk/pTk/compat/unistd.h | 87 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/default.h | 36 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/img.h | 41 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/imgInt.h | 75 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/imgInt.m | 62 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/imgInt.t | 93 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/imgInt_f.h | 14 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/ks_names.h | 925 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/mkVFunc | 427 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/moredefs.h | 131 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/port.h | 32 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tcl.h | 2411 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tclDecls.h | 4143 ++ Master/tlpkg/tlperl.straw/lib/Tk/pTk/tclDecls.m | 538 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tclDecls.t | 675 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tclDecls_f.h | 14 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tclIntDecls.h | 1324 + .../tlperl.straw/lib/Tk/pTk/tclIntPlatDecls.h | 585 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tclMath.h | 27 + .../tlpkg/tlperl.straw/lib/Tk/pTk/tclPlatDecls.h | 197 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tclWinInt.h | 145 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tix.h | 512 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tix.m | 126 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tix.t | 170 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixBitmaps.h | 618 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixDef.h | 173 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixForm.h | 143 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixGrData.h | 88 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixGrid.h | 458 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixHList.h | 323 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixImgXpm.h | 134 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixImgXpm.m | 34 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixImgXpm.t | 49 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixImgXpm_f.h | 14 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixInt.h | 886 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixInt.m | 171 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixInt.t | 249 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixInt_f.h | 14 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixPort.h | 110 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixTList.h | 148 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixWinInt.h | 23 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixWinPort.h | 40 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tix_f.h | 14 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tk.h | 1859 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tk.m | 94 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tk.t | 151 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tk3d.h | 102 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkButton.h | 320 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkCanvas.h | 334 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkCanvases.h | 81 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkColor.h | 89 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkConfig.h | 11 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkDecls.h | 2277 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkDecls.m | 870 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkDecls.t | 1158 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkDecls_f.h | 14 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkEvent.h | 122 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkEvent.m | 274 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkEvent.t | 304 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkEvent_f.h | 14 + .../tlpkg/tlperl.straw/lib/Tk/pTk/tkFileFilter.h | 92 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkFont.h | 226 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkImgPhoto.h | 36 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkImgPhoto.m | 55 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkImgPhoto.t | 66 + .../tlpkg/tlperl.straw/lib/Tk/pTk/tkImgPhoto_f.h | 14 + .../tlpkg/tlperl.straw/lib/Tk/pTk/tkInitScript.h | 58 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkInt.h | 1200 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkInt.m | 125 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkInt.t | 182 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkIntDecls.h | 1572 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkIntDecls.m | 466 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkIntDecls.t | 642 + .../tlpkg/tlperl.straw/lib/Tk/pTk/tkIntDecls_f.h | 14 + .../tlpkg/tlperl.straw/lib/Tk/pTk/tkIntPlatDecls.h | 1227 + .../tlpkg/tlperl.straw/lib/Tk/pTk/tkIntPlatDecls.m | 474 + .../tlpkg/tlperl.straw/lib/Tk/pTk/tkIntPlatDecls.t | 845 + .../tlperl.straw/lib/Tk/pTk/tkIntPlatDecls_f.h | 14 + .../tlpkg/tlperl.straw/lib/Tk/pTk/tkIntXlibDecls.h | 2436 + .../tlpkg/tlperl.straw/lib/Tk/pTk/tkIntXlibDecls.m | 446 + .../tlpkg/tlperl.straw/lib/Tk/pTk/tkIntXlibDecls.t | 1521 + .../tlperl.straw/lib/Tk/pTk/tkIntXlibDecls_f.h | 14 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkInt_f.h | 14 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkMenu.h | 588 + .../tlpkg/tlperl.straw/lib/Tk/pTk/tkMenubutton.h | 240 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkOption.h | 17 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkOption.m | 26 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkOption.t | 26 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkOption_f.h | 14 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkPlatDecls.h | 300 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkPlatDecls.m | 114 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkPlatDecls.t | 190 + .../tlpkg/tlperl.straw/lib/Tk/pTk/tkPlatDecls_f.h | 15 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkPort.h | 49 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkScale.h | 257 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkScrollbar.h | 209 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkSelect.h | 187 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkText.h | 927 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkUndo.h | 90 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkVMacro.h | 69 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkWin.h | 60 + .../tlpkg/tlperl.straw/lib/Tk/pTk/tkWinDefault.h | 525 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkWinInt.h | 209 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkWinPort.h | 156 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkXrm.h | 12 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/tk_f.h | 14 + Master/tlpkg/tlperl.straw/lib/Tk/pTk/xbytes.h | 58 + Master/tlpkg/tlperl.straw/lib/Tk/pack.pod | 324 + Master/tlpkg/tlperl.straw/lib/Tk/palette.pod | 89 + Master/tlpkg/tlperl.straw/lib/Tk/place.pod | 271 + Master/tlpkg/tlperl.straw/lib/Tk/prolog.ps | 284 + Master/tlpkg/tlperl.straw/lib/Tk/reindex.pl | 33 + Master/tlpkg/tlperl.straw/lib/Tk/selection.pod | 159 + Master/tlpkg/tlperl.straw/lib/Tk/send.pod | 118 + Master/tlpkg/tlperl.straw/lib/Tk/srcfile.xpm | 18 + Master/tlpkg/tlperl.straw/lib/Tk/textfile.xpm | 18 + Master/tlpkg/tlperl.straw/lib/Tk/tixWm.pod | 73 + Master/tlpkg/tlperl.straw/lib/Tk/tkGlue.def | 130 + Master/tlpkg/tlperl.straw/lib/Tk/tkGlue.h | 79 + Master/tlpkg/tlperl.straw/lib/Tk/tkGlue.m | 74 + Master/tlpkg/tlperl.straw/lib/Tk/tkGlue.t | 70 + Master/tlpkg/tlperl.straw/lib/Tk/tkGlue_f.h | 14 + Master/tlpkg/tlperl.straw/lib/Tk/tkvars.pod | 107 + Master/tlpkg/tlperl.straw/lib/Tk/tranicon.gif | Bin 0 -> 1718 bytes Master/tlpkg/tlperl.straw/lib/Tk/typemap | 96 + Master/tlpkg/tlperl.straw/lib/Tk/vtab.def | 90 + Master/tlpkg/tlperl.straw/lib/Tk/widgets.pm | 20 + Master/tlpkg/tlperl.straw/lib/Tk/widgets.pod | 20 + Master/tlpkg/tlperl.straw/lib/Tk/win.xbm | 6 + Master/tlpkg/tlperl.straw/lib/Tk/winfolder.xpm | 39 + Master/tlpkg/tlperl.straw/lib/Tk/wintext.xpm | 42 + Master/tlpkg/tlperl.straw/lib/URI.pm | 1102 + Master/tlpkg/tlperl.straw/lib/User/grent.pm | 95 + Master/tlpkg/tlperl.straw/lib/User/pwent.pm | 298 + Master/tlpkg/tlperl.straw/lib/Win32.pm | 793 + Master/tlpkg/tlperl.straw/lib/Win32/API.pm | 778 + .../tlpkg/tlperl.straw/lib/Win32/API/Callback.pm | 174 + Master/tlpkg/tlperl.straw/lib/Win32/API/Struct.pm | 532 + Master/tlpkg/tlperl.straw/lib/Win32/API/Test.pm | 111 + Master/tlpkg/tlperl.straw/lib/Win32/API/Type.pm | 453 + Master/tlpkg/tlperl.straw/lib/Win32/DBIODBC.pm | 248 + Master/tlpkg/tlperl.straw/lib/Win32/EventLog.pm | 471 + Master/tlpkg/tlperl.straw/lib/Win32/Exe.pm | 308 + Master/tlpkg/tlperl.straw/lib/Win32/Exe/Base.pm | 35 + .../tlperl.straw/lib/Win32/Exe/DataDirectory.pm | 13 + .../tlperl.straw/lib/Win32/Exe/DebugDirectory.pm | 19 + .../tlpkg/tlperl.straw/lib/Win32/Exe/DebugTable.pm | 12 + .../tlpkg/tlperl.straw/lib/Win32/Exe/IconFile.pm | 60 + Master/tlpkg/tlperl.straw/lib/Win32/Exe/PE.pm | 24 + .../tlpkg/tlperl.straw/lib/Win32/Exe/PE/Header.pm | 26 + .../tlperl.straw/lib/Win32/Exe/PE/Header/PE32.pm | 69 + .../tlpkg/tlperl.straw/lib/Win32/Exe/Resource.pm | 38 + .../lib/Win32/Exe/Resource/GroupIcon.pm | 57 + .../tlperl.straw/lib/Win32/Exe/Resource/Icon.pm | 54 + .../lib/Win32/Exe/Resource/Manifest.pm | 60 + .../tlperl.straw/lib/Win32/Exe/Resource/Version.pm | 364 + .../tlperl.straw/lib/Win32/Exe/ResourceData.pm | 58 + .../tlperl.straw/lib/Win32/Exe/ResourceEntry.pm | 69 + .../tlperl.straw/lib/Win32/Exe/ResourceEntry/Id.pm | 47 + .../lib/Win32/Exe/ResourceEntry/Name.pm | 42 + .../tlperl.straw/lib/Win32/Exe/ResourceTable.pm | 35 + Master/tlpkg/tlperl.straw/lib/Win32/Exe/Section.pm | 154 + .../tlperl.straw/lib/Win32/Exe/Section/Code.pm | 9 + .../tlperl.straw/lib/Win32/Exe/Section/Data.pm | 9 + .../tlperl.straw/lib/Win32/Exe/Section/Debug.pm | 9 + .../tlperl.straw/lib/Win32/Exe/Section/Exports.pm | 9 + .../tlperl.straw/lib/Win32/Exe/Section/Imports.pm | 9 + .../lib/Win32/Exe/Section/Resources.pm | 260 + Master/tlpkg/tlperl.straw/lib/Win32/File.pm | 118 + Master/tlpkg/tlperl.straw/lib/Win32/File/Object.pm | 450 + Master/tlpkg/tlperl.straw/lib/Win32/Process.pm | 219 + Master/tlpkg/tlperl.straw/lib/Win32/Shortcut.pm | 752 + Master/tlpkg/tlperl.straw/lib/Win32/TieRegistry.pm | 3809 ++ Master/tlpkg/tlperl.straw/lib/Win32/WinError.pm | 1017 + Master/tlpkg/tlperl.straw/lib/Win32API/File.pm | 3035 ++ .../tlpkg/tlperl.straw/lib/Win32API/File/cFile.pc | 165 + Master/tlpkg/tlperl.straw/lib/Win32API/Registry.pm | 1772 + .../lib/Win32API/Registry/cRegistry.pc | 87 + Master/tlpkg/tlperl.straw/lib/Win32CORE.pm | 38 + Master/tlpkg/tlperl.straw/lib/XML/LibXML.pm | 2238 + Master/tlpkg/tlperl.straw/lib/XML/LibXML.pod | 515 + Master/tlpkg/tlperl.straw/lib/XML/LibXML/Attr.pod | 134 + .../tlpkg/tlperl.straw/lib/XML/LibXML/Boolean.pm | 92 + .../tlperl.straw/lib/XML/LibXML/CDATASection.pod | 58 + .../tlpkg/tlperl.straw/lib/XML/LibXML/Comment.pod | 59 + Master/tlpkg/tlperl.straw/lib/XML/LibXML/Common.pm | 203 + .../tlpkg/tlperl.straw/lib/XML/LibXML/Common.pod | 129 + Master/tlpkg/tlperl.straw/lib/XML/LibXML/DOM.pod | 142 + .../tlpkg/tlperl.straw/lib/XML/LibXML/Document.pod | 696 + .../lib/XML/LibXML/DocumentFragment.pod | 40 + Master/tlpkg/tlperl.straw/lib/XML/LibXML/Dtd.pod | 102 + .../tlpkg/tlperl.straw/lib/XML/LibXML/Element.pod | 384 + Master/tlpkg/tlperl.straw/lib/XML/LibXML/ErrNo.pm | 500 + Master/tlpkg/tlperl.straw/lib/XML/LibXML/ErrNo.pod | 27 + Master/tlpkg/tlperl.straw/lib/XML/LibXML/Error.pm | 229 + Master/tlpkg/tlperl.straw/lib/XML/LibXML/Error.pod | 254 + .../tlperl.straw/lib/XML/LibXML/InputCallback.pod | 292 + .../tlpkg/tlperl.straw/lib/XML/LibXML/Literal.pm | 109 + .../tlperl.straw/lib/XML/LibXML/Namespace.pod | 143 + Master/tlpkg/tlperl.straw/lib/XML/LibXML/Node.pod | 752 + .../tlpkg/tlperl.straw/lib/XML/LibXML/NodeList.pm | 198 + Master/tlpkg/tlperl.straw/lib/XML/LibXML/Number.pm | 97 + Master/tlpkg/tlperl.straw/lib/XML/LibXML/PI.pod | 87 + .../tlpkg/tlperl.straw/lib/XML/LibXML/Parser.pod | 966 + .../tlpkg/tlperl.straw/lib/XML/LibXML/Pattern.pod | 107 + Master/tlpkg/tlperl.straw/lib/XML/LibXML/Reader.pm | 212 + .../tlpkg/tlperl.straw/lib/XML/LibXML/Reader.pod | 669 + .../tlpkg/tlperl.straw/lib/XML/LibXML/RegExp.pod | 71 + .../tlpkg/tlperl.straw/lib/XML/LibXML/RelaxNG.pod | 81 + Master/tlpkg/tlperl.straw/lib/XML/LibXML/SAX.pm | 97 + Master/tlpkg/tlperl.straw/lib/XML/LibXML/SAX.pod | 49 + .../tlperl.straw/lib/XML/LibXML/SAX/Builder.pm | 332 + .../tlperl.straw/lib/XML/LibXML/SAX/Builder.pod | 51 + .../tlperl.straw/lib/XML/LibXML/SAX/Generator.pm | 157 + .../tlperl.straw/lib/XML/LibXML/SAX/Parser.pm | 265 + .../tlpkg/tlperl.straw/lib/XML/LibXML/Schema.pod | 78 + Master/tlpkg/tlperl.straw/lib/XML/LibXML/Text.pod | 183 + .../tlperl.straw/lib/XML/LibXML/XPathContext.pm | 146 + .../tlperl.straw/lib/XML/LibXML/XPathContext.pod | 372 + .../lib/XML/LibXML/XPathExpression.pod | 65 + Master/tlpkg/tlperl.straw/lib/XML/LibXSLT.pm | 1008 + .../tlpkg/tlperl.straw/lib/XML/NamespaceSupport.pm | 583 + Master/tlpkg/tlperl.straw/lib/XML/Parser.pm | 840 + Master/tlpkg/tlperl.straw/lib/XML/Parser/Expat.pm | 1230 + .../tlperl.straw/lib/XML/Parser/LWPExternEnt.pl | 71 + .../tlperl.straw/lib/XML/Parser/Style/Debug.pm | 52 + .../tlperl.straw/lib/XML/Parser/Style/Objects.pm | 78 + .../tlperl.straw/lib/XML/Parser/Style/Stream.pm | 184 + .../tlperl.straw/lib/XML/Parser/Style/Subs.pm | 58 + .../tlperl.straw/lib/XML/Parser/Style/Tree.pm | 90 + Master/tlpkg/tlperl.straw/lib/XML/SAX.pm | 379 + Master/tlpkg/tlperl.straw/lib/XML/SAX/Base.pm | 3164 ++ .../tlperl.straw/lib/XML/SAX/DocumentLocator.pm | 134 + Master/tlpkg/tlperl.straw/lib/XML/SAX/Exception.pm | 126 + Master/tlpkg/tlperl.straw/lib/XML/SAX/Intro.pod | 407 + .../tlperl.straw/lib/XML/SAX/ParserDetails.ini | 10 + .../tlperl.straw/lib/XML/SAX/ParserFactory.pm | 230 + Master/tlpkg/tlperl.straw/lib/XML/SAX/PurePerl.pm | 751 + .../tlperl.straw/lib/XML/SAX/PurePerl/DTDDecls.pm | 603 + .../lib/XML/SAX/PurePerl/DebugHandler.pm | 95 + .../tlperl.straw/lib/XML/SAX/PurePerl/DocType.pm | 180 + .../lib/XML/SAX/PurePerl/EncodingDetect.pm | 105 + .../tlperl.straw/lib/XML/SAX/PurePerl/Exception.pm | 67 + .../lib/XML/SAX/PurePerl/NoUnicodeExt.pm | 28 + .../lib/XML/SAX/PurePerl/Productions.pm | 147 + .../tlperl.straw/lib/XML/SAX/PurePerl/Reader.pm | 136 + .../lib/XML/SAX/PurePerl/Reader/NoUnicodeExt.pm | 25 + .../lib/XML/SAX/PurePerl/Reader/Stream.pm | 84 + .../lib/XML/SAX/PurePerl/Reader/String.pm | 78 + .../lib/XML/SAX/PurePerl/Reader/URI.pm | 57 + .../lib/XML/SAX/PurePerl/Reader/UnicodeExt.pm | 23 + .../lib/XML/SAX/PurePerl/UnicodeExt.pm | 22 + .../tlperl.straw/lib/XML/SAX/PurePerl/XMLDecl.pm | 129 + .../tlpkg/tlperl.straw/lib/XML/SAX/placeholder.pl | 1 + Master/tlpkg/tlperl.straw/lib/XML/benchmark.pl | 268 + Master/tlpkg/tlperl.straw/lib/YAML.pm | 817 + Master/tlpkg/tlperl.straw/lib/YAML/Any.pm | 202 + Master/tlpkg/tlperl.straw/lib/YAML/Base.pm | 204 + Master/tlpkg/tlperl.straw/lib/YAML/Dumper.pm | 591 + Master/tlpkg/tlperl.straw/lib/YAML/Dumper/Base.pm | 142 + Master/tlpkg/tlperl.straw/lib/YAML/Error.pm | 226 + Master/tlpkg/tlperl.straw/lib/YAML/Loader.pm | 790 + Master/tlpkg/tlperl.straw/lib/YAML/Loader/Base.pm | 68 + Master/tlpkg/tlperl.straw/lib/YAML/Marshall.pm | 81 + Master/tlpkg/tlperl.straw/lib/YAML/Node.pm | 305 + Master/tlpkg/tlperl.straw/lib/YAML/Tag.pm | 52 + Master/tlpkg/tlperl.straw/lib/YAML/Tiny.pm | 1132 + Master/tlpkg/tlperl.straw/lib/YAML/Types.pm | 265 + Master/tlpkg/tlperl.straw/lib/assert.pl | 55 + Master/tlpkg/tlperl.straw/lib/attributes.pm | 495 + .../tlperl.straw/lib/auto/Algorithm/Diff/.packlist | 6 + .../lib/auto/Archive/Extract/.packlist | 1 + .../tlperl.straw/lib/auto/Archive/Tar/.packlist | 7 + .../tlperl.straw/lib/auto/Archive/Zip/.packlist | 15 + .../lib/auto/Attribute/Handlers/.packlist | 1 + .../tlperl.straw/lib/auto/AutoLoader/.packlist | 2 + Master/tlpkg/tlperl.straw/lib/auto/B/B.dll | Bin 0 -> 120832 bytes .../tlperl.straw/lib/auto/BerkeleyDB/.packlist | 7 + .../tlperl.straw/lib/auto/BerkeleyDB/BerkeleyDB.bs | 0 .../lib/auto/BerkeleyDB/BerkeleyDB.dll | Bin 0 -> 1519616 bytes .../tlperl.straw/lib/auto/BerkeleyDB/autosplit.ix | 3 + Master/tlpkg/tlperl.straw/lib/auto/CGI/.packlist | 9 + Master/tlpkg/tlperl.straw/lib/auto/CPAN/.packlist | 37 + .../tlperl.straw/lib/auto/CPAN/Checksums/.packlist | 1 + .../lib/auto/CPAN/DistnameInfo/.packlist | 1 + .../tlperl.straw/lib/auto/CPAN/Inject/.packlist | 3 + .../tlperl.straw/lib/auto/CPAN/SQLite/.packlist | 13 + .../tlpkg/tlperl.straw/lib/auto/CPANPLUS/.packlist | 47 + .../lib/auto/CPANPLUS/Dist/Build/.packlist | 2 + .../lib/auto/Class/ErrorHandler/.packlist | 1 + .../tlperl.straw/lib/auto/Class/ISA/.packlist | 1 + .../tlperl.straw/lib/auto/Class/Loader/.packlist | 2 + .../tlperl.straw/lib/auto/Compress/Bzip2/.packlist | 4 + .../tlperl.straw/lib/auto/Compress/Bzip2/Bzip2.bs | 0 .../tlperl.straw/lib/auto/Compress/Bzip2/Bzip2.dll | Bin 0 -> 113152 bytes .../lib/auto/Compress/Bzip2/autosplit.ix | 3 + .../lib/auto/Compress/Raw/Bzip2/.packlist | 4 + .../lib/auto/Compress/Raw/Bzip2/Bzip2.bs | 0 .../lib/auto/Compress/Raw/Bzip2/Bzip2.dll | Bin 0 -> 81408 bytes .../lib/auto/Compress/Raw/Bzip2/autosplit.ix | 3 + .../lib/auto/Compress/Raw/Zlib/.packlist | 4 + .../lib/auto/Compress/Raw/Zlib/Zlib.bs | 0 .../lib/auto/Compress/Raw/Zlib/Zlib.dll | Bin 0 -> 120832 bytes .../lib/auto/Compress/Raw/Zlib/autosplit.ix | 3 + .../lib/auto/Compress/Zlib/autosplit.ix | 3 + .../lib/auto/Compress/unLZMA/.packlist | 3 + .../lib/auto/Compress/unLZMA/unLZMA.bs | 0 .../lib/auto/Compress/unLZMA/unLZMA.dll | Bin 0 -> 14848 bytes .../lib/auto/Convert/ASCII/Armour/.packlist | 2 + .../tlperl.straw/lib/auto/Convert/ASN1/.packlist | 7 + .../tlperl.straw/lib/auto/Convert/PEM/.packlist | 2 + .../tlperl.straw/lib/auto/Crypt/Blowfish/.packlist | 3 + .../lib/auto/Crypt/Blowfish/Blowfish.bs | 0 .../lib/auto/Crypt/Blowfish/Blowfish.dll | Bin 0 -> 15872 bytes .../tlperl.straw/lib/auto/Crypt/CAST5_PP/.packlist | 6 + .../lib/auto/Crypt/CAST5_PP/autosplit.ix | 7 + .../lib/auto/Crypt/CAST5_PP/decrypt.al | 47 + .../lib/auto/Crypt/CAST5_PP/encrypt.al | 44 + .../tlperl.straw/lib/auto/Crypt/CAST5_PP/init.al | 69 + .../tlperl.straw/lib/auto/Crypt/CBC/.packlist | 1 + .../tlperl.straw/lib/auto/Crypt/DES/.packlist | 3 + .../tlpkg/tlperl.straw/lib/auto/Crypt/DES/DES.bs | 0 .../tlpkg/tlperl.straw/lib/auto/Crypt/DES/DES.dll | Bin 0 -> 15360 bytes .../tlperl.straw/lib/auto/Crypt/DES_EDE3/.packlist | 1 + .../tlpkg/tlperl.straw/lib/auto/Crypt/DH/.packlist | 1 + .../tlperl.straw/lib/auto/Crypt/DSA/.packlist | 7 + .../tlperl.straw/lib/auto/Crypt/IDEA/.packlist | 5 + .../tlpkg/tlperl.straw/lib/auto/Crypt/IDEA/IDEA.bs | 0 .../tlperl.straw/lib/auto/Crypt/IDEA/IDEA.dll | Bin 0 -> 10752 bytes .../tlperl.straw/lib/auto/Crypt/OpenPGP/.packlist | 39 + .../tlperl.straw/lib/auto/Crypt/Primes/.packlist | 3 + .../lib/auto/Crypt/RIPEMD160/.packlist | 5 + .../lib/auto/Crypt/RIPEMD160/RIPEMD160.bs | 0 .../lib/auto/Crypt/RIPEMD160/RIPEMD160.dll | Bin 0 -> 17920 bytes .../lib/auto/Crypt/RIPEMD160/autosplit.ix | 3 + .../tlperl.straw/lib/auto/Crypt/RSA/.packlist | 14 + .../tlperl.straw/lib/auto/Crypt/Random/.packlist | 9 + .../tlperl.straw/lib/auto/Crypt/Rijndael/.packlist | 3 + .../lib/auto/Crypt/Rijndael/Rijndael.bs | 0 .../lib/auto/Crypt/Rijndael/Rijndael.dll | Bin 0 -> 18432 bytes .../tlperl.straw/lib/auto/Crypt/SSLeay/.packlist | 9 + .../tlperl.straw/lib/auto/Crypt/SSLeay/SSLeay.bs | 0 .../tlperl.straw/lib/auto/Crypt/SSLeay/SSLeay.dll | Bin 0 -> 29184 bytes .../tlperl.straw/lib/auto/Crypt/Twofish/.packlist | 3 + .../tlperl.straw/lib/auto/Crypt/Twofish/Twofish.bs | 0 .../lib/auto/Crypt/Twofish/Twofish.dll | Bin 0 -> 23040 bytes Master/tlpkg/tlperl.straw/lib/auto/Cwd/.packlist | 12 + Master/tlpkg/tlperl.straw/lib/auto/Cwd/Cwd.bs | 0 Master/tlpkg/tlperl.straw/lib/auto/Cwd/Cwd.dll | Bin 0 -> 12288 bytes .../tlpkg/tlperl.straw/lib/auto/DBD/ODBC/.packlist | 5 + .../tlpkg/tlperl.straw/lib/auto/DBD/ODBC/ODBC.bs | 0 .../tlpkg/tlperl.straw/lib/auto/DBD/ODBC/ODBC.dll | Bin 0 -> 111104 bytes .../tlpkg/tlperl.straw/lib/auto/DBD/Pg/.packlist | 4 + Master/tlpkg/tlperl.straw/lib/auto/DBD/Pg/Pg.bs | 0 Master/tlpkg/tlperl.straw/lib/auto/DBD/Pg/Pg.dll | Bin 0 -> 238080 bytes .../tlperl.straw/lib/auto/DBD/SQLite/.packlist | 4 + .../tlperl.straw/lib/auto/DBD/SQLite/SQLite.bs | 0 .../tlperl.straw/lib/auto/DBD/SQLite/SQLite.dll | Bin 0 -> 512000 bytes .../tlperl.straw/lib/auto/DBD/mysql/.packlist | 6 + .../tlperl.straw/lib/auto/DBD/mysql/libmysql.dll | Bin 0 -> 2359296 bytes .../tlpkg/tlperl.straw/lib/auto/DBD/mysql/mysql.bs | 0 .../tlperl.straw/lib/auto/DBD/mysql/mysql.dll | Bin 0 -> 98816 bytes Master/tlpkg/tlperl.straw/lib/auto/DBI/.packlist | 66 + Master/tlpkg/tlperl.straw/lib/auto/DBI/DBI.bs | 0 Master/tlpkg/tlperl.straw/lib/auto/DBI/DBI.dll | Bin 0 -> 118784 bytes Master/tlpkg/tlperl.straw/lib/auto/DBI/DBIXS.h | 519 + Master/tlpkg/tlperl.straw/lib/auto/DBI/Driver.xst | 775 + .../tlpkg/tlperl.straw/lib/auto/DBI/Driver_xst.h | 118 + Master/tlpkg/tlperl.straw/lib/auto/DBI/dbd_xsh.h | 58 + Master/tlpkg/tlperl.straw/lib/auto/DBI/dbi_sql.h | 96 + Master/tlpkg/tlperl.straw/lib/auto/DBI/dbipport.h | 4954 ++ Master/tlpkg/tlperl.straw/lib/auto/DBI/dbivport.h | 52 + Master/tlpkg/tlperl.straw/lib/auto/DBI/dbixs_rev.h | 2 + .../tlperl.straw/lib/auto/DBIx/Simple/.packlist | 3 + .../tlpkg/tlperl.straw/lib/auto/DBM/Deep/.packlist | 8 + .../tlpkg/tlperl.straw/lib/auto/DB_File/.packlist | 4 + .../tlpkg/tlperl.straw/lib/auto/DB_File/DB_File.bs | 0 .../tlperl.straw/lib/auto/DB_File/DB_File.dll | Bin 0 -> 1341440 bytes .../tlperl.straw/lib/auto/DB_File/autosplit.ix | 3 + .../tlperl.straw/lib/auto/Data/Buffer/.packlist | 1 + .../tlperl.straw/lib/auto/Data/Compare/.packlist | 3 + .../tlperl.straw/lib/auto/Data/Dumper/.packlist | 3 + .../tlperl.straw/lib/auto/Data/Dumper/Dumper.bs | 0 .../tlperl.straw/lib/auto/Data/Dumper/Dumper.dll | Bin 0 -> 33280 bytes .../tlperl.straw/lib/auto/Data/Random/.packlist | 3 + .../tlperl.straw/lib/auto/Devel/DProf/DProf.dll | Bin 0 -> 16384 bytes .../tlperl.straw/lib/auto/Devel/PPPort/PPPort.dll | Bin 0 -> 108032 bytes .../tlperl.straw/lib/auto/Devel/Peek/Peek.dll | Bin 0 -> 15360 bytes .../lib/auto/Digest/BubbleBabble/.packlist | 1 + .../tlperl.straw/lib/auto/Digest/MD2/.packlist | 3 + .../tlpkg/tlperl.straw/lib/auto/Digest/MD2/MD2.bs | 0 .../tlpkg/tlperl.straw/lib/auto/Digest/MD2/MD2.dll | Bin 0 -> 13312 bytes .../tlpkg/tlperl.straw/lib/auto/Digest/MD5/MD5.dll | Bin 0 -> 15360 bytes .../tlperl.straw/lib/auto/Digest/SHA/.packlist | 5 + .../tlpkg/tlperl.straw/lib/auto/Digest/SHA/SHA.bs | 0 .../tlpkg/tlperl.straw/lib/auto/Digest/SHA/SHA.dll | Bin 0 -> 46592 bytes .../tlperl.straw/lib/auto/Digest/SHA1/.packlist | 3 + .../tlperl.straw/lib/auto/Digest/SHA1/SHA1.bs | 0 .../tlperl.straw/lib/auto/Digest/SHA1/SHA1.dll | Bin 0 -> 17408 bytes .../tlperl.straw/lib/auto/DynaLoader/autosplit.ix | 8 + .../lib/auto/DynaLoader/dl_expandspec.al | 31 + .../lib/auto/DynaLoader/dl_find_symbol_anywhere.al | 19 + .../lib/auto/DynaLoader/dl_findfile.al | 86 + .../tlpkg/tlperl.straw/lib/auto/Encode/.packlist | 56 + .../tlperl.straw/lib/auto/Encode/Byte/Byte.bs | 0 .../tlperl.straw/lib/auto/Encode/Byte/Byte.dll | Bin 0 -> 110592 bytes Master/tlpkg/tlperl.straw/lib/auto/Encode/CN/CN.bs | 0 .../tlpkg/tlperl.straw/lib/auto/Encode/CN/CN.dll | Bin 0 -> 742400 bytes .../tlperl.straw/lib/auto/Encode/EBCDIC/EBCDIC.bs | 0 .../tlperl.straw/lib/auto/Encode/EBCDIC/EBCDIC.dll | Bin 0 -> 17920 bytes .../tlpkg/tlperl.straw/lib/auto/Encode/Encode.bs | 0 .../tlpkg/tlperl.straw/lib/auto/Encode/Encode.dll | Bin 0 -> 31744 bytes Master/tlpkg/tlperl.straw/lib/auto/Encode/JP/JP.bs | 0 .../tlpkg/tlperl.straw/lib/auto/Encode/JP/JP.dll | Bin 0 -> 858624 bytes Master/tlpkg/tlperl.straw/lib/auto/Encode/KR/KR.bs | 0 .../tlpkg/tlperl.straw/lib/auto/Encode/KR/KR.dll | Bin 0 -> 813568 bytes .../tlperl.straw/lib/auto/Encode/Symbol/Symbol.bs | 0 .../tlperl.straw/lib/auto/Encode/Symbol/Symbol.dll | Bin 0 -> 22016 bytes Master/tlpkg/tlperl.straw/lib/auto/Encode/TW/TW.bs | 0 .../tlpkg/tlperl.straw/lib/auto/Encode/TW/TW.dll | Bin 0 -> 759808 bytes .../lib/auto/Encode/Unicode/Unicode.bs | 0 .../lib/auto/Encode/Unicode/Unicode.dll | Bin 0 -> 20992 bytes .../lib/auto/ExtUtils/CBuilder/.packlist | 13 + .../lib/auto/ExtUtils/MakeMaker/.packlist | 30 + .../lib/auto/ExtUtils/Manifest/.packlist | 2 + .../lib/auto/ExtUtils/ParseXS/.packlist | 1 + Master/tlpkg/tlperl.straw/lib/auto/FCGI/.packlist | 3 + Master/tlpkg/tlperl.straw/lib/auto/FCGI/FCGI.bs | 0 Master/tlpkg/tlperl.straw/lib/auto/FCGI/FCGI.dll | Bin 0 -> 51200 bytes Master/tlpkg/tlperl.straw/lib/auto/Fcntl/Fcntl.dll | Bin 0 -> 12288 bytes .../tlperl.straw/lib/auto/File/Fetch/.packlist | 1 + .../tlperl.straw/lib/auto/File/Find/Rule/.packlist | 5 + .../tlpkg/tlperl.straw/lib/auto/File/Glob/Glob.dll | Bin 0 -> 16896 bytes .../tlperl.straw/lib/auto/File/HomeDir/.packlist | 8 + .../tlperl.straw/lib/auto/File/Path/.packlist | 1 + .../tlperl.straw/lib/auto/File/Remove/.packlist | 1 + .../tlperl.straw/lib/auto/File/Which/.packlist | 3 + .../tlperl.straw/lib/auto/File/chmod/.packlist | 1 + .../tlperl.straw/lib/auto/File/pushd/.packlist | 2 + .../lib/auto/Filter/Util/Call/Call.dll | Bin 0 -> 13824 bytes Master/tlpkg/tlperl.straw/lib/auto/GD/.packlist | 12 + Master/tlpkg/tlperl.straw/lib/auto/GD/GD.bs | 0 Master/tlpkg/tlperl.straw/lib/auto/GD/GD.dll | Bin 0 -> 118272 bytes Master/tlpkg/tlperl.straw/lib/auto/GD/autosplit.ix | 3 + .../tlperl.straw/lib/auto/GDBM_File/GDBM_File.dll | Bin 0 -> 41984 bytes .../tlperl.straw/lib/auto/HTML/Parser/.packlist | 9 + .../tlperl.straw/lib/auto/HTML/Parser/Parser.bs | 0 .../tlperl.straw/lib/auto/HTML/Parser/Parser.dll | Bin 0 -> 44032 bytes .../tlperl.straw/lib/auto/HTML/Tagset/.packlist | 1 + .../lib/auto/Hash/Util/FieldHash/FieldHash.dll | Bin 0 -> 17408 bytes .../tlpkg/tlperl.straw/lib/auto/Hash/Util/Util.dll | Bin 0 -> 10240 bytes Master/tlpkg/tlperl.straw/lib/auto/IO/IO.dll | Bin 0 -> 16896 bytes .../tlperl.straw/lib/auto/IO/Socket/SSL/.packlist | 1 + .../tlperl.straw/lib/auto/IO/String/.packlist | 1 + .../tlpkg/tlperl.straw/lib/auto/IO/Zlib/.packlist | 1 + .../tlpkg/tlperl.straw/lib/auto/IPC/Cmd/.packlist | 1 + .../tlpkg/tlperl.straw/lib/auto/IPC/Run3/.packlist | 6 + .../lib/auto/IPC/System/Simple/.packlist | 1 + .../tlpkg/tlperl.straw/lib/auto/Imager/.packlist | 84 + .../lib/auto/Imager/CountColor/CountColor.bs | 0 .../lib/auto/Imager/CountColor/CountColor.dll | Bin 0 -> 9728 bytes .../tlperl.straw/lib/auto/Imager/File/ICO/ICO.bs | 0 .../tlperl.straw/lib/auto/Imager/File/ICO/ICO.dll | Bin 0 -> 28160 bytes .../tlperl.straw/lib/auto/Imager/File/SGI/SGI.bs | 0 .../tlperl.straw/lib/auto/Imager/File/SGI/SGI.dll | Bin 0 -> 23040 bytes .../lib/auto/Imager/Filter/DynTest/DynTest.bs | 0 .../lib/auto/Imager/Filter/DynTest/DynTest.dll | Bin 0 -> 9728 bytes .../lib/auto/Imager/Filter/Flines/Flines.bs | 0 .../lib/auto/Imager/Filter/Flines/Flines.dll | Bin 0 -> 9728 bytes .../auto/Imager/Filter/Mandelbrot/Mandelbrot.bs | 0 .../auto/Imager/Filter/Mandelbrot/Mandelbrot.dll | Bin 0 -> 10752 bytes .../tlpkg/tlperl.straw/lib/auto/Imager/Imager.bs | 0 .../tlpkg/tlperl.straw/lib/auto/Imager/Imager.dll | Bin 0 -> 573440 bytes Master/tlpkg/tlperl.straw/lib/auto/JSON/.packlist | 6 + .../tlpkg/tlperl.straw/lib/auto/JSON/XS/.packlist | 6 + Master/tlpkg/tlperl.straw/lib/auto/JSON/XS/XS.bs | 0 Master/tlpkg/tlperl.straw/lib/auto/JSON/XS/XS.dll | Bin 0 -> 55296 bytes .../tlperl.straw/lib/auto/LWP/Online/.packlist | 1 + .../tlperl.straw/lib/auto/List/Util/.packlist | 7 + .../tlpkg/tlperl.straw/lib/auto/List/Util/Util.bs | 0 .../tlpkg/tlperl.straw/lib/auto/List/Util/Util.dll | Bin 0 -> 26112 bytes .../lib/auto/Locale/Maketext/Simple/.packlist | 1 + .../lib/auto/Log/Message/Simple/.packlist | 1 + .../tlperl.straw/lib/auto/MIME/Base64/.packlist | 4 + .../tlperl.straw/lib/auto/MIME/Base64/Base64.bs | 0 .../tlperl.straw/lib/auto/MIME/Base64/Base64.dll | Bin 0 -> 12800 bytes .../lib/auto/Math/BigInt/FastCalc/FastCalc.dll | Bin 0 -> 17920 bytes .../lib/auto/Math/BigInt/GMP/.packlist | 3 + .../tlperl.straw/lib/auto/Math/BigInt/GMP/GMP.bs | 0 .../tlperl.straw/lib/auto/Math/BigInt/GMP/GMP.dll | Bin 0 -> 113152 bytes .../tlperl.straw/lib/auto/Math/BigRat/.packlist | 1 + .../tlpkg/tlperl.straw/lib/auto/Math/GMP/.packlist | 4 + Master/tlpkg/tlperl.straw/lib/auto/Math/GMP/GMP.bs | 0 .../tlpkg/tlperl.straw/lib/auto/Math/GMP/GMP.dll | Bin 0 -> 124416 bytes .../tlperl.straw/lib/auto/Math/GMP/autosplit.ix | 3 + .../tlperl.straw/lib/auto/Math/Pari/.packlist | 6 + .../tlpkg/tlperl.straw/lib/auto/Math/Pari/Pari.bs | 0 .../tlpkg/tlperl.straw/lib/auto/Math/Pari/Pari.dll | Bin 0 -> 2341376 bytes .../tlperl.straw/lib/auto/Module/Build/.packlist | 34 + .../lib/auto/Module/CoreList/.packlist | 3 + .../lib/auto/Module/Load/Conditional/.packlist | 1 + .../tlperl.straw/lib/auto/Module/Loaded/.packlist | 1 + .../lib/auto/Module/Signature/.packlist | 3 + .../tlperl.straw/lib/auto/Net/SMTP/TLS/.packlist | 1 + .../tlperl.straw/lib/auto/Net/SSLeay/.packlist | 79 + .../tlperl.straw/lib/auto/Net/SSLeay/SSLeay.bs | 0 .../tlperl.straw/lib/auto/Net/SSLeay/SSLeay.dll | Bin 0 -> 233472 bytes .../tlperl.straw/lib/auto/Net/SSLeay/autosplit.ix | 78 + .../tlperl.straw/lib/auto/Net/SSLeay/debug_read.al | 22 + .../tlperl.straw/lib/auto/Net/SSLeay/do_https.al | 18 + .../tlperl.straw/lib/auto/Net/SSLeay/do_https2.al | 13 + .../tlperl.straw/lib/auto/Net/SSLeay/do_https3.al | 13 + .../tlperl.straw/lib/auto/Net/SSLeay/do_https4.al | 12 + .../tlperl.straw/lib/auto/Net/SSLeay/do_httpx2.al | 18 + .../tlperl.straw/lib/auto/Net/SSLeay/do_httpx3.al | 43 + .../tlperl.straw/lib/auto/Net/SSLeay/do_httpx4.al | 19 + .../lib/auto/Net/SSLeay/dump_peer_certificate.al | 29 + .../tlperl.straw/lib/auto/Net/SSLeay/get_http.al | 9 + .../tlperl.straw/lib/auto/Net/SSLeay/get_http3.al | 9 + .../tlperl.straw/lib/auto/Net/SSLeay/get_http4.al | 9 + .../tlperl.straw/lib/auto/Net/SSLeay/get_https.al | 9 + .../tlperl.straw/lib/auto/Net/SSLeay/get_https3.al | 9 + .../tlperl.straw/lib/auto/Net/SSLeay/get_https4.al | 9 + .../tlperl.straw/lib/auto/Net/SSLeay/get_httpx.al | 9 + .../tlperl.straw/lib/auto/Net/SSLeay/get_httpx3.al | 9 + .../tlperl.straw/lib/auto/Net/SSLeay/get_httpx4.al | 9 + .../tlperl.straw/lib/auto/Net/SSLeay/head_http.al | 10 + .../tlperl.straw/lib/auto/Net/SSLeay/head_http3.al | 10 + .../tlperl.straw/lib/auto/Net/SSLeay/head_http4.al | 12 + .../tlperl.straw/lib/auto/Net/SSLeay/head_https.al | 10 + .../lib/auto/Net/SSLeay/head_https3.al | 10 + .../lib/auto/Net/SSLeay/head_https4.al | 12 + .../tlperl.straw/lib/auto/Net/SSLeay/head_httpx.al | 10 + .../lib/auto/Net/SSLeay/head_httpx3.al | 10 + .../lib/auto/Net/SSLeay/head_httpx4.al | 13 + .../tlperl.straw/lib/auto/Net/SSLeay/http_cat.al | 34 + .../tlperl.straw/lib/auto/Net/SSLeay/https_cat.al | 97 + .../tlperl.straw/lib/auto/Net/SSLeay/httpx_cat.al | 18 + .../tlperl.straw/lib/auto/Net/SSLeay/make_form.al | 25 + .../lib/auto/Net/SSLeay/make_headers.al | 21 + .../tlperl.straw/lib/auto/Net/SSLeay/new_x_ctx.al | 16 + .../auto/Net/SSLeay/open_proxy_tcp_connection.al | 31 + .../lib/auto/Net/SSLeay/open_tcp_connection.al | 40 + .../tlperl.straw/lib/auto/Net/SSLeay/post_http.al | 9 + .../tlperl.straw/lib/auto/Net/SSLeay/post_http3.al | 9 + .../tlperl.straw/lib/auto/Net/SSLeay/post_http4.al | 9 + .../tlperl.straw/lib/auto/Net/SSLeay/post_https.al | 9 + .../lib/auto/Net/SSLeay/post_https3.al | 9 + .../lib/auto/Net/SSLeay/post_https4.al | 9 + .../tlperl.straw/lib/auto/Net/SSLeay/post_httpx.al | 9 + .../lib/auto/Net/SSLeay/post_httpx3.al | 9 + .../lib/auto/Net/SSLeay/post_httpx4.al | 9 + .../tlperl.straw/lib/auto/Net/SSLeay/put_http.al | 9 + .../tlperl.straw/lib/auto/Net/SSLeay/put_http3.al | 9 + .../tlperl.straw/lib/auto/Net/SSLeay/put_http4.al | 9 + .../tlperl.straw/lib/auto/Net/SSLeay/put_https.al | 9 + .../tlperl.straw/lib/auto/Net/SSLeay/put_https3.al | 9 + .../tlperl.straw/lib/auto/Net/SSLeay/put_https4.al | 9 + .../tlperl.straw/lib/auto/Net/SSLeay/put_httpx.al | 9 + .../tlperl.straw/lib/auto/Net/SSLeay/put_httpx3.al | 9 + .../tlperl.straw/lib/auto/Net/SSLeay/put_httpx4.al | 9 + .../tlperl.straw/lib/auto/Net/SSLeay/randomize.al | 31 + .../lib/auto/Net/SSLeay/set_cert_and_key.al | 23 + .../tlperl.straw/lib/auto/Net/SSLeay/set_proxy.al | 16 + .../lib/auto/Net/SSLeay/set_server_cert_and_key.al | 14 + .../lib/auto/Net/SSLeay/ssl_read_CRLF.al | 10 + .../lib/auto/Net/SSLeay/ssl_read_all.al | 28 + .../lib/auto/Net/SSLeay/ssl_read_until.al | 95 + .../lib/auto/Net/SSLeay/ssl_write_CRLF.al | 23 + .../lib/auto/Net/SSLeay/ssl_write_all.al | 38 + .../tlperl.straw/lib/auto/Net/SSLeay/sslcat.al | 99 + .../lib/auto/Net/SSLeay/tcp_read_CRLF.al | 11 + .../lib/auto/Net/SSLeay/tcp_read_all.al | 26 + .../lib/auto/Net/SSLeay/tcp_read_until.al | 34 + .../lib/auto/Net/SSLeay/tcp_write_CRLF.al | 23 + .../lib/auto/Net/SSLeay/tcp_write_all.al | 36 + .../tlperl.straw/lib/auto/Net/SSLeay/tcpcat.al | 37 + .../tlperl.straw/lib/auto/Net/SSLeay/tcpxcat.al | 17 + .../lib/auto/Net/SSLeay/want_X509_lookup.al | 15 + .../lib/auto/Net/SSLeay/want_nothing.al | 16 + .../tlperl.straw/lib/auto/Net/SSLeay/want_read.al | 9 + .../tlperl.straw/lib/auto/Net/SSLeay/want_write.al | 9 + .../tlperl.straw/lib/auto/Number/Compare/.packlist | 1 + .../lib/auto/Object/Accessor/.packlist | 1 + .../tlpkg/tlperl.straw/lib/auto/Opcode/Opcode.dll | Bin 0 -> 20992 bytes Master/tlpkg/tlperl.straw/lib/auto/PAR/.packlist | 7 + .../tlpkg/tlperl.straw/lib/auto/PAR/Dist/.packlist | 1 + .../lib/auto/PAR/Dist/FromPPD/.packlist | 3 + .../lib/auto/PAR/Dist/InstallPPD/.packlist | 3 + .../lib/auto/PAR/Repository/Client/.packlist | 5 + .../lib/auto/PAR/Repository/Query/.packlist | 1 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/POSIX.dll | Bin 0 -> 88064 bytes .../tlperl.straw/lib/auto/POSIX/SigAction/flags.al | 9 + .../lib/auto/POSIX/SigAction/handler.al | 9 + .../tlperl.straw/lib/auto/POSIX/SigAction/mask.al | 9 + .../tlperl.straw/lib/auto/POSIX/SigAction/new.al | 11 + .../tlperl.straw/lib/auto/POSIX/SigAction/safe.al | 13 + .../tlperl.straw/lib/auto/POSIX/SigRt/CLEAR.al | 9 + .../tlperl.straw/lib/auto/POSIX/SigRt/DELETE.al | 9 + .../tlperl.straw/lib/auto/POSIX/SigRt/EXISTS.al | 9 + .../tlperl.straw/lib/auto/POSIX/SigRt/FETCH.al | 12 + .../tlperl.straw/lib/auto/POSIX/SigRt/SCALAR.al | 9 + .../tlperl.straw/lib/auto/POSIX/SigRt/STORE.al | 9 + .../tlperl.straw/lib/auto/POSIX/SigRt/_check.al | 15 + .../tlperl.straw/lib/auto/POSIX/SigRt/_croak.al | 13 + .../tlperl.straw/lib/auto/POSIX/SigRt/_exist.al | 14 + .../tlperl.straw/lib/auto/POSIX/SigRt/_getsig.al | 17 + .../tlperl.straw/lib/auto/POSIX/SigRt/_init.al | 14 + .../tlpkg/tlperl.straw/lib/auto/POSIX/SigRt/new.al | 17 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/abs.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/alarm.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/assert.al | 15 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/atan2.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/atexit.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/atof.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/atoi.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/atol.al | 12 + .../tlpkg/tlperl.straw/lib/auto/POSIX/autosplit.ix | 173 + .../tlpkg/tlperl.straw/lib/auto/POSIX/bsearch.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/calloc.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/chdir.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/chmod.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/chown.al | 13 + .../tlpkg/tlperl.straw/lib/auto/POSIX/clearerr.al | 12 + .../tlpkg/tlperl.straw/lib/auto/POSIX/closedir.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/cos.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/creat.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/div.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/errno.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/execl.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/execle.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/execlp.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/execv.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/execve.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/execvp.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/exit.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/exp.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/fabs.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/fclose.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/fcntl.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/fdopen.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/feof.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/ferror.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/fflush.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/fgetc.al | 12 + .../tlpkg/tlperl.straw/lib/auto/POSIX/fgetpos.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/fgets.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/fileno.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/fopen.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/fork.al | 13 + .../tlpkg/tlperl.straw/lib/auto/POSIX/fprintf.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/fputc.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/fputs.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/fread.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/free.al | 12 + .../tlpkg/tlperl.straw/lib/auto/POSIX/freopen.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/fscanf.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/fseek.al | 12 + .../tlpkg/tlperl.straw/lib/auto/POSIX/fsetpos.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/fstat.al | 17 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/fsync.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/ftell.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/fwrite.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/getc.al | 13 + .../tlpkg/tlperl.straw/lib/auto/POSIX/getchar.al | 13 + .../tlpkg/tlperl.straw/lib/auto/POSIX/getegid.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/getenv.al | 13 + .../tlpkg/tlperl.straw/lib/auto/POSIX/geteuid.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/getgid.al | 13 + .../tlpkg/tlperl.straw/lib/auto/POSIX/getgrgid.al | 13 + .../tlpkg/tlperl.straw/lib/auto/POSIX/getgrnam.al | 13 + .../tlpkg/tlperl.straw/lib/auto/POSIX/getgroups.al | 14 + .../tlpkg/tlperl.straw/lib/auto/POSIX/getlogin.al | 13 + .../tlpkg/tlperl.straw/lib/auto/POSIX/getpgrp.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/getpid.al | 13 + .../tlpkg/tlperl.straw/lib/auto/POSIX/getppid.al | 13 + .../tlpkg/tlperl.straw/lib/auto/POSIX/getpwnam.al | 13 + .../tlpkg/tlperl.straw/lib/auto/POSIX/getpwuid.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/gets.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/getuid.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/gmtime.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/isatty.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/kill.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/labs.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/ldiv.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/link.al | 13 + .../tlperl.straw/lib/auto/POSIX/load_imports.al | 230 + .../tlpkg/tlperl.straw/lib/auto/POSIX/localtime.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/log.al | 13 + .../tlpkg/tlperl.straw/lib/auto/POSIX/longjmp.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/malloc.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/memchr.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/memcmp.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/memcpy.al | 12 + .../tlpkg/tlperl.straw/lib/auto/POSIX/memmove.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/memset.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/mkdir.al | 13 + .../tlpkg/tlperl.straw/lib/auto/POSIX/offsetof.al | 12 + .../tlpkg/tlperl.straw/lib/auto/POSIX/opendir.al | 16 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/perror.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/pow.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/printf.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/putc.al | 12 + .../tlpkg/tlperl.straw/lib/auto/POSIX/putchar.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/puts.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/qsort.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/raise.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/rand.al | 12 + .../tlpkg/tlperl.straw/lib/auto/POSIX/readdir.al | 13 + .../tlpkg/tlperl.straw/lib/auto/POSIX/realloc.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/redef.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/remove.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/rename.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/rewind.al | 13 + .../tlpkg/tlperl.straw/lib/auto/POSIX/rewinddir.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/rmdir.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/scanf.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/setbuf.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/setjmp.al | 12 + .../tlpkg/tlperl.straw/lib/auto/POSIX/setvbuf.al | 12 + .../tlperl.straw/lib/auto/POSIX/siglongjmp.al | 12 + .../tlpkg/tlperl.straw/lib/auto/POSIX/sigsetjmp.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/sin.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/sleep.al | 13 + .../tlpkg/tlperl.straw/lib/auto/POSIX/sprintf.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/sqrt.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/srand.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/sscanf.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/stat.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/strcat.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/strchr.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/strcmp.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/strcpy.al | 12 + .../tlpkg/tlperl.straw/lib/auto/POSIX/strcspn.al | 12 + .../tlpkg/tlperl.straw/lib/auto/POSIX/strerror.al | 14 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/strlen.al | 12 + .../tlpkg/tlperl.straw/lib/auto/POSIX/strncat.al | 12 + .../tlpkg/tlperl.straw/lib/auto/POSIX/strncmp.al | 12 + .../tlpkg/tlperl.straw/lib/auto/POSIX/strncpy.al | 12 + .../tlpkg/tlperl.straw/lib/auto/POSIX/strpbrk.al | 12 + .../tlpkg/tlperl.straw/lib/auto/POSIX/strrchr.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/strspn.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/strstr.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/strtok.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/system.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/time.al | 13 + .../tlpkg/tlperl.straw/lib/auto/POSIX/tmpfile.al | 12 + .../tlpkg/tlperl.straw/lib/auto/POSIX/tolower.al | 13 + .../tlpkg/tlperl.straw/lib/auto/POSIX/toupper.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/umask.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/ungetc.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/unimpl.al | 14 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/unlink.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/usage.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/utime.al | 13 + .../tlpkg/tlperl.straw/lib/auto/POSIX/vfprintf.al | 12 + .../tlpkg/tlperl.straw/lib/auto/POSIX/vprintf.al | 12 + .../tlpkg/tlperl.straw/lib/auto/POSIX/vsprintf.al | 12 + Master/tlpkg/tlperl.straw/lib/auto/POSIX/wait.al | 13 + .../tlpkg/tlperl.straw/lib/auto/POSIX/waitpid.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/PPM/.packlist | 10 + .../tlperl.straw/lib/auto/Params/Util/.packlist | 3 + .../tlperl.straw/lib/auto/Params/Util/Util.bs | 0 .../tlperl.straw/lib/auto/Params/Util/Util.dll | Bin 0 -> 16384 bytes .../tlperl.straw/lib/auto/Parse/Binary/.packlist | 3 + .../lib/auto/Parse/CPAN/Meta/.packlist | 1 + .../lib/auto/PerlIO/encoding/encoding.dll | Bin 0 -> 23552 bytes .../tlperl.straw/lib/auto/PerlIO/scalar/scalar.dll | Bin 0 -> 10752 bytes .../tlpkg/tlperl.straw/lib/auto/PerlIO/via/via.dll | Bin 0 -> 17408 bytes .../tlperl.straw/lib/auto/Pod/Perldoc/.packlist | 14 + .../tlperl.straw/lib/auto/Pod/Plainer/.packlist | 1 + .../tlperl.straw/lib/auto/Pod/Simple/.packlist | 32 + .../tlperl.straw/lib/auto/Probe/Perl/.packlist | 1 + .../tlperl.straw/lib/auto/SDBM_File/SDBM_File.dll | Bin 0 -> 30208 bytes Master/tlpkg/tlperl.straw/lib/auto/Safe/.packlist | 1 + .../tlpkg/tlperl.straw/lib/auto/Socket/Socket.dll | Bin 0 -> 18944 bytes .../tlperl.straw/lib/auto/Sort/Versions/.packlist | 1 + .../tlpkg/tlperl.straw/lib/auto/Storable/.packlist | 28 + .../lib/auto/Storable/BIN_VERSION_NV.al | 12 + .../lib/auto/Storable/BIN_WRITE_VERSION_NV.al | 12 + .../tlperl.straw/lib/auto/Storable/CAN_FLOCK.al | 21 + .../tlperl.straw/lib/auto/Storable/Storable.bs | 0 .../tlperl.straw/lib/auto/Storable/Storable.dll | Bin 0 -> 72192 bytes .../tlperl.straw/lib/auto/Storable/_freeze.al | 23 + .../tlperl.straw/lib/auto/Storable/_retrieve.al | 31 + .../tlpkg/tlperl.straw/lib/auto/Storable/_store.al | 41 + .../tlperl.straw/lib/auto/Storable/_store_fd.al | 27 + .../tlperl.straw/lib/auto/Storable/autosplit.ix | 28 + .../tlperl.straw/lib/auto/Storable/fd_retrieve.al | 25 + .../tlperl.straw/lib/auto/Storable/file_magic.al | 21 + .../tlpkg/tlperl.straw/lib/auto/Storable/freeze.al | 18 + .../tlperl.straw/lib/auto/Storable/lock_nstore.al | 17 + .../lib/auto/Storable/lock_retrieve.al | 17 + .../tlperl.straw/lib/auto/Storable/lock_store.al | 17 + .../tlperl.straw/lib/auto/Storable/logcarp.al | 12 + .../tlperl.straw/lib/auto/Storable/logcroak.al | 17 + .../tlperl.straw/lib/auto/Storable/nfreeze.al | 17 + .../tlpkg/tlperl.straw/lib/auto/Storable/nstore.al | 17 + .../tlperl.straw/lib/auto/Storable/nstore_fd.al | 18 + .../tlperl.straw/lib/auto/Storable/read_magic.al | 69 + .../tlperl.straw/lib/auto/Storable/retrieve.al | 18 + .../lib/auto/Storable/show_file_magic.al | 30 + .../tlpkg/tlperl.straw/lib/auto/Storable/store.al | 20 + .../tlperl.straw/lib/auto/Storable/store_fd.al | 18 + .../tlpkg/tlperl.straw/lib/auto/Storable/thaw.al | 28 + .../tlperl.straw/lib/auto/String/CRC32/.packlist | 4 + .../tlperl.straw/lib/auto/String/CRC32/CRC32.bs | 0 .../tlperl.straw/lib/auto/String/CRC32/CRC32.dll | Bin 0 -> 9216 bytes .../tlperl.straw/lib/auto/Sub/Uplevel/.packlist | 2 + .../tlpkg/tlperl.straw/lib/auto/Switch/.packlist | 1 + .../lib/auto/Sys/Hostname/Hostname.dll | Bin 0 -> 8192 bytes .../lib/auto/Sys/Hostname/autosplit.ix | 3 + .../tlperl.straw/lib/auto/Term/ANSIColor/.packlist | 1 + .../tlperl.straw/lib/auto/Term/ReadKey/ReadKey.bs | 0 .../tlperl.straw/lib/auto/Term/ReadKey/ReadKey.dll | Bin 0 -> 21504 bytes .../lib/auto/Term/ReadKey/autosplit.ix | 3 + .../tlperl.straw/lib/auto/Test/Deep/.packlist | 42 + .../tlperl.straw/lib/auto/Test/Exception/.packlist | 1 + .../tlperl.straw/lib/auto/Test/Harness/.packlist | 52 + .../tlperl.straw/lib/auto/Test/Manifest/.packlist | 1 + .../lib/auto/Test/NoWarnings/.packlist | 2 + .../tlperl.straw/lib/auto/Test/Script/.packlist | 1 + .../tlperl.straw/lib/auto/Test/Simple/.packlist | 8 + .../tlperl.straw/lib/auto/Test/Tester/.packlist | 4 + .../tlperl.straw/lib/auto/Test/Warn/.packlist | 1 + .../tlperl.straw/lib/auto/Text/Balanced/.packlist | 1 + .../tlperl.straw/lib/auto/Text/Diff/.packlist | 2 + .../tlperl.straw/lib/auto/Text/Glob/.packlist | 1 + .../tlperl.straw/lib/auto/Text/Soundex/Soundex.dll | Bin 0 -> 9216 bytes .../lib/auto/Tie/EncryptedHash/.packlist | 1 + .../tlperl.straw/lib/auto/Time/HiRes/HiRes.dll | Bin 0 -> 20480 bytes .../tlperl.straw/lib/auto/Time/Piece/.packlist | 4 + .../tlperl.straw/lib/auto/Time/Piece/Piece.bs | 0 .../tlperl.straw/lib/auto/Time/Piece/Piece.dll | Bin 0 -> 21504 bytes Master/tlpkg/tlperl.straw/lib/auto/Tk/.packlist | 664 + .../tlpkg/tlperl.straw/lib/auto/Tk/CancelRepeat.al | 15 + .../tlperl.straw/lib/auto/Tk/Canvas/Canvas.bs | 0 .../tlperl.straw/lib/auto/Tk/Canvas/Canvas.dll | Bin 0 -> 153600 bytes .../lib/auto/Tk/Clipboard/autosplit.ix | 6 + .../lib/auto/Tk/Clipboard/getSelected.al | 15 + .../tlperl.straw/lib/auto/Tk/Compound/Compound.bs | 0 .../tlperl.straw/lib/auto/Tk/Compound/Compound.dll | Bin 0 -> 20480 bytes .../lib/auto/Tk/DragDrop/Win32Site/Win32Site.bs | 0 .../lib/auto/Tk/DragDrop/Win32Site/Win32Site.dll | Bin 0 -> 11264 bytes .../tlpkg/tlperl.straw/lib/auto/Tk/EnterFocus.al | 27 + .../tlpkg/tlperl.straw/lib/auto/Tk/Entry/Entry.bs | 0 .../tlpkg/tlperl.straw/lib/auto/Tk/Entry/Entry.dll | Bin 0 -> 41984 bytes Master/tlpkg/tlperl.straw/lib/auto/Tk/Error.al | 20 + .../tlpkg/tlperl.straw/lib/auto/Tk/Event/Event.bs | 0 .../tlpkg/tlperl.straw/lib/auto/Tk/Event/Event.dll | Bin 0 -> 57344 bytes Master/tlpkg/tlperl.straw/lib/auto/Tk/FirstMenu.al | 21 + .../tlperl.straw/lib/auto/Tk/FocusChildren.al | 35 + Master/tlpkg/tlperl.straw/lib/auto/Tk/FocusOK.al | 36 + .../lib/auto/Tk/Frame/AddScrollbars.al | 52 + .../tlperl.straw/lib/auto/Tk/Frame/FindMenu.al | 22 + .../tlperl.straw/lib/auto/Tk/Frame/autosplit.ix | 24 + .../lib/auto/Tk/Frame/freeze_on_map.al | 18 + .../tlpkg/tlperl.straw/lib/auto/Tk/Frame/label.al | 24 + .../tlperl.straw/lib/auto/Tk/Frame/labelPack.al | 50 + .../lib/auto/Tk/Frame/labelVariable.al | 27 + .../lib/auto/Tk/Frame/packscrollbars.al | 86 + .../tlperl.straw/lib/auto/Tk/Frame/queuePack.al | 18 + .../tlpkg/tlperl.straw/lib/auto/Tk/Frame/sbset.al | 15 + .../tlperl.straw/lib/auto/Tk/Frame/scrollbars.al | 24 + .../tlpkg/tlperl.straw/lib/auto/Tk/HList/HList.bs | 0 .../tlpkg/tlperl.straw/lib/auto/Tk/HList/HList.dll | Bin 0 -> 52224 bytes Master/tlpkg/tlperl.straw/lib/auto/Tk/IO/IO.bs | 0 Master/tlpkg/tlperl.straw/lib/auto/Tk/IO/IO.dll | Bin 0 -> 12288 bytes .../tlpkg/tlperl.straw/lib/auto/Tk/ImageNames.al | 13 + .../tlpkg/tlperl.straw/lib/auto/Tk/ImageTypes.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/Tk/JPEG/JPEG.bs | 0 .../tlpkg/tlperl.straw/lib/auto/Tk/JPEG/JPEG.dll | Bin 0 -> 17408 bytes .../tlperl.straw/lib/auto/Tk/Listbox/AutoScan.al | 49 + .../lib/auto/Tk/Listbox/BeginExtend.al | 34 + .../lib/auto/Tk/Listbox/BeginSelect.al | 46 + .../lib/auto/Tk/Listbox/BeginToggle.al | 40 + .../lib/auto/Tk/Listbox/ButtonRelease_1.al | 16 + .../tlperl.straw/lib/auto/Tk/Listbox/CLEAR.al | 16 + .../tlperl.straw/lib/auto/Tk/Listbox/Cancel.al | 42 + .../tlperl.straw/lib/auto/Tk/Listbox/Cntrl_End.al | 19 + .../tlperl.straw/lib/auto/Tk/Listbox/Cntrl_Home.al | 19 + .../lib/auto/Tk/Listbox/Cntrl_backslash.al | 19 + .../tlperl.straw/lib/auto/Tk/Listbox/DELETE.al | 19 + .../tlperl.straw/lib/auto/Tk/Listbox/DataExtend.al | 39 + .../tlperl.straw/lib/auto/Tk/Listbox/EXISTS.al | 16 + .../tlperl.straw/lib/auto/Tk/Listbox/EXTEND.al | 16 + .../lib/auto/Tk/Listbox/ExtendUpDown.al | 36 + .../tlperl.straw/lib/auto/Tk/Listbox/FETCH.al | 56 + .../tlperl.straw/lib/auto/Tk/Listbox/FETCHSIZE.al | 16 + .../tlperl.straw/lib/auto/Tk/Listbox/Listbox.bs | 0 .../tlperl.straw/lib/auto/Tk/Listbox/Listbox.dll | Bin 0 -> 31744 bytes .../tlperl.straw/lib/auto/Tk/Listbox/Motion.al | 77 + .../tlpkg/tlperl.straw/lib/auto/Tk/Listbox/POP.al | 19 + .../tlpkg/tlperl.straw/lib/auto/Tk/Listbox/PUSH.al | 13 + .../tlperl.straw/lib/auto/Tk/Listbox/SHIFT.al | 19 + .../tlperl.straw/lib/auto/Tk/Listbox/SPLICE.al | 84 + .../tlperl.straw/lib/auto/Tk/Listbox/STORE.al | 80 + .../tlperl.straw/lib/auto/Tk/Listbox/SelectAll.al | 32 + .../tlperl.straw/lib/auto/Tk/Listbox/SetList.al | 16 + .../tlperl.straw/lib/auto/Tk/Listbox/TIEARRAY.al | 15 + .../tlperl.straw/lib/auto/Tk/Listbox/TIESCALAR.al | 15 + .../tlperl.straw/lib/auto/Tk/Listbox/UNSHIFT.al | 16 + .../tlperl.straw/lib/auto/Tk/Listbox/UpDown.al | 41 + .../tlperl.straw/lib/auto/Tk/Listbox/autosplit.ix | 56 + .../lib/auto/Tk/Listbox/clipboardPaste.al | 21 + .../lib/auto/Tk/Listbox/deleteSelected.al | 18 + .../lib/auto/Tk/Listbox/getSelected.al | 24 + .../tlperl.straw/lib/auto/Tk/Listbox/xyIndex.al | 29 + .../lib/auto/Tk/Menubutton/Menubutton.bs | 0 .../lib/auto/Tk/Menubutton/Menubutton.dll | Bin 0 -> 21504 bytes .../tlperl.straw/lib/auto/Tk/NBFrame/NBFrame.bs | 0 .../tlperl.straw/lib/auto/Tk/NBFrame/NBFrame.dll | Bin 0 -> 22528 bytes Master/tlpkg/tlperl.straw/lib/auto/Tk/PNG/PNG.bs | 0 Master/tlpkg/tlperl.straw/lib/auto/Tk/PNG/PNG.dll | Bin 0 -> 16384 bytes .../tlperl.straw/lib/auto/Tk/Pixmap/Pixmap.bs | 0 .../tlperl.straw/lib/auto/Tk/Pixmap/Pixmap.dll | Bin 0 -> 26624 bytes Master/tlpkg/tlperl.straw/lib/auto/Tk/Receive.al | 23 + Master/tlpkg/tlperl.straw/lib/auto/Tk/RepeatId.al | 16 + .../tlperl.straw/lib/auto/Tk/Scale/Activate.al | 33 + .../tlperl.straw/lib/auto/Tk/Scale/ButtonDown.al | 40 + .../tlperl.straw/lib/auto/Tk/Scale/ButtonUp.al | 16 + .../tlperl.straw/lib/auto/Tk/Scale/ControlPress.al | 31 + .../tlpkg/tlperl.straw/lib/auto/Tk/Scale/Drag.al | 29 + .../tlperl.straw/lib/auto/Tk/Scale/EndDrag.al | 23 + .../tlpkg/tlperl.straw/lib/auto/Tk/Scale/Enter.al | 19 + .../tlperl.straw/lib/auto/Tk/Scale/Increment.al | 61 + .../tlpkg/tlperl.straw/lib/auto/Tk/Scale/Leave.al | 15 + .../tlpkg/tlperl.straw/lib/auto/Tk/Scale/Scale.bs | 0 .../tlpkg/tlperl.straw/lib/auto/Tk/Scale/Scale.dll | Bin 0 -> 25088 bytes .../tlperl.straw/lib/auto/Tk/Scale/autosplit.ix | 22 + .../lib/auto/Tk/Scrollbar/ButtonDown.al | 55 + .../tlperl.straw/lib/auto/Tk/Scrollbar/ButtonUp.al | 26 + .../tlperl.straw/lib/auto/Tk/Scrollbar/Drag.al | 43 + .../tlperl.straw/lib/auto/Tk/Scrollbar/EndDrag.al | 28 + .../tlperl.straw/lib/auto/Tk/Scrollbar/Enter.al | 21 + .../tlperl.straw/lib/auto/Tk/Scrollbar/Leave.al | 18 + .../tlperl.straw/lib/auto/Tk/Scrollbar/Motion.al | 15 + .../lib/auto/Tk/Scrollbar/ScrlByPages.al | 38 + .../lib/auto/Tk/Scrollbar/ScrlByUnits.al | 37 + .../lib/auto/Tk/Scrollbar/ScrlToPos.al | 35 + .../lib/auto/Tk/Scrollbar/ScrlTopBottom.al | 32 + .../lib/auto/Tk/Scrollbar/Scrollbar.bs | 0 .../lib/auto/Tk/Scrollbar/Scrollbar.dll | Bin 0 -> 20992 bytes .../tlperl.straw/lib/auto/Tk/Scrollbar/Select.al | 59 + .../lib/auto/Tk/Scrollbar/StartDrag.al | 38 + .../lib/auto/Tk/Scrollbar/autosplit.ix | 30 + Master/tlpkg/tlperl.straw/lib/auto/Tk/Selection.al | 18 + .../tlpkg/tlperl.straw/lib/auto/Tk/TList/TList.bs | 0 .../tlpkg/tlperl.straw/lib/auto/Tk/TList/TList.dll | Bin 0 -> 28672 bytes .../tlpkg/tlperl.straw/lib/auto/Tk/Table/Create.al | 17 + .../tlpkg/tlperl.straw/lib/auto/Tk/Table/Posn.al | 15 + .../tlperl.straw/lib/auto/Tk/Table/autosplit.ix | 14 + Master/tlpkg/tlperl.straw/lib/auto/Tk/Table/see.al | 46 + .../tlperl.straw/lib/auto/Tk/Table/totalColumns.al | 13 + .../tlperl.straw/lib/auto/Tk/Table/totalRows.al | 13 + Master/tlpkg/tlperl.straw/lib/auto/Tk/Text/Text.bs | 0 .../tlpkg/tlperl.straw/lib/auto/Tk/Text/Text.dll | Bin 0 -> 114176 bytes .../tlperl.straw/lib/auto/Tk/Text/autosplit.ix | 3 + .../tlperl.straw/lib/auto/Tk/TextEdit/autosplit.ix | 3 + .../tlperl.straw/lib/auto/Tk/TextUndo/autosplit.ix | 3 + .../tlperl.straw/lib/auto/Tk/TixGrid/TixGrid.bs | 0 .../tlperl.straw/lib/auto/Tk/TixGrid/TixGrid.dll | Bin 0 -> 52224 bytes Master/tlpkg/tlperl.straw/lib/auto/Tk/Tk.bs | 0 Master/tlpkg/tlperl.straw/lib/auto/Tk/Tk.dll | Bin 0 -> 807424 bytes .../tlperl.straw/lib/auto/Tk/Toplevel/FG_BindIn.al | 19 + .../lib/auto/Tk/Toplevel/FG_BindOut.al | 20 + .../tlperl.straw/lib/auto/Tk/Toplevel/FG_Create.al | 56 + .../lib/auto/Tk/Toplevel/FG_Destroy.al | 29 + .../tlperl.straw/lib/auto/Tk/Toplevel/FG_In.al | 24 + .../tlperl.straw/lib/auto/Tk/Toplevel/FG_Out.al | 32 + .../tlperl.straw/lib/auto/Tk/Toplevel/autosplit.ix | 10 + .../tlperl.straw/lib/auto/Tk/TraverseToMenu.al | 27 + .../tlperl.straw/lib/auto/Tk/Widget/ASkludge.al | 30 + .../lib/auto/Tk/Widget/AltKeyInDialog.al | 20 + .../tlperl.straw/lib/auto/Tk/Widget/AmpWidget.al | 36 + .../lib/auto/Tk/Widget/FindAltKeyTarget.al | 38 + .../tlperl.straw/lib/auto/Tk/Widget/MasterMenu.al | 14 + .../lib/auto/Tk/Widget/RestoreFocusGrab.al | 59 + .../tlperl.straw/lib/auto/Tk/Widget/SetAmpText.al | 19 + .../lib/auto/Tk/Widget/SetFocusGrab.al | 38 + .../lib/auto/Tk/Widget/UnderlineAmpersand.al | 29 + .../tlperl.straw/lib/auto/Tk/Widget/autosplit.ix | 27 + .../tlperl.straw/lib/auto/Tk/Widget/bindDump.al | 87 + .../lib/auto/Tk/Widget/clipboardKeysyms.al | 51 + .../tlperl.straw/lib/auto/Tk/Widget/pathname.al | 15 + .../tlperl.straw/lib/auto/Tk/Wm/AnchorAdjust.al | 17 + .../tlperl.straw/lib/auto/Tk/Wm/FullScreen.al | 29 + Master/tlpkg/tlperl.straw/lib/auto/Tk/Wm/Popup.al | 50 + Master/tlpkg/tlperl.straw/lib/auto/Tk/Wm/Post.al | 20 + .../tlpkg/tlperl.straw/lib/auto/Tk/Wm/autosplit.ix | 14 + .../tlperl.straw/lib/auto/Tk/Wm/iconposition.al | 24 + Master/tlpkg/tlperl.straw/lib/auto/Tk/X/X.bs | 0 Master/tlpkg/tlperl.straw/lib/auto/Tk/X/X.dll | Bin 0 -> 25088 bytes .../tlpkg/tlperl.straw/lib/auto/Tk/X/autosplit.ix | 3 + Master/tlpkg/tlperl.straw/lib/auto/Tk/Xlib/Xlib.bs | 0 .../tlpkg/tlperl.straw/lib/auto/Tk/Xlib/Xlib.dll | Bin 0 -> 29696 bytes Master/tlpkg/tlperl.straw/lib/auto/Tk/autosplit.ix | 49 + Master/tlpkg/tlperl.straw/lib/auto/Tk/break.al | 13 + .../tlperl.straw/lib/auto/Tk/focusFollowsMouse.al | 14 + Master/tlpkg/tlperl.straw/lib/auto/Tk/focusNext.al | 18 + Master/tlpkg/tlperl.straw/lib/auto/Tk/focusPrev.al | 28 + .../tlpkg/tlperl.straw/lib/auto/Tk/getEncoding.al | 43 + .../tlpkg/tlperl.straw/lib/auto/Tk/getNextFocus.al | 44 + .../tlpkg/tlperl.straw/lib/auto/Tk/getPrevFocus.al | 54 + Master/tlpkg/tlperl.straw/lib/auto/Tk/interps.al | 14 + Master/tlpkg/tlperl.straw/lib/auto/Tk/lsearch.al | 19 + .../tlperl.straw/lib/auto/Tk/pTk/extralibs.ld | 1 + Master/tlpkg/tlperl.straw/lib/auto/Tk/tabFocus.al | 13 + .../tlperl.straw/lib/auto/Tk/updateWidgets.al | 17 + .../tlperl.straw/lib/auto/Tree/DAG_Node/.packlist | 1 + Master/tlpkg/tlperl.straw/lib/auto/URI/.packlist | 52 + .../lib/auto/Unicode/Normalize/Normalize.dll | Bin 0 -> 195072 bytes .../tlperl.straw/lib/auto/Win32/API/.packlist | 9 + .../tlpkg/tlperl.straw/lib/auto/Win32/API/API.bs | 0 .../tlpkg/tlperl.straw/lib/auto/Win32/API/API.dll | Bin 0 -> 21504 bytes .../lib/auto/Win32/API/Callback/Callback.bs | 0 .../lib/auto/Win32/API/Callback/Callback.dll | Bin 0 -> 16384 bytes .../tlperl.straw/lib/auto/Win32/EventLog/.packlist | 3 + .../lib/auto/Win32/EventLog/EventLog.bs | 0 .../lib/auto/Win32/EventLog/EventLog.dll | Bin 0 -> 24576 bytes .../tlperl.straw/lib/auto/Win32/Exe/.packlist | 28 + .../tlperl.straw/lib/auto/Win32/File/.packlist | 3 + .../tlpkg/tlperl.straw/lib/auto/Win32/File/File.bs | 0 .../tlperl.straw/lib/auto/Win32/File/File.dll | Bin 0 -> 10240 bytes .../lib/auto/Win32/File/Object/.packlist | 1 + .../tlperl.straw/lib/auto/Win32/Process/.packlist | 3 + .../tlperl.straw/lib/auto/Win32/Process/Process.bs | 0 .../lib/auto/Win32/Process/Process.dll | Bin 0 -> 39936 bytes .../tlperl.straw/lib/auto/Win32/Shortcut/.packlist | 3 + .../lib/auto/Win32/Shortcut/Shortcut.bs | 0 .../lib/auto/Win32/Shortcut/Shortcut.dll | Bin 0 -> 24576 bytes .../lib/auto/Win32/TieRegistry/.packlist | 2 + Master/tlpkg/tlperl.straw/lib/auto/Win32/Win32.dll | Bin 0 -> 44032 bytes .../tlperl.straw/lib/auto/Win32/WinError/.packlist | 3 + .../lib/auto/Win32/WinError/WinError.bs | 0 .../lib/auto/Win32/WinError/WinError.dll | Bin 0 -> 68096 bytes .../tlperl.straw/lib/auto/Win32API/File/File.dll | Bin 0 -> 83968 bytes .../lib/auto/Win32API/Registry/.packlist | 4 + .../lib/auto/Win32API/Registry/Registry.bs | 0 .../lib/auto/Win32API/Registry/Registry.dll | Bin 0 -> 187392 bytes .../tlperl.straw/lib/auto/Win32CORE/extralibs.ld | 1 + .../tlperl.straw/lib/auto/XML/LibXML/.packlist | 43 + .../tlperl.straw/lib/auto/XML/LibXML/LibXML.bs | 0 .../tlperl.straw/lib/auto/XML/LibXML/LibXML.dll | Bin 0 -> 333824 bytes .../tlperl.straw/lib/auto/XML/LibXSLT/.packlist | 4 + .../tlperl.straw/lib/auto/XML/LibXSLT/LibXSLT.bs | 0 .../lib/auto/XML/LibXSLT/LibXSLT.xs.dll | Bin 0 -> 47104 bytes .../lib/auto/XML/NamespaceSupport/.packlist | 1 + .../tlperl.straw/lib/auto/XML/Parser/.packlist | 29 + .../lib/auto/XML/Parser/Expat/Expat.bs | 0 .../lib/auto/XML/Parser/Expat/Expat.dll | Bin 0 -> 67072 bytes .../tlpkg/tlperl.straw/lib/auto/XML/SAX/.packlist | 23 + Master/tlpkg/tlperl.straw/lib/auto/YAML/.packlist | 13 + .../tlperl.straw/lib/auto/YAML/Tiny/.packlist | 1 + Master/tlpkg/tlperl.straw/lib/auto/attrs/attrs.dll | Bin 0 -> 9216 bytes .../tlperl.straw/lib/auto/common/sense/.packlist | 1 + .../tlpkg/tlperl.straw/lib/auto/constant/.packlist | 1 + .../tlperl.straw/lib/auto/local/lib/.packlist | 1 + Master/tlpkg/tlperl.straw/lib/auto/mro/mro.dll | Bin 0 -> 13824 bytes .../tlpkg/tlperl.straw/lib/auto/parent/.packlist | 1 + Master/tlpkg/tlperl.straw/lib/auto/pip/.packlist | 7 + Master/tlpkg/tlperl.straw/lib/auto/pler/.packlist | 3 + Master/tlpkg/tlperl.straw/lib/auto/re/re.dll | Bin 0 -> 292864 bytes .../tlpkg/tlperl.straw/lib/auto/sdbm/extralibs.ld | 1 + .../tlpkg/tlperl.straw/lib/auto/threads/.packlist | 3 + .../tlperl.straw/lib/auto/threads/shared/.packlist | 3 + .../tlperl.straw/lib/auto/threads/shared/shared.bs | 0 .../lib/auto/threads/shared/shared.dll | Bin 0 -> 31232 bytes .../tlpkg/tlperl.straw/lib/auto/threads/threads.bs | 0 .../tlperl.straw/lib/auto/threads/threads.dll | Bin 0 -> 34304 bytes .../tlpkg/tlperl.straw/lib/auto/version/.packlist | 6 + .../tlpkg/tlperl.straw/lib/auto/version/vxs/vxs.bs | 0 .../tlperl.straw/lib/auto/version/vxs/vxs.dll | Bin 0 -> 27136 bytes Master/tlpkg/tlperl.straw/lib/autouse.pm | 171 + Master/tlpkg/tlperl.straw/lib/bigfloat.pl | 254 + Master/tlpkg/tlperl.straw/lib/bigint.pm | 675 + Master/tlpkg/tlperl.straw/lib/blib.pm | 97 + Master/tlpkg/tlperl.straw/lib/bytes.pm | 88 + Master/tlpkg/tlperl.straw/lib/charnames.pm | 554 + Master/tlpkg/tlperl.straw/lib/common/sense.pm | 424 + Master/tlpkg/tlperl.straw/lib/complete.pl | 120 + Master/tlpkg/tlperl.straw/lib/constant.pm | 392 + Master/tlpkg/tlperl.straw/lib/ctime.pl | 59 + Master/tlpkg/tlperl.straw/lib/diagnostics.pm | 647 + Master/tlpkg/tlperl.straw/lib/encoding.pm | 669 + Master/tlpkg/tlperl.straw/lib/fields.pm | 327 + Master/tlpkg/tlperl.straw/lib/filetest.pm | 117 + Master/tlpkg/tlperl.straw/lib/finddepth.pl | 46 + Master/tlpkg/tlperl.straw/lib/fix_4_os2.pl | 61 + Master/tlpkg/tlperl.straw/lib/getopt.pl | 49 + Master/tlpkg/tlperl.straw/lib/if.pm | 56 + Master/tlpkg/tlperl.straw/lib/inc/latest.pm | 246 + .../tlpkg/tlperl.straw/lib/inc/latest/private.pm | 101 + Master/tlpkg/tlperl.straw/lib/local/lib.pm | 832 + Master/tlpkg/tlperl.straw/lib/lwptut.pod | 837 + Master/tlpkg/tlperl.straw/lib/mro.pm | 381 + Master/tlpkg/tlperl.straw/lib/newgetopt.pl | 75 + Master/tlpkg/tlperl.straw/lib/open.pm | 258 + Master/tlpkg/tlperl.straw/lib/open3.pl | 12 + Master/tlpkg/tlperl.straw/lib/ops.pm | 47 + Master/tlpkg/tlperl.straw/lib/overload/numbers.pm | 159 + Master/tlpkg/tlperl.straw/lib/parent.pm | 136 + Master/tlpkg/tlperl.straw/lib/perl5db.pl | 9542 ++++ Master/tlpkg/tlperl.straw/lib/perldoc.pod | 267 + Master/tlpkg/tlperl.straw/lib/pler.pm | 482 + Master/tlpkg/tlperl.straw/lib/ppm.xml | 18 + Master/tlpkg/tlperl.straw/lib/pwd.pl | 67 + Master/tlpkg/tlperl.straw/lib/re.pm | 514 + Master/tlpkg/tlperl.straw/lib/sigtrap.pm | 289 + Master/tlpkg/tlperl.straw/lib/stat.pl | 29 + Master/tlpkg/tlperl.straw/lib/termcap.pl | 178 + Master/tlpkg/tlperl.straw/lib/utf8.pm | 198 + Master/tlpkg/tlperl.straw/lib/utf8_heavy.pl | 286 + Master/tlpkg/tlperl.straw/lib/version.pm | 216 + Master/tlpkg/tlperl.straw/lib/version.pod | 365 + .../tlpkg/tlperl.straw/lib/version/Internals.pod | 608 + Master/tlpkg/tlperl.straw/lib/version/vxs.pm | 28 + Master/tlpkg/tlperl.straw/lib/vmsish.pm | 154 + 2140 files changed, 599469 insertions(+) create mode 100644 Master/tlpkg/tlperl.straw/README.TeXLive create mode 100755 Master/tlpkg/tlperl.straw/bin/a2p.exe create mode 100755 Master/tlpkg/tlperl.straw/bin/bdf2gdfont.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/bdf2gdfont.pl create mode 100755 Master/tlpkg/tlperl.straw/bin/c2ph.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/config_data create mode 100755 Master/tlpkg/tlperl.straw/bin/config_data.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/corelist create mode 100755 Master/tlpkg/tlperl.straw/bin/corelist.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/cpan create mode 100755 Master/tlpkg/tlperl.straw/bin/cpan.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/cpan2dist create mode 100755 Master/tlpkg/tlperl.straw/bin/cpan2dist.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/cpandb create mode 100755 Master/tlpkg/tlperl.straw/bin/cpandb.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/cpaninject create mode 100755 Master/tlpkg/tlperl.straw/bin/cpaninject.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/cpanp create mode 100755 Master/tlpkg/tlperl.straw/bin/cpanp-run-perl create mode 100755 Master/tlpkg/tlperl.straw/bin/cpanp-run-perl.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/cpanp.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/cpansign create mode 100755 Master/tlpkg/tlperl.straw/bin/cpansign.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/crc32 create mode 100755 Master/tlpkg/tlperl.straw/bin/crc32.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/dbilogstrip create mode 100755 Master/tlpkg/tlperl.straw/bin/dbilogstrip.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/dbiprof create mode 100755 Master/tlpkg/tlperl.straw/bin/dbiprof.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/dbiproxy create mode 100755 Master/tlpkg/tlperl.straw/bin/dbiproxy.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/dprofpp.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/enc2xs create mode 100755 Master/tlpkg/tlperl.straw/bin/enc2xs.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/exe_update.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/exe_update.pl create mode 100755 Master/tlpkg/tlperl.straw/bin/exetype.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/find2perl.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/findrule create mode 100755 Master/tlpkg/tlperl.straw/bin/findrule.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/gedi create mode 100755 Master/tlpkg/tlperl.straw/bin/gedi.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/h2ph.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/h2xs.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/instmodsh create mode 100755 Master/tlpkg/tlperl.straw/bin/instmodsh.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/json_xs create mode 100755 Master/tlpkg/tlperl.straw/bin/json_xs.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/largeprimes create mode 100755 Master/tlpkg/tlperl.straw/bin/largeprimes.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/libnetcfg.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/lwp-download create mode 100755 Master/tlpkg/tlperl.straw/bin/lwp-download.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/lwp-dump create mode 100755 Master/tlpkg/tlperl.straw/bin/lwp-dump.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/lwp-mirror create mode 100755 Master/tlpkg/tlperl.straw/bin/lwp-mirror.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/lwp-request create mode 100755 Master/tlpkg/tlperl.straw/bin/lwp-request.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/lwp-rget create mode 100755 Master/tlpkg/tlperl.straw/bin/lwp-rget.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/makerandom create mode 100755 Master/tlpkg/tlperl.straw/bin/makerandom.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/parinstallppd create mode 100755 Master/tlpkg/tlperl.straw/bin/parinstallppd.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/perl.exe create mode 100755 Master/tlpkg/tlperl.straw/bin/perl5.10.1.exe create mode 100755 Master/tlpkg/tlperl.straw/bin/perl510.dll create mode 100755 Master/tlpkg/tlperl.straw/bin/perlbug.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/perldoc create mode 100755 Master/tlpkg/tlperl.straw/bin/perldoc.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/perlglob.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/perlglob.exe create mode 100755 Master/tlpkg/tlperl.straw/bin/perlivp.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/perlthanks.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/piconv create mode 100755 Master/tlpkg/tlperl.straw/bin/piconv.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/pip create mode 100755 Master/tlpkg/tlperl.straw/bin/pip.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/pl2bat.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/pl2pm.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/pler create mode 100755 Master/tlpkg/tlperl.straw/bin/pler.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/pod2html.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/pod2latex.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/pod2man create mode 100755 Master/tlpkg/tlperl.straw/bin/pod2man.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/pod2text create mode 100755 Master/tlpkg/tlperl.straw/bin/pod2text.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/pod2usage.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/podchecker.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/podselect.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/ppd2par create mode 100755 Master/tlpkg/tlperl.straw/bin/ppd2par.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/ppm.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/ppm.pl create mode 100755 Master/tlpkg/tlperl.straw/bin/prove create mode 100755 Master/tlpkg/tlperl.straw/bin/prove.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/psed.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/pstruct.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/ptar create mode 100755 Master/tlpkg/tlperl.straw/bin/ptar.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/ptardiff create mode 100755 Master/tlpkg/tlperl.straw/bin/ptardiff.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/ptked create mode 100755 Master/tlpkg/tlperl.straw/bin/ptked.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/ptksh create mode 100755 Master/tlpkg/tlperl.straw/bin/ptksh.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/pwhich create mode 100755 Master/tlpkg/tlperl.straw/bin/pwhich.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/runperl.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/s2p.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/search.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/shasum create mode 100755 Master/tlpkg/tlperl.straw/bin/shasum.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/splain.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/tkjpeg create mode 100755 Master/tlpkg/tlperl.straw/bin/tkjpeg.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/widget create mode 100755 Master/tlpkg/tlperl.straw/bin/widget.bat create mode 100755 Master/tlpkg/tlperl.straw/bin/wperl.exe create mode 100755 Master/tlpkg/tlperl.straw/bin/xsubpp.bat create mode 100755 Master/tlpkg/tlperl.straw/lib/Algorithm/Diff.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Algorithm/DiffOld.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Algorithm/cdiff.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Algorithm/diff.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Algorithm/diffnew.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Algorithm/htmldiff.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/AnyDBM_File.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Archive/Extract.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Archive/Tar.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Archive/Tar/Constant.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Archive/Tar/File.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Archive/Zip.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Archive/Zip/Archive.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Archive/Zip/BufferedFileHandle.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Archive/Zip/DirectoryMember.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Archive/Zip/FAQ.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Archive/Zip/FileMember.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Archive/Zip/Member.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Archive/Zip/MemberRead.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Archive/Zip/MockFileHandle.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Archive/Zip/NewFileMember.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Archive/Zip/StringMember.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Archive/Zip/Tree.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Archive/Zip/ZipFileMember.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Attribute/Handlers.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/AutoSplit.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/BerkeleyDB.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/BerkeleyDB.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Bundle/DBD/Pg.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Bundle/DBD/mysql.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Bundle/DBI.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Bundle/LWP.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CGI/Apache.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CGI/Carp.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CGI/Cookie.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CGI/Fast.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CGI/Pretty.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CGI/Push.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CGI/Switch.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CGI/Util.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/EXTERN.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/INTERN.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/XSUB.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/arpa/inet.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/av.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/cc_runtime.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/config.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/cop.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/cv.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/dirent.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/dosish.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/embed.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/embedvar.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/fakesdio.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/fakethr.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/form.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/git_version.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/gv.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/handy.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/hv.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/intrpvar.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/iperlsys.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/keywords.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/libperl510.a create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/malloc_ctl.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/mg.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/mydtrace.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/netdb.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/nostdio.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/op.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/opcode.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/opnames.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/overload.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/pad.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/parser.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/patchlevel.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/perl.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/perlapi.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/perlhost.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/perlio.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/perliol.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/perlsdio.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/perlsfio.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/perlvars.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/perly.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/pp.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/pp_proto.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/proto.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/reentr.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/regcharclass.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/regcomp.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/regexp.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/regnodes.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/scope.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/sv.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/sys/socket.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/thread.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/uconfig.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/unixish.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/utf8.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/utfebcdic.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/util.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/uudmap.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/vdir.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/vmem.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/warnings.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/win32.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/win32iop-o.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/win32iop.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/win32thread.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CORE/wince.h create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/API/HOWTO.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/Admin.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/Author.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/Bundle.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/CacheMgr.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/Checksums.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/Complete.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/Config.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/Debug.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/DeferredCode.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/DistnameInfo.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/Distribution.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/Distroprefs.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/Distrostatus.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/Exception/RecursiveDependency.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/Exception/blocked_urllist.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/Exception/yaml_not_installed.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/FTP.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/FTP/netrc.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/FirstTime.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/HandleConfig.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/Index.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/InfoObj.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/Inject.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/Kwalify.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/Kwalify/distroprefs.dd create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/Kwalify/distroprefs.yml create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/LWP/UserAgent.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/Mirrors.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/Module.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/Nox.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/Prompt.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/Queue.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/SQLite.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/SQLite/DBI.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/SQLite/DBI/Index.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/SQLite/DBI/Search.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/SQLite/Index.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/SQLite/Info.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/SQLite/META.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/SQLite/Populate.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/SQLite/Search.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/SQLite/State.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/SQLite/Util.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/Shell.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/Tarzip.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/URL.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPAN/Version.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/CPANPLUS.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Carp.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Class/ErrorHandler.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Class/ISA.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Class/Loader.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Class/LoaderTest.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Class/Struct.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Config.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Config.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Config_heavy.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Convert/ASCII/Armor.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Convert/ASCII/Armour.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Convert/ASN1.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Convert/ASN1.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Convert/ASN1/Debug.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Convert/ASN1/IO.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Convert/ASN1/_decode.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Convert/ASN1/_encode.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Convert/ASN1/parser.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Convert/PEM.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Convert/PEM/CBC.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Crypt/CAST5_PP/Tables.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Crypt/DES_EDE3.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Cwd.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DB.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBI/Changes.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBI/Const/GetInfo/ANSI.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBI/Const/GetInfo/ODBC.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBI/Const/GetInfoReturn.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBI/Const/GetInfoType.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBI/DBD.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBI/DBD/Metadata.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBI/FAQ.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBI/Gofer/Execute.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBI/Gofer/Request.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBI/Gofer/Response.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBI/Gofer/Serializer/Base.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBI/Gofer/Serializer/DataDumper.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBI/Gofer/Serializer/Storable.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBI/Gofer/Transport/Base.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBI/Gofer/Transport/pipeone.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBI/Gofer/Transport/stream.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBI/Profile.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBI/ProfileData.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBI/ProfileDumper.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBI/ProfileDumper/Apache.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBI/ProfileSubs.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBI/ProxyServer.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBI/PurePerl.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBI/Roadmap.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBI/SQL/Nano.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBI/Util/CacheMemory.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBI/Util/_accessor.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBI/W32ODBC.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DBM_Filter.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Data/Buffer.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Data/Compare.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Data/Compare/Plugins.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Data/Compare/Plugins/Scalar/Properties.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Data/Dumper.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Data/Random.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Data/Random/WordList.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Data/Random/dict create mode 100755 Master/tlpkg/tlperl.straw/lib/Digest.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Digest/BubbleBabble.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Digest/HMAC.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Digest/HMAC_MD5.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Digest/HMAC_SHA1.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Digest/MD2.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Digest/MD5.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Digest/SHA.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Digest/SHA1.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Digest/base.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Digest/file.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/DirHandle.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/English.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Errno.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Exporter/Heavy.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Fatal.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Filter/Simple.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Filter/Util/Call.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/GDBM_File.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Getopt/Long.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Getopt/Std.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/HTML/Entities.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/HTML/Filter.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/HTML/Form.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/HTML/HeadParser.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/HTML/LinkExtor.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/HTML/Parser.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/HTML/PullParser.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/HTML/Tagset.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/HTML/TokeParser.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/HTTP/Config.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/HTTP/Cookies.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/HTTP/Cookies/Microsoft.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/HTTP/Cookies/Netscape.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/HTTP/Daemon.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/HTTP/Date.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/HTTP/Headers.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/HTTP/Headers/Auth.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/HTTP/Headers/ETag.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/HTTP/Headers/Util.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/HTTP/Message.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/HTTP/Negotiate.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/HTTP/Request.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/HTTP/Request/Common.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/HTTP/Response.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/HTTP/Status.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Hash/Util.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Hash/Util/FieldHash.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/I18N/Collate.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/I18N/LangTags.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/I18N/LangTags/Detect.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/I18N/LangTags/List.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/IO.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/IPC/Cmd.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/IPC/Open2.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/IPC/Open3.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/IPC/Run3.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/IPC/Run3/ProfArrayBuffer.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/IPC/Run3/ProfLogReader.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/IPC/Run3/ProfLogger.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/IPC/Run3/ProfPP.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/IPC/Run3/ProfReporter.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/IPC/System/Simple.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/JSON.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/JSON/PP.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/JSON/PP/Boolean.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/JSON/PP5005.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/JSON/PP56.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/JSON/PP58.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/JSON/XS.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/JSON/XS/Boolean.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/LWP.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Log/Message.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Log/Message/Config.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Log/Message/Handlers.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Log/Message/Item.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Log/Message/Simple.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/MIME/Base64.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/MIME/QuotedPrint.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Math/BigFloat.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Math/BigFloat/Trace.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Math/BigInt.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Math/BigInt/Calc.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Math/BigInt/CalcEmu.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Math/BigInt/FastCalc.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Math/BigInt/GMP.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Math/BigInt/Trace.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Math/BigRat.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Math/Complex.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Math/GMP.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Math/Pari.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Math/PariInit.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Math/Trig.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Math/libPARI.dumb.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Math/libPARI.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Memoize/AnyDBM_File.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Memoize/Expire.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Memoize/ExpireFile.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Memoize/ExpireTest.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Memoize/NDBM_File.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Memoize/SDBM_File.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Memoize/Storable.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Opcode.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/PAR.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/POSIX.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/POSIX.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/PPM/RelocPerl.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/PPM/XML/Element.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/PPM/XML/PPD.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/PPM/XML/PPMConfig.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/PPM/XML/RepositorySummary.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/PPM/XML/ValidatingElement.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Package/Constants.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Params/Check.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Params/Util.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Parse/Binary.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Parse/Binary/FixedFormat.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Parse/Binary/FixedFormat/Variants.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Parse/CPAN/Meta.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/PerlIO.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/PerlIO/encoding.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/PerlIO/scalar.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/PerlIO/via.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/PerlIO/via/QuotedPrint.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Checker.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Escapes.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Find.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Functions.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Html.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/InputObjects.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/LaTeX.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Man.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/ParseLink.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/ParseUtils.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Parser.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Perldoc.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Perldoc/BaseTo.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Perldoc/GetOptsOO.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Perldoc/ToChecker.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Perldoc/ToMan.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Perldoc/ToNroff.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Perldoc/ToPod.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Perldoc/ToRtf.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Perldoc/ToText.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Perldoc/ToTk.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Perldoc/ToXml.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/PlainText.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Plainer.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Select.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple/BlackBox.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple/Checker.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple/Debug.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple/DumpAsText.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple/DumpAsXML.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple/HTML.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple/HTMLBatch.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple/HTMLLegacy.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple/LinkSection.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple/Methody.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple/Progress.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple/PullParser.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple/PullParserEndToken.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple/PullParserStartToken.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple/PullParserTextToken.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple/PullParserToken.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple/RTF.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple/Search.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple/SimpleTree.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple/Subclassing.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple/Text.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple/TextContent.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple/TiedOutFH.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple/Transcode.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple/TranscodeDumb.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple/TranscodeSmart.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple/XHTML.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Simple/XMLOutStream.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Text.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Text/Color.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Text/Overstrike.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Text/Termcap.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Pod/Usage.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Probe/Perl.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/SDBM_File.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Safe.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/SelfLoader.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Shell.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Sort/Versions.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Storable.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Sys/Hostname.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Base.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Formatter/Base.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Formatter/Color.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Formatter/Console.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Formatter/Console/ParallelSession.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Formatter/Console/Session.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Formatter/File.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Formatter/File/Session.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Formatter/Session.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Harness.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Harness/Beyond.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Object.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/Aggregator.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/Grammar.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/Iterator.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/Iterator/Array.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/Iterator/Process.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/Iterator/Stream.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/IteratorFactory.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/Multiplexer.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/Result.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/Result/Bailout.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/Result/Comment.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/Result/Plan.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/Result/Pragma.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/Result/Test.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/Result/Unknown.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/Result/Version.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/Result/YAML.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/ResultFactory.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/Scheduler.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/Scheduler/Job.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/Scheduler/Spinner.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/Source.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/Source/Perl.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/SourceHandler.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/SourceHandler/Executable.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/SourceHandler/File.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/SourceHandler/Handle.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/SourceHandler/Perl.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/SourceHandler/RawTAP.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/SourceHandler/pgTAP.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/Utils.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/YAMLish/Reader.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TAP/Parser/YAMLish/Writer.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/TASKS.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Term/ANSIColor.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Term/Cap.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Term/Complete.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Term/ReadKey.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Term/ReadLine.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Term/ReadLine/Perl.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Term/ReadLine/readline.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Term/UI.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Term/UI/History.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Builder.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Builder/IO/Scalar.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Builder/Module.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Builder/Tester.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Builder/Tester/Color.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/All.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/Any.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/Array.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/ArrayEach.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/ArrayElementsOnly.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/ArrayLength.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/ArrayLengthOnly.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/Blessed.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/Boolean.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/Cache.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/Cache/Simple.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/Class.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/Cmp.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/Code.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/Hash.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/HashEach.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/HashElements.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/HashKeys.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/HashKeysOnly.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/Ignore.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/Isa.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/ListMethods.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/MM.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/Methods.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/NoTest.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/Number.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/Ref.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/RefType.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/Regexp.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/RegexpMatches.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/RegexpOnly.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/RegexpRef.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/RegexpRefOnly.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/RegexpVersion.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/ScalarRef.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/ScalarRefOnly.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/Set.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/Shallow.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/Stack.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Deep/String.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Exception.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Harness.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Manifest.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/More.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/NoWarnings.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/NoWarnings/Warning.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Script.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Simple.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Tester.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Tester/Capture.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Tester/CaptureRunner.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Tester/Delegate.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Tutorial.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/Warn.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Test/YAML.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Thread/Queue.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Thread/Semaphore.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tie/Array.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tie/EncryptedHash.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tie/File.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tie/Handle.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tie/Hash.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tie/Hash/NamedCapture.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tie/Memoize.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tie/RefHash.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tie/Registry.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tie/Scalar.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tie/StdHandle.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tie/SubstrHash.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tie/Watch.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Time/HiRes.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Time/Local.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Time/Piece.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Time/Seconds.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Time/gmtime.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Time/localtime.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Time/tm.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/804delta.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Adjuster.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Adjuster.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/After.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Animation.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Animation.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Balloon.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Balloon.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Bitmap.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Bitmap.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/BrowseEntry.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/BrowseEntry.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Button.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Button.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Camel.xpm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Canvas.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Canvas.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Checkbutton.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Checkbutton.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Clipboard.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Clipboard.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/CmdLine.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/CmdLine.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/ColorEdit.xpm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/ColorEditor.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/ColorEditor.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Common.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Compound.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Compound.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Config.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/ConfigSpecs.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Configure.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Credits create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/DItem.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Derived.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Derived.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Dialog.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Dialog.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/DialogBox.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/DialogBox.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/DirTree.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/DirTree.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Dirlist.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/DragDrop.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/DragDrop/Common.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/DragDrop/LocalDrop.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/DragDrop/Rect.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/DragDrop/SunConst.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/DragDrop/SunDrop.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/DragDrop/SunSite.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/DragDrop/Win32Drop.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/DragDrop/Win32Site.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/DragDrop/XDNDDrop.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/DragDrop/XDNDSite.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/DropSite.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/DropSite.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/DummyEncode.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/English.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Entry.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Entry.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Error.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/ErrorDialog.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Event.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Event/IO.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Eventloop.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/FBox.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/FBox.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/FileSelect.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/FileSelect.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/FloatEntry.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Font.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Font.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Frame.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Frame.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/HList.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/HList.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/IO.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/IO.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/IconList.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/IconList.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Image.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Image.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/InputO.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Internals.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/ItemStyle.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/JPEG.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/LabEntry.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/LabFrame.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/LabFrame.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/LabRadio.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Label.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Label.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Labelframe.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Labelframe.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Listbox.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Listbox.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/MMtry.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/MMutil.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/MainWindow.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/MainWindow.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/MakeDepend.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Menu.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Menu.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Menu/Item.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Menu/Item.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Menubar.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Menubutton.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Menubutton.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Message.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Message.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/MsgBox.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/MsgBox.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Mwm.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/NBFrame.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/NoteBook.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/NoteBook.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Optionmenu.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Optionmenu.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/PNG.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Pane.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Panedwindow.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Panedwindow.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Photo.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Photo.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Pixmap.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Pixmap.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Popup.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Pretty.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/ProgressBar.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/README.Adjust create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/ROText.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/ROText.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Radiobutton.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Radiobutton.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Region.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Reindex.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/ReindexedROText.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/ReindexedText.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Scale.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Scale.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Scrollbar.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Scrollbar.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Scrolled.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Spinbox.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Spinbox.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Stats.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Submethods.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Submethods.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/SunConst.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/TList.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/TList.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Table.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Table.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Tcl-perl.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Text.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Text.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Text/Tag.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/TextEdit.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/TextList.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/TextUndo.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/TextUndo.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Tiler.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Tiler.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/TixGrid.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/TixGrid.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Tk.xbm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Tk.xpm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/TkXSUB.def create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Toplevel.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Toplevel.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Trace.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Tree.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Tree.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/UserGuide.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Widget.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Widget.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/WidgetDemo.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Wm.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Wm.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/X.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/X.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/X11/X.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/X11/Xatom.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/X11/Xfuncproto.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/X11/Xlib.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/X11/Xutil.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/X11/cursorfont.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/X11/keysym.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/X11/keysymdef.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/X11/license.terms create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/X11Font.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/X11Font.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Xcamel.gif create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Xlib.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Xrm.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/Xrm.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/act_folder.xbm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/act_folder.xpm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/after.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/anim.gif create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/arrowdownwin.xbm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/balArrow.xbm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/bind.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/bindtags.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/callbacks.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/cbxarrow.xbm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/chooseColor.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/chooseDirectory.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/composite.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/LabEnLabRad.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/images/QuitPB.xpm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/images/QuitPBa.xpm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/images/c.icon create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/images/cursor.cur create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/images/cursor.mask create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/images/cursor.xbm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/images/dir.icon create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/images/dir.mask create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/images/earth.gif create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/images/earthris.gif create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/images/face create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/images/flagdown create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/images/flagup create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/images/grey.25 create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/images/grey.5 create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/images/letters create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/images/mickey.gif create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/images/ned.xpm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/images/noletters create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/images/page.icon create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/images/page.mask create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/images/pattern create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/images/teapot.ppm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/Ball.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/HList.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/HList2.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/Plot.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/WidgetDemo.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/arrows.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/balloon.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/bind.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/bitmaps.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/bounce.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/browseentry.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/browseentry2.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/button.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/check.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/choosedir.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/clrpick.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/colors.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/cscroll.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/ctext.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/dialog1.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/dialog2.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/dirtree.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/entry1.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/entry2.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/entry3.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/filebox.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/floor.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/form.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/form_mgr.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/hello.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/hscale.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/icon.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/image1.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/image2.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/items.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/keysyms.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/labelframe.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/labels.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/labframe.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/mega.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/menbut.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/menus.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/menus2.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/msgBox.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/notebook.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/paned1.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/paned2.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/photo1.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/photo2.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/plot.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/progress.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/puzzle.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/radio.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/ruler.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/sayings.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/search.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/showVars.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/slide.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/spin.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/states.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/style.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/texts.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/trace1.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/trace2.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/transtile.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/twind.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/unicodeout.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/virtevents1.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widget_lib/vscale.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widtrib/Gedi.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widtrib/TEMPLATE.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widtrib/Tiler.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widtrib/all.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widtrib/cursor.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widtrib/lib/npuz/Xcamel.npuz create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widtrib/npuz.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/demos/widtrib/plop.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/event.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/exit.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/file.xbm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/file.xpm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/fileevent.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/focus.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/folder.xbm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/folder.xpm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/form.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/getOpenFile.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/grab.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/grid.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/icon.gif create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/install.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/license.terms create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/mega.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/messageBox.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/openfile.xbm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/openfolder.xbm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/openfolder.xpm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/option.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/options.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/overview.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/Lang.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/Lang.m create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/Lang.t create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/Lang_f.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/Tcl-pTk create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/Xlib.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/Xlib.m create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/Xlib.t create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/Xlib_f.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/compat/limits.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/compat/stdlib.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/compat/unistd.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/default.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/img.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/imgInt.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/imgInt.m create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/imgInt.t create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/imgInt_f.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/ks_names.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/mkVFunc create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/moredefs.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/port.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tcl.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tclDecls.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tclDecls.m create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tclDecls.t create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tclDecls_f.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tclIntDecls.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tclIntPlatDecls.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tclMath.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tclPlatDecls.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tclWinInt.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tix.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tix.m create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tix.t create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixBitmaps.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixDef.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixForm.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixGrData.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixGrid.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixHList.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixImgXpm.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixImgXpm.m create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixImgXpm.t create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixImgXpm_f.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixInt.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixInt.m create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixInt.t create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixInt_f.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixPort.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixTList.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixWinInt.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tixWinPort.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tix_f.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tk.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tk.m create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tk.t create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tk3d.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkButton.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkCanvas.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkCanvases.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkColor.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkConfig.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkDecls.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkDecls.m create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkDecls.t create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkDecls_f.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkEvent.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkEvent.m create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkEvent.t create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkEvent_f.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkFileFilter.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkFont.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkImgPhoto.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkImgPhoto.m create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkImgPhoto.t create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkImgPhoto_f.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkInitScript.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkInt.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkInt.m create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkInt.t create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkIntDecls.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkIntDecls.m create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkIntDecls.t create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkIntDecls_f.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkIntPlatDecls.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkIntPlatDecls.m create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkIntPlatDecls.t create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkIntPlatDecls_f.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkIntXlibDecls.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkIntXlibDecls.m create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkIntXlibDecls.t create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkIntXlibDecls_f.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkInt_f.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkMenu.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkMenubutton.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkOption.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkOption.m create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkOption.t create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkOption_f.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkPlatDecls.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkPlatDecls.m create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkPlatDecls.t create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkPlatDecls_f.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkPort.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkScale.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkScrollbar.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkSelect.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkText.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkUndo.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkVMacro.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkWin.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkWinDefault.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkWinInt.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkWinPort.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tkXrm.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/tk_f.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pTk/xbytes.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/pack.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/palette.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/place.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/prolog.ps create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/reindex.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/selection.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/send.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/srcfile.xpm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/textfile.xpm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/tixWm.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/tkGlue.def create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/tkGlue.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/tkGlue.m create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/tkGlue.t create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/tkGlue_f.h create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/tkvars.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/tranicon.gif create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/typemap create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/vtab.def create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/widgets.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/widgets.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/win.xbm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/winfolder.xpm create mode 100755 Master/tlpkg/tlperl.straw/lib/Tk/wintext.xpm create mode 100755 Master/tlpkg/tlperl.straw/lib/URI.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/User/grent.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/User/pwent.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/API.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/API/Callback.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/API/Struct.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/API/Test.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/API/Type.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/DBIODBC.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/EventLog.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/Exe.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/Exe/Base.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/Exe/DataDirectory.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/Exe/DebugDirectory.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/Exe/DebugTable.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/Exe/IconFile.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/Exe/PE.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/Exe/PE/Header.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/Exe/PE/Header/PE32.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/Exe/Resource.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/Exe/Resource/GroupIcon.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/Exe/Resource/Icon.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/Exe/Resource/Manifest.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/Exe/Resource/Version.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/Exe/ResourceData.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/Exe/ResourceEntry.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/Exe/ResourceEntry/Id.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/Exe/ResourceEntry/Name.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/Exe/ResourceTable.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/Exe/Section.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/Exe/Section/Code.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/Exe/Section/Data.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/Exe/Section/Debug.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/Exe/Section/Exports.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/Exe/Section/Imports.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/Exe/Section/Resources.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/File.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/File/Object.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/Process.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/Shortcut.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/TieRegistry.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32/WinError.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32API/File.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32API/File/cFile.pc create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32API/Registry.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32API/Registry/cRegistry.pc create mode 100755 Master/tlpkg/tlperl.straw/lib/Win32CORE.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/Attr.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/Boolean.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/CDATASection.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/Comment.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/Common.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/Common.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/DOM.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/Document.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/DocumentFragment.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/Dtd.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/Element.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/ErrNo.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/ErrNo.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/Error.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/Error.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/InputCallback.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/Literal.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/Namespace.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/Node.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/NodeList.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/Number.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/PI.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/Parser.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/Pattern.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/Reader.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/Reader.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/RegExp.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/RelaxNG.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/SAX.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/SAX.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/SAX/Builder.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/SAX/Builder.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/SAX/Generator.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/SAX/Parser.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/Schema.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/Text.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/XPathContext.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/XPathContext.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXML/XPathExpression.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/LibXSLT.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/NamespaceSupport.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/Parser.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/Parser/Expat.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/Parser/LWPExternEnt.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/Parser/Style/Debug.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/Parser/Style/Objects.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/Parser/Style/Stream.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/Parser/Style/Subs.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/Parser/Style/Tree.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/SAX.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/SAX/Base.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/SAX/DocumentLocator.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/SAX/Exception.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/SAX/Intro.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/SAX/ParserDetails.ini create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/SAX/ParserFactory.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/SAX/PurePerl.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/SAX/PurePerl/DTDDecls.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/SAX/PurePerl/DebugHandler.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/SAX/PurePerl/DocType.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/SAX/PurePerl/EncodingDetect.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/SAX/PurePerl/Exception.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/SAX/PurePerl/NoUnicodeExt.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/SAX/PurePerl/Productions.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/SAX/PurePerl/Reader.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/SAX/PurePerl/Reader/NoUnicodeExt.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/SAX/PurePerl/Reader/Stream.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/SAX/PurePerl/Reader/String.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/SAX/PurePerl/Reader/URI.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/SAX/PurePerl/Reader/UnicodeExt.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/SAX/PurePerl/UnicodeExt.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/SAX/PurePerl/XMLDecl.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/SAX/placeholder.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/XML/benchmark.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/YAML.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/YAML/Any.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/YAML/Base.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/YAML/Dumper.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/YAML/Dumper/Base.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/YAML/Error.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/YAML/Loader.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/YAML/Loader/Base.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/YAML/Marshall.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/YAML/Node.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/YAML/Tag.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/YAML/Tiny.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/YAML/Types.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/assert.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/attributes.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Algorithm/Diff/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Archive/Extract/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Archive/Tar/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Archive/Zip/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Attribute/Handlers/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/AutoLoader/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/B/B.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/BerkeleyDB/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/BerkeleyDB/BerkeleyDB.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/BerkeleyDB/BerkeleyDB.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/BerkeleyDB/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/CGI/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/CPAN/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/CPAN/Checksums/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/CPAN/DistnameInfo/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/CPAN/Inject/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/CPAN/SQLite/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/CPANPLUS/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/CPANPLUS/Dist/Build/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Class/ErrorHandler/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Class/ISA/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Class/Loader/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Compress/Bzip2/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Compress/Bzip2/Bzip2.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Compress/Bzip2/Bzip2.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Compress/Bzip2/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Compress/Raw/Bzip2/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Compress/Raw/Bzip2/Bzip2.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Compress/Raw/Bzip2/Bzip2.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Compress/Raw/Bzip2/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Compress/Raw/Zlib/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Compress/Raw/Zlib/Zlib.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Compress/Raw/Zlib/Zlib.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Compress/Raw/Zlib/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Compress/Zlib/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Compress/unLZMA/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Compress/unLZMA/unLZMA.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Compress/unLZMA/unLZMA.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Convert/ASCII/Armour/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Convert/ASN1/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Convert/PEM/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/Blowfish/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/Blowfish/Blowfish.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/Blowfish/Blowfish.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/CAST5_PP/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/CAST5_PP/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/CAST5_PP/decrypt.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/CAST5_PP/encrypt.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/CAST5_PP/init.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/CBC/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/DES/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/DES/DES.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/DES/DES.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/DES_EDE3/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/DH/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/DSA/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/IDEA/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/IDEA/IDEA.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/IDEA/IDEA.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/OpenPGP/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/Primes/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/RIPEMD160/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/RIPEMD160/RIPEMD160.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/RIPEMD160/RIPEMD160.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/RIPEMD160/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/RSA/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/Random/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/Rijndael/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/Rijndael/Rijndael.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/Rijndael/Rijndael.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/SSLeay/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/SSLeay/SSLeay.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/SSLeay/SSLeay.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/Twofish/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/Twofish/Twofish.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Crypt/Twofish/Twofish.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Cwd/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Cwd/Cwd.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Cwd/Cwd.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DBD/ODBC/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DBD/ODBC/ODBC.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DBD/ODBC/ODBC.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DBD/Pg/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DBD/Pg/Pg.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DBD/Pg/Pg.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DBD/SQLite/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DBD/SQLite/SQLite.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DBD/SQLite/SQLite.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DBD/mysql/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DBD/mysql/libmysql.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DBD/mysql/mysql.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DBD/mysql/mysql.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DBI/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DBI/DBI.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DBI/DBI.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DBI/DBIXS.h create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DBI/Driver.xst create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DBI/Driver_xst.h create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DBI/dbd_xsh.h create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DBI/dbi_sql.h create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DBI/dbipport.h create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DBI/dbivport.h create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DBI/dbixs_rev.h create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DBIx/Simple/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DBM/Deep/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DB_File/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DB_File/DB_File.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DB_File/DB_File.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DB_File/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Data/Buffer/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Data/Compare/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Data/Dumper/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Data/Dumper/Dumper.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Data/Dumper/Dumper.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Data/Random/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Devel/DProf/DProf.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Devel/PPPort/PPPort.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Devel/Peek/Peek.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Digest/BubbleBabble/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Digest/MD2/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Digest/MD2/MD2.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Digest/MD2/MD2.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Digest/MD5/MD5.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Digest/SHA/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Digest/SHA/SHA.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Digest/SHA/SHA.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Digest/SHA1/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Digest/SHA1/SHA1.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Digest/SHA1/SHA1.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DynaLoader/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DynaLoader/dl_expandspec.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DynaLoader/dl_find_symbol_anywhere.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/DynaLoader/dl_findfile.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Encode/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Encode/Byte/Byte.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Encode/Byte/Byte.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Encode/CN/CN.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Encode/CN/CN.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Encode/EBCDIC/EBCDIC.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Encode/EBCDIC/EBCDIC.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Encode/Encode.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Encode/Encode.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Encode/JP/JP.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Encode/JP/JP.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Encode/KR/KR.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Encode/KR/KR.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Encode/Symbol/Symbol.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Encode/Symbol/Symbol.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Encode/TW/TW.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Encode/TW/TW.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Encode/Unicode/Unicode.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Encode/Unicode/Unicode.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/ExtUtils/CBuilder/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/ExtUtils/MakeMaker/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/ExtUtils/Manifest/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/ExtUtils/ParseXS/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/FCGI/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/FCGI/FCGI.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/FCGI/FCGI.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Fcntl/Fcntl.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/File/Fetch/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/File/Find/Rule/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/File/Glob/Glob.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/File/HomeDir/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/File/Path/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/File/Remove/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/File/Which/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/File/chmod/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/File/pushd/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Filter/Util/Call/Call.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/GD/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/GD/GD.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/GD/GD.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/GD/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/GDBM_File/GDBM_File.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/HTML/Parser/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/HTML/Parser/Parser.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/HTML/Parser/Parser.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/HTML/Tagset/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Hash/Util/FieldHash/FieldHash.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Hash/Util/Util.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/IO/IO.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/IO/Socket/SSL/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/IO/String/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/IO/Zlib/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/IPC/Cmd/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/IPC/Run3/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/IPC/System/Simple/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Imager/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Imager/CountColor/CountColor.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Imager/CountColor/CountColor.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Imager/File/ICO/ICO.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Imager/File/ICO/ICO.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Imager/File/SGI/SGI.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Imager/File/SGI/SGI.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Imager/Filter/DynTest/DynTest.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Imager/Filter/DynTest/DynTest.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Imager/Filter/Flines/Flines.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Imager/Filter/Flines/Flines.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Imager/Filter/Mandelbrot/Mandelbrot.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Imager/Filter/Mandelbrot/Mandelbrot.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Imager/Imager.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Imager/Imager.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/JSON/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/JSON/XS/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/JSON/XS/XS.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/JSON/XS/XS.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/LWP/Online/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/List/Util/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/List/Util/Util.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/List/Util/Util.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Locale/Maketext/Simple/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Log/Message/Simple/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/MIME/Base64/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/MIME/Base64/Base64.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/MIME/Base64/Base64.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Math/BigInt/FastCalc/FastCalc.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Math/BigInt/GMP/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Math/BigInt/GMP/GMP.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Math/BigInt/GMP/GMP.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Math/BigRat/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Math/GMP/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Math/GMP/GMP.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Math/GMP/GMP.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Math/GMP/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Math/Pari/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Math/Pari/Pari.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Math/Pari/Pari.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Module/Build/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Module/CoreList/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Module/Load/Conditional/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Module/Loaded/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Module/Signature/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SMTP/TLS/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/SSLeay.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/SSLeay.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/debug_read.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/do_https.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/do_https2.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/do_https3.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/do_https4.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/do_httpx2.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/do_httpx3.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/do_httpx4.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/dump_peer_certificate.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/get_http.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/get_http3.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/get_http4.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/get_https.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/get_https3.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/get_https4.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/get_httpx.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/get_httpx3.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/get_httpx4.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/head_http.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/head_http3.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/head_http4.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/head_https.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/head_https3.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/head_https4.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/head_httpx.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/head_httpx3.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/head_httpx4.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/http_cat.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/https_cat.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/httpx_cat.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/make_form.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/make_headers.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/new_x_ctx.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/open_proxy_tcp_connection.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/open_tcp_connection.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/post_http.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/post_http3.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/post_http4.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/post_https.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/post_https3.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/post_https4.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/post_httpx.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/post_httpx3.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/post_httpx4.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/put_http.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/put_http3.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/put_http4.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/put_https.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/put_https3.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/put_https4.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/put_httpx.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/put_httpx3.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/put_httpx4.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/randomize.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/set_cert_and_key.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/set_proxy.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/set_server_cert_and_key.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/ssl_read_CRLF.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/ssl_read_all.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/ssl_read_until.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/ssl_write_CRLF.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/ssl_write_all.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/sslcat.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/tcp_read_CRLF.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/tcp_read_all.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/tcp_read_until.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/tcp_write_CRLF.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/tcp_write_all.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/tcpcat.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/tcpxcat.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/want_X509_lookup.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/want_nothing.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/want_read.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Net/SSLeay/want_write.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Number/Compare/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Object/Accessor/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Opcode/Opcode.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/PAR/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/PAR/Dist/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/PAR/Dist/FromPPD/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/PAR/Dist/InstallPPD/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/PAR/Repository/Client/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/PAR/Repository/Query/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/POSIX.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/SigAction/flags.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/SigAction/handler.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/SigAction/mask.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/SigAction/new.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/SigAction/safe.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/SigRt/CLEAR.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/SigRt/DELETE.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/SigRt/EXISTS.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/SigRt/FETCH.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/SigRt/SCALAR.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/SigRt/STORE.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/SigRt/_check.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/SigRt/_croak.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/SigRt/_exist.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/SigRt/_getsig.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/SigRt/_init.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/SigRt/new.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/abs.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/alarm.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/assert.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/atan2.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/atexit.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/atof.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/atoi.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/atol.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/bsearch.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/calloc.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/chdir.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/chmod.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/chown.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/clearerr.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/closedir.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/cos.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/creat.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/div.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/errno.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/execl.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/execle.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/execlp.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/execv.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/execve.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/execvp.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/exit.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/exp.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/fabs.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/fclose.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/fcntl.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/fdopen.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/feof.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/ferror.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/fflush.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/fgetc.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/fgetpos.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/fgets.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/fileno.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/fopen.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/fork.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/fprintf.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/fputc.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/fputs.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/fread.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/free.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/freopen.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/fscanf.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/fseek.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/fsetpos.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/fstat.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/fsync.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/ftell.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/fwrite.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/getc.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/getchar.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/getegid.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/getenv.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/geteuid.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/getgid.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/getgrgid.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/getgrnam.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/getgroups.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/getlogin.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/getpgrp.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/getpid.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/getppid.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/getpwnam.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/getpwuid.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/gets.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/getuid.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/gmtime.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/isatty.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/kill.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/labs.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/ldiv.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/link.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/load_imports.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/localtime.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/log.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/longjmp.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/malloc.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/memchr.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/memcmp.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/memcpy.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/memmove.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/memset.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/mkdir.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/offsetof.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/opendir.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/perror.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/pow.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/printf.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/putc.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/putchar.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/puts.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/qsort.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/raise.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/rand.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/readdir.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/realloc.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/redef.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/remove.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/rename.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/rewind.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/rewinddir.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/rmdir.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/scanf.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/setbuf.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/setjmp.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/setvbuf.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/siglongjmp.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/sigsetjmp.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/sin.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/sleep.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/sprintf.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/sqrt.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/srand.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/sscanf.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/stat.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/strcat.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/strchr.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/strcmp.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/strcpy.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/strcspn.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/strerror.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/strlen.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/strncat.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/strncmp.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/strncpy.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/strpbrk.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/strrchr.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/strspn.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/strstr.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/strtok.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/system.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/time.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/tmpfile.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/tolower.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/toupper.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/umask.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/ungetc.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/unimpl.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/unlink.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/usage.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/utime.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/vfprintf.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/vprintf.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/vsprintf.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/wait.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/POSIX/waitpid.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/PPM/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Params/Util/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Params/Util/Util.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Params/Util/Util.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Parse/Binary/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Parse/CPAN/Meta/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/PerlIO/encoding/encoding.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/PerlIO/scalar/scalar.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/PerlIO/via/via.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Pod/Perldoc/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Pod/Plainer/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Pod/Simple/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Probe/Perl/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/SDBM_File/SDBM_File.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Safe/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Socket/Socket.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Sort/Versions/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Storable/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Storable/BIN_VERSION_NV.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Storable/BIN_WRITE_VERSION_NV.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Storable/CAN_FLOCK.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Storable/Storable.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Storable/Storable.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Storable/_freeze.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Storable/_retrieve.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Storable/_store.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Storable/_store_fd.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Storable/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Storable/fd_retrieve.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Storable/file_magic.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Storable/freeze.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Storable/lock_nstore.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Storable/lock_retrieve.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Storable/lock_store.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Storable/logcarp.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Storable/logcroak.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Storable/nfreeze.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Storable/nstore.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Storable/nstore_fd.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Storable/read_magic.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Storable/retrieve.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Storable/show_file_magic.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Storable/store.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Storable/store_fd.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Storable/thaw.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/String/CRC32/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/String/CRC32/CRC32.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/String/CRC32/CRC32.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Sub/Uplevel/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Switch/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Sys/Hostname/Hostname.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Sys/Hostname/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Term/ANSIColor/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Term/ReadKey/ReadKey.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Term/ReadKey/ReadKey.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Term/ReadKey/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Test/Deep/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Test/Exception/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Test/Harness/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Test/Manifest/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Test/NoWarnings/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Test/Script/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Test/Simple/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Test/Tester/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Test/Warn/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Text/Balanced/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Text/Diff/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Text/Glob/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Text/Soundex/Soundex.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tie/EncryptedHash/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Time/HiRes/HiRes.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Time/Piece/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Time/Piece/Piece.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Time/Piece/Piece.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/CancelRepeat.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Canvas/Canvas.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Canvas/Canvas.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Clipboard/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Clipboard/getSelected.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Compound/Compound.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Compound/Compound.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/DragDrop/Win32Site/Win32Site.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/DragDrop/Win32Site/Win32Site.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/EnterFocus.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Entry/Entry.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Entry/Entry.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Error.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Event/Event.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Event/Event.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/FirstMenu.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/FocusChildren.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/FocusOK.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Frame/AddScrollbars.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Frame/FindMenu.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Frame/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Frame/freeze_on_map.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Frame/label.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Frame/labelPack.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Frame/labelVariable.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Frame/packscrollbars.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Frame/queuePack.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Frame/sbset.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Frame/scrollbars.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/HList/HList.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/HList/HList.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/IO/IO.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/IO/IO.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/ImageNames.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/ImageTypes.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/JPEG/JPEG.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/JPEG/JPEG.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/AutoScan.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/BeginExtend.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/BeginSelect.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/BeginToggle.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/ButtonRelease_1.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/CLEAR.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/Cancel.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/Cntrl_End.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/Cntrl_Home.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/Cntrl_backslash.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/DELETE.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/DataExtend.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/EXISTS.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/EXTEND.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/ExtendUpDown.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/FETCH.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/FETCHSIZE.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/Listbox.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/Listbox.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/Motion.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/POP.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/PUSH.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/SHIFT.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/SPLICE.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/STORE.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/SelectAll.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/SetList.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/TIEARRAY.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/TIESCALAR.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/UNSHIFT.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/UpDown.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/clipboardPaste.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/deleteSelected.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/getSelected.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Listbox/xyIndex.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Menubutton/Menubutton.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Menubutton/Menubutton.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/NBFrame/NBFrame.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/NBFrame/NBFrame.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/PNG/PNG.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/PNG/PNG.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Pixmap/Pixmap.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Pixmap/Pixmap.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Receive.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/RepeatId.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Scale/Activate.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Scale/ButtonDown.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Scale/ButtonUp.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Scale/ControlPress.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Scale/Drag.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Scale/EndDrag.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Scale/Enter.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Scale/Increment.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Scale/Leave.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Scale/Scale.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Scale/Scale.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Scale/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Scrollbar/ButtonDown.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Scrollbar/ButtonUp.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Scrollbar/Drag.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Scrollbar/EndDrag.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Scrollbar/Enter.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Scrollbar/Leave.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Scrollbar/Motion.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Scrollbar/ScrlByPages.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Scrollbar/ScrlByUnits.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Scrollbar/ScrlToPos.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Scrollbar/ScrlTopBottom.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Scrollbar/Scrollbar.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Scrollbar/Scrollbar.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Scrollbar/Select.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Scrollbar/StartDrag.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Scrollbar/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Selection.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/TList/TList.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/TList/TList.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Table/Create.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Table/Posn.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Table/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Table/see.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Table/totalColumns.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Table/totalRows.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Text/Text.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Text/Text.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Text/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/TextEdit/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/TextUndo/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/TixGrid/TixGrid.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/TixGrid/TixGrid.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Tk.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Tk.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Toplevel/FG_BindIn.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Toplevel/FG_BindOut.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Toplevel/FG_Create.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Toplevel/FG_Destroy.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Toplevel/FG_In.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Toplevel/FG_Out.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Toplevel/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/TraverseToMenu.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Widget/ASkludge.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Widget/AltKeyInDialog.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Widget/AmpWidget.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Widget/FindAltKeyTarget.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Widget/MasterMenu.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Widget/RestoreFocusGrab.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Widget/SetAmpText.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Widget/SetFocusGrab.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Widget/UnderlineAmpersand.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Widget/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Widget/bindDump.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Widget/clipboardKeysyms.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Widget/pathname.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Wm/AnchorAdjust.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Wm/FullScreen.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Wm/Popup.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Wm/Post.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Wm/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Wm/iconposition.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/X/X.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/X/X.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/X/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Xlib/Xlib.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/Xlib/Xlib.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/autosplit.ix create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/break.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/focusFollowsMouse.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/focusNext.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/focusPrev.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/getEncoding.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/getNextFocus.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/getPrevFocus.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/interps.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/lsearch.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/pTk/extralibs.ld create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/tabFocus.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tk/updateWidgets.al create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Tree/DAG_Node/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/URI/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Unicode/Normalize/Normalize.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Win32/API/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Win32/API/API.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Win32/API/API.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Win32/API/Callback/Callback.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Win32/API/Callback/Callback.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Win32/EventLog/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Win32/EventLog/EventLog.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Win32/EventLog/EventLog.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Win32/Exe/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Win32/File/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Win32/File/File.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Win32/File/File.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Win32/File/Object/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Win32/Process/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Win32/Process/Process.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Win32/Process/Process.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Win32/Shortcut/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Win32/Shortcut/Shortcut.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Win32/Shortcut/Shortcut.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Win32/TieRegistry/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Win32/Win32.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Win32/WinError/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Win32/WinError/WinError.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Win32/WinError/WinError.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Win32API/File/File.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Win32API/Registry/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Win32API/Registry/Registry.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Win32API/Registry/Registry.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/Win32CORE/extralibs.ld create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/XML/LibXML/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/XML/LibXML/LibXML.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/XML/LibXML/LibXML.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/XML/LibXSLT/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/XML/LibXSLT/LibXSLT.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/XML/LibXSLT/LibXSLT.xs.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/XML/NamespaceSupport/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/XML/Parser/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/XML/Parser/Expat/Expat.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/XML/Parser/Expat/Expat.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/XML/SAX/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/YAML/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/YAML/Tiny/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/attrs/attrs.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/common/sense/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/constant/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/local/lib/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/mro/mro.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/parent/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/pip/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/pler/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/re/re.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/sdbm/extralibs.ld create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/threads/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/threads/shared/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/threads/shared/shared.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/threads/shared/shared.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/threads/threads.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/threads/threads.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/version/.packlist create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/version/vxs/vxs.bs create mode 100755 Master/tlpkg/tlperl.straw/lib/auto/version/vxs/vxs.dll create mode 100755 Master/tlpkg/tlperl.straw/lib/autouse.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/bigfloat.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/bigint.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/blib.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/bytes.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/charnames.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/common/sense.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/complete.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/constant.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/ctime.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/diagnostics.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/encoding.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/fields.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/filetest.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/finddepth.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/fix_4_os2.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/getopt.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/if.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/inc/latest.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/inc/latest/private.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/local/lib.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/lwptut.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/mro.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/newgetopt.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/open.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/open3.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/ops.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/overload/numbers.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/parent.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/perl5db.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/perldoc.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/pler.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/ppm.xml create mode 100755 Master/tlpkg/tlperl.straw/lib/pwd.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/re.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/sigtrap.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/stat.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/termcap.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/utf8.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/utf8_heavy.pl create mode 100755 Master/tlpkg/tlperl.straw/lib/version.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/version.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/version/Internals.pod create mode 100755 Master/tlpkg/tlperl.straw/lib/version/vxs.pm create mode 100755 Master/tlpkg/tlperl.straw/lib/vmsish.pm (limited to 'Master') diff --git a/Master/tlpkg/tlperl.straw/README.TeXLive b/Master/tlpkg/tlperl.straw/README.TeXLive new file mode 100644 index 00000000000..e604d8c87a4 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/README.TeXLive @@ -0,0 +1,32 @@ + +This directory contains a subset of the Strawberry Perl distribution +as distributed from http://strawberryperl.com/ +The currently used version is 5.10.1 + +The only purpose of this package is to support programs shipped with +TeX Live. It's not intended for general use. + +Changes: + + * The only module that has been added is Perl/Tk. + Procedure: + - start the CPAN client + - at the prompt: + install Tk + install Win32::Shortcut + + * After that the lib directories in + strawberry\perl\lib + strawberry\perl\vendor\lib + strawberry\perl\site\lib + have been merged into one directory (tlperl/lib) + and strawberry\perl\bin has been put into tlperl/bin. + +This version of Perl will not be installed on your system and will not +interfere with other versions of Perl which might be installed already. + +If you need Perl for any other purpose than running the programs +provided by TeX Live, we recommand to install the full version which +can be downloaded from: + + http://www.perl.org diff --git a/Master/tlpkg/tlperl.straw/bin/a2p.exe b/Master/tlpkg/tlperl.straw/bin/a2p.exe new file mode 100755 index 00000000000..b18a77b4a08 Binary files /dev/null and b/Master/tlpkg/tlperl.straw/bin/a2p.exe differ diff --git a/Master/tlpkg/tlperl.straw/bin/bdf2gdfont.bat b/Master/tlpkg/tlperl.straw/bin/bdf2gdfont.bat new file mode 100755 index 00000000000..c87b4618745 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/bdf2gdfont.bat @@ -0,0 +1,205 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!perl +#line 15 + +# +# Simple convertor from bdf to loadable GD font format. +# +# Author: Lincoln Stein , heavily adopted from bdftogd from +# Jan Pazdziora +# +# Example of use: +# fstobdf -s fontserverhost:7100 -fn 8x16 | bdftofnt > myfont.fnt +# + +use strict; +our $VERSION = '1.00'; + +if ($ARGV[0] =~ /^--?h/) { + exec "perldoc $0"; +} + +my ($width, $height); +my (@data, @left, @bottom); +my ($globalleft, $globaltop); + +my ($minchar, $maxchar); + +my ($copyright, $fontdef); + +my $currentchar; +my $gobitmap = 0; + +foreach (@ARGV) { + $_ = "gunzip -c $_ |" if /\.gz$/; +} + +while (<>) + { + chomp; + s/\r$//; + next unless $_; + my ($tag, $value) = split / /, $_, 2; + die "Font is not fixed width\n" + if $tag eq 'SPACING' and not $value =~ /[CM]/i; + + $currentchar = $value if $tag eq 'ENCODING'; + $minchar = $currentchar if not defined $minchar + or ($currentchar < $minchar && $currentchar >= 0); + $maxchar = $currentchar if not defined $maxchar + or ($currentchar > $maxchar && $currentchar >= 0); + + if ($tag eq 'ENDCHAR') + { + next if $currentchar < 0; + $gobitmap = 0; + my $bottom = $globaltop - $bottom[$currentchar]; + + + if ($bottom > 0) + { $data[$currentchar] = substr $data[$currentchar], 0, length($data[$currentchar]) - $bottom * $width; } + else + { $data[$currentchar] .= '0' x (-$bottom * $width); } + } + + if ($tag eq 'FONTBOUNDINGBOX') + { + my ($tag, $wid, $hei, $left, $top) = split / /; + if (defined $top) + { + $globalleft = $left; + $globaltop = $top; + $height = $hei; + $width = $wid; + } + } + if ($tag eq 'FONT' and not defined $fontdef) + { $fontdef = $value; } + if ($tag eq 'COPYRIGHT' and not defined $copyright) + { $copyright = $value; } + + if ($tag eq 'BBX') + { + my ($tag, $wid, $hei, $left, $bottom) = split / /; + if (defined $bottom) + { + $left[$currentchar] = $left; + $bottom[$currentchar] = $bottom; + } + } + + if ($gobitmap) + { + my $value = pack 'H*', $_; + my $bits = unpack 'B*', $value; + $bits = ('0' x $left[$currentchar]) . $bits; + $bits .= '0' x ($width - length $bits); + $bits = substr $bits, 0, $width; + $data[$currentchar] .= $bits; + } + + if ($tag eq 'BITMAP') + { + $gobitmap = 1; + $data[$currentchar] = ''; + } + } + +$minchar = 0 unless defined $minchar; +$maxchar = 255 unless defined $maxchar; + +binmode STDOUT; # for DOS/Windows systems +my $length = $maxchar-$minchar+1; + + +print pack ('VVVV',$length,$minchar,$width,$height); # header + +for (my $i = $minchar; $i <= $maxchar; $i++) { + $data[$i] = '' unless defined $data[$i]; + $data[$i] = '0' x ($width * $height - length $data[$i]) . $data[$i]; + print pack('C*',split '',$data[$i]); +} + +print STDERR "Successfully converted $length ${width}x$}height} characters\n"; + +__END__ + +=head1 NAME + +bdf2gdfont.pl - Convert X11 "BDF" fonts into a loadable font format for GD. + +=head1 SYNOPSIS + + % bdf2gdfont.pl courR12.bdf > courR12.fnt + +=head1 DESCRIPTION + +This script converts BDF-style X11 font files into a format that can +be loaded by the GD module using the GD::Font->load() method. There +are a number of ways to obtain BDF fonts. + +=over 4 + +=item 1. The font is already present on your system. + +Some BDF fonts can be found in the standard X11R6 distribution. This +script will automatically uncompress gzipped font files if their +extension ends with .gz (the gunzip program must be on your path). + +=item 2. From a font server. + +The "fstobdf" utility, a standard X11 utility, will read a named font +from the font server of your choice and return it in BDF format. You +can pipe it to bdf2gdfont.pl: + + fstobdf -s fontserverhost:7100 -fn 8x16 | bdf2gdfont.pl > newfont.fnt + +Use xlsfonts to find out what fonts are available. Most fonts will +have long names like +-B&H-LucidaTypewriter-Bold-R-Normal-Sans-18-180-75-75-M-110-ISO8859-10. + +=item 3. Using the pcf2bdf utility. + +Some fonts are only available in PCF (compiled) format. To obtain +these, you can either turn on a font server and follow recipe (2), or +use TAGA Nayuta's pcf2bdf utility. This utility is available from +http://www.tsg.ne.jp/GANA/S/pcf2bdf/ (page is in Japanese, but you can +find the download link). + +=back + +=head2 Limitations + +This font converter only works with fixed-width fonts. If used with a +TrueType or proportional font it will die with an error message. + +=head1 SEE ALSO + +L + +=head1 AUTHOR + +Lincoln Stein , heavily adapted from bdftogd from +Jan Pazdziora . + +Copyright (c) 2004 Cold Spring Harbor Laboratory + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut + + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/bdf2gdfont.pl b/Master/tlpkg/tlperl.straw/bin/bdf2gdfont.pl new file mode 100755 index 00000000000..e807b81137b --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/bdf2gdfont.pl @@ -0,0 +1,189 @@ +#!perl + +# +# Simple convertor from bdf to loadable GD font format. +# +# Author: Lincoln Stein , heavily adopted from bdftogd from +# Jan Pazdziora +# +# Example of use: +# fstobdf -s fontserverhost:7100 -fn 8x16 | bdftofnt > myfont.fnt +# + +use strict; +our $VERSION = '1.00'; + +if ($ARGV[0] =~ /^--?h/) { + exec "perldoc $0"; +} + +my ($width, $height); +my (@data, @left, @bottom); +my ($globalleft, $globaltop); + +my ($minchar, $maxchar); + +my ($copyright, $fontdef); + +my $currentchar; +my $gobitmap = 0; + +foreach (@ARGV) { + $_ = "gunzip -c $_ |" if /\.gz$/; +} + +while (<>) + { + chomp; + s/\r$//; + next unless $_; + my ($tag, $value) = split / /, $_, 2; + die "Font is not fixed width\n" + if $tag eq 'SPACING' and not $value =~ /[CM]/i; + + $currentchar = $value if $tag eq 'ENCODING'; + $minchar = $currentchar if not defined $minchar + or ($currentchar < $minchar && $currentchar >= 0); + $maxchar = $currentchar if not defined $maxchar + or ($currentchar > $maxchar && $currentchar >= 0); + + if ($tag eq 'ENDCHAR') + { + next if $currentchar < 0; + $gobitmap = 0; + my $bottom = $globaltop - $bottom[$currentchar]; + + + if ($bottom > 0) + { $data[$currentchar] = substr $data[$currentchar], 0, length($data[$currentchar]) - $bottom * $width; } + else + { $data[$currentchar] .= '0' x (-$bottom * $width); } + } + + if ($tag eq 'FONTBOUNDINGBOX') + { + my ($tag, $wid, $hei, $left, $top) = split / /; + if (defined $top) + { + $globalleft = $left; + $globaltop = $top; + $height = $hei; + $width = $wid; + } + } + if ($tag eq 'FONT' and not defined $fontdef) + { $fontdef = $value; } + if ($tag eq 'COPYRIGHT' and not defined $copyright) + { $copyright = $value; } + + if ($tag eq 'BBX') + { + my ($tag, $wid, $hei, $left, $bottom) = split / /; + if (defined $bottom) + { + $left[$currentchar] = $left; + $bottom[$currentchar] = $bottom; + } + } + + if ($gobitmap) + { + my $value = pack 'H*', $_; + my $bits = unpack 'B*', $value; + $bits = ('0' x $left[$currentchar]) . $bits; + $bits .= '0' x ($width - length $bits); + $bits = substr $bits, 0, $width; + $data[$currentchar] .= $bits; + } + + if ($tag eq 'BITMAP') + { + $gobitmap = 1; + $data[$currentchar] = ''; + } + } + +$minchar = 0 unless defined $minchar; +$maxchar = 255 unless defined $maxchar; + +binmode STDOUT; # for DOS/Windows systems +my $length = $maxchar-$minchar+1; + + +print pack ('VVVV',$length,$minchar,$width,$height); # header + +for (my $i = $minchar; $i <= $maxchar; $i++) { + $data[$i] = '' unless defined $data[$i]; + $data[$i] = '0' x ($width * $height - length $data[$i]) . $data[$i]; + print pack('C*',split '',$data[$i]); +} + +print STDERR "Successfully converted $length ${width}x$}height} characters\n"; + +__END__ + +=head1 NAME + +bdf2gdfont.pl - Convert X11 "BDF" fonts into a loadable font format for GD. + +=head1 SYNOPSIS + + % bdf2gdfont.pl courR12.bdf > courR12.fnt + +=head1 DESCRIPTION + +This script converts BDF-style X11 font files into a format that can +be loaded by the GD module using the GD::Font->load() method. There +are a number of ways to obtain BDF fonts. + +=over 4 + +=item 1. The font is already present on your system. + +Some BDF fonts can be found in the standard X11R6 distribution. This +script will automatically uncompress gzipped font files if their +extension ends with .gz (the gunzip program must be on your path). + +=item 2. From a font server. + +The "fstobdf" utility, a standard X11 utility, will read a named font +from the font server of your choice and return it in BDF format. You +can pipe it to bdf2gdfont.pl: + + fstobdf -s fontserverhost:7100 -fn 8x16 | bdf2gdfont.pl > newfont.fnt + +Use xlsfonts to find out what fonts are available. Most fonts will +have long names like +-B&H-LucidaTypewriter-Bold-R-Normal-Sans-18-180-75-75-M-110-ISO8859-10. + +=item 3. Using the pcf2bdf utility. + +Some fonts are only available in PCF (compiled) format. To obtain +these, you can either turn on a font server and follow recipe (2), or +use TAGA Nayuta's pcf2bdf utility. This utility is available from +http://www.tsg.ne.jp/GANA/S/pcf2bdf/ (page is in Japanese, but you can +find the download link). + +=back + +=head2 Limitations + +This font converter only works with fixed-width fonts. If used with a +TrueType or proportional font it will die with an error message. + +=head1 SEE ALSO + +L + +=head1 AUTHOR + +Lincoln Stein , heavily adapted from bdftogd from +Jan Pazdziora . + +Copyright (c) 2004 Cold Spring Harbor Laboratory + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut + diff --git a/Master/tlpkg/tlperl.straw/bin/c2ph.bat b/Master/tlpkg/tlperl.straw/bin/c2ph.bat new file mode 100755 index 00000000000..84937d17f3c --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/c2ph.bat @@ -0,0 +1,1383 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!perl +#line 15 + eval 'exec C:\strawberry\perl\bin\perl.exe -S $0 ${1+"$@"}' + if $running_under_some_shell; +# +# +# c2ph (aka pstruct) +# Tom Christiansen, +# +# As pstruct, dump C structures as generated from 'cc -g -S' stabs. +# As c2ph, do this PLUS generate perl code for getting at the structures. +# +# See the usage message for more. If this isn't enough, read the code. +# + +=head1 NAME + +c2ph, pstruct - Dump C structures as generated from C stabs + +=head1 SYNOPSIS + + c2ph [-dpnP] [var=val] [files ...] + +=head2 OPTIONS + + Options: + + -w wide; short for: type_width=45 member_width=35 offset_width=8 + -x hex; short for: offset_fmt=x offset_width=08 size_fmt=x size_width=04 + + -n do not generate perl code (default when invoked as pstruct) + -p generate perl code (default when invoked as c2ph) + -v generate perl code, with C decls as comments + + -i do NOT recompute sizes for intrinsic datatypes + -a dump information on intrinsics also + + -t trace execution + -d spew reams of debugging output + + -slist give comma-separated list a structures to dump + +=head1 DESCRIPTION + +The following is the old c2ph.doc documentation by Tom Christiansen + +Date: 25 Jul 91 08:10:21 GMT + +Once upon a time, I wrote a program called pstruct. It was a perl +program that tried to parse out C structures and display their member +offsets for you. This was especially useful for people looking at +binary dumps or poking around the kernel. + +Pstruct was not a pretty program. Neither was it particularly robust. +The problem, you see, was that the C compiler was much better at parsing +C than I could ever hope to be. + +So I got smart: I decided to be lazy and let the C compiler parse the C, +which would spit out debugger stabs for me to read. These were much +easier to parse. It's still not a pretty program, but at least it's more +robust. + +Pstruct takes any .c or .h files, or preferably .s ones, since that's +the format it is going to massage them into anyway, and spits out +listings like this: + + struct tty { + int tty.t_locker 000 4 + int tty.t_mutex_index 004 4 + struct tty * tty.t_tp_virt 008 4 + struct clist tty.t_rawq 00c 20 + int tty.t_rawq.c_cc 00c 4 + int tty.t_rawq.c_cmax 010 4 + int tty.t_rawq.c_cfx 014 4 + int tty.t_rawq.c_clx 018 4 + struct tty * tty.t_rawq.c_tp_cpu 01c 4 + struct tty * tty.t_rawq.c_tp_iop 020 4 + unsigned char * tty.t_rawq.c_buf_cpu 024 4 + unsigned char * tty.t_rawq.c_buf_iop 028 4 + struct clist tty.t_canq 02c 20 + int tty.t_canq.c_cc 02c 4 + int tty.t_canq.c_cmax 030 4 + int tty.t_canq.c_cfx 034 4 + int tty.t_canq.c_clx 038 4 + struct tty * tty.t_canq.c_tp_cpu 03c 4 + struct tty * tty.t_canq.c_tp_iop 040 4 + unsigned char * tty.t_canq.c_buf_cpu 044 4 + unsigned char * tty.t_canq.c_buf_iop 048 4 + struct clist tty.t_outq 04c 20 + int tty.t_outq.c_cc 04c 4 + int tty.t_outq.c_cmax 050 4 + int tty.t_outq.c_cfx 054 4 + int tty.t_outq.c_clx 058 4 + struct tty * tty.t_outq.c_tp_cpu 05c 4 + struct tty * tty.t_outq.c_tp_iop 060 4 + unsigned char * tty.t_outq.c_buf_cpu 064 4 + unsigned char * tty.t_outq.c_buf_iop 068 4 + (*int)() tty.t_oproc_cpu 06c 4 + (*int)() tty.t_oproc_iop 070 4 + (*int)() tty.t_stopproc_cpu 074 4 + (*int)() tty.t_stopproc_iop 078 4 + struct thread * tty.t_rsel 07c 4 + +etc. + + +Actually, this was generated by a particular set of options. You can control +the formatting of each column, whether you prefer wide or fat, hex or decimal, +leading zeroes or whatever. + +All you need to be able to use this is a C compiler than generates +BSD/GCC-style stabs. The B<-g> option on native BSD compilers and GCC +should get this for you. + +To learn more, just type a bogus option, like B<-\?>, and a long usage message +will be provided. There are a fair number of possibilities. + +If you're only a C programmer, than this is the end of the message for you. +You can quit right now, and if you care to, save off the source and run it +when you feel like it. Or not. + + + +But if you're a perl programmer, then for you I have something much more +wondrous than just a structure offset printer. + +You see, if you call pstruct by its other incybernation, c2ph, you have a code +generator that translates C code into perl code! Well, structure and union +declarations at least, but that's quite a bit. + +Prior to this point, anyone programming in perl who wanted to interact +with C programs, like the kernel, was forced to guess the layouts of +the C structures, and then hardwire these into his program. Of course, +when you took your wonderfully crafted program to a system where the +sgtty structure was laid out differently, your program broke. Which is +a shame. + +We've had Larry's h2ph translator, which helped, but that only works on +cpp symbols, not real C, which was also very much needed. What I offer +you is a symbolic way of getting at all the C structures. I've couched +them in terms of packages and functions. Consider the following program: + + #!/usr/local/bin/perl + + require 'syscall.ph'; + require 'sys/time.ph'; + require 'sys/resource.ph'; + + $ru = "\0" x &rusage'sizeof(); + + syscall(&SYS_getrusage, &RUSAGE_SELF, $ru) && die "getrusage: $!"; + + @ru = unpack($t = &rusage'typedef(), $ru); + + $utime = $ru[ &rusage'ru_utime + &timeval'tv_sec ] + + ($ru[ &rusage'ru_utime + &timeval'tv_usec ]) / 1e6; + + $stime = $ru[ &rusage'ru_stime + &timeval'tv_sec ] + + ($ru[ &rusage'ru_stime + &timeval'tv_usec ]) / 1e6; + + printf "you have used %8.3fs+%8.3fu seconds.\n", $utime, $stime; + + +As you see, the name of the package is the name of the structure. Regular +fields are just their own names. Plus the following accessor functions are +provided for your convenience: + + struct This takes no arguments, and is merely the number of first-level + elements in the structure. You would use this for indexing + into arrays of structures, perhaps like this + + + $usec = $u[ &user'u_utimer + + (&ITIMER_VIRTUAL * &itimerval'struct) + + &itimerval'it_value + + &timeval'tv_usec + ]; + + sizeof Returns the bytes in the structure, or the member if + you pass it an argument, such as + + &rusage'sizeof(&rusage'ru_utime) + + typedef This is the perl format definition for passing to pack and + unpack. If you ask for the typedef of a nothing, you get + the whole structure, otherwise you get that of the member + you ask for. Padding is taken care of, as is the magic to + guarantee that a union is unpacked into all its aliases. + Bitfields are not quite yet supported however. + + offsetof This function is the byte offset into the array of that + member. You may wish to use this for indexing directly + into the packed structure with vec() if you're too lazy + to unpack it. + + typeof Not to be confused with the typedef accessor function, this + one returns the C type of that field. This would allow + you to print out a nice structured pretty print of some + structure without knoning anything about it beforehand. + No args to this one is a noop. Someday I'll post such + a thing to dump out your u structure for you. + + +The way I see this being used is like basically this: + + % h2ph /usr/lib/perl/tmp.ph + % c2ph some_include_file.h >> /usr/lib/perl/tmp.ph + % install + +It's a little tricker with c2ph because you have to get the includes right. +I can't know this for your system, but it's not usually too terribly difficult. + +The code isn't pretty as I mentioned -- I never thought it would be a 1000- +line program when I started, or I might not have begun. :-) But I would have +been less cavalier in how the parts of the program communicated with each +other, etc. It might also have helped if I didn't have to divine the makeup +of the stabs on the fly, and then account for micro differences between my +compiler and gcc. + +Anyway, here it is. Should run on perl v4 or greater. Maybe less. + + + --tom + +=cut + +$RCSID = '$Id: c2ph,v 1.7 95/10/28 10:41:47 tchrist Exp Locker: tchrist $'; + +use File::Temp; + +###################################################################### + +# some handy data definitions. many of these can be reset later. + +$bitorder = 'b'; # ascending; set to B for descending bit fields + +%intrinsics = +%template = ( + 'char', 'c', + 'unsigned char', 'C', + 'short', 's', + 'short int', 's', + 'unsigned short', 'S', + 'unsigned short int', 'S', + 'short unsigned int', 'S', + 'int', 'i', + 'unsigned int', 'I', + 'long', 'l', + 'long int', 'l', + 'unsigned long', 'L', + 'unsigned long', 'L', + 'long unsigned int', 'L', + 'unsigned long int', 'L', + 'long long', 'q', + 'long long int', 'q', + 'unsigned long long', 'Q', + 'unsigned long long int', 'Q', + 'float', 'f', + 'double', 'd', + 'pointer', 'p', + 'null', 'x', + 'neganull', 'X', + 'bit', $bitorder, +); + +&buildscrunchlist; +delete $intrinsics{'neganull'}; +delete $intrinsics{'bit'}; +delete $intrinsics{'null'}; + +# use -s to recompute sizes +%sizeof = ( + 'char', '1', + 'unsigned char', '1', + 'short', '2', + 'short int', '2', + 'unsigned short', '2', + 'unsigned short int', '2', + 'short unsigned int', '2', + 'int', '4', + 'unsigned int', '4', + 'long', '4', + 'long int', '4', + 'unsigned long', '4', + 'unsigned long int', '4', + 'long unsigned int', '4', + 'long long', '8', + 'long long int', '8', + 'unsigned long long', '8', + 'unsigned long long int', '8', + 'float', '4', + 'double', '8', + 'pointer', '4', +); + +($type_width, $member_width, $offset_width, $size_width) = (20, 20, 6, 5); + +($offset_fmt, $size_fmt) = ('d', 'd'); + +$indent = 2; + +$CC = 'cc'; +$CFLAGS = '-gstabs -S'; +$DEFINES = ''; + +$perl++ if $0 =~ m#/?c2ph$#; + +require 'getopts.pl'; + +use File::Temp 'tempdir'; + +eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_]+=)(.*)/ && shift; + +&Getopts('aixdpvtnws:') || &usage(0); + +$opt_d && $debug++; +$opt_t && $trace++; +$opt_p && $perl++; +$opt_v && $verbose++; +$opt_n && ($perl = 0); + +if ($opt_w) { + ($type_width, $member_width, $offset_width) = (45, 35, 8); +} +if ($opt_x) { + ($offset_fmt, $offset_width, $size_fmt, $size_width) = ( 'x', '08', 'x', 04 ); +} + +eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_]+=)(.*)/ && shift; + +sub PLUMBER { + select(STDERR); + print "oops, apperent pager foulup\n"; + $isatty++; + &usage(1); +} + +sub usage { + local($oops) = @_; + unless (-t STDOUT) { + select(STDERR); + } elsif (!$oops) { + $isatty++; + $| = 1; + print "hit for further explanation: "; + ; + open (PIPE, "|". ($ENV{PAGER} || 'more')); + $SIG{PIPE} = PLUMBER; + select(PIPE); + } + + print "usage: $0 [-dpnP] [var=val] [files ...]\n"; + + exit unless $isatty; + + print < 1, CLEANUP => 1) + unless (defined($SAFEDIR)); +} + +undef $SAFEDIR; + +$recurse = 1; + +if (@ARGV) { + if (grep(!/\.[csh]$/,@ARGV)) { + warn "Only *.[csh] files expected!\n"; + &usage; + } + elsif (grep(/\.s$/,@ARGV)) { + if (@ARGV > 1) { + warn "Only one *.s file allowed!\n"; + &usage; + } + } + elsif (@ARGV == 1 && $ARGV[0] =~ /\.c$/) { + local($dir, $file) = $ARGV[0] =~ m#(.*/)?(.*)$#; + $chdir = "cd $dir && " if $dir; + &system("$chdir$CC $CFLAGS $DEFINES $file") && exit 1; + $ARGV[0] =~ s/\.c$/.s/; + } + else { + &safedir; + $TMP = "$SAFEDIR/c2ph.$$.c"; + &system("cat @ARGV > $TMP") && exit 1; + &system("cd $SAFEDIR && $CC $CFLAGS $DEFINES $TMP") && exit 1; + unlink $TMP; + $TMP =~ s/\.c$/.s/; + @ARGV = ($TMP); + } +} + +if ($opt_s) { + for (split(/[\s,]+/, $opt_s)) { + $interested{$_}++; + } +} + + +$| = 1 if $debug; + +main: { + + if ($trace) { + if (-t && !@ARGV) { + print STDERR "reading from your keyboard: "; + } else { + print STDERR "reading from " . (@ARGV ? "@ARGV" : "").": "; + } + } + +STAB: while (<>) { + if ($trace && !($. % 10)) { + $lineno = $..''; + print STDERR $lineno, "\b" x length($lineno); + } + next unless /^\s*\.stabs\s+/; + $line = $_; + s/^\s*\.stabs\s+//; + if (s/\\\\"[d,]+$//) { + $saveline .= $line; + $savebar = $_; + next STAB; + } + if ($saveline) { + s/^"//; + $_ = $savebar . $_; + $line = $saveline; + } + &stab; + $savebar = $saveline = undef; + } + print STDERR "$.\n" if $trace; + unlink $TMP if $TMP; + + &compute_intrinsics if $perl && !$opt_i; + + print STDERR "resolving types\n" if $trace; + + &resolve_types; + &adjust_start_addrs; + + $sum = 2 + $type_width + $member_width; + $pmask1 = "%-${type_width}s %-${member_width}s"; + $pmask2 = "%-${sum}s %${offset_width}${offset_fmt}%s %${size_width}${size_fmt}%s"; + + + + if ($perl) { + # resolve template -- should be in stab define order, but even this isn't enough. + print STDERR "\nbuilding type templates: " if $trace; + for $i (reverse 0..$#type) { + next unless defined($name = $type[$i]); + next unless defined $struct{$name}; + ($iname = $name) =~ s/\..*//; + $build_recursed = 0; + &build_template($name) unless defined $template{&psou($name)} || + $opt_s && !$interested{$iname}; + } + print STDERR "\n\n" if $trace; + } + + print STDERR "dumping structs: " if $trace; + + local($iam); + + + + foreach $name (sort keys %struct) { + ($iname = $name) =~ s/\..*//; + next if $opt_s && !$interested{$iname}; + print STDERR "$name " if $trace; + + undef @sizeof; + undef @typedef; + undef @offsetof; + undef @indices; + undef @typeof; + undef @fieldnames; + + $mname = &munge($name); + + $fname = &psou($name); + + print "# " if $perl && $verbose; + $pcode = ''; + print "$fname {\n" if !$perl || $verbose; + $template{$fname} = &scrunch($template{$fname}) if $perl; + &pstruct($name,$name,0); + print "# " if $perl && $verbose; + print "}\n" if !$perl || $verbose; + print "\n" if $perl && $verbose; + + if ($perl) { + print "$pcode"; + + printf("\nsub %-32s { %4d; }\n\n", "${mname}'struct", $countof{$name}); + + print < $sizeof{$b}; } + + + foreach $name (sort keys %intrinsics) { + print '$',&munge($name),"'typedef = '", $template{$name}, "';\n"; + } + + print "\n1;\n" if $perl; + + exit; +} + +######################################################################################## + + +sub stab { + next unless $continued || /:[\$\w]+(\(\d+,\d+\))?=[\*\$\w]+/; # (\d+,\d+) is for sun + s/"// || next; + s/",([x\d]+),([x\d]+),([x\d]+),.*// || next; + + next if /^\s*$/; + + $size = $3 if $3; + $_ = $continued . $_ if length($continued); + if (s/\\\\$//) { + # if last 2 chars of string are '\\' then stab is continued + # in next stab entry + chop; + $continued = $_; + next; + } + $continued = ''; + + + $line = $_; + + if (($name, $pdecl) = /^([\$ \w]+):[tT]((\d+)(=[rufs*](\d+))+)$/) { + print "$name is a typedef for some funky pointers: $pdecl\n" if $debug; + &pdecl($pdecl); + next; + } + + + + if (/(([ \w]+):t(\d+|\(\d+,\d+\)))=r?(\d+|\(\d+,\d+\))(;\d+;\d+;)?/) { + local($ident) = $2; + push(@intrinsics, $ident); + $typeno = &typeno($3); + $type[$typeno] = $ident; + print STDERR "intrinsic $ident in new type $typeno\n" if $debug; + next; + } + + if (($name, $typeordef, $typeno, $extra, $struct, $_) + = /^([\$ \w]+):([ustT])(\d+|\(\d+,\d+\))(=[rufs*](\d+))?(.*)$/) + { + $typeno = &typeno($typeno); # sun foolery + } + elsif (/^[\$\w]+:/) { + next; # variable + } + else { + warn "can't grok stab: <$_> in: $line " if $_; + next; + } + + #warn "got size $size for $name\n"; + $sizeof{$name} = $size if $size; + + s/;[-\d]*;[-\d]*;$//; # we don't care about ranges + + $typenos{$name} = $typeno; + + unless (defined $type[$typeno]) { + &panic("type 0??") unless $typeno; + $type[$typeno] = $name unless defined $type[$typeno]; + printf "new type $typeno is $name" if $debug; + if ($extra =~ /\*/ && defined $type[$struct]) { + print ", a typedef for a pointer to " , $type[$struct] if $debug; + } + } else { + printf "%s is type %d", $name, $typeno if $debug; + print ", a typedef for " , $type[$typeno] if $debug; + } + print "\n" if $debug; + #next unless $extra =~ /[su*]/; + + #$type[$struct] = $name; + + if ($extra =~ /[us*]/) { + &sou($name, $extra); + $_ = &sdecl($name, $_, 0); + } + elsif (/^=ar/) { + print "it's a bare array typedef -- that's pretty sick\n" if $debug; + $_ = "$typeno$_"; + $scripts = ''; + $_ = &adecl($_,1); + + } + elsif (s/((\w+):t(\d+|\(\d+,\d+\)))?=r?(;\d+;\d+;)?//) { # the ?'s are for gcc + push(@intrinsics, $2); + $typeno = &typeno($3); + $type[$typeno] = $2; + print STDERR "intrinsic $2 in new type $typeno\n" if $debug; + } + elsif (s/^=e//) { # blessed be thy compiler; mine won't do this + &edecl; + } + else { + warn "Funny remainder for $name on line $_ left in $line " if $_; + } +} + +sub typeno { # sun thinks types are (0,27) instead of just 27 + local($_) = @_; + s/\(\d+,(\d+)\)/$1/; + $_; +} + +sub pstruct { + local($what,$prefix,$base) = @_; + local($field, $fieldname, $typeno, $count, $offset, $entry); + local($fieldtype); + local($type, $tname); + local($mytype, $mycount, $entry2); + local($struct_count) = 0; + local($pad, $revpad, $length, $prepad, $lastoffset, $lastlength, $fmt); + local($bits,$bytes); + local($template); + + + local($mname) = &munge($name); + + sub munge { + local($_) = @_; + s/[\s\$\.]/_/g; + $_; + } + + local($sname) = &psou($what); + + $nesting++; + + for $field (split(/;/, $struct{$what})) { + $pad = $prepad = 0; + $entry = ''; + ($fieldname, $typeno, $count, $offset, $length) = split(/,/, $field); + + $type = $type[$typeno]; + + $type =~ /([^[]*)(\[.*\])?/; + $mytype = $1; + $count .= $2; + $fieldtype = &psou($mytype); + + local($fname) = &psou($name); + + if ($build_templates) { + + $pad = ($offset - ($lastoffset + $lastlength))/8 + if defined $lastoffset; + + if (! $finished_template{$sname}) { + if ($isaunion{$what}) { + $template{$sname} .= 'X' x $revpad . ' ' if $revpad; + } else { + $template{$sname} .= 'x' x $pad . ' ' if $pad; + } + } + + $template = &fetch_template($type); + &repeat_template($template,$count); + + if (! $finished_template{$sname}) { + $template{$sname} .= $template; + } + + $revpad = $length/8 if $isaunion{$what}; + + ($lastoffset, $lastlength) = ($offset, $length); + + } else { + print '# ' if $perl && $verbose; + $entry = sprintf($pmask1, + ' ' x ($nesting * $indent) . $fieldtype, + "$prefix.$fieldname" . $count); + + $entry =~ s/(\*+)( )/$2$1/; + + printf $pmask2, + $entry, + ($base+$offset)/8, + ($bits = ($base+$offset)%8) ? ".$bits" : " ", + $length/8, + ($bits = $length % 8) ? ".$bits": "" + if !$perl || $verbose; + + if ($perl) { + $template = &fetch_template($type); + &repeat_template($template,$count); + } + + if ($perl && $nesting == 1) { + + push(@sizeof, int($length/8) .",\t# $fieldname"); + push(@offsetof, int($offset/8) .",\t# $fieldname"); + local($little) = &scrunch($template); + push(@typedef, "'$little', \t# $fieldname"); + $type =~ s/(struct|union) //; + push(@typeof, "'$mytype" . ($count ? $count : '') . + "',\t# $fieldname"); + push(@fieldnames, "'$fieldname',"); + } + + print ' ', ' ' x $indent x $nesting, $template + if $perl && $verbose; + + print "\n" if !$perl || $verbose; + + } + if ($perl) { + local($mycount) = defined $struct{$mytype} ? $countof{$mytype} : 1; + $mycount *= &scripts2count($count) if $count; + if ($nesting==1 && !$build_templates) { + $pcode .= sprintf("sub %-32s { %4d; }\n", + "${mname}'${fieldname}", $struct_count); + push(@indices, $struct_count); + } + $struct_count += $mycount; + } + + + &pstruct($type, "$prefix.$fieldname", $base+$offset) + if $recurse && defined $struct{$type}; + } + + $countof{$what} = $struct_count unless defined $countof{$whati}; + + $template{$sname} .= '$' if $build_templates; + $finished_template{$sname}++; + + if ($build_templates && !defined $sizeof{$name}) { + local($fmt) = &scrunch($template{$sname}); + print STDERR "no size for $name, punting with $fmt..." if $debug; + eval '$sizeof{$name} = length(pack($fmt, ()))'; + if ($@) { + chop $@; + warn "couldn't get size for \$name: $@"; + } else { + print STDERR $sizeof{$name}, "\n" if $debUg; + } + } + + --$nesting; +} + + +sub psize { + local($me) = @_; + local($amstruct) = $struct{$me} ? 'struct ' : ''; + + print '$sizeof{\'', $amstruct, $me, '\'} = '; + printf "%d;\n", $sizeof{$me}; +} + +sub pdecl { + local($pdecl) = @_; + local(@pdecls); + local($tname); + + warn "pdecl: $pdecl\n" if $debug; + + $pdecl =~ s/\(\d+,(\d+)\)/$1/g; + $pdecl =~ s/\*//g; + @pdecls = split(/=/, $pdecl); + $typeno = $pdecls[0]; + $tname = pop @pdecls; + + if ($tname =~ s/^f//) { $tname = "$tname&"; } + #else { $tname = "$tname*"; } + + for (reverse @pdecls) { + $tname .= s/^f// ? "&" : "*"; + #$tname =~ s/^f(.*)/$1&/; + print "type[$_] is $tname\n" if $debug; + $type[$_] = $tname unless defined $type[$_]; + } +} + + + +sub adecl { + ($arraytype, $unknown, $lower, $upper) = (); + #local($typeno); + # global $typeno, @type + local($_, $typedef) = @_; + + while (s/^((\d+|\(\d+,\d+\))=)?ar(\d+|\(\d+,\d+\));//) { + ($arraytype, $unknown) = ($2, $3); + $arraytype = &typeno($arraytype); + $unknown = &typeno($unknown); + if (s/^(\d+);(\d+);//) { + ($lower, $upper) = ($1, $2); + $scripts .= '[' . ($upper+1) . ']'; + } else { + warn "can't find array bounds: $_"; + } + } + if (s/^([(,)\d*f=]*),(\d+),(\d+);//) { + ($start, $length) = ($2, $3); + $whatis = $1; + if ($whatis =~ /^(\d+|\(\d+,\d+\))=/) { + $typeno = &typeno($1); + &pdecl($whatis); + } else { + $typeno = &typeno($whatis); + } + } elsif (s/^(\d+)(=[*suf]\d*)//) { + local($whatis) = $2; + + if ($whatis =~ /[f*]/) { + &pdecl($whatis); + } elsif ($whatis =~ /[su]/) { # + print "$prefix.$fieldname is an array$scripts anon structs; disgusting\n" + if $debug; + #$type[$typeno] = $name unless defined $type[$typeno]; + ##printf "new type $typeno is $name" if $debug; + $typeno = $1; + $type[$typeno] = "$prefix.$fieldname"; + local($name) = $type[$typeno]; + &sou($name, $whatis); + $_ = &sdecl($name, $_, $start+$offset); + 1; + $start = $start{$name}; + $offset = $sizeof{$name}; + $length = $offset; + } else { + warn "what's this? $whatis in $line "; + } + } elsif (/^\d+$/) { + $typeno = $_; + } else { + warn "bad array stab: $_ in $line "; + next STAB; + } + #local($wasdef) = defined($type[$typeno]) && $debug; + #if ($typedef) { + #print "redefining $type[$typeno] to " if $wasdef; + #$type[$typeno] = "$whatis$scripts"; # unless defined $type[$typeno]; + #print "$type[$typeno]\n" if $wasdef; + #} else { + #$type[$arraytype] = $type[$typeno] unless defined $type[$arraytype]; + #} + $type[$arraytype] = "$type[$typeno]$scripts" if defined $type[$typeno]; + print "type[$arraytype] is $type[$arraytype]\n" if $debug; + print "$prefix.$fieldname is an array of $type[$arraytype]\n" if $debug; + $_; +} + + + +sub sdecl { + local($prefix, $_, $offset) = @_; + + local($fieldname, $scripts, $type, $arraytype, $unknown, + $whatis, $pdecl, $upper,$lower, $start,$length) = (); + local($typeno,$sou); + + +SFIELD: + while (/^([^;]+);/) { + $scripts = ''; + warn "sdecl $_\n" if $debug; + if (s/^([\$\w]+)://) { + $fieldname = $1; + } elsif (s/(\d+)=([us])(\d+|\(\d+,\d+\))//) { # + $typeno = &typeno($1); + $type[$typeno] = "$prefix.$fieldname"; + local($name) = "$prefix.$fieldname"; + &sou($name,$2); + $_ = &sdecl("$prefix.$fieldname", $_, $start+$offset); + $start = $start{$name}; + $offset += $sizeof{$name}; + #print "done with anon, start is $start, offset is $offset\n"; + #next SFIELD; + } else { + warn "weird field $_ of $line" if $debug; + next STAB; + #$fieldname = &gensym; + #$_ = &sdecl("$prefix.$fieldname", $_, $start+$offset); + } + + if (/^(\d+|\(\d+,\d+\))=ar/) { + $_ = &adecl($_); + } + elsif (s/^(\d+|\(\d+,\d+\))?,(\d+),(\d+);//) { + ($start, $length) = ($2, $3); + &panic("no length?") unless $length; + $typeno = &typeno($1) if $1; + } + elsif (s/^(\d+)=xs\w+:,(\d+),(\d+);//) { + ($start, $length) = ($2, $3); + &panic("no length?") unless $length; + $typeno = &typeno($1) if $1; + } + elsif (s/^((\d+|\(\d+,\d+\))(=[*f](\d+|\(\d+,\d+\)))+),(\d+),(\d+);//) { + ($pdecl, $start, $length) = ($1,$5,$6); + &pdecl($pdecl); + } + elsif (s/(\d+)=([us])(\d+|\(\d+,\d+\))//) { # the dratted anon struct + ($typeno, $sou) = ($1, $2); + $typeno = &typeno($typeno); + if (defined($type[$typeno])) { + warn "now how did we get type $1 in $fieldname of $line?"; + } else { + print "anon type $typeno is $prefix.$fieldname\n" if $debug; + $type[$typeno] = "$prefix.$fieldname" unless defined $type[$typeno]; + }; + local($name) = "$prefix.$fieldname"; + &sou($name,$sou); + print "anon ".($isastruct{$name}) ? "struct":"union"." for $prefix.$fieldname\n" if $debug; + $type[$typeno] = "$prefix.$fieldname"; + $_ = &sdecl("$prefix.$fieldname", $_, $start+$offset); + $start = $start{$name}; + $length = $sizeof{$name}; + } + else { + warn "can't grok stab for $name ($_) in line $line "; + next STAB; + } + + &panic("no length for $prefix.$fieldname") unless $length; + $struct{$name} .= join(',', $fieldname, $typeno, $scripts, $start, $length) . ';'; + } + if (s/;\d*,(\d+),(\d+);//) { + local($start, $size) = ($1, $2); + $sizeof{$prefix} = $size; + print "start of $prefix is $start, size of $sizeof{$prefix}\n" if $debug; + $start{$prefix} = $start; + } + $_; +} + +sub edecl { + s/;$//; + $enum{$name} = $_; + $_ = ''; +} + +sub resolve_types { + local($sou); + for $i (0 .. $#type) { + next unless defined $type[$i]; + $_ = $type[$i]; + unless (/\d/) { + print "type[$i] $type[$i]\n" if $debug; + next; + } + print "type[$i] $_ ==> " if $debug; + s/^(\d+)(\**)\&\*(\**)/"$2($3".&type($1) . ')()'/e; + s/^(\d+)\&/&type($1)/e; + s/^(\d+)/&type($1)/e; + s/(\*+)([^*]+)(\*+)/$1$3$2/; + s/\((\*+)(\w+)(\*+)\)/$3($1$2)/; + s/^(\d+)([\*\[].*)/&type($1).$2/e; + #s/(\d+)(\*|(\[[\[\]\d\*]+]\])+)/&type($1).$2/ge; + $type[$i] = $_; + print "$_\n" if $debug; + } +} +sub type { &psou($type[$_[0]] || ""); } + +sub adjust_start_addrs { + for (sort keys %start) { + ($basename = $_) =~ s/\.[^.]+$//; + $start{$_} += $start{$basename}; + print "start: $_ @ $start{$_}\n" if $debug; + } +} + +sub sou { + local($what, $_) = @_; + /u/ && $isaunion{$what}++; + /s/ && $isastruct{$what}++; +} + +sub psou { + local($what) = @_; + local($prefix) = ''; + if ($isaunion{$what}) { + $prefix = 'union '; + } elsif ($isastruct{$what}) { + $prefix = 'struct '; + } + $prefix . $what; +} + +sub scrunch { + local($_) = @_; + + return '' if $_ eq ''; + + study; + + s/\$//g; + s/ / /g; + 1 while s/(\w) \1/$1$1/g; + + # i wanna say this, but perl resists my efforts: + # s/(\w)(\1+)/$2 . length($1)/ge; + + &quick_scrunch; + + s/ $//; + + $_; +} + +sub buildscrunchlist { + $scrunch_code = "sub quick_scrunch {\n"; + for (values %intrinsics) { + $scrunch_code .= "\ts/(${_}{2,})/'$_' . length(\$1)/ge;\n"; + } + $scrunch_code .= "}\n"; + print "$scrunch_code" if $debug; + eval $scrunch_code; + &panic("can't eval scrunch_code $@ \nscrunch_code") if $@; +} + +sub fetch_template { + local($mytype) = @_; + local($fmt); + local($count) = 1; + + &panic("why do you care?") unless $perl; + + if ($mytype =~ s/(\[\d+\])+$//) { + $count .= $1; + } + + if ($mytype =~ /\*/) { + $fmt = $template{'pointer'}; + } + elsif (defined $template{$mytype}) { + $fmt = $template{$mytype}; + } + elsif (defined $struct{$mytype}) { + if (!defined $template{&psou($mytype)}) { + &build_template($mytype) unless $mytype eq $name; + } + elsif ($template{&psou($mytype)} !~ /\$$/) { + #warn "incomplete template for $mytype\n"; + } + $fmt = $template{&psou($mytype)} || '?'; + } + else { + warn "unknown fmt for $mytype\n"; + $fmt = '?'; + } + + $fmt x $count . ' '; +} + +sub compute_intrinsics { + &safedir; + local($TMP) = "$SAFEDIR/c2ph-i.$$.c"; + open (TMP, ">$TMP") || die "can't open $TMP: $!"; + select(TMP); + + print STDERR "computing intrinsic sizes: " if $trace; + + undef %intrinsics; + + print <<'EOF'; +main() { + char *mask = "%d %s\n"; +EOF + + for $type (@intrinsics) { + next if !$type || $type eq 'void' || $type =~ /complex/; # sun stuff + print <<"EOF"; + printf(mask,sizeof($type), "$type"); +EOF + } + + print <<'EOF'; + printf(mask,sizeof(char *), "pointer"); + exit(0); +} +EOF + close TMP; + + select(STDOUT); + open(PIPE, "cd $SAFEDIR && $CC $TMP && $SAFEDIR/a.out|"); + while () { + chop; + split(' ',$_,2);; + print "intrinsic $_[1] is size $_[0]\n" if $debug; + $sizeof{$_[1]} = $_[0]; + $intrinsics{$_[1]} = $template{$_[0]}; + } + close(PIPE) || die "couldn't read intrinsics!"; + unlink($TMP, "$SAFEDIR/a.out"); + print STDERR "done\n" if $trace; +} + +sub scripts2count { + local($_) = @_; + + s/^\[//; + s/\]$//; + s/\]\[/*/g; + $_ = eval; + &panic("$_: $@") if $@; + $_; +} + +sub system { + print STDERR "@_\n" if $trace; + system @_; +} + +sub build_template { + local($name) = @_; + + &panic("already got a template for $name") if defined $template{$name}; + + local($build_templates) = 1; + + local($lparen) = '(' x $build_recursed; + local($rparen) = ')' x $build_recursed; + + print STDERR "$lparen$name$rparen " if $trace; + $build_recursed++; + &pstruct($name,$name,0); + print STDERR "TEMPLATE for $name is ", $template{&psou($name)}, "\n" if $debug; + --$build_recursed; +} + + +sub panic { + + select(STDERR); + + print "\npanic: @_\n"; + + exit 1 if $] <= 4.003; # caller broken + + local($i,$_); + local($p,$f,$l,$s,$h,$a,@a,@sub); + for ($i = 0; ($p,$f,$l,$s,$h,$w) = caller($i); $i++) { + @a = @DB'args; + for (@a) { + if (/^StB\000/ && length($_) == length($_main{'_main'})) { + $_ = sprintf("%s",$_); + } + else { + s/'/\\'/g; + s/([^\0]*)/'$1'/ unless /^-?[\d.]+$/; + s/([\200-\377])/sprintf("M-%c",ord($1)&0177)/eg; + s/([\0-\37\177])/sprintf("^%c",ord($1)^64)/eg; + } + } + $w = $w ? '@ = ' : '$ = '; + $a = $h ? '(' . join(', ', @a) . ')' : ''; + push(@sub, "$w&$s$a from file $f line $l\n"); + last if $signal; + } + for ($i=0; $i <= $#sub; $i++) { + last if $signal; + print $sub[$i]; + } + exit 1; +} + +sub squishseq { + local($num); + local($last) = -1e8; + local($string); + local($seq) = '..'; + + while (defined($num = shift)) { + if ($num == ($last + 1)) { + $string .= $seq unless $inseq++; + $last = $num; + next; + } elsif ($inseq) { + $string .= $last unless $last == -1e8; + } + + $string .= ',' if defined $string; + $string .= $num; + $last = $num; + $inseq = 0; + } + $string .= $last if $inseq && $last != -e18; + $string; +} + +sub repeat_template { + # local($template, $scripts) = @_; have to change caller's values + + if ( $_[1] ) { + local($ncount) = &scripts2count($_[1]); + if ($_[0] =~ /^\s*c\s*$/i) { + $_[0] = "A$ncount "; + $_[1] = ''; + } else { + $_[0] = $template x $ncount; + } + } +} + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/config_data b/Master/tlpkg/tlperl.straw/bin/config_data new file mode 100755 index 00000000000..532fe2406b0 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/config_data @@ -0,0 +1,249 @@ +#!C:\strawberry\perl\bin\perl.exe + +use strict; +use Module::Build 0.25; +use Getopt::Long; + +my %opt_defs = ( + module => {type => '=s', + desc => 'The name of the module to configure (required)'}, + feature => {type => ':s', + desc => 'Print the value of a feature or all features'}, + config => {type => ':s', + desc => 'Print the value of a config option'}, + set_feature => {type => '=s%', + desc => "Set a feature to 'true' or 'false'"}, + set_config => {type => '=s%', + desc => 'Set a config option to the given value'}, + eval => {type => '', + desc => 'eval() config values before setting'}, + help => {type => '', + desc => 'Print a help message and exit'}, + ); + +my %opts; +GetOptions( \%opts, map "$_$opt_defs{$_}{type}", keys %opt_defs ) or die usage(%opt_defs); +print usage(%opt_defs) and exit(0) + if $opts{help}; + +my @exclusive = qw(feature config set_feature set_config); +die "Exactly one of the options '" . join("', '", @exclusive) . "' must be specified\n" . usage(%opt_defs) + unless grep(exists $opts{$_}, @exclusive) == 1; + +die "Option --module is required\n" . usage(%opt_defs) + unless $opts{module}; + +my $cf = load_config($opts{module}); + +if (exists $opts{feature}) { + + if (length $opts{feature}) { + print $cf->feature($opts{feature}); + } else { + my %auto; + # note: need to support older ConfigData.pm's + @auto{$cf->auto_feature_names} = () if $cf->can("auto_feature_names"); + + print " Features defined in $cf:\n"; + foreach my $name (sort $cf->feature_names) { + print " $name => ", $cf->feature($name), (exists $auto{$name} ? " (dynamic)" : ""), "\n"; + } + } + +} elsif (exists $opts{config}) { + + require Data::Dumper; + local $Data::Dumper::Terse = 1; + + if (length $opts{config}) { + print Data::Dumper::Dumper($cf->config($opts{config})), "\n"; + } else { + print " Configuration defined in $cf:\n"; + foreach my $name (sort $cf->config_names) { + print " $name => ", Data::Dumper::Dumper($cf->config($name)), "\n"; + } + } + +} elsif (exists $opts{set_feature}) { + my %to_set = %{$opts{set_feature}}; + while (my ($k, $v) = each %to_set) { + die "Feature value must be 0 or 1\n" unless $v =~ /^[01]$/; + $cf->set_feature($k, 0+$v); # Cast to a number, not a string + } + $cf->write; + print "Feature" . 's'x(keys(%to_set)>1) . " saved\n"; + +} elsif (exists $opts{set_config}) { + + my %to_set = %{$opts{set_config}}; + while (my ($k, $v) = each %to_set) { + if ($opts{eval}) { + $v = eval($v); + die $@ if $@; + } + $cf->set_config($k, $v); + } + $cf->write; + print "Config value" . 's'x(keys(%to_set)>1) . " saved\n"; +} + +sub load_config { + my $mod = shift; + + $mod =~ /^([\w:]+)$/ + or die "Invalid module name '$mod'"; + + my $cf = $mod . "::ConfigData"; + eval "require $cf"; + die $@ if $@; + + return $cf; +} + +sub usage { + my %defs = @_; + + my $out = "\nUsage: $0 [options]\n\n Options include:\n"; + + foreach my $name (sort keys %defs) { + $out .= " --$name"; + + for ($defs{$name}{type}) { + /^=s$/ and $out .= " "; + /^=s%$/ and $out .= " ="; + } + + pad_line($out, 35); + $out .= "$defs{$name}{desc}\n"; + } + + $out .= < tool provides a command-line interface to the +configuration of Perl modules. By "configuration", we mean something +akin to "user preferences" or "local settings". This is a +formalization and abstraction of the systems that people like Andreas +Koenig (C), Jon Swartz (C), Andy +Wardley (C), and Larry Wall (perl's own Config.pm) +have developed independently. + +The configuration system emplyed here was developed in the context of +C. Under this system, configuration information for a +module C, for example, is stored in a module called +C) (I would have called it C, but that +was taken by all those other systems mentioned in the previous +paragraph...). These C<...::ConfigData> modules contain the +configuration data, as well as publically accessible methods for +querying and setting (yes, actually re-writing) the configuration +data. The C script (whose docs you are currently +reading) is merely a front-end for those methods. If you wish, you +may create alternate front-ends. + +The two types of data that may be stored are called C values +and C values. A C value may be any perl scalar, +including references to complex data structures. It must, however, be +serializable using C. A C is a boolean (1 or +0) value. + +=head1 USAGE + +This script functions as a basic getter/setter wrapper around the +configuration of a single module. On the command line, specify which +module's configuration you're interested in, and pass options to get +or set C or C values. The following options are +supported: + +=over 4 + +=item module + +Specifies the name of the module to configure (required). + +=item feature + +When passed the name of a C, shows its value. The value will +be 1 if the feature is enabled, 0 if the feature is not enabled, or +empty if the feature is unknown. When no feature name is supplied, +the names and values of all known features will be shown. + +=item config + +When passed the name of a C entry, shows its value. The value +will be displayed using C (or similar) as perl code. +When no config name is supplied, the names and values of all known +config entries will be shown. + +=item set_feature + +Sets the given C to the given boolean value. Specify the value +as either 1 or 0. + +=item set_config + +Sets the given C entry to the given value. + +=item eval + +If the C<--eval> option is used, the values in C will be +evaluated as perl code before being stored. This allows moderately +complicated data structures to be stored. For really complicated +structures, you probably shouldn't use this command-line interface, +just use the Perl API instead. + +=item help + +Prints a help message, including a few examples, and exits. + +=back + +=head1 AUTHOR + +Ken Williams, kwilliams@cpan.org + +=head1 COPYRIGHT + +Copyright (c) 1999, Ken Williams. All rights reserved. + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=head1 SEE ALSO + +Module::Build(3), perl(1). + +=cut diff --git a/Master/tlpkg/tlperl.straw/bin/config_data.bat b/Master/tlpkg/tlperl.straw/bin/config_data.bat new file mode 100755 index 00000000000..19604694e39 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/config_data.bat @@ -0,0 +1,265 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!C:\strawberry\perl\bin\perl.exe +#line 15 + +use strict; +use Module::Build 0.25; +use Getopt::Long; + +my %opt_defs = ( + module => {type => '=s', + desc => 'The name of the module to configure (required)'}, + feature => {type => ':s', + desc => 'Print the value of a feature or all features'}, + config => {type => ':s', + desc => 'Print the value of a config option'}, + set_feature => {type => '=s%', + desc => "Set a feature to 'true' or 'false'"}, + set_config => {type => '=s%', + desc => 'Set a config option to the given value'}, + eval => {type => '', + desc => 'eval() config values before setting'}, + help => {type => '', + desc => 'Print a help message and exit'}, + ); + +my %opts; +GetOptions( \%opts, map "$_$opt_defs{$_}{type}", keys %opt_defs ) or die usage(%opt_defs); +print usage(%opt_defs) and exit(0) + if $opts{help}; + +my @exclusive = qw(feature config set_feature set_config); +die "Exactly one of the options '" . join("', '", @exclusive) . "' must be specified\n" . usage(%opt_defs) + unless grep(exists $opts{$_}, @exclusive) == 1; + +die "Option --module is required\n" . usage(%opt_defs) + unless $opts{module}; + +my $cf = load_config($opts{module}); + +if (exists $opts{feature}) { + + if (length $opts{feature}) { + print $cf->feature($opts{feature}); + } else { + my %auto; + # note: need to support older ConfigData.pm's + @auto{$cf->auto_feature_names} = () if $cf->can("auto_feature_names"); + + print " Features defined in $cf:\n"; + foreach my $name (sort $cf->feature_names) { + print " $name => ", $cf->feature($name), (exists $auto{$name} ? " (dynamic)" : ""), "\n"; + } + } + +} elsif (exists $opts{config}) { + + require Data::Dumper; + local $Data::Dumper::Terse = 1; + + if (length $opts{config}) { + print Data::Dumper::Dumper($cf->config($opts{config})), "\n"; + } else { + print " Configuration defined in $cf:\n"; + foreach my $name (sort $cf->config_names) { + print " $name => ", Data::Dumper::Dumper($cf->config($name)), "\n"; + } + } + +} elsif (exists $opts{set_feature}) { + my %to_set = %{$opts{set_feature}}; + while (my ($k, $v) = each %to_set) { + die "Feature value must be 0 or 1\n" unless $v =~ /^[01]$/; + $cf->set_feature($k, 0+$v); # Cast to a number, not a string + } + $cf->write; + print "Feature" . 's'x(keys(%to_set)>1) . " saved\n"; + +} elsif (exists $opts{set_config}) { + + my %to_set = %{$opts{set_config}}; + while (my ($k, $v) = each %to_set) { + if ($opts{eval}) { + $v = eval($v); + die $@ if $@; + } + $cf->set_config($k, $v); + } + $cf->write; + print "Config value" . 's'x(keys(%to_set)>1) . " saved\n"; +} + +sub load_config { + my $mod = shift; + + $mod =~ /^([\w:]+)$/ + or die "Invalid module name '$mod'"; + + my $cf = $mod . "::ConfigData"; + eval "require $cf"; + die $@ if $@; + + return $cf; +} + +sub usage { + my %defs = @_; + + my $out = "\nUsage: $0 [options]\n\n Options include:\n"; + + foreach my $name (sort keys %defs) { + $out .= " --$name"; + + for ($defs{$name}{type}) { + /^=s$/ and $out .= " "; + /^=s%$/ and $out .= " ="; + } + + pad_line($out, 35); + $out .= "$defs{$name}{desc}\n"; + } + + $out .= < tool provides a command-line interface to the +configuration of Perl modules. By "configuration", we mean something +akin to "user preferences" or "local settings". This is a +formalization and abstraction of the systems that people like Andreas +Koenig (C), Jon Swartz (C), Andy +Wardley (C), and Larry Wall (perl's own Config.pm) +have developed independently. + +The configuration system emplyed here was developed in the context of +C. Under this system, configuration information for a +module C, for example, is stored in a module called +C) (I would have called it C, but that +was taken by all those other systems mentioned in the previous +paragraph...). These C<...::ConfigData> modules contain the +configuration data, as well as publically accessible methods for +querying and setting (yes, actually re-writing) the configuration +data. The C script (whose docs you are currently +reading) is merely a front-end for those methods. If you wish, you +may create alternate front-ends. + +The two types of data that may be stored are called C values +and C values. A C value may be any perl scalar, +including references to complex data structures. It must, however, be +serializable using C. A C is a boolean (1 or +0) value. + +=head1 USAGE + +This script functions as a basic getter/setter wrapper around the +configuration of a single module. On the command line, specify which +module's configuration you're interested in, and pass options to get +or set C or C values. The following options are +supported: + +=over 4 + +=item module + +Specifies the name of the module to configure (required). + +=item feature + +When passed the name of a C, shows its value. The value will +be 1 if the feature is enabled, 0 if the feature is not enabled, or +empty if the feature is unknown. When no feature name is supplied, +the names and values of all known features will be shown. + +=item config + +When passed the name of a C entry, shows its value. The value +will be displayed using C (or similar) as perl code. +When no config name is supplied, the names and values of all known +config entries will be shown. + +=item set_feature + +Sets the given C to the given boolean value. Specify the value +as either 1 or 0. + +=item set_config + +Sets the given C entry to the given value. + +=item eval + +If the C<--eval> option is used, the values in C will be +evaluated as perl code before being stored. This allows moderately +complicated data structures to be stored. For really complicated +structures, you probably shouldn't use this command-line interface, +just use the Perl API instead. + +=item help + +Prints a help message, including a few examples, and exits. + +=back + +=head1 AUTHOR + +Ken Williams, kwilliams@cpan.org + +=head1 COPYRIGHT + +Copyright (c) 1999, Ken Williams. All rights reserved. + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=head1 SEE ALSO + +Module::Build(3), perl(1). + +=cut + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/corelist b/Master/tlpkg/tlperl.straw/bin/corelist new file mode 100755 index 00000000000..b59aef34776 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/corelist @@ -0,0 +1,272 @@ +#!/usr/bin/perl + +=head1 NAME + +corelist - a commandline frontend to Module::CoreList + +=head1 DESCRIPTION + +See L for one. + +=head1 SYNOPSIS + + corelist -v + corelist [-a|-d] | // [] ... + corelist [-v ] [ | // ] ... + +=head1 OPTIONS + +=over + +=item -a + +lists all versions of the given module (or the matching modules, in case you +used a module regexp) in the perls Module::CoreList knows about. + + corelist -a utf8 + + utf8 was first released with perl 5.006 + 5.006 undef + 5.006001 undef + 5.006002 undef + 5.007003 1.00 + 5.008 1.00 + 5.008001 1.02 + 5.008002 1.02 + 5.008003 1.02 + 5.008004 1.03 + 5.008005 1.04 + 5.008006 1.04 + 5.008007 1.05 + 5.008008 1.06 + 5.009 1.02 + 5.009001 1.02 + 5.009002 1.04 + 5.009003 1.06 + +=item -d + +finds the first perl version where a module has been released by +date, and not by version number (as is the default). + +=item -? or -help + +help! help! help! to see more help, try --man. + +=item -man + +all of the help + +=item -v + +lists all of the perl release versions we got the CoreList for. + +If you pass a version argument (value of C<$]>, like C<5.00503> or C<5.008008>), +you get a list of all the modules and their respective versions. +(If you have the C module, you can also use new-style version numbers, +like C<5.8.8>.) + +In module filtering context, it can be used as Perl version filter. + +=back + +As a special case, if you specify the module name C, you'll get +the version number of the Unicode Character Database bundled with the +requested perl versions. + +=cut + +use Module::CoreList; +use Getopt::Long; +use Pod::Usage; +use strict; +use warnings; + +my %Opts; + +GetOptions(\%Opts, qw[ help|?! man! v|version:f a! d ] ); + +pod2usage(1) if $Opts{help}; +pod2usage(-verbose=>2) if $Opts{man}; + +if(exists $Opts{v} ){ + if( !$Opts{v} ) { + print "\nModule::CoreList has info on the following perl versions:\n"; + print "$_\n" for sort keys %Module::CoreList::version; + print "\n"; + exit 0; + } + + $Opts{v} = numify_version( $Opts{v} ); + my $version_hash = Module::CoreList->find_version($Opts{v}); + if( !$version_hash ) { + print "\nModule::CoreList has no info on perl v$Opts{v}\n\n"; + exit 1; + } + + if ( !@ARGV ) { + print "\nThe following modules were in perl v$Opts{v} CORE\n"; + print "$_ ", $version_hash->{$_} || " ","\n" + for sort keys %$version_hash; + print "\n"; + exit 0; + } +} + +if ( !@ARGV ) { + pod2usage(0); +} + +while (@ARGV) { + my ($mod, $ver); + if ($ARGV[0] =~ /=/) { + ($mod, $ver) = split /=/, shift @ARGV; + } else { + $mod = shift @ARGV; + $ver = (@ARGV && $ARGV[0] =~ /^\d/) ? shift @ARGV : ""; + } + + if ($mod !~ m|^/(.*)/([imosx]*)$|) { # not a regex + module_version($mod,$ver); + } else { + my $re; + eval { $re = $2 ? qr/(?$2)($1)/ : qr/$1/; }; # trap exceptions while building regex + if ($@) { + # regex errors are usually like 'Quantifier follow nothing in regex; marked by ...' + # then we drop text after ';' to shorten message + my $errmsg = $@ =~ /(.*);/ ? $1 : $@; + warn "\n$mod is a bad regex: $errmsg\n"; + next; + } + my @mod = Module::CoreList->find_modules($re); + if (@mod) { + module_version($_, $ver) for @mod; + } else { + $ver |= ''; + print "\n$mod $ver has no match in CORE (or so I think)\n"; + } + + } +} + +exit(); + +sub module_version { + my($mod,$ver) = @_; + + if ( $Opts{v} ) { + my $version_hash = Module::CoreList->find_version($Opts{v}); + if ($version_hash) { + print $mod, " ", $version_hash->{$mod} || 'undef', "\n"; + return; + } + else { die "Shouldn't happen" } + } + + my $ret = $Opts{d} + ? Module::CoreList->first_release_by_date(@_) + : Module::CoreList->first_release(@_); + my $msg = $mod; + $msg .= " $ver" if $ver; + + if( defined $ret ) { + $msg .= " was "; + $msg .= "first " unless $ver; + $msg .= "released with perl $ret" + } else { + $msg .= " was not in CORE (or so I think)"; + } + + print "\n",$msg,"\n"; + + if(defined $ret and exists $Opts{a} and $Opts{a}){ + for my $v( + sort keys %Module::CoreList::version ){ + + printf " %-10s %-10s\n", + $v, + $Module::CoreList::version{$v}{$mod} + || 'undef' + if exists $Module::CoreList::version{$v}{$mod}; + } + print "\n"; + } +} + +sub numify_version { + my $ver = shift; + if ($ver =~ /\..+\./) { + eval { require version ; 1 } + or die "You need to install version.pm to use dotted version numbers\n"; + $ver = version->new($ver)->numify; + } + $ver += 0; + return $ver; +} + +=head1 EXAMPLES + + $ corelist File::Spec + + File::Spec was first released with perl 5.005 + + $ corelist File::Spec 0.83 + + File::Spec 0.83 was released with perl 5.007003 + + $ corelist File::Spec 0.89 + + File::Spec 0.89 was not in CORE (or so I think) + + $ corelist File::Spec::Aliens + + File::Spec::Aliens was not in CORE (or so I think) + + $ corelist /IPC::Open/ + + IPC::Open2 was first released with perl 5 + + IPC::Open3 was first released with perl 5 + + $ corelist /MANIFEST/i + + ExtUtils::Manifest was first released with perl 5.001 + + $ corelist /Template/ + + /Template/ has no match in CORE (or so I think) + + $ corelist -v 5.8.8 B + + B 1.09_01 + + $ corelist -v 5.8.8 /^B::/ + + B::Asmdata 1.01 + B::Assembler 0.07 + B::Bblock 1.02_01 + B::Bytecode 1.01_01 + B::C 1.04_01 + B::CC 1.00_01 + B::Concise 0.66 + B::Debug 1.02_01 + B::Deparse 0.71 + B::Disassembler 1.05 + B::Lint 1.03 + B::O 1.00 + B::Showlex 1.02 + B::Stackobj 1.00 + B::Stash 1.00 + B::Terse 1.03_01 + B::Xref 1.01 + +=head1 COPYRIGHT + +Copyright (c) 2002-2007 by D.H. aka PodMaster + +Currently maintained by the perl 5 porters Eperl5-porters@perl.orgE. + +This program is distributed under the same terms as perl itself. +See http://perl.org/ or http://cpan.org/ for more info on that. + +=cut diff --git a/Master/tlpkg/tlperl.straw/bin/corelist.bat b/Master/tlpkg/tlperl.straw/bin/corelist.bat new file mode 100755 index 00000000000..f0cc991ff10 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/corelist.bat @@ -0,0 +1,288 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!/usr/bin/perl +#line 15 + +=head1 NAME + +corelist - a commandline frontend to Module::CoreList + +=head1 DESCRIPTION + +See L for one. + +=head1 SYNOPSIS + + corelist -v + corelist [-a|-d] | // [] ... + corelist [-v ] [ | // ] ... + +=head1 OPTIONS + +=over + +=item -a + +lists all versions of the given module (or the matching modules, in case you +used a module regexp) in the perls Module::CoreList knows about. + + corelist -a utf8 + + utf8 was first released with perl 5.006 + 5.006 undef + 5.006001 undef + 5.006002 undef + 5.007003 1.00 + 5.008 1.00 + 5.008001 1.02 + 5.008002 1.02 + 5.008003 1.02 + 5.008004 1.03 + 5.008005 1.04 + 5.008006 1.04 + 5.008007 1.05 + 5.008008 1.06 + 5.009 1.02 + 5.009001 1.02 + 5.009002 1.04 + 5.009003 1.06 + +=item -d + +finds the first perl version where a module has been released by +date, and not by version number (as is the default). + +=item -? or -help + +help! help! help! to see more help, try --man. + +=item -man + +all of the help + +=item -v + +lists all of the perl release versions we got the CoreList for. + +If you pass a version argument (value of C<$]>, like C<5.00503> or C<5.008008>), +you get a list of all the modules and their respective versions. +(If you have the C module, you can also use new-style version numbers, +like C<5.8.8>.) + +In module filtering context, it can be used as Perl version filter. + +=back + +As a special case, if you specify the module name C, you'll get +the version number of the Unicode Character Database bundled with the +requested perl versions. + +=cut + +use Module::CoreList; +use Getopt::Long; +use Pod::Usage; +use strict; +use warnings; + +my %Opts; + +GetOptions(\%Opts, qw[ help|?! man! v|version:f a! d ] ); + +pod2usage(1) if $Opts{help}; +pod2usage(-verbose=>2) if $Opts{man}; + +if(exists $Opts{v} ){ + if( !$Opts{v} ) { + print "\nModule::CoreList has info on the following perl versions:\n"; + print "$_\n" for sort keys %Module::CoreList::version; + print "\n"; + exit 0; + } + + $Opts{v} = numify_version( $Opts{v} ); + my $version_hash = Module::CoreList->find_version($Opts{v}); + if( !$version_hash ) { + print "\nModule::CoreList has no info on perl v$Opts{v}\n\n"; + exit 1; + } + + if ( !@ARGV ) { + print "\nThe following modules were in perl v$Opts{v} CORE\n"; + print "$_ ", $version_hash->{$_} || " ","\n" + for sort keys %$version_hash; + print "\n"; + exit 0; + } +} + +if ( !@ARGV ) { + pod2usage(0); +} + +while (@ARGV) { + my ($mod, $ver); + if ($ARGV[0] =~ /=/) { + ($mod, $ver) = split /=/, shift @ARGV; + } else { + $mod = shift @ARGV; + $ver = (@ARGV && $ARGV[0] =~ /^\d/) ? shift @ARGV : ""; + } + + if ($mod !~ m|^/(.*)/([imosx]*)$|) { # not a regex + module_version($mod,$ver); + } else { + my $re; + eval { $re = $2 ? qr/(?$2)($1)/ : qr/$1/; }; # trap exceptions while building regex + if ($@) { + # regex errors are usually like 'Quantifier follow nothing in regex; marked by ...' + # then we drop text after ';' to shorten message + my $errmsg = $@ =~ /(.*);/ ? $1 : $@; + warn "\n$mod is a bad regex: $errmsg\n"; + next; + } + my @mod = Module::CoreList->find_modules($re); + if (@mod) { + module_version($_, $ver) for @mod; + } else { + $ver |= ''; + print "\n$mod $ver has no match in CORE (or so I think)\n"; + } + + } +} + +exit(); + +sub module_version { + my($mod,$ver) = @_; + + if ( $Opts{v} ) { + my $version_hash = Module::CoreList->find_version($Opts{v}); + if ($version_hash) { + print $mod, " ", $version_hash->{$mod} || 'undef', "\n"; + return; + } + else { die "Shouldn't happen" } + } + + my $ret = $Opts{d} + ? Module::CoreList->first_release_by_date(@_) + : Module::CoreList->first_release(@_); + my $msg = $mod; + $msg .= " $ver" if $ver; + + if( defined $ret ) { + $msg .= " was "; + $msg .= "first " unless $ver; + $msg .= "released with perl $ret" + } else { + $msg .= " was not in CORE (or so I think)"; + } + + print "\n",$msg,"\n"; + + if(defined $ret and exists $Opts{a} and $Opts{a}){ + for my $v( + sort keys %Module::CoreList::version ){ + + printf " %-10s %-10s\n", + $v, + $Module::CoreList::version{$v}{$mod} + || 'undef' + if exists $Module::CoreList::version{$v}{$mod}; + } + print "\n"; + } +} + +sub numify_version { + my $ver = shift; + if ($ver =~ /\..+\./) { + eval { require version ; 1 } + or die "You need to install version.pm to use dotted version numbers\n"; + $ver = version->new($ver)->numify; + } + $ver += 0; + return $ver; +} + +=head1 EXAMPLES + + $ corelist File::Spec + + File::Spec was first released with perl 5.005 + + $ corelist File::Spec 0.83 + + File::Spec 0.83 was released with perl 5.007003 + + $ corelist File::Spec 0.89 + + File::Spec 0.89 was not in CORE (or so I think) + + $ corelist File::Spec::Aliens + + File::Spec::Aliens was not in CORE (or so I think) + + $ corelist /IPC::Open/ + + IPC::Open2 was first released with perl 5 + + IPC::Open3 was first released with perl 5 + + $ corelist /MANIFEST/i + + ExtUtils::Manifest was first released with perl 5.001 + + $ corelist /Template/ + + /Template/ has no match in CORE (or so I think) + + $ corelist -v 5.8.8 B + + B 1.09_01 + + $ corelist -v 5.8.8 /^B::/ + + B::Asmdata 1.01 + B::Assembler 0.07 + B::Bblock 1.02_01 + B::Bytecode 1.01_01 + B::C 1.04_01 + B::CC 1.00_01 + B::Concise 0.66 + B::Debug 1.02_01 + B::Deparse 0.71 + B::Disassembler 1.05 + B::Lint 1.03 + B::O 1.00 + B::Showlex 1.02 + B::Stackobj 1.00 + B::Stash 1.00 + B::Terse 1.03_01 + B::Xref 1.01 + +=head1 COPYRIGHT + +Copyright (c) 2002-2007 by D.H. aka PodMaster + +Currently maintained by the perl 5 porters Eperl5-porters@perl.orgE. + +This program is distributed under the same terms as perl itself. +See http://perl.org/ or http://cpan.org/ for more info on that. + +=cut + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/cpan b/Master/tlpkg/tlperl.straw/bin/cpan new file mode 100755 index 00000000000..5e5609555f6 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/cpan @@ -0,0 +1,229 @@ +#!/usr/local/bin/perl +use strict; +use vars qw($VERSION); + +use App::Cpan; +$VERSION = '1.57'; + +my $rc = App::Cpan->run( @ARGV ); + +# will this work under Strawberry Perl? +exit( $rc || 0 ); + +=head1 NAME + +cpan - easily interact with CPAN from the command line + +=head1 SYNOPSIS + + # with arguments and no switches, installs specified modules + cpan module_name [ module_name ... ] + + # with switches, installs modules with extra behavior + cpan [-cfgimt] module_name [ module_name ... ] + + # with just the dot, install from the distribution in the + # current directory + cpan . + + # without arguments, starts CPAN.pm shell + cpan + + # dump the configuration + cpan -J + + # load a different configuration to install Module::Foo + cpan -j some/other/file Module::Foo + + # without arguments, but some switches + cpan [-ahrvACDlLO] + +=head1 DESCRIPTION + +This script provides a command interface (not a shell) to CPAN. At the +moment it uses CPAN.pm to do the work, but it is not a one-shot command +runner for CPAN.pm. + +=head2 Options + +=over 4 + +=item -a + +Creates a CPAN.pm autobundle with CPAN::Shell->autobundle. + +=item -A module [ module ... ] + +Shows the primary maintainers for the specified modules. + +=item -c module + +Runs a `make clean` in the specified module's directories. + +=item -C module [ module ... ] + +Show the F files for the specified modules + +=item -D module [ module ... ] + +Show the module details. This prints one line for each out-of-date module +(meaning, modules locally installed but have newer versions on CPAN). +Each line has three columns: module name, local version, and CPAN +version. + +=item -f + +Force the specified action, when it normally would have failed. Use this +to install a module even if its tests fail. When you use this option, +-i is not optional for installing a module when you need to force it: + + % cpan -f -i Module::Foo + +=item -F + +Turn off CPAN.pm's attempts to lock anything. You should be careful with +this since you might end up with multiple scripts trying to muck in the +same directory. This isn't so much of a concern if you're loading a special +config with C<-j>, and that config sets up its own work directories. + +=item -g module [ module ... ] + +Downloads to the current directory the latest distribution of the module. + +=item -G module [ module ... ] + +UNIMPLEMENTED + +Download to the current directory the latest distribution of the +modules, unpack each distribution, and create a git repository for each +distribution. + +If you want this feature, check out Yanick Champoux's C +distribution. + +=item -h + +Print a help message and exit. When you specify C<-h>, it ignores all +of the other options and arguments. + +=item -i + +Install the specified modules. + +=item -j Config.pm + +Load the file that has the CPAN configuration data. This should have the +same format as the standard F file, which defines +C<$CPAN::Config> as an anonymous hash. + +=item -J + +Dump the configuration in the same format that CPAN.pm uses. This is useful +for checking the configuration as well as using the dump as a starting point +for a new, custom configuration. + +=item -L author [ author ... ] + +List the modules by the specified authors. + +=item -m + +Make the specified modules. + +=item -O + +Show the out-of-date modules. + +=item -t + +Run a `make test` on the specified modules. + +=item -r + +Recompiles dynamically loaded modules with CPAN::Shell->recompile. + +=item -v + +Print the script version and CPAN.pm version then exit. + +=back + +=head2 Examples + + # print a help message + cpan -h + + # print the version numbers + cpan -v + + # create an autobundle + cpan -a + + # recompile modules + cpan -r + + # install modules ( sole -i is optional ) + cpan -i Netscape::Booksmarks Business::ISBN + + # force install modules ( must use -i ) + cpan -fi CGI::Minimal URI + +=head1 EXIT VALUES + +The script exits with zero if it thinks that everything worked, or a +positive number if it thinks that something failed. Note, however, that +in some cases it has to divine a failure by the output of things it does +not control. For now, the exit codes are vague: + + 1 An unknown error + + 2 The was an external problem + + 4 There was an internal problem with the script + + 8 A module failed to install + +=head1 TO DO + +* one shot configuration values from the command line + + + +=head1 BUGS + +* none noted + +=head1 SEE ALSO + +Most behaviour, including environment variables and configuration, +comes directly from CPAN.pm. + +=head1 SOURCE AVAILABILITY + +This code is in Github: + + git://github.com/briandfoy/cpan_script.git + +=head1 CREDITS + +Japheth Cleaver added the bits to allow a forced install (-f). + +Jim Brandt suggest and provided the initial implementation for the +up-to-date and Changes features. + +Adam Kennedy pointed out that exit() causes problems on Windows +where this script ends up with a .bat extension + +=head1 AUTHOR + +brian d foy, C<< >> + +=head1 COPYRIGHT + +Copyright (c) 2001-2009, brian d foy, All Rights Reserved. + +You may redistribute this under the same terms as Perl itself. + +=cut + +1; diff --git a/Master/tlpkg/tlperl.straw/bin/cpan.bat b/Master/tlpkg/tlperl.straw/bin/cpan.bat new file mode 100755 index 00000000000..b96d7678fd2 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/cpan.bat @@ -0,0 +1,245 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!/usr/local/bin/perl +#line 15 +use strict; +use vars qw($VERSION); + +use App::Cpan; +$VERSION = '1.57'; + +my $rc = App::Cpan->run( @ARGV ); + +# will this work under Strawberry Perl? +exit( $rc || 0 ); + +=head1 NAME + +cpan - easily interact with CPAN from the command line + +=head1 SYNOPSIS + + # with arguments and no switches, installs specified modules + cpan module_name [ module_name ... ] + + # with switches, installs modules with extra behavior + cpan [-cfgimt] module_name [ module_name ... ] + + # with just the dot, install from the distribution in the + # current directory + cpan . + + # without arguments, starts CPAN.pm shell + cpan + + # dump the configuration + cpan -J + + # load a different configuration to install Module::Foo + cpan -j some/other/file Module::Foo + + # without arguments, but some switches + cpan [-ahrvACDlLO] + +=head1 DESCRIPTION + +This script provides a command interface (not a shell) to CPAN. At the +moment it uses CPAN.pm to do the work, but it is not a one-shot command +runner for CPAN.pm. + +=head2 Options + +=over 4 + +=item -a + +Creates a CPAN.pm autobundle with CPAN::Shell->autobundle. + +=item -A module [ module ... ] + +Shows the primary maintainers for the specified modules. + +=item -c module + +Runs a `make clean` in the specified module's directories. + +=item -C module [ module ... ] + +Show the F files for the specified modules + +=item -D module [ module ... ] + +Show the module details. This prints one line for each out-of-date module +(meaning, modules locally installed but have newer versions on CPAN). +Each line has three columns: module name, local version, and CPAN +version. + +=item -f + +Force the specified action, when it normally would have failed. Use this +to install a module even if its tests fail. When you use this option, +-i is not optional for installing a module when you need to force it: + + % cpan -f -i Module::Foo + +=item -F + +Turn off CPAN.pm's attempts to lock anything. You should be careful with +this since you might end up with multiple scripts trying to muck in the +same directory. This isn't so much of a concern if you're loading a special +config with C<-j>, and that config sets up its own work directories. + +=item -g module [ module ... ] + +Downloads to the current directory the latest distribution of the module. + +=item -G module [ module ... ] + +UNIMPLEMENTED + +Download to the current directory the latest distribution of the +modules, unpack each distribution, and create a git repository for each +distribution. + +If you want this feature, check out Yanick Champoux's C +distribution. + +=item -h + +Print a help message and exit. When you specify C<-h>, it ignores all +of the other options and arguments. + +=item -i + +Install the specified modules. + +=item -j Config.pm + +Load the file that has the CPAN configuration data. This should have the +same format as the standard F file, which defines +C<$CPAN::Config> as an anonymous hash. + +=item -J + +Dump the configuration in the same format that CPAN.pm uses. This is useful +for checking the configuration as well as using the dump as a starting point +for a new, custom configuration. + +=item -L author [ author ... ] + +List the modules by the specified authors. + +=item -m + +Make the specified modules. + +=item -O + +Show the out-of-date modules. + +=item -t + +Run a `make test` on the specified modules. + +=item -r + +Recompiles dynamically loaded modules with CPAN::Shell->recompile. + +=item -v + +Print the script version and CPAN.pm version then exit. + +=back + +=head2 Examples + + # print a help message + cpan -h + + # print the version numbers + cpan -v + + # create an autobundle + cpan -a + + # recompile modules + cpan -r + + # install modules ( sole -i is optional ) + cpan -i Netscape::Booksmarks Business::ISBN + + # force install modules ( must use -i ) + cpan -fi CGI::Minimal URI + +=head1 EXIT VALUES + +The script exits with zero if it thinks that everything worked, or a +positive number if it thinks that something failed. Note, however, that +in some cases it has to divine a failure by the output of things it does +not control. For now, the exit codes are vague: + + 1 An unknown error + + 2 The was an external problem + + 4 There was an internal problem with the script + + 8 A module failed to install + +=head1 TO DO + +* one shot configuration values from the command line + + + +=head1 BUGS + +* none noted + +=head1 SEE ALSO + +Most behaviour, including environment variables and configuration, +comes directly from CPAN.pm. + +=head1 SOURCE AVAILABILITY + +This code is in Github: + + git://github.com/briandfoy/cpan_script.git + +=head1 CREDITS + +Japheth Cleaver added the bits to allow a forced install (-f). + +Jim Brandt suggest and provided the initial implementation for the +up-to-date and Changes features. + +Adam Kennedy pointed out that exit() causes problems on Windows +where this script ends up with a .bat extension + +=head1 AUTHOR + +brian d foy, C<< >> + +=head1 COPYRIGHT + +Copyright (c) 2001-2009, brian d foy, All Rights Reserved. + +You may redistribute this under the same terms as Perl itself. + +=cut + +1; + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/cpan2dist b/Master/tlpkg/tlperl.straw/bin/cpan2dist new file mode 100755 index 00000000000..5ba4556c529 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/cpan2dist @@ -0,0 +1,671 @@ +#!/usr/bin/perl -w +use strict; +use CPANPLUS::Backend; +use CPANPLUS::Dist; +use CPANPLUS::Internals::Constants; +use Data::Dumper; +use Getopt::Long; +use File::Spec; +use File::Temp qw|tempfile|; +use File::Basename; +use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext'; + +local $Data::Dumper::Indent = 1; + +use constant PREREQ_SKIP_CLASS => 'CPANPLUS::To::Dist::PREREQ_SKIP'; +use constant ALARM_CLASS => 'CPANPLUS::To::Dist::ALARM'; + +### print when you can +$|++; + +my $cb = CPANPLUS::Backend->new + or die loc("Could not create new CPANPLUS::Backend object"); +my $conf = $cb->configure_object; + +my %formats = map { $_ => $_ } CPANPLUS::Dist->dist_types; + +my $opts = {}; +GetOptions( $opts, + 'format=s', 'archive', + 'verbose!', 'force!', + 'skiptest!', 'keepsource!', + 'makefile!', 'buildprereq!', + 'help', 'flushcache', + 'ban=s@', 'banlist=s@', + 'ignore=s@', 'ignorelist=s@', + 'defaults', 'modulelist=s@', + 'logfile=s', 'timeout=s', + 'dist-opts=s%', 'set-config=s%', + 'default-banlist!', 'set-program=s%', + 'default-ignorelist!', 'edit-metafile!', + 'install!' + ); + +die usage() if exists $opts->{'help'}; + +### parse options +my $tarball = $opts->{'archive'} || 0; +my $keep = $opts->{'keepsource'} ? 1 : 0; +my $prereqbuild = exists $opts->{'buildprereq'} + ? $opts->{'buildprereq'} + : 0; +my $timeout = exists $opts->{'timeout'} + ? $opts->{'timeout'} + : 300; + +### use default answers? +$ENV{'PERL_MM_USE_DEFAULT'} = $opts->{'defaults'} ? 1 : 0; + +my $format; +### if provided, we go with the command line option, fall back to conf setting +{ $format = $opts->{'format'} || $conf->get_conf('dist_type'); + $conf->set_conf( dist_type => $format ); + + ### is this a valid format?? + die loc("Invalid format: " . ($format || "[NONE]") ) . usage() + unless $formats{$format}; + + ### any options to fix config entries + { my $set_conf = $opts->{'set-config'} || {}; + while( my($key,$val) = each %$set_conf ) { + $conf->set_conf( $key => $val ); + } + } + + ### any options to fix program entries + { my $set_prog = $opts->{'set-program'} || {}; + while( my($key,$val) = each %$set_prog ) { + $conf->set_program( $key => $val ); + } + } + + ### any other options passed + { my %map = ( verbose => 'verbose', + force => 'force', + skiptest => 'skiptest', + makefile => 'prefer_makefile' + ); + + ### set config options from arguments + while (my($key,$val) = each %map) { + my $bool = exists $opts->{$key} + ? $opts->{$key} + : $conf->get_conf($val); + $conf->set_conf( $val => $bool ); + } + } +} + +my @modules = @ARGV; +if( exists $opts->{'modulelist'} ) { + push @modules, map { parse_file( $_ ) } @{ $opts->{'modulelist'} }; +} + +die usage() unless @modules; + +### set up munge callback if requested +{ if( $opts->{'edit-metafile'} ) { + my $editor = $conf->get_program('editor'); + + if( $editor ) { + + ### register install callback ### + $cb->_register_callback( + name => 'munge_dist_metafile', + code => sub { + my $self = shift; + my $text = shift or return; + + my($fh,$file) = tempfile( UNLINK => 1 ); + + unless( print $fh $text ) { + warn "Could not print metafile information: $!"; + return; + } + + close $fh; + + system( $editor => $file ); + + my $cont = $cb->_get_file_contents( file => $file ); + + return $cont; + }, + ); + + } else { + warn "No editor configured. Can not edit metafiles!\n"; + } + } +} + +my $fh; +LOGFILE: { + if( my $file = $opts->{logfile} ) { + open $fh, ">$file" or ( + warn loc("Could not open '%1' for writing: %2", $file,$!), + last LOGFILE + ); + + warn "Logging to '$file'\n"; + + *STDERR = $fh; + *STDOUT = $fh; + } +} + +### reload indices if so desired +$cb->reload_indices() if $opts->{'flushcache'}; + +{ my @ban = exists $opts->{'ban'} + ? map { qr/$_/ } @{ $opts->{'ban'} } + : (); + + + if( exists $opts->{'banlist'} ) { + push @ban, map { parse_file( $_, 1 ) } @{ $opts->{'banlist'} }; + } + + push @ban, map { s/\s+//; $_ } + map { [split /\s*#\s*/]->[0] } + grep { /#/ } + map { split /\n/ } _default_ban_list() + if $opts->{'default-banlist'}; + + ### use our prereq install callback + $conf->set_conf( prereqs => PREREQ_ASK ); + + ### register install callback ### + $cb->_register_callback( + name => 'install_prerequisite', + code => \&__ask_about_install, + ); + + + ### check for ban patterns when handling prereqs + sub __ask_about_install { + + my $mod = shift or return; + my $prereq = shift or return; + + + ### die with an error object, so we can verify that + ### the die came from this location, and that it's an + ### 'acceptable' death + my $pat = ban_me( $prereq ); + die bless sub { loc("Module '%1' requires '%2' to be installed " . + "but found in your ban list (%3) -- skipping", + $mod->module, $prereq->module, $pat ) + }, PREREQ_SKIP_CLASS if $pat; + return 1; + } + + ### should we skip this module? + sub ban_me { + my $mod = shift; + + for my $pat ( @ban ) { + return $pat if $mod->module =~ /$pat/i; + } + return; + } +} + +### patterns to strip from prereq lists +{ my @ignore = exists $opts->{'ignore'} + ? map { qr/$_/ } @{ $opts->{'ignore'} } + : (); + + if( exists $opts->{'ignorelist'} ) { + push @ignore, map { parse_file( $_, 1 ) } @{ $opts->{'ignorelist'} }; + } + + push @ignore, map { s/\s+//; $_ } + map { [split /\s*#\s*/]->[0] } + grep { /#/ } + map { split /\n/ } _default_ignore_list() + if $opts->{'default-ignorelist'}; + + + ### register install callback ### + $cb->_register_callback( + name => 'filter_prereqs', + code => \&__filter_prereqs, + ); + + sub __filter_prereqs { + my $cb = shift; + my $href = shift; + + for my $name ( keys %$href ) { + my $obj = $cb->parse_module( module => $name ) or ( + warn "Cannot make a module object out of ". + "'$name' -- skipping\n", + next ); + + if( my $pat = ignore_me( $obj ) ) { + warn loc("'%1' found in your ignore list (%2) ". + "-- filtering it out\n", $name, $pat); + + delete $href->{ $name }; + } + } + + return $href; + } + + ### should we skip this module? + sub ignore_me { + my $mod = shift; + + for my $pat ( @ignore ) { + return $pat if $mod->module =~ /$pat/i; + return $pat if $mod->package_name =~ /$pat/i; + } + return; + } +} + + +my %done; +for my $name (@modules) { + + my $obj; + + ### is it a tarball? then we get it locally and transform it + ### and its dependencies into .debs + if( $tarball ) { + ### make sure we use an absolute path, so chdirs() dont + ### mess things up + $name = File::Spec->rel2abs( $name ); + + ### ENOTARBALL? + unless( -e $name ) { + warn loc("Archive '$name' does not exist"); + next; + } + + $obj = CPANPLUS::Module::Fake->new( + module => basename($name), + path => dirname($name), + package => basename($name), + ); + + ### if it's a traditional CPAN package, we can tidy + ### up the module name some + $obj->module( $obj->package_name ) if $obj->package_name; + + ### get the version from the package name + $obj->version( $obj->package_version || 0 ); + + ### set the location of the tarball + $obj->status->fetch($name); + + ### plain old cpan module? + } else { + + ### find the corresponding module object ### + $obj = $cb->parse_module( module => $name ) or ( + warn "Cannot make a module object out of ". + "'$name' -- skipping\n", + next ); + } + + ### you banned it? + if( my $pat = ban_me( $obj ) ) { + warn loc("'%1' found in your ban list (%2) -- skipping\n", + $obj->module, $pat ); + next; + } + + ### or just ignored it? + if( my $pat = ignore_me( $obj ) ) { + warn loc("'%1' found in your ignore list (%2) -- skipping\n", + $obj->module, $pat ); + next; + } + + + my $target = $opts->{'install'} ? 'install' : 'create'; + my $dist = eval { + local $SIG{ALRM} = sub { die bless {}, ALARM_CLASS } + if $timeout; + + alarm $timeout || 0; + + my $dist_opts = $opts->{'dist-opts'} || {}; + + my $rv = $obj->install( + prereq_target => $target, + target => $target, + keep_source => $keep, + prereq_build => $prereqbuild, + + ### any passed arbitrary options + %$dist_opts, + ); + + alarm 0; + + $rv; + }; + + ### set here again, in case the install dies + alarm 0; + + ### install failed due to a 'die' in our prereq skipper? + if( $@ and ref $@ and $@->isa( PREREQ_SKIP_CLASS ) ) { + warn loc("Dist creation of '%1' skipped: '%2'", + $obj->module, $@->() ); + next; + + } elsif ( $@ and ref $@ and $@->isa( ALARM_CLASS ) ) { + warn loc("\nDist creation of '%1' skipped, build time exceeded: ". + "%2 seconds\n", $obj->module, $timeout ); + next; + + ### died for some other reason? just report and skip + } elsif ( $@ ) { + warn loc("Dist creation of '%1' failed: '%2'", + $obj->module, $@ ); + next; + } + + ### we didn't get a dist object back? + unless ($dist and $obj->status->dist) { + warn loc("Unable to create '%1' dist of '%2'", $format, $obj->module); + next + } + + print "Created '$format' distribution for ", $obj->module, + " to:\n\t", $obj->status->dist->status->dist, "\n"; +} + + +sub parse_file { + my $file = shift or return; + my $qr = shift() ? 1 : 0; + + my $fh = OPEN_FILE->( $file ) or return; + + my @rv; + while( <$fh> ) { + chomp; + next if /^#/; # skip comments + next unless /\S/; # skip empty lines + s/^(\S+).*/$1/; # skip extra info + push @rv, $qr ? qr/$_/ : $_; # add pattern to the list + } + + return @rv; +} + +=head1 NAME + +cpan2dist - The CPANPLUS distribution creator + +=head1 DESCRIPTION + +This script will create distributions of C modules of the format +you specify, including its prerequisites. These packages can then be +installed using the corresponding package manager for the format. + +Note, you can also do this interactively from the default shell, +C. See the C documentation, +as well as the documentation of your format of choice for any format +specific documentation. + +=head1 USAGE + +=cut + +sub usage { + my $me = basename($0); + my $formats = join "\n", map { "\t\t$_" } sort keys %formats; + + my $usage = << '=cut'; +=pod + + Usage: cpan2dist [--format FMT] [OPTS] Mod::Name [Mod::Name, ...] + cpan2dist [--format FMT] [OPTS] --modulelist /tmp/mods.list + cpan2dist [--format FMT] [OPTS] --archive /tmp/dist [/tmp/dist2] + + Will create a distribution of type FMT of the modules + specified on the command line, and all their prerequisites. + + Can also create a distribution of type FMT from a local + archive and all of its prerequisites. + +=cut + + $usage .= qq[ + Possible formats are: +$formats + + You can install more formats from CPAN! + \n]; + + $usage .= << '=cut'; +=pod + +Options: + + ### take no argument: + --help Show this help message + --install Install this package (and any prerequisites you built) + after building it. + --skiptest Skip tests. Can be negated using --noskiptest + --force Force operation. Can be negated using --noforce + --verbose Be verbose. Can be negated using --noverbose + --keepsource Keep sources after building distribution. Can be + negated by --nokeepsource. May not be supported + by all formats + --makefile Prefer Makefile.PL over Build.PL. Can be negated + using --nomakefile. Defaults to your config setting + --buildprereq Build packages of any prerequisites, even if they are + already uptodate on the local system. Can be negated + using --nobuildprereq. Defaults to false. + --archive Indicate that all modules listed are actually archives + --flushcache Update CPANPLUS' cache before commencing any operation + --defaults Instruct ExtUtils::MakeMaker and Module::Build to use + default answers during 'perl Makefile.PL' or 'perl + Build.PL' calls where possible + --edit-metafile Edit the distributions metafile(s) before the distribution + is built. Requires a configured editor. + + ### take argument: + --format Installer format to use (defaults to config setting) + --ban Patterns of module names to skip during installation, + case-insensitive (affects prerequisites too) + May be given multiple times + --banlist File containing patterns that could be given to --ban + Are appended to the ban list built up by --ban + May be given multiple times. + --ignore Patterns of modules to exclude from prereq list. Useful + for when a prereq listed by a CPAN module is resolved + in another way than from its corresponding CPAN package + (Match is done on both module name, and package name of + the package the module is in, case-insensitive) + --ignorelist File containing patterns that may be given to --ignore. + Are appended to the ban list built up by --ignore. + May be given multiple times. + --modulelist File containing a list of modules that should be built. + Are appended to the list of command line modules. + May be given multiple times. + --logfile File to log all output to. By default, all output goes + to the console. + --timeout The allowed time for buliding a distribution before + aborting. This is useful to terminate any build that + hang or happen to be interactive despite being told not + to be. Defaults to 300 seconds. To turn off, you can + set it to 0. + --set-config Change any options as specified in your config for this + invocation only. See CPANPLUS::Config for a list of + supported options. + --set-program Change any programs as specified in your config for this + invocation only. See CPANPLUS::Config for a list of + supported programs. + --dist-opts Arbitrary options passed along to the chosen installer + format's prepare()/create() routine. Please see the + documentation of the installer of your choice for + options it accepts. + + ### builtin lists + --default-banlist Use our builtin banlist. Works just like --ban + and --banlist, but with pre-set lists. See the + "Builtin Lists" section for details. + --default-ignorelist Use our builtin ignorelist. Works just like + --ignore and --ignorelist but with pre-set lists. + See the "Builtin Lists" section for details. + +Examples: + + ### build a debian package of DBI and its prerequisites, + ### don't bother running tests + cpan2dist --format CPANPLUS::Dist::Deb --buildprereq --skiptest DBI + + ### build a debian package of DBI and its prerequisites and install them + cpan2dist --format CPANPLUS::Dist::Deb --buildprereq --install DBI + + ### Build a package, whose format is determined by your config, of + ### the local tarball, reloading cpanplus' indices first and using + ### the tarballs Makefile.PL if it has one. + cpan2dist --makefile --flushcache --archive /path/to/Cwd-1.0.tgz + + ### build a package from Net::FTP, but dont build any packages or + ### dependencies whose name match 'Foo', 'Bar' or any of the + ### patterns mentioned in /tmp/ban + cpan2dist --ban Foo --ban Bar --banlist /tmp/ban Net::FTP + + ### build a package from Net::FTP, but ignore its listed dependency + ### on IO::Socket, as it's shipped per default with the OS we're on + cpan2dist --ignore IO::Socket Net::FTP + + ### building all modules listed, plus their prerequisites + cpan2dist --ignorelist /tmp/modules.ignore --banlist /tmp/modules.ban + --modulelist /tmp/modules.list --buildprereq --flushcache + --makefile --defaults + + ### pass arbitrary options to the format's prepare()/create() routine + cpan2dist --dist-opts deb_version=3 --dist-opts prefix=corp + +=cut + + $usage .= qq[ +Builtin Lists: + + Ignore list:] . _default_ignore_list() . qq[ + Ban list:] . _default_ban_list(); + + ### strip the pod directives + $usage =~ s/=pod\n//g; + + return $usage; +} + +=pod + +=head1 Built-In Filter Lists + +Some modules you'd rather not package. Some because they +are part of core-perl and you dont want a new package. +Some because they won't build on your system. Some because +your package manager of choice already packages them for you. + +There may be a myriad of reasons. You can use the C<--ignore> +and C<--ban> options for this, but we provide some built-in +lists that catch common cases. You can use these built-in lists +if you like, or supply your own if need be. + +=head2 Built-In Ignore List + +=pod + +You can use this list of regexes to ignore modules matching +to be listed as prerequisites of a package. Particulaly useful +if they are bundled with core-perl anyway and they have known +issues building. + +Toggle it by supplying the C<--default-ignorelist> option. + +=cut + +sub _default_ignore_list { + + my $list = << '=cut'; +=pod + + ^IO$ # Provided with core anyway + ^Cwd$ # Provided with core anyway + ^File::Spec # Provided with core anyway + ^Config$ # Perl's own config, not shipped separately + ^ExtUtils::MakeMaker$ # Shipped with perl, recent versions + # have bug 14721 (see rt.cpan.org) + ^ExtUtils::Install$ # Part of of EU::MM, same reason + +=cut + + return $list; +} + +=head2 Built-In Ban list + +You can use this list of regexes to disable building of these +modules altogether. + +Toggle it by supplying the C<--default-banlist> option. + +=cut + +sub _default_ban_list { + + my $list = << '=cut'; +=pod + + ^GD$ # Needs c libaries + ^Berk.*DB # DB packages require specific options & linking + ^DBD:: # DBD drives require database files/headers + ^XML:: # XML modules usually require expat libraries + Apache # These usually require apache libraries + SSL # These usually require SSL certificates & libs + Image::Magick # Needs ImageMagick C libraries + Mail::ClamAV # Needs ClamAV C Libraries + ^Verilog # Needs Verilog C Libraries + ^Authen::PAM$ # Needs PAM C libraries & Headers + +=cut + + return $list; +} + +__END__ + +=head1 SEE ALSO + +L, L, L, +C + +=head1 BUG REPORTS + +Please report bugs or other issues to Ebug-cpanplus@rt.cpan.org. + +=head1 AUTHOR + +This module by Jos Boumans Ekane@cpan.orgE. + +=head1 COPYRIGHT + +The CPAN++ interface (of which this module is a part of) is copyright (c) +2001 - 2007, Jos Boumans Ekane@cpan.orgE. All rights reserved. + +This library is free software; you may redistribute and/or modify it +under the same terms as Perl itself. + +=cut + +# Local variables: +# c-indentation-style: bsd +# c-basic-offset: 4 +# indent-tabs-mode: nil +# End: +# vim: expandtab shiftwidth=4: diff --git a/Master/tlpkg/tlperl.straw/bin/cpan2dist.bat b/Master/tlpkg/tlperl.straw/bin/cpan2dist.bat new file mode 100755 index 00000000000..aa670d75d28 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/cpan2dist.bat @@ -0,0 +1,687 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!/usr/bin/perl -w +#line 15 +use strict; +use CPANPLUS::Backend; +use CPANPLUS::Dist; +use CPANPLUS::Internals::Constants; +use Data::Dumper; +use Getopt::Long; +use File::Spec; +use File::Temp qw|tempfile|; +use File::Basename; +use Locale::Maketext::Simple Class => 'CPANPLUS', Style => 'gettext'; + +local $Data::Dumper::Indent = 1; + +use constant PREREQ_SKIP_CLASS => 'CPANPLUS::To::Dist::PREREQ_SKIP'; +use constant ALARM_CLASS => 'CPANPLUS::To::Dist::ALARM'; + +### print when you can +$|++; + +my $cb = CPANPLUS::Backend->new + or die loc("Could not create new CPANPLUS::Backend object"); +my $conf = $cb->configure_object; + +my %formats = map { $_ => $_ } CPANPLUS::Dist->dist_types; + +my $opts = {}; +GetOptions( $opts, + 'format=s', 'archive', + 'verbose!', 'force!', + 'skiptest!', 'keepsource!', + 'makefile!', 'buildprereq!', + 'help', 'flushcache', + 'ban=s@', 'banlist=s@', + 'ignore=s@', 'ignorelist=s@', + 'defaults', 'modulelist=s@', + 'logfile=s', 'timeout=s', + 'dist-opts=s%', 'set-config=s%', + 'default-banlist!', 'set-program=s%', + 'default-ignorelist!', 'edit-metafile!', + 'install!' + ); + +die usage() if exists $opts->{'help'}; + +### parse options +my $tarball = $opts->{'archive'} || 0; +my $keep = $opts->{'keepsource'} ? 1 : 0; +my $prereqbuild = exists $opts->{'buildprereq'} + ? $opts->{'buildprereq'} + : 0; +my $timeout = exists $opts->{'timeout'} + ? $opts->{'timeout'} + : 300; + +### use default answers? +$ENV{'PERL_MM_USE_DEFAULT'} = $opts->{'defaults'} ? 1 : 0; + +my $format; +### if provided, we go with the command line option, fall back to conf setting +{ $format = $opts->{'format'} || $conf->get_conf('dist_type'); + $conf->set_conf( dist_type => $format ); + + ### is this a valid format?? + die loc("Invalid format: " . ($format || "[NONE]") ) . usage() + unless $formats{$format}; + + ### any options to fix config entries + { my $set_conf = $opts->{'set-config'} || {}; + while( my($key,$val) = each %$set_conf ) { + $conf->set_conf( $key => $val ); + } + } + + ### any options to fix program entries + { my $set_prog = $opts->{'set-program'} || {}; + while( my($key,$val) = each %$set_prog ) { + $conf->set_program( $key => $val ); + } + } + + ### any other options passed + { my %map = ( verbose => 'verbose', + force => 'force', + skiptest => 'skiptest', + makefile => 'prefer_makefile' + ); + + ### set config options from arguments + while (my($key,$val) = each %map) { + my $bool = exists $opts->{$key} + ? $opts->{$key} + : $conf->get_conf($val); + $conf->set_conf( $val => $bool ); + } + } +} + +my @modules = @ARGV; +if( exists $opts->{'modulelist'} ) { + push @modules, map { parse_file( $_ ) } @{ $opts->{'modulelist'} }; +} + +die usage() unless @modules; + +### set up munge callback if requested +{ if( $opts->{'edit-metafile'} ) { + my $editor = $conf->get_program('editor'); + + if( $editor ) { + + ### register install callback ### + $cb->_register_callback( + name => 'munge_dist_metafile', + code => sub { + my $self = shift; + my $text = shift or return; + + my($fh,$file) = tempfile( UNLINK => 1 ); + + unless( print $fh $text ) { + warn "Could not print metafile information: $!"; + return; + } + + close $fh; + + system( $editor => $file ); + + my $cont = $cb->_get_file_contents( file => $file ); + + return $cont; + }, + ); + + } else { + warn "No editor configured. Can not edit metafiles!\n"; + } + } +} + +my $fh; +LOGFILE: { + if( my $file = $opts->{logfile} ) { + open $fh, ">$file" or ( + warn loc("Could not open '%1' for writing: %2", $file,$!), + last LOGFILE + ); + + warn "Logging to '$file'\n"; + + *STDERR = $fh; + *STDOUT = $fh; + } +} + +### reload indices if so desired +$cb->reload_indices() if $opts->{'flushcache'}; + +{ my @ban = exists $opts->{'ban'} + ? map { qr/$_/ } @{ $opts->{'ban'} } + : (); + + + if( exists $opts->{'banlist'} ) { + push @ban, map { parse_file( $_, 1 ) } @{ $opts->{'banlist'} }; + } + + push @ban, map { s/\s+//; $_ } + map { [split /\s*#\s*/]->[0] } + grep { /#/ } + map { split /\n/ } _default_ban_list() + if $opts->{'default-banlist'}; + + ### use our prereq install callback + $conf->set_conf( prereqs => PREREQ_ASK ); + + ### register install callback ### + $cb->_register_callback( + name => 'install_prerequisite', + code => \&__ask_about_install, + ); + + + ### check for ban patterns when handling prereqs + sub __ask_about_install { + + my $mod = shift or return; + my $prereq = shift or return; + + + ### die with an error object, so we can verify that + ### the die came from this location, and that it's an + ### 'acceptable' death + my $pat = ban_me( $prereq ); + die bless sub { loc("Module '%1' requires '%2' to be installed " . + "but found in your ban list (%3) -- skipping", + $mod->module, $prereq->module, $pat ) + }, PREREQ_SKIP_CLASS if $pat; + return 1; + } + + ### should we skip this module? + sub ban_me { + my $mod = shift; + + for my $pat ( @ban ) { + return $pat if $mod->module =~ /$pat/i; + } + return; + } +} + +### patterns to strip from prereq lists +{ my @ignore = exists $opts->{'ignore'} + ? map { qr/$_/ } @{ $opts->{'ignore'} } + : (); + + if( exists $opts->{'ignorelist'} ) { + push @ignore, map { parse_file( $_, 1 ) } @{ $opts->{'ignorelist'} }; + } + + push @ignore, map { s/\s+//; $_ } + map { [split /\s*#\s*/]->[0] } + grep { /#/ } + map { split /\n/ } _default_ignore_list() + if $opts->{'default-ignorelist'}; + + + ### register install callback ### + $cb->_register_callback( + name => 'filter_prereqs', + code => \&__filter_prereqs, + ); + + sub __filter_prereqs { + my $cb = shift; + my $href = shift; + + for my $name ( keys %$href ) { + my $obj = $cb->parse_module( module => $name ) or ( + warn "Cannot make a module object out of ". + "'$name' -- skipping\n", + next ); + + if( my $pat = ignore_me( $obj ) ) { + warn loc("'%1' found in your ignore list (%2) ". + "-- filtering it out\n", $name, $pat); + + delete $href->{ $name }; + } + } + + return $href; + } + + ### should we skip this module? + sub ignore_me { + my $mod = shift; + + for my $pat ( @ignore ) { + return $pat if $mod->module =~ /$pat/i; + return $pat if $mod->package_name =~ /$pat/i; + } + return; + } +} + + +my %done; +for my $name (@modules) { + + my $obj; + + ### is it a tarball? then we get it locally and transform it + ### and its dependencies into .debs + if( $tarball ) { + ### make sure we use an absolute path, so chdirs() dont + ### mess things up + $name = File::Spec->rel2abs( $name ); + + ### ENOTARBALL? + unless( -e $name ) { + warn loc("Archive '$name' does not exist"); + next; + } + + $obj = CPANPLUS::Module::Fake->new( + module => basename($name), + path => dirname($name), + package => basename($name), + ); + + ### if it's a traditional CPAN package, we can tidy + ### up the module name some + $obj->module( $obj->package_name ) if $obj->package_name; + + ### get the version from the package name + $obj->version( $obj->package_version || 0 ); + + ### set the location of the tarball + $obj->status->fetch($name); + + ### plain old cpan module? + } else { + + ### find the corresponding module object ### + $obj = $cb->parse_module( module => $name ) or ( + warn "Cannot make a module object out of ". + "'$name' -- skipping\n", + next ); + } + + ### you banned it? + if( my $pat = ban_me( $obj ) ) { + warn loc("'%1' found in your ban list (%2) -- skipping\n", + $obj->module, $pat ); + next; + } + + ### or just ignored it? + if( my $pat = ignore_me( $obj ) ) { + warn loc("'%1' found in your ignore list (%2) -- skipping\n", + $obj->module, $pat ); + next; + } + + + my $target = $opts->{'install'} ? 'install' : 'create'; + my $dist = eval { + local $SIG{ALRM} = sub { die bless {}, ALARM_CLASS } + if $timeout; + + alarm $timeout || 0; + + my $dist_opts = $opts->{'dist-opts'} || {}; + + my $rv = $obj->install( + prereq_target => $target, + target => $target, + keep_source => $keep, + prereq_build => $prereqbuild, + + ### any passed arbitrary options + %$dist_opts, + ); + + alarm 0; + + $rv; + }; + + ### set here again, in case the install dies + alarm 0; + + ### install failed due to a 'die' in our prereq skipper? + if( $@ and ref $@ and $@->isa( PREREQ_SKIP_CLASS ) ) { + warn loc("Dist creation of '%1' skipped: '%2'", + $obj->module, $@->() ); + next; + + } elsif ( $@ and ref $@ and $@->isa( ALARM_CLASS ) ) { + warn loc("\nDist creation of '%1' skipped, build time exceeded: ". + "%2 seconds\n", $obj->module, $timeout ); + next; + + ### died for some other reason? just report and skip + } elsif ( $@ ) { + warn loc("Dist creation of '%1' failed: '%2'", + $obj->module, $@ ); + next; + } + + ### we didn't get a dist object back? + unless ($dist and $obj->status->dist) { + warn loc("Unable to create '%1' dist of '%2'", $format, $obj->module); + next + } + + print "Created '$format' distribution for ", $obj->module, + " to:\n\t", $obj->status->dist->status->dist, "\n"; +} + + +sub parse_file { + my $file = shift or return; + my $qr = shift() ? 1 : 0; + + my $fh = OPEN_FILE->( $file ) or return; + + my @rv; + while( <$fh> ) { + chomp; + next if /^#/; # skip comments + next unless /\S/; # skip empty lines + s/^(\S+).*/$1/; # skip extra info + push @rv, $qr ? qr/$_/ : $_; # add pattern to the list + } + + return @rv; +} + +=head1 NAME + +cpan2dist - The CPANPLUS distribution creator + +=head1 DESCRIPTION + +This script will create distributions of C modules of the format +you specify, including its prerequisites. These packages can then be +installed using the corresponding package manager for the format. + +Note, you can also do this interactively from the default shell, +C. See the C documentation, +as well as the documentation of your format of choice for any format +specific documentation. + +=head1 USAGE + +=cut + +sub usage { + my $me = basename($0); + my $formats = join "\n", map { "\t\t$_" } sort keys %formats; + + my $usage = << '=cut'; +=pod + + Usage: cpan2dist [--format FMT] [OPTS] Mod::Name [Mod::Name, ...] + cpan2dist [--format FMT] [OPTS] --modulelist /tmp/mods.list + cpan2dist [--format FMT] [OPTS] --archive /tmp/dist [/tmp/dist2] + + Will create a distribution of type FMT of the modules + specified on the command line, and all their prerequisites. + + Can also create a distribution of type FMT from a local + archive and all of its prerequisites. + +=cut + + $usage .= qq[ + Possible formats are: +$formats + + You can install more formats from CPAN! + \n]; + + $usage .= << '=cut'; +=pod + +Options: + + ### take no argument: + --help Show this help message + --install Install this package (and any prerequisites you built) + after building it. + --skiptest Skip tests. Can be negated using --noskiptest + --force Force operation. Can be negated using --noforce + --verbose Be verbose. Can be negated using --noverbose + --keepsource Keep sources after building distribution. Can be + negated by --nokeepsource. May not be supported + by all formats + --makefile Prefer Makefile.PL over Build.PL. Can be negated + using --nomakefile. Defaults to your config setting + --buildprereq Build packages of any prerequisites, even if they are + already uptodate on the local system. Can be negated + using --nobuildprereq. Defaults to false. + --archive Indicate that all modules listed are actually archives + --flushcache Update CPANPLUS' cache before commencing any operation + --defaults Instruct ExtUtils::MakeMaker and Module::Build to use + default answers during 'perl Makefile.PL' or 'perl + Build.PL' calls where possible + --edit-metafile Edit the distributions metafile(s) before the distribution + is built. Requires a configured editor. + + ### take argument: + --format Installer format to use (defaults to config setting) + --ban Patterns of module names to skip during installation, + case-insensitive (affects prerequisites too) + May be given multiple times + --banlist File containing patterns that could be given to --ban + Are appended to the ban list built up by --ban + May be given multiple times. + --ignore Patterns of modules to exclude from prereq list. Useful + for when a prereq listed by a CPAN module is resolved + in another way than from its corresponding CPAN package + (Match is done on both module name, and package name of + the package the module is in, case-insensitive) + --ignorelist File containing patterns that may be given to --ignore. + Are appended to the ban list built up by --ignore. + May be given multiple times. + --modulelist File containing a list of modules that should be built. + Are appended to the list of command line modules. + May be given multiple times. + --logfile File to log all output to. By default, all output goes + to the console. + --timeout The allowed time for buliding a distribution before + aborting. This is useful to terminate any build that + hang or happen to be interactive despite being told not + to be. Defaults to 300 seconds. To turn off, you can + set it to 0. + --set-config Change any options as specified in your config for this + invocation only. See CPANPLUS::Config for a list of + supported options. + --set-program Change any programs as specified in your config for this + invocation only. See CPANPLUS::Config for a list of + supported programs. + --dist-opts Arbitrary options passed along to the chosen installer + format's prepare()/create() routine. Please see the + documentation of the installer of your choice for + options it accepts. + + ### builtin lists + --default-banlist Use our builtin banlist. Works just like --ban + and --banlist, but with pre-set lists. See the + "Builtin Lists" section for details. + --default-ignorelist Use our builtin ignorelist. Works just like + --ignore and --ignorelist but with pre-set lists. + See the "Builtin Lists" section for details. + +Examples: + + ### build a debian package of DBI and its prerequisites, + ### don't bother running tests + cpan2dist --format CPANPLUS::Dist::Deb --buildprereq --skiptest DBI + + ### build a debian package of DBI and its prerequisites and install them + cpan2dist --format CPANPLUS::Dist::Deb --buildprereq --install DBI + + ### Build a package, whose format is determined by your config, of + ### the local tarball, reloading cpanplus' indices first and using + ### the tarballs Makefile.PL if it has one. + cpan2dist --makefile --flushcache --archive /path/to/Cwd-1.0.tgz + + ### build a package from Net::FTP, but dont build any packages or + ### dependencies whose name match 'Foo', 'Bar' or any of the + ### patterns mentioned in /tmp/ban + cpan2dist --ban Foo --ban Bar --banlist /tmp/ban Net::FTP + + ### build a package from Net::FTP, but ignore its listed dependency + ### on IO::Socket, as it's shipped per default with the OS we're on + cpan2dist --ignore IO::Socket Net::FTP + + ### building all modules listed, plus their prerequisites + cpan2dist --ignorelist /tmp/modules.ignore --banlist /tmp/modules.ban + --modulelist /tmp/modules.list --buildprereq --flushcache + --makefile --defaults + + ### pass arbitrary options to the format's prepare()/create() routine + cpan2dist --dist-opts deb_version=3 --dist-opts prefix=corp + +=cut + + $usage .= qq[ +Builtin Lists: + + Ignore list:] . _default_ignore_list() . qq[ + Ban list:] . _default_ban_list(); + + ### strip the pod directives + $usage =~ s/=pod\n//g; + + return $usage; +} + +=pod + +=head1 Built-In Filter Lists + +Some modules you'd rather not package. Some because they +are part of core-perl and you dont want a new package. +Some because they won't build on your system. Some because +your package manager of choice already packages them for you. + +There may be a myriad of reasons. You can use the C<--ignore> +and C<--ban> options for this, but we provide some built-in +lists that catch common cases. You can use these built-in lists +if you like, or supply your own if need be. + +=head2 Built-In Ignore List + +=pod + +You can use this list of regexes to ignore modules matching +to be listed as prerequisites of a package. Particulaly useful +if they are bundled with core-perl anyway and they have known +issues building. + +Toggle it by supplying the C<--default-ignorelist> option. + +=cut + +sub _default_ignore_list { + + my $list = << '=cut'; +=pod + + ^IO$ # Provided with core anyway + ^Cwd$ # Provided with core anyway + ^File::Spec # Provided with core anyway + ^Config$ # Perl's own config, not shipped separately + ^ExtUtils::MakeMaker$ # Shipped with perl, recent versions + # have bug 14721 (see rt.cpan.org) + ^ExtUtils::Install$ # Part of of EU::MM, same reason + +=cut + + return $list; +} + +=head2 Built-In Ban list + +You can use this list of regexes to disable building of these +modules altogether. + +Toggle it by supplying the C<--default-banlist> option. + +=cut + +sub _default_ban_list { + + my $list = << '=cut'; +=pod + + ^GD$ # Needs c libaries + ^Berk.*DB # DB packages require specific options & linking + ^DBD:: # DBD drives require database files/headers + ^XML:: # XML modules usually require expat libraries + Apache # These usually require apache libraries + SSL # These usually require SSL certificates & libs + Image::Magick # Needs ImageMagick C libraries + Mail::ClamAV # Needs ClamAV C Libraries + ^Verilog # Needs Verilog C Libraries + ^Authen::PAM$ # Needs PAM C libraries & Headers + +=cut + + return $list; +} + +__END__ + +=head1 SEE ALSO + +L, L, L, +C + +=head1 BUG REPORTS + +Please report bugs or other issues to Ebug-cpanplus@rt.cpan.org. + +=head1 AUTHOR + +This module by Jos Boumans Ekane@cpan.orgE. + +=head1 COPYRIGHT + +The CPAN++ interface (of which this module is a part of) is copyright (c) +2001 - 2007, Jos Boumans Ekane@cpan.orgE. All rights reserved. + +This library is free software; you may redistribute and/or modify it +under the same terms as Perl itself. + +=cut + +# Local variables: +# c-indentation-style: bsd +# c-basic-offset: 4 +# indent-tabs-mode: nil +# End: +# vim: expandtab shiftwidth=4: + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/cpandb b/Master/tlpkg/tlperl.straw/bin/cpandb new file mode 100755 index 00000000000..46c07b939a1 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/cpandb @@ -0,0 +1,272 @@ +#!C:\strawberry\perl\bin\perl.exe +use strict; +use warnings; +use CPAN::SQLite; +use CPAN::SQLite::Util qw(%chaps); +use Getopt::Long; +my ($CPAN, $setup, $help, $reindex, $index, $query, + $db_name, $db_dir, $module, $dist, $cpanid, $update); + +my $rc = GetOptions('CPAN=s' => \$CPAN, + 'db_name=s' => \$db_name, + 'db_dir=s' => \$db_dir, + 'setup' => \$setup, + 'update' => \$update, + 'help' => \$help, + 'module=s' => \$module, + 'dist=s' => \$dist, + 'cpanid=s' => \$cpanid, + 'reindex=s' => \$reindex); + +$query = ($module or $dist or $cpanid); +$index = ($update or $reindex or $setup); + +if ($help or not $rc or not ($index or $query)) { + print <<"END"; + +Setup, maintain, and search the CPAN::SQLite database +Usage: + $^X $0 --setup + $^X $0 --update + $^X $0 --reindex dist_name + + $^X $0 --module Mod::Name + $^X $0 --dist Distname + $^X $0 --cpanid CPANID + + $^X $0 --help +END + exit(1); +} + +if (defined $setup and defined $reindex) { + die "Must reindex on an exisiting database"; +} + +if ($index) { + my $obj = CPAN::SQLite->new(CPAN => $CPAN, + setup => $setup, + db_name => $db_name, + db_dir => $db_dir, + reindex => $reindex, + ); + $obj->index(); +} +else { + + my $max_results = 100; + my $obj = CPAN::SQLite->new(CPAN => $CPAN, + db_name => $db_name, + db_dir => $db_dir, + max_results => $max_results); + my $results; + + RESULTS : { + $module and do { + $obj->query(mode => 'module', name => $module); + $results = $obj->{results}; + if (not $results) { + print qq{\nNo module by name of "$module" was found.\n}; + print qq{Error: $obj->{error}\n} if $obj->{error}; + } + else { + my $abs = $results->{mod_abs} || ''; + my $dslip = ''; + if (my $dslip_info = $results->{dslip_info}) { + foreach my $entry (@$dslip_info) { + $dslip .= " $entry->{desc}: $entry->{what}\n"; + } + } + my $chapter_desc = $results->{chapter_desc} || ''; + print << "EOI"; + +Module: $results->{mod_name} +Abstract: $abs +Version: $results->{mod_vers} +Chapter: $chapter_desc +Distribution: $results->{dist_name} +CPAN author: $results->{cpanid} +CPAN file: $results->{dist_file} +Download: $results->{download} +dslip info: +$dslip +EOI + } + last RESULTS; + }; + $dist and do { + $obj->query(mode => 'dist', name => $dist); + $results = $obj->{results}; + if (not $results) { + print qq{\nNo distribution by name of "$dist" was found.\n}; + print qq{Error: $obj->{error}\n} if $obj->{error}; + } + else { + my $abs = $results->{dist_abs} || ''; + my $dslip = ''; + if (my $dslip_info = $results->{dslip_info}) { + foreach my $entry (@$dslip_info) { + $dslip .= " $entry->{desc}: $entry->{what}\n"; + } + } + print << "EOI"; + +Distribution: $results->{dist_name} +Abstract: $abs +Version: $results->{dist_vers} +CPAN author: $results->{cpanid} +CPAN file: $results->{dist_file} +Download: $results->{download} +dslip info: +$dslip +EOI + } + my $mods = $results->{mods}; + if ($mods and (ref($mods) eq 'ARRAY')) { + print qq{\nProvided modules:\n}; + foreach my $item(@$mods) { + my $abs = $item->{mod_abs} || ''; + print qq{ $item->{mod_name}: $abs\n}; + } + } + last RESULTS; + }; + $cpanid and do { + $obj->query(mode => 'author', name => $cpanid); + $results = $obj->{results}; + if (not $results) { + print qq{\nNo cpanid by name of "$cpanid" was found.\n}; + print qq{Error: $obj->{error}\n} if $obj->{error}; + } + else { + print << "EOI"; + +CPANID: $results->{cpanid} +Full Name: $results->{fullname} +email: $results->{email} +EOI + } + my $dists = $results->{dists}; + if ($dists and (ref($dists) eq 'ARRAY')) { + print qq{\nAvailable distributions:\n}; + foreach my $item(@$dists) { + my $abs = $item->{dist_abs} || ''; + print qq{ $item->{dist_file}: $abs\n}; + } + } + last RESULTS; + }; + } +} + +__END__ + +=head1 NAME + +cpandb - interface to C + +=head1 DESCRIPTION + +This script is an interface to the routines of +L for setting up, maintaining and +searching a C database +of CPAN. Available options can be grouped into +three categories. + +=head2 Common options + +These are options which are common to both setting up +and maintaining the database or performing queries on it. +These are + +=over 3 + +=item * C<--CPAN '/path/to/CPAN'> + +This specifies the path to where the index files are +to be stored. This could be a local CPAN mirror, +defined here by the presence of a F file beneath +this directory, or a local directory in which to store +these files from a remote CPAN mirror. In the latter case, +the index files are fetched from a remote CPAN mirror, +using the same list that C uses, if this is +configured, and are updated if they are more than one +day old. + +If the C option is not given, it will default +to C of L, if this is configured, +with the sources being found under C. +A fatal error results if such a directory isn't found. +Updates to these index files are assumed here to be +handled by C. + +=item * C<--db_name 'cpan-sqlite'> + +This is the name of the database that C +will use. If not given, this defaults to C. + +=item * C<--db_dir '/path/to/db/dir'> + +This specifies the path to where the database file is +found. If not given, it defaults to the +C directory of C, if present, or to +the directory in which the script was invoked. + +=back + +=head2 Indexing options + +These are options which are used for setting up and +maintaining the database. These include + +=over 3 + +=item * C<--setup> + +This specifies that the database is to be created and +populated from the CPAN indices; any exisiting database +will be overwritten. + +=item * C<--update> + +This is used to update an exisiting database, +which must have first been created with the C +option. + +=item * C<--reindex 'dist_name'> + +This specifies that the CPAN distribution C +is to be reindexed. + +=back + +=head2 Querying options + +These options are used to query the database. Available +options are + +=over 3 + +=item * C<--module Mod::Name> + +This provides information on the specified module name. + +=item * C<--dist Dist-Name> + +This provides information on the specified distribution name. + +=item * C<--cpanid CPANID> + +This provides information on the specified CPAN author id + +=back + +All search terms are assumed to be exact matches in a +case-insensitive manner. + +=head1 SEE ALSO + +L. + +=cut + diff --git a/Master/tlpkg/tlperl.straw/bin/cpandb.bat b/Master/tlpkg/tlperl.straw/bin/cpandb.bat new file mode 100755 index 00000000000..0eeeb422909 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/cpandb.bat @@ -0,0 +1,288 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!C:\strawberry\perl\bin\perl.exe +#line 15 +use strict; +use warnings; +use CPAN::SQLite; +use CPAN::SQLite::Util qw(%chaps); +use Getopt::Long; +my ($CPAN, $setup, $help, $reindex, $index, $query, + $db_name, $db_dir, $module, $dist, $cpanid, $update); + +my $rc = GetOptions('CPAN=s' => \$CPAN, + 'db_name=s' => \$db_name, + 'db_dir=s' => \$db_dir, + 'setup' => \$setup, + 'update' => \$update, + 'help' => \$help, + 'module=s' => \$module, + 'dist=s' => \$dist, + 'cpanid=s' => \$cpanid, + 'reindex=s' => \$reindex); + +$query = ($module or $dist or $cpanid); +$index = ($update or $reindex or $setup); + +if ($help or not $rc or not ($index or $query)) { + print <<"END"; + +Setup, maintain, and search the CPAN::SQLite database +Usage: + $^X $0 --setup + $^X $0 --update + $^X $0 --reindex dist_name + + $^X $0 --module Mod::Name + $^X $0 --dist Distname + $^X $0 --cpanid CPANID + + $^X $0 --help +END + exit(1); +} + +if (defined $setup and defined $reindex) { + die "Must reindex on an exisiting database"; +} + +if ($index) { + my $obj = CPAN::SQLite->new(CPAN => $CPAN, + setup => $setup, + db_name => $db_name, + db_dir => $db_dir, + reindex => $reindex, + ); + $obj->index(); +} +else { + + my $max_results = 100; + my $obj = CPAN::SQLite->new(CPAN => $CPAN, + db_name => $db_name, + db_dir => $db_dir, + max_results => $max_results); + my $results; + + RESULTS : { + $module and do { + $obj->query(mode => 'module', name => $module); + $results = $obj->{results}; + if (not $results) { + print qq{\nNo module by name of "$module" was found.\n}; + print qq{Error: $obj->{error}\n} if $obj->{error}; + } + else { + my $abs = $results->{mod_abs} || ''; + my $dslip = ''; + if (my $dslip_info = $results->{dslip_info}) { + foreach my $entry (@$dslip_info) { + $dslip .= " $entry->{desc}: $entry->{what}\n"; + } + } + my $chapter_desc = $results->{chapter_desc} || ''; + print << "EOI"; + +Module: $results->{mod_name} +Abstract: $abs +Version: $results->{mod_vers} +Chapter: $chapter_desc +Distribution: $results->{dist_name} +CPAN author: $results->{cpanid} +CPAN file: $results->{dist_file} +Download: $results->{download} +dslip info: +$dslip +EOI + } + last RESULTS; + }; + $dist and do { + $obj->query(mode => 'dist', name => $dist); + $results = $obj->{results}; + if (not $results) { + print qq{\nNo distribution by name of "$dist" was found.\n}; + print qq{Error: $obj->{error}\n} if $obj->{error}; + } + else { + my $abs = $results->{dist_abs} || ''; + my $dslip = ''; + if (my $dslip_info = $results->{dslip_info}) { + foreach my $entry (@$dslip_info) { + $dslip .= " $entry->{desc}: $entry->{what}\n"; + } + } + print << "EOI"; + +Distribution: $results->{dist_name} +Abstract: $abs +Version: $results->{dist_vers} +CPAN author: $results->{cpanid} +CPAN file: $results->{dist_file} +Download: $results->{download} +dslip info: +$dslip +EOI + } + my $mods = $results->{mods}; + if ($mods and (ref($mods) eq 'ARRAY')) { + print qq{\nProvided modules:\n}; + foreach my $item(@$mods) { + my $abs = $item->{mod_abs} || ''; + print qq{ $item->{mod_name}: $abs\n}; + } + } + last RESULTS; + }; + $cpanid and do { + $obj->query(mode => 'author', name => $cpanid); + $results = $obj->{results}; + if (not $results) { + print qq{\nNo cpanid by name of "$cpanid" was found.\n}; + print qq{Error: $obj->{error}\n} if $obj->{error}; + } + else { + print << "EOI"; + +CPANID: $results->{cpanid} +Full Name: $results->{fullname} +email: $results->{email} +EOI + } + my $dists = $results->{dists}; + if ($dists and (ref($dists) eq 'ARRAY')) { + print qq{\nAvailable distributions:\n}; + foreach my $item(@$dists) { + my $abs = $item->{dist_abs} || ''; + print qq{ $item->{dist_file}: $abs\n}; + } + } + last RESULTS; + }; + } +} + +__END__ + +=head1 NAME + +cpandb - interface to C + +=head1 DESCRIPTION + +This script is an interface to the routines of +L for setting up, maintaining and +searching a C database +of CPAN. Available options can be grouped into +three categories. + +=head2 Common options + +These are options which are common to both setting up +and maintaining the database or performing queries on it. +These are + +=over 3 + +=item * C<--CPAN '/path/to/CPAN'> + +This specifies the path to where the index files are +to be stored. This could be a local CPAN mirror, +defined here by the presence of a F file beneath +this directory, or a local directory in which to store +these files from a remote CPAN mirror. In the latter case, +the index files are fetched from a remote CPAN mirror, +using the same list that C uses, if this is +configured, and are updated if they are more than one +day old. + +If the C option is not given, it will default +to C of L, if this is configured, +with the sources being found under C. +A fatal error results if such a directory isn't found. +Updates to these index files are assumed here to be +handled by C. + +=item * C<--db_name 'cpan-sqlite'> + +This is the name of the database that C +will use. If not given, this defaults to C. + +=item * C<--db_dir '/path/to/db/dir'> + +This specifies the path to where the database file is +found. If not given, it defaults to the +C directory of C, if present, or to +the directory in which the script was invoked. + +=back + +=head2 Indexing options + +These are options which are used for setting up and +maintaining the database. These include + +=over 3 + +=item * C<--setup> + +This specifies that the database is to be created and +populated from the CPAN indices; any exisiting database +will be overwritten. + +=item * C<--update> + +This is used to update an exisiting database, +which must have first been created with the C +option. + +=item * C<--reindex 'dist_name'> + +This specifies that the CPAN distribution C +is to be reindexed. + +=back + +=head2 Querying options + +These options are used to query the database. Available +options are + +=over 3 + +=item * C<--module Mod::Name> + +This provides information on the specified module name. + +=item * C<--dist Dist-Name> + +This provides information on the specified distribution name. + +=item * C<--cpanid CPANID> + +This provides information on the specified CPAN author id + +=back + +All search terms are assumed to be exact matches in a +case-insensitive manner. + +=head1 SEE ALSO + +L. + +=cut + + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/cpaninject b/Master/tlpkg/tlperl.straw/bin/cpaninject new file mode 100755 index 00000000000..12679fb1737 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/cpaninject @@ -0,0 +1,137 @@ +#!/usr/bin/perl + +=pod + +=head1 NAME + +cpaninject - Inject a distribution for installation via the CPAN shell + +=head1 SYNOPSIS + + # Add the distribution + cpaninject myperlmodule.tar.gz + + # And then install it from the cpan shell + cpan> install LOCAL/myperlmodule.tar.gz + +=head1 DESCRIPTION + +B is a small front-end application for the L +module. + +It takes any arbitrary Perl distribution tarball (open source or +otherwise) and injects it into the local CPAN file cache, smoothing +some metadata files to make it look as if it came from CPAN. + +It makes use the officially blessed "Reserved Local CPAN Author" id +"LOCAL" as the author the distributions are added under. + +To use the program, just run F F to add it, +then the CPAN shell to install it (with full automatic recursive +dependency installation). + +The key here being the recursive dependency installation, which you are +now able to do even for installing non-CPAN modules. + +This simplifies the installation process a little, and makes things easier +on someone that just wants to install a single commercial or non-CPAN +Perl module that might have a dozen or more CPAN dependencies. + +=cut + +package cpaninject; + +use strict; +use Params::Util '_STRING'; +use CPAN::Inject; + +use vars qw{$VERSION}; +BEGIN { + $VERSION = '0.11'; +} + + + + + +##################################################################### +# Configuration + +unless ( @ARGV ) { + error("Usage: cpaninject ./any/Perl-Distribution-1.00.tar.gz"); +} + +# Get the file name +my $file = _STRING(shift @ARGV); +unless ( $file ) { + error("Did not provide a file name"); +} +unless ( -f $file ) { + error("File '$file' does not exist"); +} +unless ( -r $file ) { + error("No permissions to read '$file'"); +} + +# Create the injector +my $cpan = eval { CPAN::Inject->from_cpan_config }; +if ( $@ ) { + my $message = $@; + $message =~ s/^(.+)\s+at line.+$/$1/; + error( $message ); +} + +# Add the file +my $path = $cpan->add( file => $file ); +message( "Injected $file ok.\n" ); +message( "The following command will install it from the CPAN shell.\n" ); +message( "\n" ); +message( "cpan> install $path\n" ); +message( "\n" ); +exit(0); + + + + + +##################################################################### +# Support Functions + +sub message ($) { + print ' ' . $_[0]; +} + +sub error (@) { + print ' ' . join '', map { "$_\n" } ('', @_, ''); + exit(255); +} + +=pod + +=head1 SUPPORT + +All bugs should be filed via the bug tracker at + +L + +For other issues, or commercial enhancement and support, contact the author + +=head1 AUTHOR + +Adam Kennedy Eadamk@cpan.orgE + +=head1 SEE ALSO + +L + +=head1 COPYRIGHT + +Copyright 2006 Adam Kennedy. + +This program is free software; you can redistribute +it and/or modify it under the same terms as Perl itself. + +The full text of the license can be found in the +LICENSE file included with this module. + +=cut diff --git a/Master/tlpkg/tlperl.straw/bin/cpaninject.bat b/Master/tlpkg/tlperl.straw/bin/cpaninject.bat new file mode 100755 index 00000000000..ddbeeff5dd2 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/cpaninject.bat @@ -0,0 +1,153 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!/usr/bin/perl +#line 15 + +=pod + +=head1 NAME + +cpaninject - Inject a distribution for installation via the CPAN shell + +=head1 SYNOPSIS + + # Add the distribution + cpaninject myperlmodule.tar.gz + + # And then install it from the cpan shell + cpan> install LOCAL/myperlmodule.tar.gz + +=head1 DESCRIPTION + +B is a small front-end application for the L +module. + +It takes any arbitrary Perl distribution tarball (open source or +otherwise) and injects it into the local CPAN file cache, smoothing +some metadata files to make it look as if it came from CPAN. + +It makes use the officially blessed "Reserved Local CPAN Author" id +"LOCAL" as the author the distributions are added under. + +To use the program, just run F F to add it, +then the CPAN shell to install it (with full automatic recursive +dependency installation). + +The key here being the recursive dependency installation, which you are +now able to do even for installing non-CPAN modules. + +This simplifies the installation process a little, and makes things easier +on someone that just wants to install a single commercial or non-CPAN +Perl module that might have a dozen or more CPAN dependencies. + +=cut + +package cpaninject; + +use strict; +use Params::Util '_STRING'; +use CPAN::Inject; + +use vars qw{$VERSION}; +BEGIN { + $VERSION = '0.11'; +} + + + + + +##################################################################### +# Configuration + +unless ( @ARGV ) { + error("Usage: cpaninject ./any/Perl-Distribution-1.00.tar.gz"); +} + +# Get the file name +my $file = _STRING(shift @ARGV); +unless ( $file ) { + error("Did not provide a file name"); +} +unless ( -f $file ) { + error("File '$file' does not exist"); +} +unless ( -r $file ) { + error("No permissions to read '$file'"); +} + +# Create the injector +my $cpan = eval { CPAN::Inject->from_cpan_config }; +if ( $@ ) { + my $message = $@; + $message =~ s/^(.+)\s+at line.+$/$1/; + error( $message ); +} + +# Add the file +my $path = $cpan->add( file => $file ); +message( "Injected $file ok.\n" ); +message( "The following command will install it from the CPAN shell.\n" ); +message( "\n" ); +message( "cpan> install $path\n" ); +message( "\n" ); +exit(0); + + + + + +##################################################################### +# Support Functions + +sub message ($) { + print ' ' . $_[0]; +} + +sub error (@) { + print ' ' . join '', map { "$_\n" } ('', @_, ''); + exit(255); +} + +=pod + +=head1 SUPPORT + +All bugs should be filed via the bug tracker at + +L + +For other issues, or commercial enhancement and support, contact the author + +=head1 AUTHOR + +Adam Kennedy Eadamk@cpan.orgE + +=head1 SEE ALSO + +L + +=head1 COPYRIGHT + +Copyright 2006 Adam Kennedy. + +This program is free software; you can redistribute +it and/or modify it under the same terms as Perl itself. + +The full text of the license can be found in the +LICENSE file included with this module. + +=cut + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/cpanp b/Master/tlpkg/tlperl.straw/bin/cpanp new file mode 100755 index 00000000000..a493322cc29 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/cpanp @@ -0,0 +1,104 @@ +#!/usr/bin/perl +# $File: //depot/cpanplus/dist/bin/cpanp $ +# $Revision: #8 $ $Change: 8345 $ $DateTime: 2003/10/05 19:25:48 $ + +use strict; +use vars '$VERSION'; + +use CPANPLUS; +$VERSION = CPANPLUS->VERSION; + +use CPANPLUS::Shell qw[Default]; +my $shell = CPANPLUS::Shell->new; + +### if we're given a command, run it; otherwise, open a shell. +if (@ARGV) { + ### take the command line arguments as a command + my $input = "@ARGV"; + ### if they said "--help", fix it up to work. + $input = 'h' if $input =~ /^\s*--?h(?:elp)?\s*$/i; + ### strip the leading dash + $input =~ s/^\s*-//; + ### pass the command line to the shell + ### exit with a useful return value on return + exit not $shell->dispatch_on_input(input => $input, noninteractive => 1); +} else { + ### open a shell for the user + $shell->shell(); +} + +=head1 NAME + +cpanp - The CPANPLUS launcher + +=head1 SYNOPSIS + +B + +B S<[-]B> S<[ --[B-]I> S<[ --[B-]I
)) { + while (/\\$/) { # Handle continuation lines + chop $line; + $line .=
; + } + + if ($line =~ /^#\s*include\s+([<"])(.*?)[>"]/) { + my ($delimiter, $new_file) = ($1, $2); + # copy the prefix in the quote syntax (#include "x.h") case + if ($delimiter eq q{"} && $file =~ m|^(.*)/|) { + $new_file = "$1/$new_file"; + } + push(@ARGV, $new_file) unless $Is_converted{$new_file}; + } + } + close HEADER; +} + + +# Determine include directories; $Config{usrinc} should be enough for (all +# non-GCC?) C compilers, but gcc uses additional include directories. +sub inc_dirs +{ + my $from_gcc = `LC_ALL=C $Config{cc} -v 2>&1`; + if( !( $from_gcc =~ s:^Reading specs from (.*?)/specs\b.*:$1/include:s ) ) + { # gcc-4+ : + $from_gcc = `LC_ALL=C $Config{cc} -print-search-dirs 2>&1`; + if ( !($from_gcc =~ s/^install:\s*([^\s]+[^\s\/])([\s\/]*).*$/$1\/include/s) ) + { + $from_gcc = ''; + }; + }; + length($from_gcc) ? ($from_gcc, $from_gcc . "-fixed", $Config{usrinc}) : ($Config{usrinc}); +} + + +# Create "_h2ph_pre.ph", if it doesn't exist or was built by a different +# version of h2ph. +sub build_preamble_if_necessary +{ + # Increment $VERSION every time this function is modified: + my $VERSION = 2; + my $preamble = "$Dest_dir/_h2ph_pre.ph"; + + # Can we skip building the preamble file? + if (-r $preamble) { + # Extract version number from first line of preamble: + open PREAMBLE, $preamble or die "Cannot open $preamble: $!"; + my $line = ; + $line =~ /(\b\d+\b)/; + close PREAMBLE or die "Cannot close $preamble: $!"; + + # Don't build preamble if a compatible preamble exists: + return if $1 == $VERSION; + } + + my (%define) = _extract_cc_defines(); + + open PREAMBLE, ">$preamble" or die "Cannot open $preamble: $!"; + print PREAMBLE "# This file was created by h2ph version $VERSION\n"; + + foreach (sort keys %define) { + if ($opt_D) { + print PREAMBLE "# $_=$define{$_}\n"; + } + if ($define{$_} =~ /^\((.*)\)$/) { + # parenthesized value: d=(v) + $define{$_} = $1; + } + if ($define{$_} =~ /^([+-]?(\d+)?\.\d+([eE][+-]?\d+)?)[FL]?$/) { + # float: + print PREAMBLE + "unless (defined &$_) { sub $_() { $1 } }\n\n"; + } elsif ($define{$_} =~ /^([+-]?\d+)U?L{0,2}$/i) { + # integer: + print PREAMBLE + "unless (defined &$_) { sub $_() { $1 } }\n\n"; + } elsif ($define{$_} =~ /^\w+$/) { + print PREAMBLE + "unless (defined &$_) { sub $_() { &$define{$_} } }\n\n"; + } else { + print PREAMBLE + "unless (defined &$_) { sub $_() { \"", + quotemeta($define{$_}), "\" } }\n\n"; + } + } + print PREAMBLE "\n1;\n"; # avoid 'did not return a true value' when empty + close PREAMBLE or die "Cannot close $preamble: $!"; +} + + +# %Config contains information on macros that are pre-defined by the +# system's compiler. We need this information to make the .ph files +# function with perl as the .h files do with cc. +sub _extract_cc_defines +{ + my %define; + my $allsymbols = join " ", + @Config{'ccsymbols', 'cppsymbols', 'cppccsymbols'}; + + # Split compiler pre-definitions into `key=value' pairs: + while ($allsymbols =~ /([^\s]+)=((\\\s|[^\s])+)/g) { + $define{$1} = $2; + if ($opt_D) { + print STDERR "$_: $1 -> $2\n"; + } + } + + return %define; +} + + +1; + +############################################################################## +__END__ + +=head1 NAME + +h2ph - convert .h C header files to .ph Perl header files + +=head1 SYNOPSIS + +B + +=head1 DESCRIPTION + +I +converts any C header files specified to the corresponding Perl header file +format. +It is most easily run while in /usr/include: + + cd /usr/include; h2ph * sys/* + +or + + cd /usr/include; h2ph * sys/* arpa/* netinet/* + +or + + cd /usr/include; h2ph -r -l . + +The output files are placed in the hierarchy rooted at Perl's +architecture dependent library directory. You can specify a different +hierarchy with a B<-d> switch. + +If run with no arguments, filters standard input to standard output. + +=head1 OPTIONS + +=over 4 + +=item -d destination_dir + +Put the resulting B<.ph> files beneath B, instead of +beneath the default Perl library location (C<$Config{'installsitearch'}>). + +=item -r + +Run recursively; if any of B are directories, then run I +on all files in those directories (and their subdirectories, etc.). B<-r> +and B<-a> are mutually exclusive. + +=item -a + +Run automagically; convert B, as well as any B<.h> files +which they include. This option will search for B<.h> files in all +directories which your C compiler ordinarily uses. B<-a> and B<-r> are +mutually exclusive. + +=item -l + +Symbolic links will be replicated in the destination directory. If B<-l> +is not specified, then links are skipped over. + +=item -h + +Put ``hints'' in the .ph files which will help in locating problems with +I. In those cases when you B a B<.ph> file containing syntax +errors, instead of the cryptic + + [ some error condition ] at (eval mmm) line nnn + +you will see the slightly more helpful + + [ some error condition ] at filename.ph line nnn + +However, the B<.ph> files almost double in size when built using B<-h>. + +=item -D + +Include the code from the B<.h> file as a comment in the B<.ph> file. +This is primarily used for debugging I. + +=item -Q + +``Quiet'' mode; don't print out the names of the files being converted. + +=back + +=head1 ENVIRONMENT + +No environment variables are used. + +=head1 FILES + + /usr/include/*.h + /usr/include/sys/*.h + +etc. + +=head1 AUTHOR + +Larry Wall + +=head1 SEE ALSO + +perl(1) + +=head1 DIAGNOSTICS + +The usual warnings if it can't read or write the files involved. + +=head1 BUGS + +Doesn't construct the %sizeof array for you. + +It doesn't handle all C constructs, but it does attempt to isolate +definitions inside evals so that you can get at the definitions +that it can translate. + +It's only intended as a rough tool. +You may need to dicker with the files produced. + +You have to run this program by hand; it's not run as part of the Perl +installation. + +Doesn't handle complicated expressions built piecemeal, a la: + + enum { + FIRST_VALUE, + SECOND_VALUE, + #ifdef ABC + THIRD_VALUE + #endif + }; + +Doesn't necessarily locate all of your C compiler's internally-defined +symbols. + +=cut + + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/h2xs.bat b/Master/tlpkg/tlperl.straw/bin/h2xs.bat new file mode 100755 index 00000000000..136eeea2fad --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/h2xs.bat @@ -0,0 +1,2203 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!perl +#line 15 + eval 'exec C:\strawberry\perl\bin\perl.exe -S $0 ${1+"$@"}' + if $running_under_some_shell; + +use warnings; + +=head1 NAME + +h2xs - convert .h C header files to Perl extensions + +=head1 SYNOPSIS + +B [B ...] [headerfile ... [extra_libraries]] + +B B<-h>|B<-?>|B<--help> + +=head1 DESCRIPTION + +I builds a Perl extension from C header files. The extension +will include functions which can be used to retrieve the value of any +#define statement which was in the C header files. + +The I will be used for the name of the extension. If +module_name is not supplied then the name of the first header file +will be used, with the first character capitalized. + +If the extension might need extra libraries, they should be included +here. The extension Makefile.PL will take care of checking whether +the libraries actually exist and how they should be loaded. The extra +libraries should be specified in the form -lm -lposix, etc, just as on +the cc command line. By default, the Makefile.PL will search through +the library path determined by Configure. That path can be augmented +by including arguments of the form B<-L/another/library/path> in the +extra-libraries argument. + +In spite of its name, I may also be used to create a skeleton pure +Perl module. See the B<-X> option. + +=head1 OPTIONS + +=over 5 + +=item B<-A>, B<--omit-autoload> + +Omit all autoload facilities. This is the same as B<-c> but also +removes the S> statement from the .pm file. + +=item B<-B>, B<--beta-version> + +Use an alpha/beta style version number. Causes version number to +be "0.00_01" unless B<-v> is specified. + +=item B<-C>, B<--omit-changes> + +Omits creation of the F file, and adds a HISTORY section to +the POD template. + +=item B<-F>, B<--cpp-flags>=I + +Additional flags to specify to C preprocessor when scanning header for +function declarations. Writes these options in the generated F +too. + +=item B<-M>, B<--func-mask>=I + +selects functions/macros to process. + +=item B<-O>, B<--overwrite-ok> + +Allows a pre-existing extension directory to be overwritten. + +=item B<-P>, B<--omit-pod> + +Omit the autogenerated stub POD section. + +=item B<-X>, B<--omit-XS> + +Omit the XS portion. Used to generate a skeleton pure Perl module. +C<-c> and C<-f> are implicitly enabled. + +=item B<-a>, B<--gen-accessors> + +Generate an accessor method for each element of structs and unions. The +generated methods are named after the element name; will return the current +value of the element if called without additional arguments; and will set +the element to the supplied value (and return the new value) if called with +an additional argument. Embedded structures and unions are returned as a +pointer rather than the complete structure, to facilitate chained calls. + +These methods all apply to the Ptr type for the structure; additionally +two methods are constructed for the structure type itself, C<_to_ptr> +which returns a Ptr type pointing to the same structure, and a C +method to construct and return a new structure, initialised to zeroes. + +=item B<-b>, B<--compat-version>=I + +Generates a .pm file which is backwards compatible with the specified +perl version. + +For versions < 5.6.0, the changes are. + - no use of 'our' (uses 'use vars' instead) + - no 'use warnings' + +Specifying a compatibility version higher than the version of perl you +are using to run h2xs will have no effect. If unspecified h2xs will default +to compatibility with the version of perl you are using to run h2xs. + +=item B<-c>, B<--omit-constant> + +Omit C from the .xs file and corresponding specialised +C from the .pm file. + +=item B<-d>, B<--debugging> + +Turn on debugging messages. + +=item B<-e>, B<--omit-enums>=[I] + +If I is not given, skip all constants that are defined in +a C enumeration. Otherwise skip only those constants that are defined in an +enum whose name matches I. + +Since I is optional, make sure that this switch is followed +by at least one other switch if you omit I and have some +pending arguments such as header-file names. This is ok: + + h2xs -e -n Module::Foo foo.h + +This is not ok: + + h2xs -n Module::Foo -e foo.h + +In the latter, foo.h is taken as I. + +=item B<-f>, B<--force> + +Allows an extension to be created for a header even if that header is +not found in standard include directories. + +=item B<-g>, B<--global> + +Include code for safely storing static data in the .xs file. +Extensions that do no make use of static data can ignore this option. + +=item B<-h>, B<-?>, B<--help> + +Print the usage, help and version for this h2xs and exit. + +=item B<-k>, B<--omit-const-func> + +For function arguments declared as C, omit the const attribute in the +generated XS code. + +=item B<-m>, B<--gen-tied-var> + +B: for each variable declared in the header file(s), declare +a perl variable of the same name magically tied to the C variable. + +=item B<-n>, B<--name>=I + +Specifies a name to be used for the extension, e.g., S<-n RPC::DCE> + +=item B<-o>, B<--opaque-re>=I + +Use "opaque" data type for the C types matched by the regular +expression, even if these types are C-equivalent to types +from typemaps. Should not be used without B<-x>. + +This may be useful since, say, types which are C-equivalent +to integers may represent OS-related handles, and one may want to work +with these handles in OO-way, as in C<$handle-Edo_something()>. +Use C<-o .> if you want to handle all the Ced types as opaque +types. + +The type-to-match is whitewashed (except for commas, which have no +whitespace before them, and multiple C<*> which have no whitespace +between them). + +=item B<-p>, B<--remove-prefix>=I + +Specify a prefix which should be removed from the Perl function names, +e.g., S<-p sec_rgy_> This sets up the XS B keyword and removes +the prefix from functions that are autoloaded via the C +mechanism. + +=item B<-s>, B<--const-subs>=I + +Create a perl subroutine for the specified macros rather than autoload +with the constant() subroutine. These macros are assumed to have a +return type of B, e.g., +S<-s sec_rgy_wildcard_name,sec_rgy_wildcard_sid>. + +=item B<-t>, B<--default-type>=I + +Specify the internal type that the constant() mechanism uses for macros. +The default is IV (signed integer). Currently all macros found during the +header scanning process will be assumed to have this type. Future versions +of C may gain the ability to make educated guesses. + +=item B<--use-new-tests> + +When B<--compat-version> (B<-b>) is present the generated tests will use +C rather than C which is the default for versions before +5.7.2 . C will be added to PREREQ_PM in the generated +C. + +=item B<--use-old-tests> + +Will force the generation of test code that uses the older C module. + +=item B<--skip-exporter> + +Do not use C and/or export any symbol. + +=item B<--skip-ppport> + +Do not use C: no portability to older version. + +=item B<--skip-autoloader> + +Do not use the module C; but keep the constant() function +and C for constants. + +=item B<--skip-strict> + +Do not use the pragma C. + +=item B<--skip-warnings> + +Do not use the pragma C. + +=item B<-v>, B<--version>=I + +Specify a version number for this extension. This version number is added +to the templates. The default is 0.01, or 0.00_01 if C<-B> is specified. +The version specified should be numeric. + +=item B<-x>, B<--autogen-xsubs> + +Automatically generate XSUBs basing on function declarations in the +header file. The package C should be installed. If this +option is specified, the name of the header file may look like +C. In this case NAME1 is used instead of the specified +string, but XSUBs are emitted only for the declarations included from +file NAME2. + +Note that some types of arguments/return-values for functions may +result in XSUB-declarations/typemap-entries which need +hand-editing. Such may be objects which cannot be converted from/to a +pointer (like C), pointers to functions, or arrays. See +also the section on L>. + +=back + +=head1 EXAMPLES + + + # Default behavior, extension is Rusers + h2xs rpcsvc/rusers + + # Same, but extension is RUSERS + h2xs -n RUSERS rpcsvc/rusers + + # Extension is rpcsvc::rusers. Still finds + h2xs rpcsvc::rusers + + # Extension is ONC::RPC. Still finds + h2xs -n ONC::RPC rpcsvc/rusers + + # Without constant() or AUTOLOAD + h2xs -c rpcsvc/rusers + + # Creates templates for an extension named RPC + h2xs -cfn RPC + + # Extension is ONC::RPC. + h2xs -cfn ONC::RPC + + # Extension is a pure Perl module with no XS code. + h2xs -X My::Module + + # Extension is Lib::Foo which works at least with Perl5.005_03. + # Constants are created for all #defines and enums h2xs can find + # in foo.h. + h2xs -b 5.5.3 -n Lib::Foo foo.h + + # Extension is Lib::Foo which works at least with Perl5.005_03. + # Constants are created for all #defines but only for enums + # whose names do not start with 'bar_'. + h2xs -b 5.5.3 -e '^bar_' -n Lib::Foo foo.h + + # Makefile.PL will look for library -lrpc in + # additional directory /opt/net/lib + h2xs rpcsvc/rusers -L/opt/net/lib -lrpc + + # Extension is DCE::rgynbase + # prefix "sec_rgy_" is dropped from perl function names + h2xs -n DCE::rgynbase -p sec_rgy_ dce/rgynbase + + # Extension is DCE::rgynbase + # prefix "sec_rgy_" is dropped from perl function names + # subroutines are created for sec_rgy_wildcard_name and + # sec_rgy_wildcard_sid + h2xs -n DCE::rgynbase -p sec_rgy_ \ + -s sec_rgy_wildcard_name,sec_rgy_wildcard_sid dce/rgynbase + + # Make XS without defines in perl.h, but with function declarations + # visible from perl.h. Name of the extension is perl1. + # When scanning perl.h, define -DEXT=extern -DdEXT= -DINIT(x)= + # Extra backslashes below because the string is passed to shell. + # Note that a directory with perl header files would + # be added automatically to include path. + h2xs -xAn perl1 -F "-DEXT=extern -DdEXT= -DINIT\(x\)=" perl.h + + # Same with function declaration in proto.h as visible from perl.h. + h2xs -xAn perl2 perl.h,proto.h + + # Same but select only functions which match /^av_/ + h2xs -M '^av_' -xAn perl2 perl.h,proto.h + + # Same but treat SV* etc as "opaque" types + h2xs -o '^[S]V \*$' -M '^av_' -xAn perl2 perl.h,proto.h + +=head2 Extension based on F<.h> and F<.c> files + +Suppose that you have some C files implementing some functionality, +and the corresponding header files. How to create an extension which +makes this functionality accessible in Perl? The example below +assumes that the header files are F and +I, and you want the perl module be named as +C. If you need some preprocessor directives and/or +linking with external libraries, see the flags C<-F>, C<-L> and C<-l> +in L<"OPTIONS">. + +=over + +=item Find the directory name + +Start with a dummy run of h2xs: + + h2xs -Afn Ext::Ension + +The only purpose of this step is to create the needed directories, and +let you know the names of these directories. From the output you can +see that the directory for the extension is F. + +=item Copy C files + +Copy your header files and C files to this directory F. + +=item Create the extension + +Run h2xs, overwriting older autogenerated files: + + h2xs -Oxan Ext::Ension interface_simple.h interface_hairy.h + +h2xs looks for header files I changing to the extension +directory, so it will find your header files OK. + +=item Archive and test + +As usual, run + + cd Ext/Ension + perl Makefile.PL + make dist + make + make test + +=item Hints + +It is important to do C as early as possible. This way you +can easily merge(1) your changes to autogenerated files if you decide +to edit your C<.h> files and rerun h2xs. + +Do not forget to edit the documentation in the generated F<.pm> file. + +Consider the autogenerated files as skeletons only, you may invent +better interfaces than what h2xs could guess. + +Consider this section as a guideline only, some other options of h2xs +may better suit your needs. + +=back + +=head1 ENVIRONMENT + +No environment variables are used. + +=head1 AUTHOR + +Larry Wall and others + +=head1 SEE ALSO + +L, L, L, and L. + +=head1 DIAGNOSTICS + +The usual warnings if it cannot read or write the files involved. + +=head1 LIMITATIONS of B<-x> + +F would not distinguish whether an argument to a C function +which is of the form, say, C, is an input, output, or +input/output parameter. In particular, argument declarations of the +form + + int + foo(n) + int *n + +should be better rewritten as + + int + foo(n) + int &n + +if C is an input parameter. + +Additionally, F has no facilities to intuit that a function + + int + foo(addr,l) + char *addr + int l + +takes a pair of address and length of data at this address, so it is better +to rewrite this function as + + int + foo(sv) + SV *addr + PREINIT: + STRLEN len; + char *s; + CODE: + s = SvPV(sv,len); + RETVAL = foo(s, len); + OUTPUT: + RETVAL + +or alternately + + static int + my_foo(SV *sv) + { + STRLEN len; + char *s = SvPV(sv,len); + + return foo(s, len); + } + + MODULE = foo PACKAGE = foo PREFIX = my_ + + int + foo(sv) + SV *sv + +See L and L for additional details. + +=cut + +# ' # Grr +use strict; + + +my( $H2XS_VERSION ) = ' $Revision: 1.23 $ ' =~ /\$Revision:\s+([^\s]+)/; +my $TEMPLATE_VERSION = '0.01'; +my @ARGS = @ARGV; +my $compat_version = $]; + +use Getopt::Long; +use Config; +use Text::Wrap; +$Text::Wrap::huge = 'overflow'; +$Text::Wrap::columns = 80; +use ExtUtils::Constant qw (WriteConstants WriteMakefileSnippet autoload); +use File::Compare; +use File::Path; + +sub usage { + warn "@_\n" if @_; + die <. + --skip-strict Do not use the pragma C. + --skip-warnings Do not use the pragma C. + -v, --version Specify a version number for this extension. + -x, --autogen-xsubs Autogenerate XSUBs using C::Scan. + --use-xsloader Use XSLoader in backward compatible modules (ignored + when used with -X). + +extra_libraries + are any libraries that might be needed for loading the + extension, e.g. -lm would try to link in the math library. +EOFUSAGE +} + +my ($opt_A, + $opt_B, + $opt_C, + $opt_F, + $opt_M, + $opt_O, + $opt_P, + $opt_X, + $opt_a, + $opt_c, + $opt_d, + $opt_e, + $opt_f, + $opt_g, + $opt_h, + $opt_k, + $opt_m, + $opt_n, + $opt_o, + $opt_p, + $opt_s, + $opt_v, + $opt_x, + $opt_b, + $opt_t, + $new_test, + $old_test, + $skip_exporter, + $skip_ppport, + $skip_autoloader, + $skip_strict, + $skip_warnings, + $use_xsloader + ); + +Getopt::Long::Configure('bundling'); +Getopt::Long::Configure('pass_through'); + +my %options = ( + 'omit-autoload|A' => \$opt_A, + 'beta-version|B' => \$opt_B, + 'omit-changes|C' => \$opt_C, + 'cpp-flags|F=s' => \$opt_F, + 'func-mask|M=s' => \$opt_M, + 'overwrite_ok|O' => \$opt_O, + 'omit-pod|P' => \$opt_P, + 'omit-XS|X' => \$opt_X, + 'gen-accessors|a' => \$opt_a, + 'compat-version|b=s' => \$opt_b, + 'omit-constant|c' => \$opt_c, + 'debugging|d' => \$opt_d, + 'omit-enums|e:s' => \$opt_e, + 'force|f' => \$opt_f, + 'global|g' => \$opt_g, + 'help|h|?' => \$opt_h, + 'omit-const-func|k' => \$opt_k, + 'gen-tied-var|m' => \$opt_m, + 'name|n=s' => \$opt_n, + 'opaque-re|o=s' => \$opt_o, + 'remove-prefix|p=s' => \$opt_p, + 'const-subs|s=s' => \$opt_s, + 'default-type|t=s' => \$opt_t, + 'version|v=s' => \$opt_v, + 'autogen-xsubs|x' => \$opt_x, + 'use-new-tests' => \$new_test, + 'use-old-tests' => \$old_test, + 'skip-exporter' => \$skip_exporter, + 'skip-ppport' => \$skip_ppport, + 'skip-autoloader' => \$skip_autoloader, + 'skip-warnings' => \$skip_warnings, + 'skip-strict' => \$skip_strict, + 'use-xsloader' => \$use_xsloader, + ); + +GetOptions(%options) || usage; + +usage if $opt_h; + +if( $opt_b ){ + usage "You cannot use -b and -m at the same time.\n" if ($opt_b && $opt_m); + $opt_b =~ /^v?(\d+)\.(\d+)\.(\d+)/ || + usage "You must provide the backwards compatibility version in X.Y.Z form. " + . "(i.e. 5.5.0)\n"; + my ($maj,$min,$sub) = ($1,$2,$3); + if ($maj < 5 || ($maj == 5 && $min < 6)) { + $compat_version = + $sub ? sprintf("%d.%03d%02d",$maj,$min,$sub) : + sprintf("%d.%03d", $maj,$min); + } else { + $compat_version = sprintf("%d.%03d%03d",$maj,$min,$sub); + } +} else { + my ($maj,$min,$sub) = $compat_version =~ /(\d+)\.(\d\d\d)(\d*)/; + $sub ||= 0; + warn sprintf <<'EOF', $maj,$min,$sub; +Defaulting to backwards compatibility with perl %d.%d.%d +If you intend this module to be compatible with earlier perl versions, please +specify a minimum perl version with the -b option. + +EOF +} + +if( $opt_B ){ + $TEMPLATE_VERSION = '0.00_01'; +} + +if( $opt_v ){ + $TEMPLATE_VERSION = $opt_v; + + # check if it is numeric + my $temp_version = $TEMPLATE_VERSION; + my $beta_version = $temp_version =~ s/(\d)_(\d\d)/$1$2/; + my $notnum; + { + local $SIG{__WARN__} = sub { $notnum = 1 }; + use warnings 'numeric'; + $temp_version = 0+$temp_version; + } + + if ($notnum) { + my $module = $opt_n || 'Your::Module'; + warn <<"EOF"; +You have specified a non-numeric version. Unless you supply an +appropriate VERSION class method, users may not be able to specify a +minimum required version with C. + +EOF + } + else { + $opt_B = $beta_version; + } +} + +# -A implies -c. +$skip_autoloader = $opt_c = 1 if $opt_A; + +# -X implies -c and -f +$opt_c = $opt_f = 1 if $opt_X; + +$opt_t ||= 'IV'; + +my %const_xsub; +%const_xsub = map { $_,1 } split(/,+/, $opt_s) if $opt_s; + +my $extralibs = ''; + +my @path_h; + +while (my $arg = shift) { + if ($arg =~ /^-l/i) { + $extralibs .= "$arg "; + next; + } + last if $extralibs; + push(@path_h, $arg); +} + +usage "Must supply header file or module name\n" + unless (@path_h or $opt_n); + +my $fmask; +my $tmask; + +$fmask = qr{$opt_M} if defined $opt_M; +$tmask = qr{$opt_o} if defined $opt_o; +my $tmask_all = $tmask && $opt_o eq '.'; + +if ($opt_x) { + eval {require C::Scan; 1} + or die <= 0.70 + or die <curdir(), $Config{usrinc}, + (split ' ', $Config{locincpth}), '/usr/include'); + } + foreach my $path_h (@path_h) { + $name ||= $path_h; + $module ||= do { + $name =~ s/\.h$//; + if ( $name !~ /::/ ) { + $name =~ s#^.*/##; + $name = "\u$name"; + } + $name; + }; + + if( $path_h =~ s#::#/#g && $opt_n ){ + warn "Nesting of headerfile ignored with -n\n"; + } + $path_h .= ".h" unless $path_h =~ /\.h$/; + my $fullpath = $path_h; + $path_h =~ s/,.*$// if $opt_x; + $fullpath{$path_h} = $fullpath; + + # Minor trickery: we can't chdir() before we processed the headers + # (so know the name of the extension), but the header may be in the + # extension directory... + my $tmp_path_h = $path_h; + my $rel_path_h = $path_h; + my @dirs = @paths; + if (not -f $path_h) { + my $found; + for my $dir (@paths) { + $found++, last + if -f ($path_h = File::Spec->catfile($dir, $tmp_path_h)); + } + if ($found) { + $rel_path_h = $path_h; + $fullpath{$path_h} = $fullpath; + } else { + (my $epath = $module) =~ s,::,/,g; + $epath = File::Spec->catdir('ext', $epath) if -d 'ext'; + $rel_path_h = File::Spec->catfile($epath, $tmp_path_h); + $path_h = $tmp_path_h; # Used during -x + push @dirs, $epath; + } + } + + if (!$opt_c) { + die "Can't find $tmp_path_h in @dirs\n" + if ( ! $opt_f && ! -f "$rel_path_h" ); + # Scan the header file (we should deal with nested header files) + # Record the names of simple #define constants into const_names + # Function prototypes are processed below. + open(CH, "<$rel_path_h") || die "Can't open $rel_path_h: $!\n"; + defines: + while () { + if ($pre_sub_tri_graphs) { + # Preprocess all tri-graphs + # including things stuck in quoted string constants. + s/\?\?=/#/g; # | ??=| #| + s/\?\?\!/|/g; # | ??!| || + s/\?\?'/^/g; # | ??'| ^| + s/\?\?\(/[/g; # | ??(| [| + s/\?\?\)/]/g; # | ??)| ]| + s/\?\?\-/~/g; # | ??-| ~| + s/\?\?\//\\/g; # | ??/| \| + s/\?\?/}/g; # | ??>| }| + } + if (/^[ \t]*#[ \t]*define\s+([\$\w]+)\b(?!\()\s*(?=[^"\s])(.*)/) { + my $def = $1; + my $rest = $2; + $rest =~ s!/\*.*?(\*/|\n)|//.*!!g; # Remove comments + $rest =~ s/^\s+//; + $rest =~ s/\s+$//; + # Cannot do: (-1) and ((LHANDLE)3) are OK: + #print("Skip non-wordy $def => $rest\n"), + # next defines if $rest =~ /[^\w\$]/; + if ($rest =~ /"/) { + print("Skip stringy $def => $rest\n") if $opt_d; + next defines; + } + print "Matched $_ ($def)\n" if $opt_d; + $seen_define{$def} = $rest; + $_ = $def; + next if /^_.*_h_*$/i; # special case, but for what? + if (defined $opt_p) { + if (!/^$opt_p(\d)/) { + ++$prefix{$_} if s/^$opt_p//; + } + else { + warn "can't remove $opt_p prefix from '$_'!\n"; + } + } + $prefixless{$def} = $_; + if (!$fmask or /$fmask/) { + print "... Passes mask of -M.\n" if $opt_d and $fmask; + $const_names{$_}++; + } + } + } + if (defined $opt_e and !$opt_e) { + close(CH); + } + else { + # Work from miniperl too - on "normal" systems + my $SEEK_SET = eval 'use Fcntl qw/SEEK_SET/; SEEK_SET' or 0; + seek CH, 0, $SEEK_SET; + my $src = do { local $/; }; + close CH; + no warnings 'uninitialized'; + + # Remove C and C++ comments + $src =~ s#/\*[^*]*\*+([^/*][^*]*\*+)*/|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#$2#gs; + $src =~ s#//.*$##gm; + + while ($src =~ /\benum\s*([\w_]*)\s*\{\s([^}]+)\}/gsc) { + my ($enum_name, $enum_body) = ($1, $2); + # skip enums matching $opt_e + next if $opt_e && $enum_name =~ /$opt_e/; + my $val = 0; + for my $item (split /,/, $enum_body) { + next if $item =~ /\A\s*\Z/; + 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} = { name => $key, macro => 1 }; + } + } # while (...) + } # if (!defined $opt_e or $opt_e) + } + } +} + +# Save current directory so that C::Scan can use it +my $cwd = File::Spec->rel2abs( File::Spec->curdir ); + +# As Ilya suggested, use a name that contains - and then it can't clash with +# the names of any packages. A directory 'fallback' will clash with any +# new pragmata down the fallback:: tree, but that seems unlikely. +my $constscfname = 'const-c.inc'; +my $constsxsfname = 'const-xs.inc'; +my $fallbackdirname = 'fallback'; + +my $ext = chdir 'ext' ? 'ext/' : ''; + +my @modparts = split(/::/,$module); +my $modpname = join('-', @modparts); +my $modfname = pop @modparts; +my $modpmdir = join '/', 'lib', @modparts; +my $modpmname = join '/', $modpmdir, $modfname.'.pm'; + +if ($opt_O) { + warn "Overwriting existing $ext$modpname!!!\n" if -e $modpname; +} +else { + die "Won't overwrite existing $ext$modpname\n" if -e $modpname; +} +-d "$modpname" || mkpath([$modpname], 0, 0775); +chdir($modpname) || die "Can't chdir $ext$modpname: $!\n"; + +my %types_seen; +my %std_types; +my $fdecls = []; +my $fdecls_parsed = []; +my $typedef_rex; +my %typedefs_pre; +my %known_fnames; +my %structs; + +my @fnames; +my @fnames_no_prefix; +my %vdecl_hash; +my @vdecls; + +if( ! $opt_X ){ # use XS, unless it was disabled + unless ($skip_ppport) { + require Devel::PPPort; + warn "Writing $ext$modpname/ppport.h\n"; + Devel::PPPort::WriteFile('ppport.h') + || die "Can't create $ext$modpname/ppport.h: $!\n"; + } + open(XS, ">$modfname.xs") || die "Can't create $ext$modpname/$modfname.xs: $!\n"; + if ($opt_x) { + warn "Scanning typemaps...\n"; + get_typemap(); + my @td; + my @good_td; + my $addflags = $opt_F || ''; + + foreach my $filename (@path_h) { + my $c; + my $filter; + + if ($fullpath{$filename} =~ /,/) { + $filename = $`; + $filter = $'; + } + warn "Scanning $filename for functions...\n"; + my @styles = $Config{gccversion} ? qw(C++ C9X GNU) : qw(C++ C9X); + $c = new C::Scan 'filename' => $filename, 'filename_filter' => $filter, + 'add_cppflags' => $addflags, 'c_styles' => \@styles; + $c->set('includeDirs' => ["$Config::Config{archlib}/CORE", $cwd]); + + $c->get('keywords')->{'__restrict'} = 1; + + push @$fdecls_parsed, @{ $c->get('parsed_fdecls') }; + push(@$fdecls, @{$c->get('fdecls')}); + + push @td, @{$c->get('typedefs_maybe')}; + if ($opt_a) { + my $structs = $c->get('typedef_structs'); + @structs{keys %$structs} = values %$structs; + } + + if ($opt_m) { + %vdecl_hash = %{ $c->get('vdecl_hash') }; + @vdecls = sort keys %vdecl_hash; + for (local $_ = 0; $_ < @vdecls; ++$_) { + my $var = $vdecls[$_]; + my($type, $post) = @{ $vdecl_hash{$var} }; + if (defined $post) { + warn "Can't handle variable '$type $var $post', skipping.\n"; + splice @vdecls, $_, 1; + redo; + } + $type = normalize_type($type); + $vdecl_hash{$var} = $type; + } + } + + unless ($tmask_all) { + warn "Scanning $filename for typedefs...\n"; + my $td = $c->get('typedef_hash'); + # eval {require 'dumpvar.pl'; ::dumpValue($td)} or warn $@ if $opt_d; + my @f_good_td = grep $td->{$_}[1] eq '', keys %$td; + push @good_td, @f_good_td; + @typedefs_pre{@f_good_td} = map $_->[0], @$td{@f_good_td}; + } + } + { local $" = '|'; + $typedef_rex = qr(\b(?[$i][1] =~ /$fmask/; # [1] is NAME + push @good, $i; + print "... Function $fdecls_parsed->[$i][1] passes -M mask.\n" + if $opt_d; + } + $fdecls = [@$fdecls[@good]]; + $fdecls_parsed = [@$fdecls_parsed[@good]]; + } + @fnames = sort map $_->[1], @$fdecls_parsed; # 1 is NAME + # Sort declarations: + { + my %h = map( ($_->[1], $_), @$fdecls_parsed); + $fdecls_parsed = [ @h{@fnames} ]; + } + @fnames_no_prefix = @fnames; + @fnames_no_prefix + = sort map { ++$prefix{$_} if s/^$opt_p(?!\d)//; $_ } @fnames_no_prefix + if defined $opt_p; + # Remove macros which expand to typedefs + print "Typedefs are @td.\n" if $opt_d; + my %td = map {($_, $_)} @td; + # Add some other possible but meaningless values for macros + for my $k (qw(char double float int long short unsigned signed void)) { + $td{"$_$k"} = "$_$k" for ('', 'signed ', 'unsigned '); + } + # eval {require 'dumpvar.pl'; ::dumpValue( [\@td, \%td] ); 1} or warn $@; + my $n = 0; + my %bad_macs; + while (keys %td > $n) { + $n = keys %td; + my ($k, $v); + while (($k, $v) = each %seen_define) { + # print("found '$k'=>'$v'\n"), + $bad_macs{$k} = $td{$k} = $td{$v} if exists $td{$v}; + } + } + # Now %bad_macs contains names of bad macros + for my $k (keys %bad_macs) { + delete $const_names{$prefixless{$k}}; + print "Ignoring macro $k which expands to a typedef name '$bad_macs{$k}'\n" if $opt_d; + } + } +} +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"; + +$" = "\n\t"; +warn "Writing $ext$modpname/$modpmname\n"; + +print PM <<"END"; +package $module; + +use $compat_version; +END + +print PM <<"END" unless $skip_strict; +use strict; +END + +print PM "use warnings;\n" unless $skip_warnings or $compat_version < 5.006; + +unless( $opt_X || $opt_c || $opt_A ){ + # we'll have an AUTOLOAD(), and it will have $AUTOLOAD and + # will want Carp. + print PM <<'END'; +use Carp; +END +} + +print PM <<'END' unless $skip_exporter; + +require Exporter; +END + +my $use_Dyna = (not $opt_X and $compat_version < 5.006 and not $use_xsloader); +print PM <<"END" if $use_Dyna; # use DynaLoader, unless XS was disabled +require DynaLoader; +END + + +# Are we using AutoLoader or not? +unless ($skip_autoloader) { # no autoloader whatsoever. + unless ($opt_c) { # we're doing the AUTOLOAD + print PM "use AutoLoader;\n"; + } + else { + print PM "use AutoLoader qw(AUTOLOAD);\n" + } +} + +if ( $compat_version < 5.006 ) { + my $vars = '$VERSION @ISA'; + $vars .= ' @EXPORT @EXPORT_OK %EXPORT_TAGS' unless $skip_exporter; + $vars .= ' $AUTOLOAD' unless $opt_X || $opt_c || $opt_A; + $vars .= ' $XS_VERSION' if $opt_B && !$opt_X; + print PM "use vars qw($vars);"; +} + +# Determine @ISA. +my @modISA; +push @modISA, 'Exporter' unless $skip_exporter; +push @modISA, 'DynaLoader' if $use_Dyna; # no XS +my $myISA = "our \@ISA = qw(@modISA);"; +$myISA =~ s/^our // if $compat_version < 5.006; + +print PM "\n$myISA\n\n"; + +my @exported_names = (@const_names, @fnames_no_prefix, map '$'.$_, @vdecls); + +my $tmp=''; +$tmp .= <<"END" unless $skip_exporter; +# Items to export into callers namespace by default. Note: do not export +# names by default without a very good reason. Use EXPORT_OK instead. +# Do not simply export all your public functions/methods/constants. + +# This allows declaration use $module ':all'; +# If you do not need this, moving things directly into \@EXPORT or \@EXPORT_OK +# will save memory. +our %EXPORT_TAGS = ( 'all' => [ qw( + @exported_names +) ] ); + +our \@EXPORT_OK = ( \@{ \$EXPORT_TAGS{'all'} } ); + +our \@EXPORT = qw( + @const_names +); + +END + +$tmp .= "our \$VERSION = '$TEMPLATE_VERSION';\n"; +if ($opt_B) { + $tmp .= "our \$XS_VERSION = \$VERSION;\n" unless $opt_X; + $tmp .= "\$VERSION = eval \$VERSION; # see L\n"; +} +$tmp .= "\n"; + +$tmp =~ s/^our //mg if $compat_version < 5.006; +print PM $tmp; + +if (@vdecls) { + printf PM "our(@{[ join ', ', map '$'.$_, @vdecls ]});\n\n"; +} + + +print PM autoload ($module, $compat_version) unless $opt_c or $opt_X; + +if( ! $opt_X ){ # print bootstrap, unless XS is disabled + if ($use_Dyna) { + $tmp = <<"END"; +bootstrap $module \$VERSION; +END + } else { + $tmp = <<"END"; +require XSLoader; +XSLoader::load('$module', \$VERSION); +END + } + $tmp =~ s:\$VERSION:\$XS_VERSION:g if $opt_B; + print PM $tmp; +} + +# tying the variables can happen only after bootstrap +if (@vdecls) { + printf PM <))[0,6]; + if (defined $username && defined $author) { + $author =~ s/,.*$//; # in case of sub fields + my $domain = $Config{'mydomain'}; + $domain =~ s/^\.//; + $email = "$username\@$domain"; + } + }; + +$author =~ s/'/\\'/g if defined $author; +$author ||= "A. U. Thor"; +$email ||= 'a.u.thor@a.galaxy.far.far.away'; + +$licence = sprintf << "DEFAULT", $^V; +Copyright (C) ${\(1900 + (localtime) [5])} by $author + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself, either Perl version %vd or, +at your option, any later version of Perl 5 you may have available. +DEFAULT + +my $revhist = ''; +$revhist = < should be removed. +# +#EOD + $exp_doc .= <${email}E +# +#=head1 COPYRIGHT AND LICENSE +# +$licence_hash +# +#=cut +END + +$pod =~ s/^\#//gm unless $opt_P; +print PM $pod unless $opt_P; + +close PM; + + +if( ! $opt_X ){ # print XS, unless it is disabled +warn "Writing $ext$modpname/$modfname.xs\n"; + +print XS <<"END"; +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" + +END + +print XS <<"END" unless $skip_ppport; +#include "ppport.h" + +END + +if( @path_h ){ + foreach my $path_h (@path_h_ini) { + my($h) = $path_h; + $h =~ s#^/usr/include/##; + if ($^O eq 'VMS') { $h =~ s#.*vms\]#sys/# or $h =~ s#.*[:>\]]##; } + print XS qq{#include <$h>\n}; + } + print XS "\n"; +} + +print XS <<"END" if $opt_g; + +/* Global Data */ + +#define MY_CXT_KEY "${module}::_guts" XS_VERSION + +typedef struct { + /* Put Global Data in here */ + int dummy; /* you can access this elsewhere as MY_CXT.dummy */ +} my_cxt_t; + +START_MY_CXT + +END + +my %pointer_typedefs; +my %struct_typedefs; + +sub td_is_pointer { + my $type = shift; + my $out = $pointer_typedefs{$type}; + return $out if defined $out; + my $otype = $type; + $out = ($type =~ /\*$/); + # This converts only the guys which do not have trailing part in the typedef + if (not $out + and $typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) { + $type = normalize_type($type); + print "Is-Pointer: Type mutation via typedefs: $otype ==> $type\n" + if $opt_d; + $out = td_is_pointer($type); + } + return ($pointer_typedefs{$otype} = $out); +} + +sub td_is_struct { + my $type = shift; + my $out = $struct_typedefs{$type}; + return $out if defined $out; + my $otype = $type; + $out = ($type =~ /^(struct|union)\b/) && !td_is_pointer($type); + # This converts only the guys which do not have trailing part in the typedef + if (not $out + and $typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) { + $type = normalize_type($type); + print "Is-Struct: Type mutation via typedefs: $otype ==> $type\n" + if $opt_d; + $out = td_is_struct($type); + } + return ($struct_typedefs{$otype} = $out); +} + +print_tievar_subs(\*XS, $_, $vdecl_hash{$_}) for @vdecls; + +if( ! $opt_c ) { + # We write the "sample" files used when this module is built by perl without + # ExtUtils::Constant. + # h2xs will later check that these are the same as those generated by the + # code embedded into Makefile.PL + unless (-d $fallbackdirname) { + mkdir "$fallbackdirname" or die "Cannot mkdir $fallbackdirname: $!\n"; + } + warn "Writing $ext$modpname/$fallbackdirname/$constscfname\n"; + warn "Writing $ext$modpname/$fallbackdirname/$constsxsfname\n"; + my $cfallback = File::Spec->catfile($fallbackdirname, $constscfname); + my $xsfallback = File::Spec->catfile($fallbackdirname, $constsxsfname); + WriteConstants ( C_FILE => $cfallback, + XS_FILE => $xsfallback, + DEFAULT_TYPE => $opt_t, + NAME => $module, + NAMES => \@const_specs, + ); + print XS "#include \"$constscfname\"\n"; +} + + +my $prefix = defined $opt_p ? "PREFIX = $opt_p" : ''; + +# Now switch from C to XS by issuing the first MODULE declaration: +print XS <<"END"; + +MODULE = $module PACKAGE = $module $prefix + +END + +# If a constant() function was #included then output a corresponding +# XS declaration: +print XS "INCLUDE: $constsxsfname\n" unless $opt_c; + +print XS <<"END" if $opt_g; + +BOOT: +{ + MY_CXT_INIT; + /* If any of the fields in the my_cxt_t struct need + to be initialised, do it here. + */ +} + +END + +foreach (sort keys %const_xsub) { + print XS <<"END"; +char * +$_() + + CODE: +#ifdef $_ + RETVAL = $_; +#else + croak("Your vendor has not defined the $module macro $_"); +#endif + + OUTPUT: + RETVAL + +END +} + +my %seen_decl; +my %typemap; + +sub print_decl { + my $fh = shift; + my $decl = shift; + my ($type, $name, $args) = @$decl; + return if $seen_decl{$name}++; # Need to do the same for docs as well? + + my @argnames = map {$_->[1]} @$args; + my @argtypes = map { normalize_type( $_->[0], 1 ) } @$args; + if ($opt_k) { + s/^\s*const\b\s*// for @argtypes; + } + my @argarrays = map { $_->[4] || '' } @$args; + my $numargs = @$args; + if ($numargs and $argtypes[-1] eq '...') { + $numargs--; + $argnames[-1] = '...'; + } + local $" = ', '; + $type = normalize_type($type, 1); + + print $fh <<"EOP"; + +$type +$name(@argnames) +EOP + + for my $arg (0 .. $numargs - 1) { + print $fh <<"EOP"; + $argtypes[$arg] $argnames[$arg]$argarrays[$arg] +EOP + } +} + +sub print_tievar_subs { + my($fh, $name, $type) = @_; + print $fh <[0] =~ /_ANON/) { + if (defined $item->[2]) { + push @items, map [ + @$_[0, 1], "$item->[2]_$_->[2]", "$item->[2].$_->[2]", + ], @{ $structs{$item->[0]} }; + } else { + push @items, @{ $structs{$item->[0]} }; + } + } else { + my $type = normalize_type($item->[0]); + my $ttype = $structs{$type} ? normalize_type("$type *") : $type; + print $fh <<"EOF"; +$ttype +$item->[2](THIS, __value = NO_INIT) + $ptrname THIS + $type __value + PROTOTYPE: \$;\$ + CODE: + if (items > 1) + THIS->$item->[-1] = __value; + RETVAL = @{[ + $type eq $ttype ? "THIS->$item->[-1]" : "&(THIS->$item->[-1])" + ]}; + OUTPUT: + RETVAL + +EOF + } + } +} + +sub accessor_docs { + my($name, $struct) = @_; + return unless defined $struct && $name !~ /\s|_ANON/; + $name = normalize_type($name); + my $ptrname = $name . 'Ptr'; + my @items = @$struct; + my @list; + while (@items) { + my $item = shift @items; + if ($item->[0] =~ /_ANON/) { + if (defined $item->[2]) { + push @items, map [ + @$_[0, 1], "$item->[2]_$_->[2]", "$item->[2].$_->[2]", + ], @{ $structs{$item->[0]} }; + } else { + push @items, @{ $structs{$item->[0]} }; + } + } else { + push @list, $item->[2]; + } + } + my $methods = (join '(...)>, C<', @list) . '(...)'; + + my $pod = <<"EOF"; +# +#=head2 Object and class methods for C<$name>/C<$ptrname> +# +#The principal Perl representation of a C object of type C<$name> is an +#object of class C<$ptrname> which is a reference to an integer +#representation of a C pointer. To create such an object, one may use +#a combination +# +# my \$buffer = $name->new(); +# my \$obj = \$buffer->_to_ptr(); +# +#This exersizes the following two methods, and an additional class +#C<$name>, the internal representation of which is a reference to a +#packed string with the C structure. Keep in mind that \$buffer should +#better survive longer than \$obj. +# +#=over +# +#=item C<\$object_of_type_$name-E_to_ptr()> +# +#Converts an object of type C<$name> to an object of type C<$ptrname>. +# +#=item C<$name-Enew()> +# +#Creates an empty object of type C<$name>. The corresponding packed +#string is zeroed out. +# +#=item C<$methods> +# +#return the current value of the corresponding element if called +#without additional arguments. Set the element to the supplied value +#(and return the new value) if called with an additional argument. +# +#Applicable to objects of type C<$ptrname>. +# +#=back +# +EOF + $pod =~ s/^\#//gm; + return $pod; +} + +# Should be called before any actual call to normalize_type(). +sub get_typemap { + # We do not want to read ./typemap by obvios reasons. + my @tm = qw(../../../typemap ../../typemap ../typemap); + my $stdtypemap = "$Config::Config{privlib}/ExtUtils/typemap"; + unshift @tm, $stdtypemap; + my $proto_re = "[" . quotemeta('\$%&*@;') . "]" ; + + # Start with useful default values + $typemap{float} = 'T_NV'; + + foreach my $typemap (@tm) { + next unless -e $typemap ; + # skip directories, binary files etc. + warn " Scanning $typemap\n"; + warn("Warning: ignoring non-text typemap file '$typemap'\n"), next + unless -T $typemap ; + open(TYPEMAP, $typemap) + or warn ("Warning: could not open typemap file '$typemap': $!\n"), next; + my $mode = 'Typemap'; + while () { + next if /^\s*\#/; + if (/^INPUT\s*$/) { $mode = 'Input'; next; } + elsif (/^OUTPUT\s*$/) { $mode = 'Output'; next; } + elsif (/^TYPEMAP\s*$/) { $mode = 'Typemap'; next; } + elsif ($mode eq 'Typemap') { + next if /^\s*($|\#)/ ; + my ($type, $image); + if ( ($type, $image) = + /^\s*(.*?\S)\s+(\S+)\s*($proto_re*)\s*$/o + # This may reference undefined functions: + and not ($image eq 'T_PACKED' and $typemap eq $stdtypemap)) { + $typemap{normalize_type($type)} = $image; + } + } + } + close(TYPEMAP) or die "Cannot close $typemap: $!"; + } + %std_types = %types_seen; + %types_seen = (); +} + + +sub normalize_type { # Second arg: do not strip const's before \* + my $type = shift; + my $do_keep_deep_const = shift; + # If $do_keep_deep_const this is heuristical only + my $keep_deep_const = ($do_keep_deep_const ? '\b(?![^(,)]*\*)' : ''); + my $ignore_mods + = "(?:\\b(?:(?:__const__|const)$keep_deep_const|static|inline|__inline__)\\b\\s*)*"; + if ($do_keep_deep_const) { # Keep different compiled /RExen/o separately! + $type =~ s/$ignore_mods//go; + } + else { + $type =~ s/$ignore_mods//go; + } + $type =~ s/([^\s\w])/ $1 /g; + $type =~ s/\s+$//; + $type =~ s/^\s+//; + $type =~ s/\s+/ /g; + $type =~ s/\* (?=\*)/*/g; + $type =~ s/\. \. \./.../g; + $type =~ s/ ,/,/g; + $types_seen{$type}++ + unless $type eq '...' or $type eq 'void' or $std_types{$type}; + $type; +} + +my $need_opaque; + +sub assign_typemap_entry { + my $type = shift; + my $otype = $type; + my $entry; + if ($tmask and $type =~ /$tmask/) { + print "Type $type matches -o mask\n" if $opt_d; + $entry = (td_is_struct($type) ? "T_OPAQUE_STRUCT" : "T_PTROBJ"); + } + elsif ($typedef_rex and $type =~ s/($typedef_rex)/$typedefs_pre{$1}/go) { + $type = normalize_type $type; + print "Type mutation via typedefs: $otype ==> $type\n" if $opt_d; + $entry = assign_typemap_entry($type); + } + # XXX good do better if our UV happens to be long long + return "T_NV" if $type =~ /^(unsigned\s+)?long\s+(long|double)\z/; + $entry ||= $typemap{$otype} + || (td_is_struct($type) ? "T_OPAQUE_STRUCT" : "T_PTROBJ"); + $typemap{$otype} = $entry; + $need_opaque = 1 if $entry eq "T_OPAQUE_STRUCT"; + return $entry; +} + +for (@vdecls) { + print_tievar_xsubs(\*XS, $_, $vdecl_hash{$_}); +} + +if ($opt_x) { + for my $decl (@$fdecls_parsed) { print_decl(\*XS, $decl) } + if ($opt_a) { + while (my($name, $struct) = each %structs) { + print_accessors(\*XS, $name, $struct); + } + } +} + +close XS; + +if (%types_seen) { + my $type; + warn "Writing $ext$modpname/typemap\n"; + open TM, ">typemap" or die "Cannot open typemap file for write: $!"; + + for $type (sort keys %types_seen) { + my $entry = assign_typemap_entry $type; + print TM $type, "\t" x (5 - int((length $type)/8)), "\t$entry\n" + } + + print TM <<'EOP' if $need_opaque; # Older Perls do not have correct entry +############################################################################# +INPUT +T_OPAQUE_STRUCT + if (sv_derived_from($arg, \"${ntype}\")) { + STRLEN len; + char *s = SvPV((SV*)SvRV($arg), len); + + if (len != sizeof($var)) + croak(\"Size %d of packed data != expected %d\", + len, sizeof($var)); + $var = *($type *)s; + } + else + croak(\"$var is not of type ${ntype}\") +############################################################################# +OUTPUT +T_OPAQUE_STRUCT + sv_setref_pvn($arg, \"${ntype}\", (char *)&$var, sizeof($var)); +EOP + + close TM or die "Cannot close typemap file for write: $!"; +} + +} # if( ! $opt_X ) + +warn "Writing $ext$modpname/Makefile.PL\n"; +open(PL, ">Makefile.PL") || die "Can't create $ext$modpname/Makefile.PL: $!\n"; + +my $prereq_pm = ''; + +if ( $compat_version < 5.00702 and $new_test ) +{ + $prereq_pm .= q%'Test::More' => 0, %; +} + +if ( $compat_version < 5.00600 and !$opt_X and $use_xsloader) +{ + $prereq_pm .= q%'XSLoader' => 0, %; +} + +print PL <<"END"; +use $compat_version; +use ExtUtils::MakeMaker; +# See lib/ExtUtils/MakeMaker.pm for details of how to influence +# the contents of the Makefile that is written. +WriteMakefile( + NAME => '$module', + VERSION_FROM => '$modpmname', # finds \$VERSION + PREREQ_PM => {$prereq_pm}, # e.g., Module::Name => 1.1 + (\$] >= 5.005 ? ## Add these new keywords supported since 5.005 + (ABSTRACT_FROM => '$modpmname', # retrieve abstract from module + AUTHOR => '$author <$email>') : ()), +END +if (!$opt_X) { # print C stuff, unless XS is disabled + $opt_F = '' unless defined $opt_F; + my $I = (((glob '*.h') || (glob '*.hh')) ? '-I.' : ''); + my $Ihelp = ($I ? '-I. ' : ''); + my $Icomment = ($I ? '' : < ['$extralibs'], # e.g., '-lm' + DEFINE => '$opt_F', # e.g., '-DHAVE_SOMETHING' +$Icomment INC => '$I', # e.g., '${Ihelp}-I/usr/include/other' +END + + my $C = grep {$_ ne "$modfname.c"} + (glob '*.c'), (glob '*.cc'), (glob '*.C'); + my $Cpre = ($C ? '' : '# '); + my $Ccomment = ($C ? '' : < '\$(O_FILES)', # link all the C files too +END +} # ' # Grr +print PL ");\n"; +if (!$opt_c) { + my $generate_code = + WriteMakefileSnippet ( C_FILE => $constscfname, + XS_FILE => $constsxsfname, + DEFAULT_TYPE => $opt_t, + NAME => $module, + NAMES => \@const_specs, + ); + print PL <<"END"; +if (eval {require ExtUtils::Constant; 1}) { + # If you edit these definitions to change the constants used by this module, + # you will need to use the generated $constscfname and $constsxsfname + # files to replace their "fallback" counterparts before distributing your + # changes. +$generate_code +} +else { + use File::Copy; + use File::Spec; + foreach my \$file ('$constscfname', '$constsxsfname') { + my \$fallback = File::Spec->catfile('$fallbackdirname', \$file); + copy (\$fallback, \$file) or die "Can't copy \$fallback to \$file: \$!"; + } +} +END + + eval $generate_code; + if ($@) { + warn <<"EOM"; +Attempting to test constant code in $ext$modpname/Makefile.PL: +$generate_code +__END__ +gave unexpected error $@ +Please report the circumstances of this bug in h2xs version $H2XS_VERSION +using the perlbug script. +EOM + } else { + my $fail; + + foreach my $file ($constscfname, $constsxsfname) { + my $fallback = File::Spec->catfile($fallbackdirname, $file); + if (compare($file, $fallback)) { + warn << "EOM"; +Files "$ext$modpname/$fallbackdirname/$file" and "$ext$modpname/$file" differ. +EOM + $fail++; + } + } + if ($fail) { + warn fill ('','', <<"EOM") . "\n"; +It appears that the code in $ext$modpname/Makefile.PL does not autogenerate +the files $ext$modpname/$constscfname and $ext$modpname/$constsxsfname +correctly. + +Please report the circumstances of this bug in h2xs version $H2XS_VERSION +using the perlbug script. +EOM + } else { + unlink $constscfname, $constsxsfname; + } + } +} +close(PL) || die "Can't close $ext$modpname/Makefile.PL: $!\n"; + +# Create a simple README since this is a CPAN requirement +# and it doesnt hurt to have one +warn "Writing $ext$modpname/README\n"; +open(RM, ">README") || die "Can't create $ext$modpname/README:$!\n"; +my $thisyear = (gmtime)[5] + 1900; +my $rmhead = "$modpname version $TEMPLATE_VERSION"; +my $rmheadeq = "=" x length($rmhead); + +my $rm_prereq; + +if ( $compat_version < 5.00702 and $new_test ) +{ + $rm_prereq = 'Test::More'; +} +else +{ + $rm_prereq = 'blah blah blah'; +} + +print RM <<_RMEND_; +$rmhead +$rmheadeq + +The README is used to introduce the module and provide instructions on +how to install the module, any machine dependencies it may have (for +example C compilers and installed libraries) and any other information +that should be provided before the module is installed. + +A README file is required for CPAN modules since CPAN extracts the +README file from a module distribution so that people browsing the +archive can use it get an idea of the modules uses. It is usually a +good idea to provide version information here so that people can +decide whether fixes for the module are worth downloading. + +INSTALLATION + +To install this module type the following: + + perl Makefile.PL + make + make test + make install + +DEPENDENCIES + +This module requires these other modules and libraries: + + $rm_prereq + +COPYRIGHT AND LICENCE + +Put the correct copyright and licence information here. + +$licence + +_RMEND_ +close(RM) || die "Can't close $ext$modpname/README: $!\n"; + +my $testdir = "t"; +my $testfile = "$testdir/$modpname.t"; +unless (-d "$testdir") { + mkdir "$testdir" or die "Cannot mkdir $testdir: $!\n"; +} +warn "Writing $ext$modpname/$testfile\n"; +my $tests = @const_names ? 2 : 1; + +open EX, ">$testfile" or die "Can't create $ext$modpname/$testfile: $!\n"; + +print EX <<_END_; +# Before `make install' is performed this script should be runnable with +# `make test'. After `make install' it should work as `perl $modpname.t' + +######################### + +# change 'tests => $tests' to 'tests => last_test_to_print'; + +_END_ + +my $test_mod = 'Test::More'; + +if ( $old_test or ($compat_version < 5.007 and not $new_test )) +{ + my $test_mod = 'Test'; + + print EX <<_END_; +use Test; +BEGIN { plan tests => $tests }; +use $module; +ok(1); # If we made it this far, we're ok. + +_END_ + + if (@const_names) { + my $const_names = join " ", @const_names; + print EX <<'_END_'; + +my $fail; +foreach my $constname (qw( +_END_ + + print EX wrap ("\t", "\t", $const_names); + print EX (")) {\n"); + + print EX <<_END_; + next if (eval "my \\\$a = \$constname; 1"); + if (\$\@ =~ /^Your vendor has not defined $module macro \$constname/) { + print "# pass: \$\@"; + } else { + print "# fail: \$\@"; + \$fail = 1; + } +} +if (\$fail) { + print "not ok 2\\n"; +} else { + print "ok 2\\n"; +} + +_END_ + } +} +else +{ + print EX <<_END_; +use Test::More tests => $tests; +BEGIN { use_ok('$module') }; + +_END_ + + if (@const_names) { + my $const_names = join " ", @const_names; + print EX <<'_END_'; + +my $fail = 0; +foreach my $constname (qw( +_END_ + + print EX wrap ("\t", "\t", $const_names); + print EX (")) {\n"); + + print EX <<_END_; + next if (eval "my \\\$a = \$constname; 1"); + if (\$\@ =~ /^Your vendor has not defined $module macro \$constname/) { + print "# pass: \$\@"; + } else { + print "# fail: \$\@"; + \$fail = 1; + } + +} + +ok( \$fail == 0 , 'Constants' ); +_END_ + } +} + +print EX <<_END_; +######################### + +# Insert your test code below, the $test_mod module is use()ed here so read +# its man page ( perldoc $test_mod ) for help writing this test script. + +_END_ + +close(EX) || die "Can't close $ext$modpname/$testfile: $!\n"; + +unless ($opt_C) { + warn "Writing $ext$modpname/Changes\n"; + $" = ' '; + open(EX, ">Changes") || die "Can't create $ext$modpname/Changes: $!\n"; + @ARGS = map {/[\s\"\'\`\$*?^|&<>\[\]\{\}\(\)]/ ? "'$_'" : $_} @ARGS; + print EX <MANIFEST') or die "Can't create MANIFEST: $!"; +my @files = grep { -f } (<*>, , <$fallbackdirname/*>, <$modpmdir/*>); +if (!@files) { + eval {opendir(D,'.');}; + unless ($@) { @files = readdir(D); closedir(D); } +} +if (!@files) { @files = map {chomp && $_} `ls`; } +if ($^O eq 'VMS') { + foreach (@files) { + # Clip trailing '.' for portability -- non-VMS OSs don't expect it + s%\.$%%; + # Fix up for case-sensitive file systems + s/$modfname/$modfname/i && next; + $_ = "\U$_" if $_ eq 'manifest' or $_ eq 'changes'; + $_ = 'Makefile.PL' if $_ eq 'makefile.pl'; + } +} +print MANI join("\n",@files), "\n"; +close MANI; + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/instmodsh b/Master/tlpkg/tlperl.straw/bin/instmodsh new file mode 100755 index 00000000000..5874aa61c7a --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/instmodsh @@ -0,0 +1,192 @@ +#!/usr/bin/perl -w + +use strict; +use IO::File; +use ExtUtils::Packlist; +use ExtUtils::Installed; + +use vars qw($Inst @Modules); + + +=head1 NAME + +instmodsh - A shell to examine installed modules + +=head1 SYNOPSIS + + instmodsh + +=head1 DESCRIPTION + +A little interface to ExtUtils::Installed to examine installed modules, +validate your packlists and even create a tarball from an installed module. + +=head1 SEE ALSO + +ExtUtils::Installed + +=cut + + +my $Module_Help = < - Create a tar archive of the module + h - Display module help + q - Quit the module +EOF + +my %Module_Commands = ( + f => \&list_installed, + d => \&list_directories, + v => \&validate_packlist, + t => \&create_archive, + h => \&module_help, + ); + +sub do_module($) { + my ($module) = @_; + + print($Module_Help); + MODULE_CMD: while (1) { + print("$module cmd? "); + + my $reply = ; chomp($reply); + my($cmd) = $reply =~ /^(\w)\b/; + + last if $cmd eq 'q'; + + if( $Module_Commands{$cmd} ) { + $Module_Commands{$cmd}->($reply, $module); + } + elsif( $cmd eq 'q' ) { + last MODULE_CMD; + } + else { + module_help(); + } + } +} + + +sub list_installed { + my($reply, $module) = @_; + + my $class = (split(' ', $reply))[1]; + $class = 'all' unless $class; + + my @files; + if (eval { @files = $Inst->files($module, $class); }) { + print("$class files in $module are:\n ", + join("\n ", @files), "\n"); + } + else { + print($@); + } +}; + + +sub list_directories { + my($reply, $module) = @_; + + my $class = (split(' ', $reply))[1]; + $class = 'all' unless $class; + + my @dirs; + if (eval { @dirs = $Inst->directories($module, $class); }) { + print("$class directories in $module are:\n ", + join("\n ", @dirs), "\n"); + } + else { + print($@); + } +} + + +sub create_archive { + my($reply, $module) = @_; + + my $file = (split(' ', $reply))[1]; + + if( !(defined $file and length $file) ) { + print "No tar file specified\n"; + } + elsif( eval { require Archive::Tar } ) { + Archive::Tar->create_archive($file, 0, $Inst->files($module)); + } + else { + my($first, @rest) = $Inst->files($module); + system('tar', 'cvf', $file, $first); + for my $f (@rest) { + system('tar', 'rvf', $file, $f); + } + print "Can't use tar\n" if $?; + } +} + + +sub validate_packlist { + my($reply, $module) = @_; + + if (my @missing = $Inst->validate($module)) { + print("Files missing from $module are:\n ", + join("\n ", @missing), "\n"); + } + else { + print("$module has no missing files\n"); + } +} + +sub module_help { + print $Module_Help; +} + + + +############################################################################## + +sub toplevel() +{ +my $help = < - Select a module + q - Quit the program +EOF +print($help); +while (1) + { + print("cmd? "); + my $reply = ; chomp($reply); + CASE: + { + $reply eq 'l' and do + { + print("Installed modules are:\n ", join("\n ", @Modules), "\n"); + last CASE; + }; + $reply =~ /^m\s+/ and do + { + do_module((split(' ', $reply))[1]); + last CASE; + }; + $reply eq 'q' and do + { + exit(0); + }; + # Default + print($help); + } + } +} + + +############################################################################### + +$Inst = ExtUtils::Installed->new(); +@Modules = $Inst->modules(); +toplevel(); + +############################################################################### diff --git a/Master/tlpkg/tlperl.straw/bin/instmodsh.bat b/Master/tlpkg/tlperl.straw/bin/instmodsh.bat new file mode 100755 index 00000000000..c72c0f22199 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/instmodsh.bat @@ -0,0 +1,208 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!/usr/bin/perl -w +#line 15 + +use strict; +use IO::File; +use ExtUtils::Packlist; +use ExtUtils::Installed; + +use vars qw($Inst @Modules); + + +=head1 NAME + +instmodsh - A shell to examine installed modules + +=head1 SYNOPSIS + + instmodsh + +=head1 DESCRIPTION + +A little interface to ExtUtils::Installed to examine installed modules, +validate your packlists and even create a tarball from an installed module. + +=head1 SEE ALSO + +ExtUtils::Installed + +=cut + + +my $Module_Help = < - Create a tar archive of the module + h - Display module help + q - Quit the module +EOF + +my %Module_Commands = ( + f => \&list_installed, + d => \&list_directories, + v => \&validate_packlist, + t => \&create_archive, + h => \&module_help, + ); + +sub do_module($) { + my ($module) = @_; + + print($Module_Help); + MODULE_CMD: while (1) { + print("$module cmd? "); + + my $reply = ; chomp($reply); + my($cmd) = $reply =~ /^(\w)\b/; + + last if $cmd eq 'q'; + + if( $Module_Commands{$cmd} ) { + $Module_Commands{$cmd}->($reply, $module); + } + elsif( $cmd eq 'q' ) { + last MODULE_CMD; + } + else { + module_help(); + } + } +} + + +sub list_installed { + my($reply, $module) = @_; + + my $class = (split(' ', $reply))[1]; + $class = 'all' unless $class; + + my @files; + if (eval { @files = $Inst->files($module, $class); }) { + print("$class files in $module are:\n ", + join("\n ", @files), "\n"); + } + else { + print($@); + } +}; + + +sub list_directories { + my($reply, $module) = @_; + + my $class = (split(' ', $reply))[1]; + $class = 'all' unless $class; + + my @dirs; + if (eval { @dirs = $Inst->directories($module, $class); }) { + print("$class directories in $module are:\n ", + join("\n ", @dirs), "\n"); + } + else { + print($@); + } +} + + +sub create_archive { + my($reply, $module) = @_; + + my $file = (split(' ', $reply))[1]; + + if( !(defined $file and length $file) ) { + print "No tar file specified\n"; + } + elsif( eval { require Archive::Tar } ) { + Archive::Tar->create_archive($file, 0, $Inst->files($module)); + } + else { + my($first, @rest) = $Inst->files($module); + system('tar', 'cvf', $file, $first); + for my $f (@rest) { + system('tar', 'rvf', $file, $f); + } + print "Can't use tar\n" if $?; + } +} + + +sub validate_packlist { + my($reply, $module) = @_; + + if (my @missing = $Inst->validate($module)) { + print("Files missing from $module are:\n ", + join("\n ", @missing), "\n"); + } + else { + print("$module has no missing files\n"); + } +} + +sub module_help { + print $Module_Help; +} + + + +############################################################################## + +sub toplevel() +{ +my $help = < - Select a module + q - Quit the program +EOF +print($help); +while (1) + { + print("cmd? "); + my $reply = ; chomp($reply); + CASE: + { + $reply eq 'l' and do + { + print("Installed modules are:\n ", join("\n ", @Modules), "\n"); + last CASE; + }; + $reply =~ /^m\s+/ and do + { + do_module((split(' ', $reply))[1]); + last CASE; + }; + $reply eq 'q' and do + { + exit(0); + }; + # Default + print($help); + } + } +} + + +############################################################################### + +$Inst = ExtUtils::Installed->new(); +@Modules = $Inst->modules(); +toplevel(); + +############################################################################### + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/json_xs b/Master/tlpkg/tlperl.straw/bin/json_xs new file mode 100755 index 00000000000..8509f64cf9e --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/json_xs @@ -0,0 +1,179 @@ +#!/opt/bin/perl + +=head1 NAME + +json_xs - JSON::XS commandline utility + +=head1 SYNOPSIS + + json_xs [-v] [-f inputformat] [-t outputformat] + +=head1 DESCRIPTION + +F converts between some input and output formats (one of them is +JSON). + +The default input format is C and the default output format is +C. + +=head1 OPTIONS + +=over 4 + +=item -v + +Be slightly more verbose. + +=item -f fromformat + +Read a file in the given format from STDIN. + +C can be one of: + +=over 4 + +=item json - a json text encoded, either utf-8, utf16-be/le, utf32-be/le + +=item storable - a Storable frozen value + +=item storable-file - a Storable file (Storable has two incompatible formats) + +=item clzf - Compress::LZF format (requires that module to be installed) + +=item yaml - YAML (avoid at all costs, requires the YAML module :) + +=back + +=item -t toformat + +Write the file in the given format to STDOUT. + +C can be one of: + +=over 4 + +=item json, json-utf-8 - json, utf-8 encoded + +=item json-pretty - as above, but pretty-printed + +=item json-utf-16le, json-utf-16be - little endian/big endian utf-16 + +=item json-utf-32le, json-utf-32be - little endian/big endian utf-32 + +=item storable - a Storable frozen value in network format + +=item storable-file - a Storable file in network format (Storable has two incompatible formats) + +=item clzf - Compress::LZF format + +=item yaml - YAML + +=back + +=back + +=head1 EXAMPLES + + json_xs -t null as JSON - if it +is valid JSON, the command outputs nothing, otherwise it will print an +error message and exit with non-zero exit status. + + pretty.json + +Prettify the JSON file F to F. + + json_xs -f storable-file and print a human-readable JSON +version of it to STDOUT. + + json_xs -f storable-file -t yaml and pretty-print it. + +=head1 AUTHOR + +Copyright (C) 2008 Marc Lehmann + +=cut + +use strict; + +use Getopt::Long; +use Storable (); +use Encode; + +use JSON::XS; + +my $opt_verbose; +my $opt_from = "json"; +my $opt_to = "json-pretty"; + +Getopt::Long::Configure ("bundling", "no_ignore_case", "require_order"); + +GetOptions( + "v" => \$opt_verbose, + "f=s" => \$opt_from, + "t=s" => \$opt_to, +) or die "Usage: $0 [-v] -f fromformat [-t toformat]\n"; + +my %F = ( + "json" => sub { + my $enc = + /^\x00\x00\x00/s ? "utf-32be" + : /^\x00.\x00/s ? "utf-16be" + : /^.\x00\x00\x00/s ? "utf-32le" + : /^.\x00.\x00/s ? "utf-16le" + : "utf-8"; + warn "input text encoding is $enc\n" if $opt_verbose; + JSON::XS->new->decode (decode $enc, $_) + }, + "storable" => sub { Storable::thaw $_ }, + "storable-file" => sub { open my $fh, "<", \$_; Storable::fd_retrieve $fh }, + "clzf" => sub { require Compress::LZF; Compress::LZF::sthaw ($_) }, + "yaml" => sub { require YAML; YAML::Load ($_) }, +); + +my %T = ( + "null" => sub { "" }, + "json" => sub { encode_json $_ }, + "json-utf-8" => sub { encode_json $_ }, + "json-pretty" => sub { JSON::XS->new->utf8->pretty->encode ($_) }, + "json-utf-16le" => sub { encode "utf-16le", JSON::XS->new->encode ($_) }, + "json-utf-16be" => sub { encode "utf-16be", JSON::XS->new->encode ($_) }, + "json-utf-32le" => sub { encode "utf-32le", JSON::XS->new->encode ($_) }, + "json-utf-32be" => sub { encode "utf-32be", JSON::XS->new->encode ($_) }, + + "storable" => sub { Storable::nfreeze $_ }, + "storable-file" => sub { open my $fh, ">", \my $buf; Storable::nstore_fd $_, $fh; $buf }, + + "clzf" => sub { require Compress::LZF; Compress::LZF::sfreeze_cr ($_) }, + "yaml" => sub { require YAML; YAML::Dump ($_) }, +); + +$F{$opt_from} + or die "$opt_from: not a valid fromformat\n"; + +$T{$opt_to} + or die "$opt_from: not a valid toformat\n"; + +{ + local $/; + binmode STDIN; # stupid perl sometimes thinks its funny + $_ = ; +} + +$_ = $F{$opt_from}->(); +$_ = $T{$opt_to}->(); + +binmode STDOUT; +print $_; + + + diff --git a/Master/tlpkg/tlperl.straw/bin/json_xs.bat b/Master/tlpkg/tlperl.straw/bin/json_xs.bat new file mode 100755 index 00000000000..306e47e0650 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/json_xs.bat @@ -0,0 +1,195 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!/opt/bin/perl +#line 15 + +=head1 NAME + +json_xs - JSON::XS commandline utility + +=head1 SYNOPSIS + + json_xs [-v] [-f inputformat] [-t outputformat] + +=head1 DESCRIPTION + +F converts between some input and output formats (one of them is +JSON). + +The default input format is C and the default output format is +C. + +=head1 OPTIONS + +=over 4 + +=item -v + +Be slightly more verbose. + +=item -f fromformat + +Read a file in the given format from STDIN. + +C can be one of: + +=over 4 + +=item json - a json text encoded, either utf-8, utf16-be/le, utf32-be/le + +=item storable - a Storable frozen value + +=item storable-file - a Storable file (Storable has two incompatible formats) + +=item clzf - Compress::LZF format (requires that module to be installed) + +=item yaml - YAML (avoid at all costs, requires the YAML module :) + +=back + +=item -t toformat + +Write the file in the given format to STDOUT. + +C can be one of: + +=over 4 + +=item json, json-utf-8 - json, utf-8 encoded + +=item json-pretty - as above, but pretty-printed + +=item json-utf-16le, json-utf-16be - little endian/big endian utf-16 + +=item json-utf-32le, json-utf-32be - little endian/big endian utf-32 + +=item storable - a Storable frozen value in network format + +=item storable-file - a Storable file in network format (Storable has two incompatible formats) + +=item clzf - Compress::LZF format + +=item yaml - YAML + +=back + +=back + +=head1 EXAMPLES + + json_xs -t null as JSON - if it +is valid JSON, the command outputs nothing, otherwise it will print an +error message and exit with non-zero exit status. + + pretty.json + +Prettify the JSON file F to F. + + json_xs -f storable-file and print a human-readable JSON +version of it to STDOUT. + + json_xs -f storable-file -t yaml and pretty-print it. + +=head1 AUTHOR + +Copyright (C) 2008 Marc Lehmann + +=cut + +use strict; + +use Getopt::Long; +use Storable (); +use Encode; + +use JSON::XS; + +my $opt_verbose; +my $opt_from = "json"; +my $opt_to = "json-pretty"; + +Getopt::Long::Configure ("bundling", "no_ignore_case", "require_order"); + +GetOptions( + "v" => \$opt_verbose, + "f=s" => \$opt_from, + "t=s" => \$opt_to, +) or die "Usage: $0 [-v] -f fromformat [-t toformat]\n"; + +my %F = ( + "json" => sub { + my $enc = + /^\x00\x00\x00/s ? "utf-32be" + : /^\x00.\x00/s ? "utf-16be" + : /^.\x00\x00\x00/s ? "utf-32le" + : /^.\x00.\x00/s ? "utf-16le" + : "utf-8"; + warn "input text encoding is $enc\n" if $opt_verbose; + JSON::XS->new->decode (decode $enc, $_) + }, + "storable" => sub { Storable::thaw $_ }, + "storable-file" => sub { open my $fh, "<", \$_; Storable::fd_retrieve $fh }, + "clzf" => sub { require Compress::LZF; Compress::LZF::sthaw ($_) }, + "yaml" => sub { require YAML; YAML::Load ($_) }, +); + +my %T = ( + "null" => sub { "" }, + "json" => sub { encode_json $_ }, + "json-utf-8" => sub { encode_json $_ }, + "json-pretty" => sub { JSON::XS->new->utf8->pretty->encode ($_) }, + "json-utf-16le" => sub { encode "utf-16le", JSON::XS->new->encode ($_) }, + "json-utf-16be" => sub { encode "utf-16be", JSON::XS->new->encode ($_) }, + "json-utf-32le" => sub { encode "utf-32le", JSON::XS->new->encode ($_) }, + "json-utf-32be" => sub { encode "utf-32be", JSON::XS->new->encode ($_) }, + + "storable" => sub { Storable::nfreeze $_ }, + "storable-file" => sub { open my $fh, ">", \my $buf; Storable::nstore_fd $_, $fh; $buf }, + + "clzf" => sub { require Compress::LZF; Compress::LZF::sfreeze_cr ($_) }, + "yaml" => sub { require YAML; YAML::Dump ($_) }, +); + +$F{$opt_from} + or die "$opt_from: not a valid fromformat\n"; + +$T{$opt_to} + or die "$opt_from: not a valid toformat\n"; + +{ + local $/; + binmode STDIN; # stupid perl sometimes thinks its funny + $_ = ; +} + +$_ = $F{$opt_from}->(); +$_ = $T{$opt_to}->(); + +binmode STDOUT; +print $_; + + + + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/largeprimes b/Master/tlpkg/tlperl.straw/bin/largeprimes new file mode 100755 index 00000000000..498bfbe9462 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/largeprimes @@ -0,0 +1,68 @@ +#!/usr/bin/perl -sI.. -I../lib/ -Ilib/ +## +## largeprimes -- generates large provable primes, uniformally distributed +## in random intervals, with maurer's recursive algorithm. +## +## Copyright (c) 1998, Vipul Ved Prakash. All rights reserved. +## This code is free software; you can redistribute it and/or modify +## it under the same terms as Perl itself. +## +## $Id$ + + +use Crypt::Primes; + +unless ( $bitsize ) { + print "$0 -bitsize=bits -num=number_of_primes -v=verbosity\n\n"; + exit 0; +} + +for ( $i=0; $i <= $num; $i++ ) { + my $prime = Crypt::Primes::maurer Size => $bitsize, + Verbosity => $v, + Generator => $generator; + my $g = 0; + if ( ref $prime eq 'HASH') { + $g = $prime->{Generator}; + $prime = $prime->{Prime}; + } + + if ($t) { print "$prime\n" } else { + print "\n" if $v; + print "random $bitsize bit prime: $prime"; + print ", $g" if $g; + print "\n"; + } +} + +=head1 NAME + +largeprimes -- generate large, random primes using Crypt::Primes. + +=head1 SYNOPSIS + + largeprimes -bitsize=128 -v + largeprimes -bitsize=512 -v=2 + largeprimes -bitsize=512 -v -num=10 + largeprimes -bitsize=1024 -generator -v + +=head1 DESCRIPTION + +largeprimes generates a provable prime of specified bitsize and prints it on +STDOUT. For more details see Crypt::Primes(3) manpage. + +=head1 SEE ALSO + +Crypt::Primes(3) + +=head1 AUTHOR + +Vipul Ved Prakash, mail@vipul.net + +=head1 LICENSE + +Artistic. + +=cut + + diff --git a/Master/tlpkg/tlperl.straw/bin/largeprimes.bat b/Master/tlpkg/tlperl.straw/bin/largeprimes.bat new file mode 100755 index 00000000000..81b48044af1 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/largeprimes.bat @@ -0,0 +1,84 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!/usr/bin/perl -sI.. -I../lib/ -Ilib/ +#line 15 +## +## largeprimes -- generates large provable primes, uniformally distributed +## in random intervals, with maurer's recursive algorithm. +## +## Copyright (c) 1998, Vipul Ved Prakash. All rights reserved. +## This code is free software; you can redistribute it and/or modify +## it under the same terms as Perl itself. +## +## $Id$ + + +use Crypt::Primes; + +unless ( $bitsize ) { + print "$0 -bitsize=bits -num=number_of_primes -v=verbosity\n\n"; + exit 0; +} + +for ( $i=0; $i <= $num; $i++ ) { + my $prime = Crypt::Primes::maurer Size => $bitsize, + Verbosity => $v, + Generator => $generator; + my $g = 0; + if ( ref $prime eq 'HASH') { + $g = $prime->{Generator}; + $prime = $prime->{Prime}; + } + + if ($t) { print "$prime\n" } else { + print "\n" if $v; + print "random $bitsize bit prime: $prime"; + print ", $g" if $g; + print "\n"; + } +} + +=head1 NAME + +largeprimes -- generate large, random primes using Crypt::Primes. + +=head1 SYNOPSIS + + largeprimes -bitsize=128 -v + largeprimes -bitsize=512 -v=2 + largeprimes -bitsize=512 -v -num=10 + largeprimes -bitsize=1024 -generator -v + +=head1 DESCRIPTION + +largeprimes generates a provable prime of specified bitsize and prints it on +STDOUT. For more details see Crypt::Primes(3) manpage. + +=head1 SEE ALSO + +Crypt::Primes(3) + +=head1 AUTHOR + +Vipul Ved Prakash, mail@vipul.net + +=head1 LICENSE + +Artistic. + +=cut + + + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/libnetcfg.bat b/Master/tlpkg/tlperl.straw/bin/libnetcfg.bat new file mode 100755 index 00000000000..aacd5fe7490 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/libnetcfg.bat @@ -0,0 +1,737 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!perl +#line 15 + eval 'exec C:\strawberry\perl\bin\perl.exe -S $0 ${1+"$@"}' + if $running_under_some_shell; + +=head1 NAME + +libnetcfg - configure libnet + +=head1 DESCRIPTION + +The libnetcfg utility can be used to configure the libnet. +Starting from perl 5.8 libnet is part of the standard Perl +distribution, but the libnetcfg can be used for any libnet +installation. + +=head1 USAGE + +Without arguments libnetcfg displays the current configuration. + + $ libnetcfg + # old config ./libnet.cfg + daytime_hosts ntp1.none.such + ftp_int_passive 0 + ftp_testhost ftp.funet.fi + inet_domain none.such + nntp_hosts nntp.none.such + ph_hosts + pop3_hosts pop.none.such + smtp_hosts smtp.none.such + snpp_hosts + test_exist 1 + test_hosts 1 + time_hosts ntp.none.such + # libnetcfg -h for help + $ + +It tells where the old configuration file was found (if found). + +The C<-h> option will show a usage message. + +To change the configuration you will need to use either the C<-c> or +the C<-d> options. + +The default name of the old configuration file is by default +"libnet.cfg", unless otherwise specified using the -i option, +C<-i oldfile>, and it is searched first from the current directory, +and then from your module path. + +The default name of the new configuration file is "libnet.cfg", and by +default it is written to the current directory, unless otherwise +specified using the -o option, C<-o newfile>. + +=head1 SEE ALSO + +L, L + +=head1 AUTHORS + +Graham Barr, the original Configure script of libnet. + +Jarkko Hietaniemi, conversion into libnetcfg for inclusion into Perl 5.8. + +=cut + +# $Id: Configure,v 1.8 1997/03/04 09:22:32 gbarr Exp $ + +use strict; +use IO::File; +use Getopt::Std; +use ExtUtils::MakeMaker qw(prompt); +use File::Spec; + +use vars qw($opt_d $opt_c $opt_h $opt_o $opt_i); + +## +## +## + +my %cfg = (); +my @cfg = (); + +my($libnet_cfg_in,$libnet_cfg_out,$msg,$ans,$def,$have_old); + +## +## +## + +sub valid_host +{ + my $h = shift; + + defined($h) && (($cfg{'test_exist'} == 0) || gethostbyname($h)); +} + +## +## +## + +sub test_hostnames (\@) +{ + my $hlist = shift; + my @h = (); + my $host; + my $err = 0; + + foreach $host (@$hlist) + { + if(valid_host($host)) + { + push(@h, $host); + next; + } + warn "Bad hostname: '$host'\n"; + $err++; + } + @$hlist = @h; + $err ? join(" ",@h) : undef; +} + +## +## +## + +sub Prompt +{ + my($prompt,$def) = @_; + + $def = "" unless defined $def; + + chomp($prompt); + + if($opt_d) + { + print $prompt,," [",$def,"]\n"; + return $def; + } + prompt($prompt,$def); +} + +## +## +## + +sub get_host_list +{ + my($prompt,$def) = @_; + + $def = join(" ",@$def) if ref($def); + + my @hosts; + + do + { + my $ans = Prompt($prompt,$def); + + $ans =~ s/(\A\s+|\s+\Z)//g; + + @hosts = split(/\s+/, $ans); + } + while(@hosts && defined($def = test_hostnames(@hosts))); + + \@hosts; +} + +## +## +## + +sub get_hostname +{ + my($prompt,$def) = @_; + + my $host; + + while(1) + { + my $ans = Prompt($prompt,$def); + $host = ($ans =~ /(\S*)/)[0]; + last + if(!length($host) || valid_host($host)); + + $def ="" + if $def eq $host; + + print <<"EDQ"; + +*** ERROR: + Hostname `$host' does not seem to exist, please enter again + or a single space to clear any default + +EDQ + } + + length $host + ? $host + : undef; +} + +## +## +## + +sub get_bool ($$) +{ + my($prompt,$def) = @_; + + chomp($prompt); + + my $val = Prompt($prompt,$def ? "yes" : "no"); + + $val =~ /^y/i ? 1 : 0; +} + +## +## +## + +sub get_netmask ($$) +{ + my($prompt,$def) = @_; + + chomp($prompt); + + my %list; + @list{@$def} = (); + +MASK: + while(1) { + my $bad = 0; + my $ans = Prompt($prompt) or last; + + if($ans eq '*') { + %list = (); + next; + } + + if($ans eq '=') { + print "\n",( %list ? join("\n", sort keys %list) : 'none'),"\n\n"; + next; + } + + unless ($ans =~ m{^\s*(?:(-?\s*)(\d+(?:\.\d+){0,3})/(\d+))}) { + warn "Bad netmask '$ans'\n"; + next; + } + + my($remove,$bits,@ip) = ($1,$3,split(/\./, $2),0,0,0); + if ( $ip[0] < 1 || $bits < 1 || $bits > 32) { + warn "Bad netmask '$ans'\n"; + next MASK; + } + foreach my $byte (@ip) { + if ( $byte > 255 ) { + warn "Bad netmask '$ans'\n"; + next MASK; + } + } + + my $mask = sprintf("%d.%d.%d.%d/%d",@ip[0..3],$bits); + + if ($remove) { + delete $list{$mask}; + } + else { + $list{$mask} = 1; + } + + } + + [ keys %list ]; +} + +## +## +## + +sub default_hostname +{ + my $host; + my @host; + + foreach $host (@_) + { + if(defined($host) && valid_host($host)) + { + return $host + unless wantarray; + push(@host,$host); + } + } + + return wantarray ? @host : undef; +} + +## +## +## + +getopts('dcho:i:'); + +$libnet_cfg_in = "libnet.cfg" + unless(defined($libnet_cfg_in = $opt_i)); + +$libnet_cfg_out = "libnet.cfg" + unless(defined($libnet_cfg_out = $opt_o)); + +my %oldcfg = (); + +$Net::Config::CONFIGURE = 1; # Suppress load of user overrides +if( -f $libnet_cfg_in ) + { + %oldcfg = ( %{ do $libnet_cfg_in } ); + } +elsif (eval { require Net::Config }) + { + $have_old = 1; + %oldcfg = %Net::Config::NetConfig; + } + +map { $cfg{lc $_} = $cfg{$_}; delete $cfg{$_} if /[A-Z]/ } keys %cfg; + +#--------------------------------------------------------------------------- + +if ($opt_h) { + print <, and it is searched first from the current directory, +and then from your module path. + +The default name of the new configuration file is "libnet.cfg", and by +default it is written to the current directory, unless otherwise +specified using the -o option. + +EOU + exit(0); +} + +#--------------------------------------------------------------------------- + +{ + my $oldcfgfile; + my @inc; + push @inc, $ENV{PERL5LIB} if exists $ENV{PERL5LIB}; + push @inc, $ENV{PERLLIB} if exists $ENV{PERLLIB}; + push @inc, @INC; + for (@inc) { + my $trycfgfile = File::Spec->catfile($_, $libnet_cfg_in); + if (-f $trycfgfile && -r $trycfgfile) { + $oldcfgfile = $trycfgfile; + last; + } + } + print "# old config $oldcfgfile\n" if defined $oldcfgfile; + for (sort keys %oldcfg) { + printf "%-20s %s\n", $_, + ref $oldcfg{$_} ? @{$oldcfg{$_}} : $oldcfg{$_}; + } + unless ($opt_c || $opt_d) { + print "# $0 -h for help\n"; + exit(0); + } +} + +#--------------------------------------------------------------------------- + +$oldcfg{'test_exist'} = 1 unless exists $oldcfg{'test_exist'}; +$oldcfg{'test_hosts'} = 1 unless exists $oldcfg{'test_hosts'}; + +#--------------------------------------------------------------------------- + +if($have_old && !$opt_d) + { + $msg = <. To accept the +default, hit + +EDQ + +$msg = 'Enter a list of available NNTP hosts :'; + +$def = $oldcfg{'nntp_hosts'} || + [ default_hostname($ENV{NNTPSERVER},$ENV{NEWSHOST},'news') ]; + +$cfg{'nntp_hosts'} = get_host_list($msg,$def); + +#--------------------------------------------------------------------------- + +$msg = 'Enter a list of available SMTP hosts :'; + +$def = $oldcfg{'smtp_hosts'} || + [ default_hostname(split(/:/,$ENV{SMTPHOSTS} || ""), 'mailhost') ]; + +$cfg{'smtp_hosts'} = get_host_list($msg,$def); + +#--------------------------------------------------------------------------- + +$msg = 'Enter a list of available POP3 hosts :'; + +$def = $oldcfg{'pop3_hosts'} || []; + +$cfg{'pop3_hosts'} = get_host_list($msg,$def); + +#--------------------------------------------------------------------------- + +$msg = 'Enter a list of available SNPP hosts :'; + +$def = $oldcfg{'snpp_hosts'} || []; + +$cfg{'snpp_hosts'} = get_host_list($msg,$def); + +#--------------------------------------------------------------------------- + +$msg = 'Enter a list of available PH Hosts :' ; + +$def = $oldcfg{'ph_hosts'} || + [ default_hostname('dirserv') ]; + +$cfg{'ph_hosts'} = get_host_list($msg,$def); + +#--------------------------------------------------------------------------- + +$msg = 'Enter a list of available TIME Hosts :' ; + +$def = $oldcfg{'time_hosts'} || []; + +$cfg{'time_hosts'} = get_host_list($msg,$def); + +#--------------------------------------------------------------------------- + +$msg = 'Enter a list of available DAYTIME Hosts :' ; + +$def = $oldcfg{'daytime_hosts'} || $oldcfg{'time_hosts'}; + +$cfg{'daytime_hosts'} = get_host_list($msg,$def); + +#--------------------------------------------------------------------------- + +$msg = < external user & password +fwuser/fwpass => firewall user & password + +0) None +1) ----------------------- + USER user@remote.host + PASS pass +2) ----------------------- + USER fwuser + PASS fwpass + USER user@remote.host + PASS pass +3) ----------------------- + USER fwuser + PASS fwpass + SITE remote.site + USER user + PASS pass +4) ----------------------- + USER fwuser + PASS fwpass + OPEN remote.site + USER user + PASS pass +5) ----------------------- + USER user@fwuser@remote.site + PASS pass@fwpass +6) ----------------------- + USER fwuser@remote.site + PASS fwpass + USER user + PASS pass +7) ----------------------- + USER user@remote.host + PASS pass + AUTH fwuser + RESP fwpass + +Choice: +EDQ + $def = exists $oldcfg{'ftp_firewall_type'} ? $oldcfg{'ftp_firewall_type'} : 1; + $ans = Prompt($msg,$def); + $cfg{'ftp_firewall_type'} = 0+$ans; + $def = $oldcfg{'ftp_firewall'} || $ENV{FTP_FIREWALL}; + + $cfg{'ftp_firewall'} = get_hostname("FTP proxy hostname :", $def); +} +else { + delete $cfg{'ftp_firewall'}; +} + + +#--------------------------------------------------------------------------- + +if (defined $cfg{'ftp_firewall'}) + { + print <new($libnet_cfg_out, "w") or + die "Cannot create `$libnet_cfg_out': $!"; + +print "Writing $libnet_cfg_out\n"; + +print $fh "{\n"; + +my $key; +foreach $key (keys %cfg) { + my $val = $cfg{$key}; + if(!defined($val)) { + $val = "undef"; + } + elsif(ref($val)) { + $val = '[' . join(",", + map { + my $v = "undef"; + if(defined $_) { + ($v = $_) =~ s/'/\'/sog; + $v = "'" . $v . "'"; + } + $v; + } @$val ) . ']'; + } + else { + $val =~ s/'/\'/sog; + $val = "'" . $val . "'" if $val =~ /\D/; + } + print $fh "\t'",$key,"' => ",$val,",\n"; +} + +print $fh "}\n"; + +$fh->close; + +############################################################################ +############################################################################ + +exit 0; + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/lwp-download b/Master/tlpkg/tlperl.straw/bin/lwp-download new file mode 100755 index 00000000000..a85ac551d9f --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/lwp-download @@ -0,0 +1,320 @@ +#!/usr/bin/perl -w + +=head1 NAME + +lwp-download - Fetch large files from the web + +=head1 SYNOPSIS + +B [B<-a>] > [>] + +=head1 DESCRIPTION + +The B program will save the file at I to a local +file. + +If I is not specified, then the current directory is +assumed. + +If I is a directory, then the basename of the file to save +is picked up from the Content-Disposition header or the URL of the +response. If the file already exists, then B will +prompt before it overwrites and will fail if its standard input is not +a terminal. This form of invocation will also fail is no acceptable +filename can be derived from the sources mentioned above. + +If I is not a directory, then it is simply used as the +path to save into. + +The I program is implemented using the I +library. It is better suited to down load big files than the +I program because it does not store the file in memory. +Another benefit is that it will keep you updated about its progress +and that you don't have much options to worry about. + +Use the C<-a> option to save the file in text (ascii) mode. Might +make a difference on dosish systems. + +=head1 EXAMPLE + +Fetch the newest and greatest perl version: + + $ lwp-download http://www.perl.com/CPAN/src/latest.tar.gz + Saving to 'latest.tar.gz'... + 11.4 MB received in 8 seconds (1.43 MB/sec) + +=head1 AUTHOR + +Gisle Aas + +=cut + +#' get emacs out of quote mode + +use strict; + +use LWP::UserAgent (); +use LWP::MediaTypes qw(guess_media_type media_suffix); +use URI (); +use HTTP::Date (); + +my $progname = $0; +$progname =~ s,.*/,,; # only basename left in progname +$progname =~ s,.*\\,, if $^O eq "MSWin32"; +$progname =~ s/\.\w*$//; # strip extension if any + +#parse option +use Getopt::Std; +my %opt; +unless (getopts('a', \%opt)) { + usage(); +} + +my $url = URI->new(shift || usage()); +my $argfile = shift; +usage() if defined($argfile) && !length($argfile); +my $VERSION = "5.827"; + +my $ua = LWP::UserAgent->new( + agent => "lwp-download/$VERSION ", + keep_alive => 1, + env_proxy => 1, +); + +my $file; # name of file we download into +my $length; # total number of bytes to download +my $flength; # formatted length +my $size = 0; # number of bytes received +my $start_t; # start time of download +my $last_dur; # time of last callback + +my $shown = 0; # have we called the show() function yet + +$SIG{INT} = sub { die "Interrupted\n"; }; + +$| = 1; # autoflush + +my $res = $ua->request(HTTP::Request->new(GET => $url), + sub { + unless(defined $file) { + my $res = $_[1]; + + my $directory; + if (defined $argfile && -d $argfile) { + ($directory, $argfile) = ($argfile, undef); + } + + unless (defined $argfile) { + # find a suitable name to use + $file = $res->filename; + + # if this fails we try to make something from the URL + unless ($file) { + my $req = $res->request; # not always there + my $rurl = $req ? $req->uri : $url; + + $file = ($rurl->path_segments)[-1]; + if (!defined($file) || !length($file)) { + $file = "index"; + my $suffix = media_suffix($res->content_type); + $file .= ".$suffix" if $suffix; + } + elsif ($rurl->scheme eq 'ftp' || + $file =~ /\.t[bg]z$/ || + $file =~ /\.tar(\.(Z|gz|bz2?))?$/ + ) { + # leave the filename as it was + } + else { + my $ct = guess_media_type($file); + unless ($ct eq $res->content_type) { + # need a better suffix for this type + my $suffix = media_suffix($res->content_type); + $file .= ".$suffix" if $suffix; + } + } + } + + # validate that we don't have a harmful filename now. The server + # might try to trick us into doing something bad. + if (!length($file) || + $file =~ s/([^a-zA-Z0-9_\.\-\+\~])/sprintf "\\x%02x", ord($1)/ge) + { + die "Will not save <$url> as \"$file\".\nPlease override file name on the command line.\n"; + } + + if (defined $directory) { + require File::Spec; + $file = File::Spec->catfile($directory, $file); + } + + # Check if the file is already present + if (-l $file) { + die "Will not save <$url> to link \"$file\".\nPlease override file name on the command line.\n"; + } + elsif (-f _) { + die "Will not save <$url> as \"$file\" without verification.\nEither run from terminal or override file name on the command line.\n" + unless -t; + $shown = 1; + print "Overwrite $file? [y] "; + my $ans = ; + unless (defined($ans) && $ans =~ /^y?\n/) { + if (defined $ans) { + print "Ok, aborting.\n"; + } + else { + print "\nAborting.\n"; + } + exit 1; + } + $shown = 0; + } + elsif (-e _) { + die "Will not save <$url> as \"$file\". Path exists.\n"; + } + else { + print "Saving to '$file'...\n"; + } + } + else { + $file = $argfile; + } + open(FILE, ">$file") || die "Can't open $file: $!\n"; + binmode FILE unless $opt{a}; + $length = $res->content_length; + $flength = fbytes($length) if defined $length; + $start_t = time; + $last_dur = 0; + } + + print FILE $_[0] or die "Can't write to $file: $!\n"; + $size += length($_[0]); + + if (defined $length) { + my $dur = time - $start_t; + if ($dur != $last_dur) { # don't update too often + $last_dur = $dur; + my $perc = $size / $length; + my $speed; + $speed = fbytes($size/$dur) . "/sec" if $dur > 3; + my $secs_left = fduration($dur/$perc - $dur); + $perc = int($perc*100); + my $show = "$perc% of $flength"; + $show .= " (at $speed, $secs_left remaining)" if $speed; + show($show, 1); + } + } + else { + show( fbytes($size) . " received"); + } + } +); + +if (fileno(FILE)) { + close(FILE) || die "Can't write to $file: $!\n"; + + show(""); # clear text + print "\r"; + print fbytes($size); + print " of ", fbytes($length) if defined($length) && $length != $size; + print " received"; + my $dur = time - $start_t; + if ($dur) { + my $speed = fbytes($size/$dur) . "/sec"; + print " in ", fduration($dur), " ($speed)"; + } + print "\n"; + + if (my $mtime = $res->last_modified) { + utime time, $mtime, $file; + } + + if ($res->header("X-Died") || !$res->is_success) { + if (my $died = $res->header("X-Died")) { + print "$died\n"; + } + if (-t) { + print "Transfer aborted. Delete $file? [n] "; + my $ans = ; + if (defined($ans) && $ans =~ /^y\n/) { + unlink($file) && print "Deleted.\n"; + } + elsif ($length > $size) { + print "Truncated file kept: ", fbytes($length - $size), " missing\n"; + } + else { + print "File kept.\n"; + } + exit 1; + } + else { + print "Transfer aborted, $file kept\n"; + } + } + exit 0; +} + +# Did not manage to create any file +print "\n" if $shown; +if (my $xdied = $res->header("X-Died")) { + print "$progname: Aborted\n$xdied\n"; +} +else { + print "$progname: ", $res->status_line, "\n"; +} +exit 1; + + +sub fbytes +{ + my $n = int(shift); + if ($n >= 1024 * 1024) { + return sprintf "%.3g MB", $n / (1024.0 * 1024); + } + elsif ($n >= 1024) { + return sprintf "%.3g KB", $n / 1024.0; + } + else { + return "$n bytes"; + } +} + +sub fduration +{ + use integer; + my $secs = int(shift); + my $hours = $secs / (60*60); + $secs -= $hours * 60*60; + my $mins = $secs / 60; + $secs %= 60; + if ($hours) { + return "$hours hours $mins minutes"; + } + elsif ($mins >= 2) { + return "$mins minutes"; + } + else { + $secs += $mins * 60; + return "$secs seconds"; + } +} + + +BEGIN { + my @ani = qw(- \ | /); + my $ani = 0; + + sub show + { + my($mess, $show_ani) = @_; + print "\r$mess" . (" " x (75 - length $mess)); + print $show_ani ? "$ani[$ani++]\b" : " "; + $ani %= @ani; + $shown++; + } +} + +sub usage +{ + die "Usage: $progname [-a] []\n"; +} diff --git a/Master/tlpkg/tlperl.straw/bin/lwp-download.bat b/Master/tlpkg/tlperl.straw/bin/lwp-download.bat new file mode 100755 index 00000000000..ec045baf4e9 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/lwp-download.bat @@ -0,0 +1,336 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!/usr/bin/perl -w +#line 15 + +=head1 NAME + +lwp-download - Fetch large files from the web + +=head1 SYNOPSIS + +B [B<-a>] > [>] + +=head1 DESCRIPTION + +The B program will save the file at I to a local +file. + +If I is not specified, then the current directory is +assumed. + +If I is a directory, then the basename of the file to save +is picked up from the Content-Disposition header or the URL of the +response. If the file already exists, then B will +prompt before it overwrites and will fail if its standard input is not +a terminal. This form of invocation will also fail is no acceptable +filename can be derived from the sources mentioned above. + +If I is not a directory, then it is simply used as the +path to save into. + +The I program is implemented using the I +library. It is better suited to down load big files than the +I program because it does not store the file in memory. +Another benefit is that it will keep you updated about its progress +and that you don't have much options to worry about. + +Use the C<-a> option to save the file in text (ascii) mode. Might +make a difference on dosish systems. + +=head1 EXAMPLE + +Fetch the newest and greatest perl version: + + $ lwp-download http://www.perl.com/CPAN/src/latest.tar.gz + Saving to 'latest.tar.gz'... + 11.4 MB received in 8 seconds (1.43 MB/sec) + +=head1 AUTHOR + +Gisle Aas + +=cut + +#' get emacs out of quote mode + +use strict; + +use LWP::UserAgent (); +use LWP::MediaTypes qw(guess_media_type media_suffix); +use URI (); +use HTTP::Date (); + +my $progname = $0; +$progname =~ s,.*/,,; # only basename left in progname +$progname =~ s,.*\\,, if $^O eq "MSWin32"; +$progname =~ s/\.\w*$//; # strip extension if any + +#parse option +use Getopt::Std; +my %opt; +unless (getopts('a', \%opt)) { + usage(); +} + +my $url = URI->new(shift || usage()); +my $argfile = shift; +usage() if defined($argfile) && !length($argfile); +my $VERSION = "5.827"; + +my $ua = LWP::UserAgent->new( + agent => "lwp-download/$VERSION ", + keep_alive => 1, + env_proxy => 1, +); + +my $file; # name of file we download into +my $length; # total number of bytes to download +my $flength; # formatted length +my $size = 0; # number of bytes received +my $start_t; # start time of download +my $last_dur; # time of last callback + +my $shown = 0; # have we called the show() function yet + +$SIG{INT} = sub { die "Interrupted\n"; }; + +$| = 1; # autoflush + +my $res = $ua->request(HTTP::Request->new(GET => $url), + sub { + unless(defined $file) { + my $res = $_[1]; + + my $directory; + if (defined $argfile && -d $argfile) { + ($directory, $argfile) = ($argfile, undef); + } + + unless (defined $argfile) { + # find a suitable name to use + $file = $res->filename; + + # if this fails we try to make something from the URL + unless ($file) { + my $req = $res->request; # not always there + my $rurl = $req ? $req->uri : $url; + + $file = ($rurl->path_segments)[-1]; + if (!defined($file) || !length($file)) { + $file = "index"; + my $suffix = media_suffix($res->content_type); + $file .= ".$suffix" if $suffix; + } + elsif ($rurl->scheme eq 'ftp' || + $file =~ /\.t[bg]z$/ || + $file =~ /\.tar(\.(Z|gz|bz2?))?$/ + ) { + # leave the filename as it was + } + else { + my $ct = guess_media_type($file); + unless ($ct eq $res->content_type) { + # need a better suffix for this type + my $suffix = media_suffix($res->content_type); + $file .= ".$suffix" if $suffix; + } + } + } + + # validate that we don't have a harmful filename now. The server + # might try to trick us into doing something bad. + if (!length($file) || + $file =~ s/([^a-zA-Z0-9_\.\-\+\~])/sprintf "\\x%02x", ord($1)/ge) + { + die "Will not save <$url> as \"$file\".\nPlease override file name on the command line.\n"; + } + + if (defined $directory) { + require File::Spec; + $file = File::Spec->catfile($directory, $file); + } + + # Check if the file is already present + if (-l $file) { + die "Will not save <$url> to link \"$file\".\nPlease override file name on the command line.\n"; + } + elsif (-f _) { + die "Will not save <$url> as \"$file\" without verification.\nEither run from terminal or override file name on the command line.\n" + unless -t; + $shown = 1; + print "Overwrite $file? [y] "; + my $ans = ; + unless (defined($ans) && $ans =~ /^y?\n/) { + if (defined $ans) { + print "Ok, aborting.\n"; + } + else { + print "\nAborting.\n"; + } + exit 1; + } + $shown = 0; + } + elsif (-e _) { + die "Will not save <$url> as \"$file\". Path exists.\n"; + } + else { + print "Saving to '$file'...\n"; + } + } + else { + $file = $argfile; + } + open(FILE, ">$file") || die "Can't open $file: $!\n"; + binmode FILE unless $opt{a}; + $length = $res->content_length; + $flength = fbytes($length) if defined $length; + $start_t = time; + $last_dur = 0; + } + + print FILE $_[0] or die "Can't write to $file: $!\n"; + $size += length($_[0]); + + if (defined $length) { + my $dur = time - $start_t; + if ($dur != $last_dur) { # don't update too often + $last_dur = $dur; + my $perc = $size / $length; + my $speed; + $speed = fbytes($size/$dur) . "/sec" if $dur > 3; + my $secs_left = fduration($dur/$perc - $dur); + $perc = int($perc*100); + my $show = "$perc% of $flength"; + $show .= " (at $speed, $secs_left remaining)" if $speed; + show($show, 1); + } + } + else { + show( fbytes($size) . " received"); + } + } +); + +if (fileno(FILE)) { + close(FILE) || die "Can't write to $file: $!\n"; + + show(""); # clear text + print "\r"; + print fbytes($size); + print " of ", fbytes($length) if defined($length) && $length != $size; + print " received"; + my $dur = time - $start_t; + if ($dur) { + my $speed = fbytes($size/$dur) . "/sec"; + print " in ", fduration($dur), " ($speed)"; + } + print "\n"; + + if (my $mtime = $res->last_modified) { + utime time, $mtime, $file; + } + + if ($res->header("X-Died") || !$res->is_success) { + if (my $died = $res->header("X-Died")) { + print "$died\n"; + } + if (-t) { + print "Transfer aborted. Delete $file? [n] "; + my $ans = ; + if (defined($ans) && $ans =~ /^y\n/) { + unlink($file) && print "Deleted.\n"; + } + elsif ($length > $size) { + print "Truncated file kept: ", fbytes($length - $size), " missing\n"; + } + else { + print "File kept.\n"; + } + exit 1; + } + else { + print "Transfer aborted, $file kept\n"; + } + } + exit 0; +} + +# Did not manage to create any file +print "\n" if $shown; +if (my $xdied = $res->header("X-Died")) { + print "$progname: Aborted\n$xdied\n"; +} +else { + print "$progname: ", $res->status_line, "\n"; +} +exit 1; + + +sub fbytes +{ + my $n = int(shift); + if ($n >= 1024 * 1024) { + return sprintf "%.3g MB", $n / (1024.0 * 1024); + } + elsif ($n >= 1024) { + return sprintf "%.3g KB", $n / 1024.0; + } + else { + return "$n bytes"; + } +} + +sub fduration +{ + use integer; + my $secs = int(shift); + my $hours = $secs / (60*60); + $secs -= $hours * 60*60; + my $mins = $secs / 60; + $secs %= 60; + if ($hours) { + return "$hours hours $mins minutes"; + } + elsif ($mins >= 2) { + return "$mins minutes"; + } + else { + $secs += $mins * 60; + return "$secs seconds"; + } +} + + +BEGIN { + my @ani = qw(- \ | /); + my $ani = 0; + + sub show + { + my($mess, $show_ani) = @_; + print "\r$mess" . (" " x (75 - length $mess)); + print $show_ani ? "$ani[$ani++]\b" : " "; + $ani %= @ani; + $shown++; + } +} + +sub usage +{ + die "Usage: $progname [-a] []\n"; +} + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/lwp-dump b/Master/tlpkg/tlperl.straw/bin/lwp-dump new file mode 100755 index 00000000000..1805eb56138 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/lwp-dump @@ -0,0 +1,107 @@ +#!/usr/bin/perl -w + +use strict; +use LWP::UserAgent (); +use Getopt::Long qw(GetOptions); + +my $VERSION = "5.827"; + +GetOptions(\my %opt, + 'parse-head', + 'max-length=n', + 'keep-client-headers', + 'method=s', + 'agent=s', +) || usage(); + +my $url = shift || usage(); +@ARGV && usage(); + +sub usage { + (my $progname = $0) =~ s,.*/,,; + die <<"EOT"; +Usage: $progname [options] + +Recognized options are: + --agent + --keep-client-headers + --max-length + --method + --parse-head + +EOT +} + +my $ua = LWP::UserAgent->new( + parse_head => $opt{'parse-head'} || 0, + keep_alive => 1, + env_proxy => 1, + agent => $opt{agent} || "lwp-dump/$VERSION ", +); + +my $req = HTTP::Request->new($opt{method} || 'GET' => $url); +my $res = $ua->simple_request($req); +$res->remove_header(grep /^Client-/, $res->header_field_names) + unless $opt{'keep-client-headers'} or + ($res->header("Client-Warning") || "") eq "Internal response"; + +$res->dump(maxlength => $opt{'max-length'}); + +__END__ + +=head1 NAME + +lwp-dump - See what headers and content is returned for a URL + +=head1 SYNOPSIS + +B [ I ] I + +=head1 DESCRIPTION + +The B program will get the resource indentified by the URL and then +dump the response object to STDOUT. This will display the headers returned and +the initial part of the content, escaped so that it's safe to display even +binary content. The escapes syntax used is the same as for Perl's double +quoted strings. If there is no content the string "(no content)" is shown in +its place. + +The following options are recognized: + +=over + +=item B<--agent> I + +Override the user agent string passed to the server. + +=item B<--keep-client-headers> + +LWP internally generate various C headers that are stripped by +B in order to show the headers exactly as the server provided them. +This option will suppress this. + +=item B<--max-length> I + +How much of the content to show. The default is 512. Set this +to 0 for unlimited. + +If the content is longer then the string is chopped at the +limit and the string "...\n(### more bytes not shown)" +appended. + +=item B<--method> I + +Use the given method for the request instead of the default "GET". + +=item B<--parse-head> + +By default B will not try to initialize headers by looking at the +head section of HTML documents. This option enables this. This corresponds to +L. + +=back + +=head1 SEE ALSO + +L, L, L + diff --git a/Master/tlpkg/tlperl.straw/bin/lwp-dump.bat b/Master/tlpkg/tlperl.straw/bin/lwp-dump.bat new file mode 100755 index 00000000000..fcd6ac64baf --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/lwp-dump.bat @@ -0,0 +1,123 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!/usr/bin/perl -w +#line 15 + +use strict; +use LWP::UserAgent (); +use Getopt::Long qw(GetOptions); + +my $VERSION = "5.827"; + +GetOptions(\my %opt, + 'parse-head', + 'max-length=n', + 'keep-client-headers', + 'method=s', + 'agent=s', +) || usage(); + +my $url = shift || usage(); +@ARGV && usage(); + +sub usage { + (my $progname = $0) =~ s,.*/,,; + die <<"EOT"; +Usage: $progname [options] + +Recognized options are: + --agent + --keep-client-headers + --max-length + --method + --parse-head + +EOT +} + +my $ua = LWP::UserAgent->new( + parse_head => $opt{'parse-head'} || 0, + keep_alive => 1, + env_proxy => 1, + agent => $opt{agent} || "lwp-dump/$VERSION ", +); + +my $req = HTTP::Request->new($opt{method} || 'GET' => $url); +my $res = $ua->simple_request($req); +$res->remove_header(grep /^Client-/, $res->header_field_names) + unless $opt{'keep-client-headers'} or + ($res->header("Client-Warning") || "") eq "Internal response"; + +$res->dump(maxlength => $opt{'max-length'}); + +__END__ + +=head1 NAME + +lwp-dump - See what headers and content is returned for a URL + +=head1 SYNOPSIS + +B [ I ] I + +=head1 DESCRIPTION + +The B program will get the resource indentified by the URL and then +dump the response object to STDOUT. This will display the headers returned and +the initial part of the content, escaped so that it's safe to display even +binary content. The escapes syntax used is the same as for Perl's double +quoted strings. If there is no content the string "(no content)" is shown in +its place. + +The following options are recognized: + +=over + +=item B<--agent> I + +Override the user agent string passed to the server. + +=item B<--keep-client-headers> + +LWP internally generate various C headers that are stripped by +B in order to show the headers exactly as the server provided them. +This option will suppress this. + +=item B<--max-length> I + +How much of the content to show. The default is 512. Set this +to 0 for unlimited. + +If the content is longer then the string is chopped at the +limit and the string "...\n(### more bytes not shown)" +appended. + +=item B<--method> I + +Use the given method for the request instead of the default "GET". + +=item B<--parse-head> + +By default B will not try to initialize headers by looking at the +head section of HTML documents. This option enables this. This corresponds to +L. + +=back + +=head1 SEE ALSO + +L, L, L + + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/lwp-mirror b/Master/tlpkg/tlperl.straw/bin/lwp-mirror new file mode 100755 index 00000000000..13da7971242 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/lwp-mirror @@ -0,0 +1,103 @@ +#!/usr/bin/perl -w + +# Simple mirror utility using LWP + +=head1 NAME + +lwp-mirror - Simple mirror utility + +=head1 SYNOPSIS + + lwp-mirror [-v] [-t timeout] + +=head1 DESCRIPTION + +This program can be used to mirror a document from a WWW server. The +document is only transfered if the remote copy is newer than the local +copy. If the local copy is newer nothing happens. + +Use the C<-v> option to print the version number of this program. + +The timeout value specified with the C<-t> option. The timeout value +is the time that the program will wait for response from the remote +server before it fails. The default unit for the timeout value is +seconds. You might append "m" or "h" to the timeout value to make it +minutes or hours, respectively. + +Because this program is implemented using the LWP library, it only +supports the protocols that LWP supports. + +=head1 SEE ALSO + +L, L + +=head1 AUTHOR + +Gisle Aas + +=cut + + +use LWP::Simple qw(mirror is_success status_message $ua); +use Getopt::Std; + +$progname = $0; +$progname =~ s,.*/,,; # use basename only +$progname =~ s/\.\w*$//; #strip extension if any + +$VERSION = "5.810"; + +$opt_h = undef; # print usage +$opt_v = undef; # print version +$opt_t = undef; # timeout + +unless (getopts("hvt:")) { + usage(); +} + +if ($opt_v) { + require LWP; + my $DISTNAME = 'libwww-perl-' . LWP::Version(); + die <<"EOT"; +This is lwp-mirror version $VERSION ($DISTNAME) + +Copyright 1995-1999, Gisle Aas. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. +EOT +} + +$url = shift or usage(); +$file = shift or usage(); +usage() if $opt_h or @ARGV; + +if (defined $opt_t) { + $opt_t =~ /^(\d+)([smh])?/; + die "$progname: Illegal timeout value!\n" unless defined $1; + $timeout = $1; + $timeout *= 60 if ($2 eq "m"); + $timeout *= 3600 if ($2 eq "h"); + $ua->timeout($timeout); +} + +$rc = mirror($url, $file); + +if ($rc == 304) { + print STDERR "$progname: $file is up to date\n" +} +elsif (!is_success($rc)) { + print STDERR "$progname: $rc ", status_message($rc), " ($url)\n"; + exit 1; +} +exit; + + +sub usage +{ + die <<"EOT"; +Usage: $progname [-options] + -v print version number of program + -t Set timeout value +EOT +} diff --git a/Master/tlpkg/tlperl.straw/bin/lwp-mirror.bat b/Master/tlpkg/tlperl.straw/bin/lwp-mirror.bat new file mode 100755 index 00000000000..87beb3aa103 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/lwp-mirror.bat @@ -0,0 +1,119 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!/usr/bin/perl -w +#line 15 + +# Simple mirror utility using LWP + +=head1 NAME + +lwp-mirror - Simple mirror utility + +=head1 SYNOPSIS + + lwp-mirror [-v] [-t timeout] + +=head1 DESCRIPTION + +This program can be used to mirror a document from a WWW server. The +document is only transfered if the remote copy is newer than the local +copy. If the local copy is newer nothing happens. + +Use the C<-v> option to print the version number of this program. + +The timeout value specified with the C<-t> option. The timeout value +is the time that the program will wait for response from the remote +server before it fails. The default unit for the timeout value is +seconds. You might append "m" or "h" to the timeout value to make it +minutes or hours, respectively. + +Because this program is implemented using the LWP library, it only +supports the protocols that LWP supports. + +=head1 SEE ALSO + +L, L + +=head1 AUTHOR + +Gisle Aas + +=cut + + +use LWP::Simple qw(mirror is_success status_message $ua); +use Getopt::Std; + +$progname = $0; +$progname =~ s,.*/,,; # use basename only +$progname =~ s/\.\w*$//; #strip extension if any + +$VERSION = "5.810"; + +$opt_h = undef; # print usage +$opt_v = undef; # print version +$opt_t = undef; # timeout + +unless (getopts("hvt:")) { + usage(); +} + +if ($opt_v) { + require LWP; + my $DISTNAME = 'libwww-perl-' . LWP::Version(); + die <<"EOT"; +This is lwp-mirror version $VERSION ($DISTNAME) + +Copyright 1995-1999, Gisle Aas. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. +EOT +} + +$url = shift or usage(); +$file = shift or usage(); +usage() if $opt_h or @ARGV; + +if (defined $opt_t) { + $opt_t =~ /^(\d+)([smh])?/; + die "$progname: Illegal timeout value!\n" unless defined $1; + $timeout = $1; + $timeout *= 60 if ($2 eq "m"); + $timeout *= 3600 if ($2 eq "h"); + $ua->timeout($timeout); +} + +$rc = mirror($url, $file); + +if ($rc == 304) { + print STDERR "$progname: $file is up to date\n" +} +elsif (!is_success($rc)) { + print STDERR "$progname: $rc ", status_message($rc), " ($url)\n"; + exit 1; +} +exit; + + +sub usage +{ + die <<"EOT"; +Usage: $progname [-options] + -v print version number of program + -t Set timeout value +EOT +} + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/lwp-request b/Master/tlpkg/tlperl.straw/bin/lwp-request new file mode 100755 index 00000000000..ee9dbf88ea7 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/lwp-request @@ -0,0 +1,531 @@ +#!/usr/bin/perl -w + +# Simple user agent using LWP library. + +=head1 NAME + +lwp-request, GET, POST, HEAD - Simple command line user agent + +=head1 SYNOPSIS + +B [B<-afPuUsSedvhx>] [B<-m> I] [B<-b> I] [B<-t> I] + [B<-i> I] [B<-c> I] + [B<-C> I] [B<-p> I] [B<-o> I] I... + +=head1 DESCRIPTION + +This program can be used to send requests to WWW servers and your +local file system. The request content for POST and PUT +methods is read from stdin. The content of the response is printed on +stdout. Error messages are printed on stderr. The program returns a +status value indicating the number of URLs that failed. + +The options are: + +=over 4 + +=item -m + +Set which method to use for the request. If this option is not used, +then the method is derived from the name of the program. + +=item -f + +Force request through, even if the program believes that the method is +illegal. The server might reject the request eventually. + +=item -b + +This URI will be used as the base URI for resolving all relative URIs +given as argument. + +=item -t + +Set the timeout value for the requests. The timeout is the amount of +time that the program will wait for a response from the remote server +before it fails. The default unit for the timeout value is seconds. +You might append "m" or "h" to the timeout value to make it minutes or +hours, respectively. The default timeout is '3m', i.e. 3 minutes. + +=item -i
+ +Send this HTTP header with each request. You can specify several, e.g.: + + lwp-request \ + -H 'Referer: http://other.url/' \ + -H 'Host: somehost' \ + http://this.url/ + +=item -C : + +Provide credentials for documents that are protected by Basic +Authentication. If the document is protected and you did not specify +the username and password with this option, then you will be prompted +to provide these values. + +=back + +The following options controls what is displayed by the program: + +=over 4 + +=item -u + +Print request method and absolute URL as requests are made. + +=item -U + +Print request headers in addition to request method and absolute URL. + +=item -s + +Print response status code. This option is always on for HEAD requests. + +=item -S + +Print response status chain. This shows redirect and authorization +requests that are handled by the library. + +=item -e + +Print response headers. This option is always on for HEAD requests. + +=item -d + +Do B print the content of the response. + +=item -o + +Process HTML content in various ways before printing it. If the +content type of the response is not HTML, then this option has no +effect. The legal format values are; I, I, I, +I and I. + +If you specify the I format then the HTML will be formatted as +plain latin1 text. If you specify the I format then it will be +formatted as Postscript. + +The I format will output all links found in the HTML document. +Relative links will be expanded to absolute ones. + +The I format will reformat the HTML code and the I format +will just dump the HTML syntax tree. + +Note that the C distribution needs to be installed for this +option to work. In addition the C distribution needs to +be installed for I<-o text> or I<-o ps> to work. + +=item -v + +Print the version number of the program and quit. + +=item -h + +Print usage message and quit. + +=item -a + +Set text(ascii) mode for content input and output. If this option is not +used, content input and output is done in binary mode. + +=back + +Because this program is implemented using the LWP library, it will +only support the protocols that LWP supports. + +=head1 SEE ALSO + +L, L + +=head1 COPYRIGHT + +Copyright 1995-1999 Gisle Aas. + +This library is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=head1 AUTHOR + +Gisle Aas + +=cut + +$progname = $0; +$progname =~ s,.*[\\/],,; # use basename only +$progname =~ s/\.\w*$//; # strip extension, if any + +$VERSION = "5.834"; + + +require LWP; + +use URI; +use URI::Heuristic qw(uf_uri); + +use HTTP::Status qw(status_message); +use HTTP::Date qw(time2str str2time); + + +# This table lists the methods that are allowed. It should really be +# a superset for all methods supported for every scheme that may be +# supported by the library. Currently it might be a bit too HTTP +# specific. You might use the -f option to force a method through. +# +# "" = No content in request, "C" = Needs content in request +# +%allowed_methods = ( + GET => "", + HEAD => "", + POST => "C", + PUT => "C", + DELETE => "", + TRACE => "", + OPTIONS => "", +); + + +# We make our own specialization of LWP::UserAgent that asks for +# user/password if document is protected. +{ + package RequestAgent; + @ISA = qw(LWP::UserAgent); + + sub new + { + my $self = LWP::UserAgent::new(@_); + $self->agent("lwp-request/$main::VERSION "); + $self; + } + + sub get_basic_credentials + { + my($self, $realm, $uri) = @_; + if ($main::options{'C'}) { + return split(':', $main::options{'C'}, 2); + } + elsif (-t) { + my $netloc = $uri->host_port; + print STDERR "Enter username for $realm at $netloc: "; + my $user = ; + chomp($user); + return (undef, undef) unless length $user; + print STDERR "Password: "; + system("stty -echo"); + my $password = ; + system("stty echo"); + print STDERR "\n"; # because we disabled echo + chomp($password); + return ($user, $password); + } + else { + return (undef, undef) + } + } +} + +$method = uc(lc($progname) eq "lwp-request" ? "GET" : $progname); + +# Parse command line +use Getopt::Long; + +my @getopt_args = ( + 'a', # content i/o in text(ascii) mode + 'm=s', # set method + 'f', # make request even if method is not in %allowed_methods + 'b=s', # base url + 't=s', # timeout + 'i=s', # if-modified-since + 'c=s', # content type for POST + 'C=s', # credentials for basic authorization + 'H=s@', # extra headers, form "Header: value string" + # + 'u', # display method, URL and headers of request + 'U', # display request headers also + 's', # display status code + 'S', # display whole chain of status codes + 'e', # display response headers (default for HEAD) + 'd', # don't display content + # + 'h', # print usage + 'v', # print version + # + 'p=s', # proxy URL + 'P', # don't load proxy setting from environment + # + 'o=s', # output format +); + +Getopt::Long::config("noignorecase", "bundling"); +unless (GetOptions(\%options, @getopt_args)) { + usage(); +} +if ($options{'v'}) { + require LWP; + my $DISTNAME = 'libwww-perl-' . LWP::Version(); + die <<"EOT"; +This is lwp-request version $VERSION ($DISTNAME) + +Copyright 1995-1999, Gisle Aas. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. +EOT +} + +usage() if $options{'h'} || !@ARGV; + +# Create the user agent object +$ua = RequestAgent->new; + +# Load proxy settings from *_proxy environment variables. +$ua->env_proxy unless $options{'P'}; + +$method = uc($options{'m'}) if defined $options{'m'}; + +if ($options{'f'}) { + if ($options{'c'}) { + $allowed_methods{$method} = "C"; # force content + } + else { + $allowed_methods{$method} = ""; + } +} +elsif (!defined $allowed_methods{$method}) { + die "$progname: $method is not an allowed method\n"; +} + +if ($method eq "HEAD") { + $options{'s'} = 1; + $options{'e'} = 1 unless $options{'d'}; + $options{'d'} = 1; +} + +if (defined $options{'t'}) { + $options{'t'} =~ /^(\d+)([smh])?/; + die "$progname: Illegal timeout value!\n" unless defined $1; + $timeout = $1; + if (defined $2) { + $timeout *= 60 if $2 eq "m"; + $timeout *= 3600 if $2 eq "h"; + } + $ua->timeout($timeout); +} + +if (defined $options{'i'}) { + if (-e $options{'i'}) { + $time = (stat _)[9]; + } + else { + $time = str2time($options{'i'}); + die "$progname: Illegal time syntax for -i option\n" + unless defined $time; + } + $options{'i'} = time2str($time); +} + +$content = undef; +if ($allowed_methods{$method} eq "C") { + # This request needs some content + unless (defined $options{'c'}) { + # set default content type + $options{'c'} = ($method eq "POST") ? + "application/x-www-form-urlencoded" + : "text/plain"; + } + else { + die "$progname: Illegal Content-type format\n" + unless $options{'c'} =~ m,^[\w\-]+/[\w\-.+]+(?:\s*;.*)?$, + } + print STDERR "Please enter content ($options{'c'}) to be ${method}ed:\n" + if -t; + binmode STDIN unless -t or $options{'a'}; + $content = join("", ); +} +else { + die "$progname: Can't set Content-type for $method requests\n" + if defined $options{'c'}; +} + +# Set up a request. We will use the same request object for all URLs. +$request = HTTP::Request->new($method); +$request->header('If-Modified-Since', $options{'i'}) if defined $options{'i'}; +for my $user_header (@{ $options{'H'} || [] }) { + my ($header_name, $header_value) = split /:\s*/, $user_header, 2; + $request->header($header_name, $header_value); + $ua->agent($header_value) if lc($header_name) eq "user-agent"; # Ugh! +} +#$request->header('Accept', '*/*'); +if ($options{'c'}) { # will always be set for request that wants content + $request->header('Content-Type', $options{'c'}); + $request->header('Content-Length', length $content); # Not really needed + $request->content($content); +} + +$errors = 0; + +# Ok, now we perform the requests, one URL at a time +while ($url = shift) { + # Create the URL object, but protect us against bad URLs + eval { + if ($url =~ /^\w+:/ || $options{'b'}) { # is there any scheme specification + $url = URI->new($url, $options{'b'}); + $url = $url->abs($options{'b'}) if $options{'b'}; + } + else { + $url = uf_uri($url); + } + }; + if ($@) { + $@ =~ s/ at .* line \d+.*//; + print STDERR $@; + $errors++; + next; + } + + $ua->proxy($url->scheme, $options{'p'}) if $options{'p'}; + + # Send the request and get a response back from the server + $request->uri($url); + $response = $ua->request($request); + + if ($options{'u'} || $options{'U'}) { + my $url = $response->request->uri->as_string; + print "$method $url\n"; + print $response->request->headers_as_string, "\n" if $options{'U'}; + } + + if ($options{'S'}) { + for my $r ($response->redirects, $response) { + my $method = $r->request->method; + my $url = $r->request->uri->as_string; + print "$method $url --> ", $r->status_line, "\n"; + } + } + elsif ($options{'s'}) { + print $response->status_line, "\n"; + } + + if ($options{'e'}) { + # Display headers + print $response->headers_as_string; + print "\n"; # separate headers and content + } + + unless ($options{'d'}) { + if ($options{'o'} && + $response->content_type eq 'text/html') { + eval { + require HTML::Parse; + }; + if ($@) { + if ($@ =~ m,^Can't locate HTML/Parse.pm in \@INC,) { + die "The HTML-Tree distribution need to be installed for the -o option to be used.\n"; + } + else { + die $@; + } + } + my $html = HTML::Parse::parse_html($response->content); + { + $options{'o'} eq 'ps' && do { + require HTML::FormatPS; + my $f = HTML::FormatPS->new; + print $f->format($html); + last; + }; + $options{'o'} eq 'text' && do { + require HTML::FormatText; + my $f = HTML::FormatText->new; + print $f->format($html); + last; + }; + $options{'o'} eq 'html' && do { + print $html->as_HTML; + last; + }; + $options{'o'} eq 'links' && do { + my $base = $response->base; + $base = $options{'b'} if $options{'b'}; + for ( @{ $html->extract_links } ) { + my($link, $elem) = @$_; + my $tag = uc $elem->tag; + $link = URI->new($link)->abs($base)->as_string; + print "$tag\t$link\n"; + } + last; + }; + $options{'o'} eq 'dump' && do { + $html->dump; + last; + }; + # It is bad to not notice this before now :-( + die "Illegal -o option value ($options{'o'})\n"; + } + } + else { + binmode STDOUT unless $options{'a'}; + print $response->content; + } + } + + $errors++ unless $response->is_success; +} + +exit $errors; + + +sub usage +{ + die <<"EOT"; +Usage: $progname [-options] ... + -m use method for the request (default is '$method') + -f make request even if $progname believes method is illegal + -b Use the specified URL as base + -t Set timeout value + -i
send this HTTP header (you can specify several) + -C : + provide credentials for basic authentication + + -u Display method and URL before any response + -U Display request headers (implies -u) + -s Display response status code + -S Display response status chain + -e Display response headers + -d Do not display content + -o Process HTML content in various ways + + -v Show program version + -h Print this message +EOT +} diff --git a/Master/tlpkg/tlperl.straw/bin/lwp-request.bat b/Master/tlpkg/tlperl.straw/bin/lwp-request.bat new file mode 100755 index 00000000000..0b447c29fd0 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/lwp-request.bat @@ -0,0 +1,547 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!/usr/bin/perl -w +#line 15 + +# Simple user agent using LWP library. + +=head1 NAME + +lwp-request, GET, POST, HEAD - Simple command line user agent + +=head1 SYNOPSIS + +B [B<-afPuUsSedvhx>] [B<-m> I] [B<-b> I] [B<-t> I] + [B<-i> I] [B<-c> I] + [B<-C> I] [B<-p> I] [B<-o> I] I... + +=head1 DESCRIPTION + +This program can be used to send requests to WWW servers and your +local file system. The request content for POST and PUT +methods is read from stdin. The content of the response is printed on +stdout. Error messages are printed on stderr. The program returns a +status value indicating the number of URLs that failed. + +The options are: + +=over 4 + +=item -m + +Set which method to use for the request. If this option is not used, +then the method is derived from the name of the program. + +=item -f + +Force request through, even if the program believes that the method is +illegal. The server might reject the request eventually. + +=item -b + +This URI will be used as the base URI for resolving all relative URIs +given as argument. + +=item -t + +Set the timeout value for the requests. The timeout is the amount of +time that the program will wait for a response from the remote server +before it fails. The default unit for the timeout value is seconds. +You might append "m" or "h" to the timeout value to make it minutes or +hours, respectively. The default timeout is '3m', i.e. 3 minutes. + +=item -i
+ +Send this HTTP header with each request. You can specify several, e.g.: + + lwp-request \ + -H 'Referer: http://other.url/' \ + -H 'Host: somehost' \ + http://this.url/ + +=item -C : + +Provide credentials for documents that are protected by Basic +Authentication. If the document is protected and you did not specify +the username and password with this option, then you will be prompted +to provide these values. + +=back + +The following options controls what is displayed by the program: + +=over 4 + +=item -u + +Print request method and absolute URL as requests are made. + +=item -U + +Print request headers in addition to request method and absolute URL. + +=item -s + +Print response status code. This option is always on for HEAD requests. + +=item -S + +Print response status chain. This shows redirect and authorization +requests that are handled by the library. + +=item -e + +Print response headers. This option is always on for HEAD requests. + +=item -d + +Do B print the content of the response. + +=item -o + +Process HTML content in various ways before printing it. If the +content type of the response is not HTML, then this option has no +effect. The legal format values are; I, I, I, +I and I. + +If you specify the I format then the HTML will be formatted as +plain latin1 text. If you specify the I format then it will be +formatted as Postscript. + +The I format will output all links found in the HTML document. +Relative links will be expanded to absolute ones. + +The I format will reformat the HTML code and the I format +will just dump the HTML syntax tree. + +Note that the C distribution needs to be installed for this +option to work. In addition the C distribution needs to +be installed for I<-o text> or I<-o ps> to work. + +=item -v + +Print the version number of the program and quit. + +=item -h + +Print usage message and quit. + +=item -a + +Set text(ascii) mode for content input and output. If this option is not +used, content input and output is done in binary mode. + +=back + +Because this program is implemented using the LWP library, it will +only support the protocols that LWP supports. + +=head1 SEE ALSO + +L, L + +=head1 COPYRIGHT + +Copyright 1995-1999 Gisle Aas. + +This library is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=head1 AUTHOR + +Gisle Aas + +=cut + +$progname = $0; +$progname =~ s,.*[\\/],,; # use basename only +$progname =~ s/\.\w*$//; # strip extension, if any + +$VERSION = "5.834"; + + +require LWP; + +use URI; +use URI::Heuristic qw(uf_uri); + +use HTTP::Status qw(status_message); +use HTTP::Date qw(time2str str2time); + + +# This table lists the methods that are allowed. It should really be +# a superset for all methods supported for every scheme that may be +# supported by the library. Currently it might be a bit too HTTP +# specific. You might use the -f option to force a method through. +# +# "" = No content in request, "C" = Needs content in request +# +%allowed_methods = ( + GET => "", + HEAD => "", + POST => "C", + PUT => "C", + DELETE => "", + TRACE => "", + OPTIONS => "", +); + + +# We make our own specialization of LWP::UserAgent that asks for +# user/password if document is protected. +{ + package RequestAgent; + @ISA = qw(LWP::UserAgent); + + sub new + { + my $self = LWP::UserAgent::new(@_); + $self->agent("lwp-request/$main::VERSION "); + $self; + } + + sub get_basic_credentials + { + my($self, $realm, $uri) = @_; + if ($main::options{'C'}) { + return split(':', $main::options{'C'}, 2); + } + elsif (-t) { + my $netloc = $uri->host_port; + print STDERR "Enter username for $realm at $netloc: "; + my $user = ; + chomp($user); + return (undef, undef) unless length $user; + print STDERR "Password: "; + system("stty -echo"); + my $password = ; + system("stty echo"); + print STDERR "\n"; # because we disabled echo + chomp($password); + return ($user, $password); + } + else { + return (undef, undef) + } + } +} + +$method = uc(lc($progname) eq "lwp-request" ? "GET" : $progname); + +# Parse command line +use Getopt::Long; + +my @getopt_args = ( + 'a', # content i/o in text(ascii) mode + 'm=s', # set method + 'f', # make request even if method is not in %allowed_methods + 'b=s', # base url + 't=s', # timeout + 'i=s', # if-modified-since + 'c=s', # content type for POST + 'C=s', # credentials for basic authorization + 'H=s@', # extra headers, form "Header: value string" + # + 'u', # display method, URL and headers of request + 'U', # display request headers also + 's', # display status code + 'S', # display whole chain of status codes + 'e', # display response headers (default for HEAD) + 'd', # don't display content + # + 'h', # print usage + 'v', # print version + # + 'p=s', # proxy URL + 'P', # don't load proxy setting from environment + # + 'o=s', # output format +); + +Getopt::Long::config("noignorecase", "bundling"); +unless (GetOptions(\%options, @getopt_args)) { + usage(); +} +if ($options{'v'}) { + require LWP; + my $DISTNAME = 'libwww-perl-' . LWP::Version(); + die <<"EOT"; +This is lwp-request version $VERSION ($DISTNAME) + +Copyright 1995-1999, Gisle Aas. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. +EOT +} + +usage() if $options{'h'} || !@ARGV; + +# Create the user agent object +$ua = RequestAgent->new; + +# Load proxy settings from *_proxy environment variables. +$ua->env_proxy unless $options{'P'}; + +$method = uc($options{'m'}) if defined $options{'m'}; + +if ($options{'f'}) { + if ($options{'c'}) { + $allowed_methods{$method} = "C"; # force content + } + else { + $allowed_methods{$method} = ""; + } +} +elsif (!defined $allowed_methods{$method}) { + die "$progname: $method is not an allowed method\n"; +} + +if ($method eq "HEAD") { + $options{'s'} = 1; + $options{'e'} = 1 unless $options{'d'}; + $options{'d'} = 1; +} + +if (defined $options{'t'}) { + $options{'t'} =~ /^(\d+)([smh])?/; + die "$progname: Illegal timeout value!\n" unless defined $1; + $timeout = $1; + if (defined $2) { + $timeout *= 60 if $2 eq "m"; + $timeout *= 3600 if $2 eq "h"; + } + $ua->timeout($timeout); +} + +if (defined $options{'i'}) { + if (-e $options{'i'}) { + $time = (stat _)[9]; + } + else { + $time = str2time($options{'i'}); + die "$progname: Illegal time syntax for -i option\n" + unless defined $time; + } + $options{'i'} = time2str($time); +} + +$content = undef; +if ($allowed_methods{$method} eq "C") { + # This request needs some content + unless (defined $options{'c'}) { + # set default content type + $options{'c'} = ($method eq "POST") ? + "application/x-www-form-urlencoded" + : "text/plain"; + } + else { + die "$progname: Illegal Content-type format\n" + unless $options{'c'} =~ m,^[\w\-]+/[\w\-.+]+(?:\s*;.*)?$, + } + print STDERR "Please enter content ($options{'c'}) to be ${method}ed:\n" + if -t; + binmode STDIN unless -t or $options{'a'}; + $content = join("", ); +} +else { + die "$progname: Can't set Content-type for $method requests\n" + if defined $options{'c'}; +} + +# Set up a request. We will use the same request object for all URLs. +$request = HTTP::Request->new($method); +$request->header('If-Modified-Since', $options{'i'}) if defined $options{'i'}; +for my $user_header (@{ $options{'H'} || [] }) { + my ($header_name, $header_value) = split /:\s*/, $user_header, 2; + $request->header($header_name, $header_value); + $ua->agent($header_value) if lc($header_name) eq "user-agent"; # Ugh! +} +#$request->header('Accept', '*/*'); +if ($options{'c'}) { # will always be set for request that wants content + $request->header('Content-Type', $options{'c'}); + $request->header('Content-Length', length $content); # Not really needed + $request->content($content); +} + +$errors = 0; + +# Ok, now we perform the requests, one URL at a time +while ($url = shift) { + # Create the URL object, but protect us against bad URLs + eval { + if ($url =~ /^\w+:/ || $options{'b'}) { # is there any scheme specification + $url = URI->new($url, $options{'b'}); + $url = $url->abs($options{'b'}) if $options{'b'}; + } + else { + $url = uf_uri($url); + } + }; + if ($@) { + $@ =~ s/ at .* line \d+.*//; + print STDERR $@; + $errors++; + next; + } + + $ua->proxy($url->scheme, $options{'p'}) if $options{'p'}; + + # Send the request and get a response back from the server + $request->uri($url); + $response = $ua->request($request); + + if ($options{'u'} || $options{'U'}) { + my $url = $response->request->uri->as_string; + print "$method $url\n"; + print $response->request->headers_as_string, "\n" if $options{'U'}; + } + + if ($options{'S'}) { + for my $r ($response->redirects, $response) { + my $method = $r->request->method; + my $url = $r->request->uri->as_string; + print "$method $url --> ", $r->status_line, "\n"; + } + } + elsif ($options{'s'}) { + print $response->status_line, "\n"; + } + + if ($options{'e'}) { + # Display headers + print $response->headers_as_string; + print "\n"; # separate headers and content + } + + unless ($options{'d'}) { + if ($options{'o'} && + $response->content_type eq 'text/html') { + eval { + require HTML::Parse; + }; + if ($@) { + if ($@ =~ m,^Can't locate HTML/Parse.pm in \@INC,) { + die "The HTML-Tree distribution need to be installed for the -o option to be used.\n"; + } + else { + die $@; + } + } + my $html = HTML::Parse::parse_html($response->content); + { + $options{'o'} eq 'ps' && do { + require HTML::FormatPS; + my $f = HTML::FormatPS->new; + print $f->format($html); + last; + }; + $options{'o'} eq 'text' && do { + require HTML::FormatText; + my $f = HTML::FormatText->new; + print $f->format($html); + last; + }; + $options{'o'} eq 'html' && do { + print $html->as_HTML; + last; + }; + $options{'o'} eq 'links' && do { + my $base = $response->base; + $base = $options{'b'} if $options{'b'}; + for ( @{ $html->extract_links } ) { + my($link, $elem) = @$_; + my $tag = uc $elem->tag; + $link = URI->new($link)->abs($base)->as_string; + print "$tag\t$link\n"; + } + last; + }; + $options{'o'} eq 'dump' && do { + $html->dump; + last; + }; + # It is bad to not notice this before now :-( + die "Illegal -o option value ($options{'o'})\n"; + } + } + else { + binmode STDOUT unless $options{'a'}; + print $response->content; + } + } + + $errors++ unless $response->is_success; +} + +exit $errors; + + +sub usage +{ + die <<"EOT"; +Usage: $progname [-options] ... + -m use method for the request (default is '$method') + -f make request even if $progname believes method is illegal + -b Use the specified URL as base + -t Set timeout value + -i
send this HTTP header (you can specify several) + -C : + provide credentials for basic authentication + + -u Display method and URL before any response + -U Display request headers (implies -u) + -s Display response status code + -S Display response status chain + -e Display response headers + -d Do not display content + -o Process HTML content in various ways + + -v Show program version + -h Print this message +EOT +} + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/lwp-rget b/Master/tlpkg/tlperl.straw/bin/lwp-rget new file mode 100755 index 00000000000..2ac798f4bb0 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/lwp-rget @@ -0,0 +1,607 @@ +#!/usr/bin/perl -w + +=head1 NAME + +lwp-rget - Retrieve web documents recursively + +=head1 SYNOPSIS + + lwp-rget [--verbose] [--auth=USER:PASS] [--depth=N] [--hier] [--iis] + [--keepext=mime/type[,mime/type]] [--limit=N] [--nospace] + [--prefix=URL] [--referer=URL] [--sleep=N] [--tolower] + lwp-rget --version + +=head1 DESCRIPTION + +This program will retrieve a document and store it in a local file. It +will follow any links found in the document and store these documents +as well, patching links so that they refer to these local copies. +This process continues until there are no more unvisited links or the +process is stopped by the one or more of the limits which can be +controlled by the command line arguments. + +This program is useful if you want to make a local copy of a +collection of documents or want to do web reading off-line. + +All documents are stored as plain files in the current directory. The +file names chosen are derived from the last component of URL paths. + +The options are: + +=over 3 + +=item --auth=USER:PASS + +Set the authentication credentials to user "USER" and password "PASS" if +any restricted parts of the web site are hit. If there are restricted +parts of the web site and authentication credentials are not available, +those pages will not be downloaded. + +=item --depth=I + +Limit the recursive level. Embedded images are always loaded, even if +they fall outside the I<--depth>. This means that one can use +I<--depth=0> in order to fetch a single document together with all +inline graphics. + +The default depth is 5. + +=item --hier + +Download files into a hierarchy that mimics the web site structure. +The default is to put all files in the current directory. + +=item --referer=I + +Set the value of the Referer header for the initial request. The +special value C<"NONE"> can be used to suppress the Referer header in +any of subsequent requests. The Referer header will always be suppressed +in all normal C requests if the referring page was transmitted over +C as recommended in RFC 2616. + +=item --iis + +Sends an "Accept: */*" on all URL requests as a workaround for a bug in +IIS 2.0. If no Accept MIME header is present, IIS 2.0 returns with a +"406 No acceptable objects were found" error. Also converts any back +slashes (\\) in URLs to forward slashes (/). + +=item --keepext=I + +Keeps the current extension for the list MIME types. Useful when +downloading text/plain documents that shouldn't all be translated to +*.txt files. + +=item --limit=I + +Limit the number of documents to get. The default limit is 50. + +=item --nospace + +Changes spaces in all URLs to underscore characters (_). Useful when +downloading files from sites serving URLs with spaces in them. Does not +remove spaces from fragments, e.g., "file.html#somewhere in here". + +=item --prefix=I + +Limit the links to follow. Only URLs that start the prefix string are +followed. + +The default prefix is set as the "directory" of the initial URL to +follow. For instance if we start lwp-rget with the URL +C, then prefix will be set to +C. + +Use C<--prefix=''> if you don't want the fetching to be limited by any +prefix. + +=item --sleep=I + +Sleep I seconds before retrieving each document. This options allows +you to go slowly, not loading the server you visiting too much. + +=item --tolower + +Translates all links to lowercase. Useful when downloading files from +IIS since it does not serve files in a case sensitive manner. + +=item --verbose + +Make more noise while running. + +=item --quiet + +Don't make any noise. + +=item --version + +Print program version number and quit. + +=item --help + +Print the usage message and quit. + +=back + +Before the program exits the name of the file, where the initial URL +is stored, is printed on stdout. All used filenames are also printed +on stderr as they are loaded. This printing can be suppressed with +the I<--quiet> option. + +=head1 SEE ALSO + +L, L + +=head1 AUTHOR + +Gisle Aas + +=cut + +use strict; + +use Getopt::Long qw(GetOptions); +use URI::URL qw(url); +use LWP::MediaTypes qw(media_suffix); +use HTML::Entities (); + +use vars qw($VERSION); +use vars qw($MAX_DEPTH $MAX_DOCS $PREFIX $REFERER $VERBOSE $QUIET $SLEEP $HIER $AUTH $IIS $TOLOWER $NOSPACE %KEEPEXT); + +my $progname = $0; +$progname =~ s|.*/||; # only basename left +$progname =~ s/\.\w*$//; #strip extension if any + +$VERSION = "5.827"; + +#$Getopt::Long::debug = 1; +#$Getopt::Long::ignorecase = 0; + +# Defaults +$MAX_DEPTH = 5; +$MAX_DOCS = 50; + +GetOptions('version' => \&print_version, + 'help' => \&usage, + 'depth=i' => \$MAX_DEPTH, + 'limit=i' => \$MAX_DOCS, + 'verbose!' => \$VERBOSE, + 'quiet!' => \$QUIET, + 'sleep=i' => \$SLEEP, + 'prefix:s' => \$PREFIX, + 'referer:s'=> \$REFERER, + 'hier' => \$HIER, + 'auth=s' => \$AUTH, + 'iis' => \$IIS, + 'tolower' => \$TOLOWER, + 'nospace' => \$NOSPACE, + 'keepext=s' => \$KEEPEXT{'OPT'}, + ) || usage(); + +sub print_version { + require LWP; + my $DISTNAME = 'libwww-perl-' . LWP::Version(); + print <<"EOT"; +This is lwp-rget version $VERSION ($DISTNAME) + +Copyright 1996-1998, Gisle Aas. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. +EOT + exit 0; +} + +my $start_url = shift || usage(); +usage() if @ARGV; + +require LWP::UserAgent; +my $ua = new LWP::UserAgent; +$ua->agent("$progname/$VERSION "); +$ua->env_proxy; + +unless (defined $PREFIX) { + $PREFIX = url($start_url); # limit to URLs below this one + eval { + $PREFIX->eparams(undef); + $PREFIX->equery(undef); + }; + + $_ = $PREFIX->epath; + s|[^/]+$||; + $PREFIX->epath($_); + $PREFIX = $PREFIX->as_string; +} + +%KEEPEXT = map { lc($_) => 1 } split(/\s*,\s*/, ($KEEPEXT{'OPT'}||0)); + +my $SUPPRESS_REFERER; +$SUPPRESS_REFERER++ if ($REFERER || "") eq "NONE"; + +print <<"" if $VERBOSE; +START = $start_url +MAX_DEPTH = $MAX_DEPTH +MAX_DOCS = $MAX_DOCS +PREFIX = $PREFIX + +my $no_docs = 0; +my %seen = (); # mapping from URL => local_file + +my $filename = fetch($start_url, undef, $REFERER); +print "$filename\n" unless $QUIET; + +sub fetch +{ + my($url, $type, $referer, $depth) = @_; + + # Fix http://sitename.com/../blah/blah.html to + # http://sitename.com/blah/blah.html + $url = $url->as_string if (ref($url)); + while ($url =~ s#(https?://[^/]+/)\.\.\/#$1#) {} + + # Fix backslashes (\) in URL if $IIS defined + $url = fix_backslashes($url) if (defined $IIS); + + $url = url($url); + $type ||= 'a'; + # Might be the background attribute + $type = 'img' if ($type eq 'body' || $type eq 'td'); + $depth ||= 0; + + # Print the URL before we start checking... + my $out = (" " x $depth) . $url . " "; + $out .= "." x (60 - length($out)); + print STDERR $out . " " if $VERBOSE; + + # Can't get mailto things + if ($url->scheme eq 'mailto') { + print STDERR "*skipping mailto*\n" if $VERBOSE; + return $url->as_string; + } + + # The $plain_url is a URL without the fragment part + my $plain_url = $url->clone; + $plain_url->frag(undef); + + # Check PREFIX, but not for links + if ($type ne 'img' and $url->as_string !~ /^\Q$PREFIX/o) { + print STDERR "*outsider*\n" if $VERBOSE; + return $url->as_string; + } + + # Translate URL to lowercase if $TOLOWER defined + $plain_url = to_lower($plain_url) if (defined $TOLOWER); + + # If we already have it, then there is nothing to be done + my $seen = $seen{$plain_url->as_string}; + if ($seen) { + my $frag = $url->frag; + $seen .= "#$frag" if defined($frag); + $seen = protect_frag_spaces($seen); + print STDERR "$seen (again)\n" if $VERBOSE; + return $seen; + } + + # Too much or too deep + if ($depth > $MAX_DEPTH and $type ne 'img') { + print STDERR "*too deep*\n" if $VERBOSE; + return $url; + } + if ($no_docs > $MAX_DOCS) { + print STDERR "*too many*\n" if $VERBOSE; + return $url; + } + + # Fetch document + $no_docs++; + sleep($SLEEP) if $SLEEP; + my $req = HTTP::Request->new(GET => $url); + # See: http://ftp.sunet.se/pub/NT/mirror-microsoft/kb/Q163/7/74.TXT + $req->header ('Accept', '*/*') if (defined $IIS); # GIF/JPG from IIS 2.0 + $req->authorization_basic(split (/:/, $AUTH)) if (defined $AUTH); + if ($referer && !$SUPPRESS_REFERER) { + if ($req->uri->scheme eq 'http') { + # RFC 2616, section 15.1.3 + $referer = url($referer) unless ref($referer); + undef $referer if ($referer->scheme || '') eq 'https'; + } + $req->referer($referer) if $referer; + } + my $res = $ua->request($req); + + # Check outcome + if ($res->is_success) { + my $doc = $res->content; + my $ct = $res->content_type; + my $name = find_name($res->request->uri, $ct); + print STDERR "$name\n" unless $QUIET; + $seen{$plain_url->as_string} = $name; + + # If the file is HTML, then we look for internal links + if ($ct eq "text/html") { + # Save an unprosessed version of the HTML document. This + # both reserves the name used, and it also ensures that we + # don't loose everything if this program is killed before + # we finish. + save($name, $doc); + my $base = $res->base; + + # Follow and substitute links... + $doc =~ +s/ + ( + <(img|a|body|area|frame|td)\b # some interesting tag + [^>]+ # still inside tag (not strictly correct) + \b(?:src|href|background) # some link attribute + \s*=\s* # = + ) + (?: # scope of OR-ing + (")([^"]*)" | # value in double quotes OR + (')([^']*)' | # value in single quotes OR + ([^\s>]+) # quoteless value + ) +/ + new_link($1, lc($2), $3||$5, HTML::Entities::decode($4||$6||$7), + $base, $name, "$url", $depth+1) +/giex; + # XXX + # The regular expression above is not strictly correct. + # It is not really possible to parse HTML with a single + # regular expression, but it is faster. Tags that might + # confuse us include: + # + # + # + } + save($name, $doc); + return $name; + } + else { + print STDERR $res->code . " " . $res->message . "\n" if $VERBOSE; + $seen{$plain_url->as_string} = $url->as_string; + return $url->as_string; + } +} + +sub new_link +{ + my($pre, $type, $quote, $url, $base, $localbase, $referer, $depth) = @_; + + $url = protect_frag_spaces($url); + + $url = fetch(url($url, $base)->abs, $type, $referer, $depth); + $url = url("file:$url", "file:$localbase")->rel + unless $url =~ /^[.+\-\w]+:/; + + $url = unprotect_frag_spaces($url); + + return $pre . $quote . $url . $quote; +} + + +sub protect_frag_spaces +{ + my ($url) = @_; + + $url = $url->as_string if (ref($url)); + + if ($url =~ m/^([^#]*#)(.+)$/) + { + my ($base, $frag) = ($1, $2); + $frag =~ s/ /%20/g; + $url = $base . $frag; + } + + return $url; +} + + +sub unprotect_frag_spaces +{ + my ($url) = @_; + + $url = $url->as_string if (ref($url)); + + if ($url =~ m/^([^#]*#)(.+)$/) + { + my ($base, $frag) = ($1, $2); + $frag =~ s/%20/ /g; + $url = $base . $frag; + } + + return $url; +} + + +sub fix_backslashes +{ + my ($url) = @_; + my ($base, $frag); + + $url = $url->as_string if (ref($url)); + + if ($url =~ m/([^#]+)(#.*)/) + { + ($base, $frag) = ($1, $2); + } + else + { + $base = $url; + $frag = ""; + } + + $base =~ tr/\\/\//; + $base =~ s/%5[cC]/\//g; # URL-encoded back slash is %5C + + return $base . $frag; +} + + +sub to_lower +{ + my ($url) = @_; + my $was_object = 0; + + if (ref($url)) + { + $url = $url->as_string; + $was_object = 1; + } + + if ($url =~ m/([^#]+)(#.*)/) + { + $url = lc($1) . $2; + } + else + { + $url = lc($url); + } + + if ($was_object == 1) + { + return url($url); + } + else + { + return $url; + } +} + + +sub translate_spaces +{ + my ($url) = @_; + my ($base, $frag); + + $url = $url->as_string if (ref($url)); + + if ($url =~ m/([^#]+)(#.*)/) + { + ($base, $frag) = ($1, $2); + } + else + { + $base = $url; + $frag = ""; + } + + $base =~ s/^ *//; # Remove initial spaces from base + $base =~ s/ *$//; # Remove trailing spaces from base + + $base =~ tr/ /_/; + $base =~ s/%20/_/g; # URL-encoded space is %20 + + return $base . $frag; +} + + +sub mkdirp +{ + my($directory, $mode) = @_; + my @dirs = split(/\//, $directory); + my $path = shift(@dirs); # build it as we go + my $result = 1; # assume it will work + + unless (-d $path) { + $result &&= mkdir($path, $mode); + } + + foreach (@dirs) { + $path .= "/$_"; + if ( ! -d $path) { + $result &&= mkdir($path, $mode); + } + } + + return $result; +} + + +sub find_name +{ + my($url, $type) = @_; + #print "find_name($url, $type)\n"; + + # Translate spaces in URL to underscores (_) if $NOSPACE defined + $url = translate_spaces($url) if (defined $NOSPACE); + + # Translate URL to lowercase if $TOLOWER defined + $url = to_lower($url) if (defined $TOLOWER); + + $url = url($url) unless ref($url); + + my $path = $url->path; + + # trim path until only the basename is left + $path =~ s|(.*/)||; + my $dirname = ".$1"; + if (!$HIER) { + $dirname = ""; + } + elsif (! -d $dirname) { + mkdirp($dirname, 0775); + } + + my $extra = ""; # something to make the name unique + my $suffix; + + if ($KEEPEXT{lc($type)}) { + $suffix = ($path =~ m/\.(.*)/) ? $1 : ""; + } + else { + $suffix = media_suffix($type); + } + + $path =~ s|\..*||; # trim suffix + $path = "index" unless length $path; + + while (1) { + # Construct a new file name + my $file = $dirname . $path . $extra; + $file .= ".$suffix" if $suffix; + # Check if it is unique + return $file unless -f $file; + + # Try something extra + unless ($extra) { + $extra = "001"; + next; + } + $extra++; + } +} + + +sub save +{ + my $name = shift; + #print "save($name,...)\n"; + open(FILE, ">$name") || die "Can't save $name: $!"; + binmode FILE; + print FILE $_[0]; + close(FILE); +} + + +sub usage +{ + print <<""; exit 1; +Usage: $progname [options] +Allowed options are: + --auth=USER:PASS Set authentication credentials for web site + --depth=N Maximum depth to traverse (default is $MAX_DEPTH) + --hier Download into hierarchy (not all files into cwd) + --referer=URI Set initial referer header (or "NONE") + --iis Workaround IIS 2.0 bug by sending "Accept: */*" MIME + header; translates backslashes (\\) to forward slashes (/) + --keepext=type Keep file extension for MIME types (comma-separated list) + --limit=N A limit on the number documents to get (default is $MAX_DOCS) + --nospace Translate spaces URLs (not #fragments) to underscores (_) + --version Print version number and quit + --verbose More output + --quiet No output + --sleep=SECS Sleep between gets, ie. go slowly + --prefix=PREFIX Limit URLs to follow to those which begin with PREFIX + --tolower Translate all URLs to lowercase (useful with IIS servers) + +} diff --git a/Master/tlpkg/tlperl.straw/bin/lwp-rget.bat b/Master/tlpkg/tlperl.straw/bin/lwp-rget.bat new file mode 100755 index 00000000000..34b097d1f2c --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/lwp-rget.bat @@ -0,0 +1,623 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!/usr/bin/perl -w +#line 15 + +=head1 NAME + +lwp-rget - Retrieve web documents recursively + +=head1 SYNOPSIS + + lwp-rget [--verbose] [--auth=USER:PASS] [--depth=N] [--hier] [--iis] + [--keepext=mime/type[,mime/type]] [--limit=N] [--nospace] + [--prefix=URL] [--referer=URL] [--sleep=N] [--tolower] + lwp-rget --version + +=head1 DESCRIPTION + +This program will retrieve a document and store it in a local file. It +will follow any links found in the document and store these documents +as well, patching links so that they refer to these local copies. +This process continues until there are no more unvisited links or the +process is stopped by the one or more of the limits which can be +controlled by the command line arguments. + +This program is useful if you want to make a local copy of a +collection of documents or want to do web reading off-line. + +All documents are stored as plain files in the current directory. The +file names chosen are derived from the last component of URL paths. + +The options are: + +=over 3 + +=item --auth=USER:PASS + +Set the authentication credentials to user "USER" and password "PASS" if +any restricted parts of the web site are hit. If there are restricted +parts of the web site and authentication credentials are not available, +those pages will not be downloaded. + +=item --depth=I + +Limit the recursive level. Embedded images are always loaded, even if +they fall outside the I<--depth>. This means that one can use +I<--depth=0> in order to fetch a single document together with all +inline graphics. + +The default depth is 5. + +=item --hier + +Download files into a hierarchy that mimics the web site structure. +The default is to put all files in the current directory. + +=item --referer=I + +Set the value of the Referer header for the initial request. The +special value C<"NONE"> can be used to suppress the Referer header in +any of subsequent requests. The Referer header will always be suppressed +in all normal C requests if the referring page was transmitted over +C as recommended in RFC 2616. + +=item --iis + +Sends an "Accept: */*" on all URL requests as a workaround for a bug in +IIS 2.0. If no Accept MIME header is present, IIS 2.0 returns with a +"406 No acceptable objects were found" error. Also converts any back +slashes (\\) in URLs to forward slashes (/). + +=item --keepext=I + +Keeps the current extension for the list MIME types. Useful when +downloading text/plain documents that shouldn't all be translated to +*.txt files. + +=item --limit=I + +Limit the number of documents to get. The default limit is 50. + +=item --nospace + +Changes spaces in all URLs to underscore characters (_). Useful when +downloading files from sites serving URLs with spaces in them. Does not +remove spaces from fragments, e.g., "file.html#somewhere in here". + +=item --prefix=I + +Limit the links to follow. Only URLs that start the prefix string are +followed. + +The default prefix is set as the "directory" of the initial URL to +follow. For instance if we start lwp-rget with the URL +C, then prefix will be set to +C. + +Use C<--prefix=''> if you don't want the fetching to be limited by any +prefix. + +=item --sleep=I + +Sleep I seconds before retrieving each document. This options allows +you to go slowly, not loading the server you visiting too much. + +=item --tolower + +Translates all links to lowercase. Useful when downloading files from +IIS since it does not serve files in a case sensitive manner. + +=item --verbose + +Make more noise while running. + +=item --quiet + +Don't make any noise. + +=item --version + +Print program version number and quit. + +=item --help + +Print the usage message and quit. + +=back + +Before the program exits the name of the file, where the initial URL +is stored, is printed on stdout. All used filenames are also printed +on stderr as they are loaded. This printing can be suppressed with +the I<--quiet> option. + +=head1 SEE ALSO + +L, L + +=head1 AUTHOR + +Gisle Aas + +=cut + +use strict; + +use Getopt::Long qw(GetOptions); +use URI::URL qw(url); +use LWP::MediaTypes qw(media_suffix); +use HTML::Entities (); + +use vars qw($VERSION); +use vars qw($MAX_DEPTH $MAX_DOCS $PREFIX $REFERER $VERBOSE $QUIET $SLEEP $HIER $AUTH $IIS $TOLOWER $NOSPACE %KEEPEXT); + +my $progname = $0; +$progname =~ s|.*/||; # only basename left +$progname =~ s/\.\w*$//; #strip extension if any + +$VERSION = "5.827"; + +#$Getopt::Long::debug = 1; +#$Getopt::Long::ignorecase = 0; + +# Defaults +$MAX_DEPTH = 5; +$MAX_DOCS = 50; + +GetOptions('version' => \&print_version, + 'help' => \&usage, + 'depth=i' => \$MAX_DEPTH, + 'limit=i' => \$MAX_DOCS, + 'verbose!' => \$VERBOSE, + 'quiet!' => \$QUIET, + 'sleep=i' => \$SLEEP, + 'prefix:s' => \$PREFIX, + 'referer:s'=> \$REFERER, + 'hier' => \$HIER, + 'auth=s' => \$AUTH, + 'iis' => \$IIS, + 'tolower' => \$TOLOWER, + 'nospace' => \$NOSPACE, + 'keepext=s' => \$KEEPEXT{'OPT'}, + ) || usage(); + +sub print_version { + require LWP; + my $DISTNAME = 'libwww-perl-' . LWP::Version(); + print <<"EOT"; +This is lwp-rget version $VERSION ($DISTNAME) + +Copyright 1996-1998, Gisle Aas. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. +EOT + exit 0; +} + +my $start_url = shift || usage(); +usage() if @ARGV; + +require LWP::UserAgent; +my $ua = new LWP::UserAgent; +$ua->agent("$progname/$VERSION "); +$ua->env_proxy; + +unless (defined $PREFIX) { + $PREFIX = url($start_url); # limit to URLs below this one + eval { + $PREFIX->eparams(undef); + $PREFIX->equery(undef); + }; + + $_ = $PREFIX->epath; + s|[^/]+$||; + $PREFIX->epath($_); + $PREFIX = $PREFIX->as_string; +} + +%KEEPEXT = map { lc($_) => 1 } split(/\s*,\s*/, ($KEEPEXT{'OPT'}||0)); + +my $SUPPRESS_REFERER; +$SUPPRESS_REFERER++ if ($REFERER || "") eq "NONE"; + +print <<"" if $VERBOSE; +START = $start_url +MAX_DEPTH = $MAX_DEPTH +MAX_DOCS = $MAX_DOCS +PREFIX = $PREFIX + +my $no_docs = 0; +my %seen = (); # mapping from URL => local_file + +my $filename = fetch($start_url, undef, $REFERER); +print "$filename\n" unless $QUIET; + +sub fetch +{ + my($url, $type, $referer, $depth) = @_; + + # Fix http://sitename.com/../blah/blah.html to + # http://sitename.com/blah/blah.html + $url = $url->as_string if (ref($url)); + while ($url =~ s#(https?://[^/]+/)\.\.\/#$1#) {} + + # Fix backslashes (\) in URL if $IIS defined + $url = fix_backslashes($url) if (defined $IIS); + + $url = url($url); + $type ||= 'a'; + # Might be the background attribute + $type = 'img' if ($type eq 'body' || $type eq 'td'); + $depth ||= 0; + + # Print the URL before we start checking... + my $out = (" " x $depth) . $url . " "; + $out .= "." x (60 - length($out)); + print STDERR $out . " " if $VERBOSE; + + # Can't get mailto things + if ($url->scheme eq 'mailto') { + print STDERR "*skipping mailto*\n" if $VERBOSE; + return $url->as_string; + } + + # The $plain_url is a URL without the fragment part + my $plain_url = $url->clone; + $plain_url->frag(undef); + + # Check PREFIX, but not for links + if ($type ne 'img' and $url->as_string !~ /^\Q$PREFIX/o) { + print STDERR "*outsider*\n" if $VERBOSE; + return $url->as_string; + } + + # Translate URL to lowercase if $TOLOWER defined + $plain_url = to_lower($plain_url) if (defined $TOLOWER); + + # If we already have it, then there is nothing to be done + my $seen = $seen{$plain_url->as_string}; + if ($seen) { + my $frag = $url->frag; + $seen .= "#$frag" if defined($frag); + $seen = protect_frag_spaces($seen); + print STDERR "$seen (again)\n" if $VERBOSE; + return $seen; + } + + # Too much or too deep + if ($depth > $MAX_DEPTH and $type ne 'img') { + print STDERR "*too deep*\n" if $VERBOSE; + return $url; + } + if ($no_docs > $MAX_DOCS) { + print STDERR "*too many*\n" if $VERBOSE; + return $url; + } + + # Fetch document + $no_docs++; + sleep($SLEEP) if $SLEEP; + my $req = HTTP::Request->new(GET => $url); + # See: http://ftp.sunet.se/pub/NT/mirror-microsoft/kb/Q163/7/74.TXT + $req->header ('Accept', '*/*') if (defined $IIS); # GIF/JPG from IIS 2.0 + $req->authorization_basic(split (/:/, $AUTH)) if (defined $AUTH); + if ($referer && !$SUPPRESS_REFERER) { + if ($req->uri->scheme eq 'http') { + # RFC 2616, section 15.1.3 + $referer = url($referer) unless ref($referer); + undef $referer if ($referer->scheme || '') eq 'https'; + } + $req->referer($referer) if $referer; + } + my $res = $ua->request($req); + + # Check outcome + if ($res->is_success) { + my $doc = $res->content; + my $ct = $res->content_type; + my $name = find_name($res->request->uri, $ct); + print STDERR "$name\n" unless $QUIET; + $seen{$plain_url->as_string} = $name; + + # If the file is HTML, then we look for internal links + if ($ct eq "text/html") { + # Save an unprosessed version of the HTML document. This + # both reserves the name used, and it also ensures that we + # don't loose everything if this program is killed before + # we finish. + save($name, $doc); + my $base = $res->base; + + # Follow and substitute links... + $doc =~ +s/ + ( + <(img|a|body|area|frame|td)\b # some interesting tag + [^>]+ # still inside tag (not strictly correct) + \b(?:src|href|background) # some link attribute + \s*=\s* # = + ) + (?: # scope of OR-ing + (")([^"]*)" | # value in double quotes OR + (')([^']*)' | # value in single quotes OR + ([^\s>]+) # quoteless value + ) +/ + new_link($1, lc($2), $3||$5, HTML::Entities::decode($4||$6||$7), + $base, $name, "$url", $depth+1) +/giex; + # XXX + # The regular expression above is not strictly correct. + # It is not really possible to parse HTML with a single + # regular expression, but it is faster. Tags that might + # confuse us include: + # + # + # + } + save($name, $doc); + return $name; + } + else { + print STDERR $res->code . " " . $res->message . "\n" if $VERBOSE; + $seen{$plain_url->as_string} = $url->as_string; + return $url->as_string; + } +} + +sub new_link +{ + my($pre, $type, $quote, $url, $base, $localbase, $referer, $depth) = @_; + + $url = protect_frag_spaces($url); + + $url = fetch(url($url, $base)->abs, $type, $referer, $depth); + $url = url("file:$url", "file:$localbase")->rel + unless $url =~ /^[.+\-\w]+:/; + + $url = unprotect_frag_spaces($url); + + return $pre . $quote . $url . $quote; +} + + +sub protect_frag_spaces +{ + my ($url) = @_; + + $url = $url->as_string if (ref($url)); + + if ($url =~ m/^([^#]*#)(.+)$/) + { + my ($base, $frag) = ($1, $2); + $frag =~ s/ /%20/g; + $url = $base . $frag; + } + + return $url; +} + + +sub unprotect_frag_spaces +{ + my ($url) = @_; + + $url = $url->as_string if (ref($url)); + + if ($url =~ m/^([^#]*#)(.+)$/) + { + my ($base, $frag) = ($1, $2); + $frag =~ s/%20/ /g; + $url = $base . $frag; + } + + return $url; +} + + +sub fix_backslashes +{ + my ($url) = @_; + my ($base, $frag); + + $url = $url->as_string if (ref($url)); + + if ($url =~ m/([^#]+)(#.*)/) + { + ($base, $frag) = ($1, $2); + } + else + { + $base = $url; + $frag = ""; + } + + $base =~ tr/\\/\//; + $base =~ s/%5[cC]/\//g; # URL-encoded back slash is %5C + + return $base . $frag; +} + + +sub to_lower +{ + my ($url) = @_; + my $was_object = 0; + + if (ref($url)) + { + $url = $url->as_string; + $was_object = 1; + } + + if ($url =~ m/([^#]+)(#.*)/) + { + $url = lc($1) . $2; + } + else + { + $url = lc($url); + } + + if ($was_object == 1) + { + return url($url); + } + else + { + return $url; + } +} + + +sub translate_spaces +{ + my ($url) = @_; + my ($base, $frag); + + $url = $url->as_string if (ref($url)); + + if ($url =~ m/([^#]+)(#.*)/) + { + ($base, $frag) = ($1, $2); + } + else + { + $base = $url; + $frag = ""; + } + + $base =~ s/^ *//; # Remove initial spaces from base + $base =~ s/ *$//; # Remove trailing spaces from base + + $base =~ tr/ /_/; + $base =~ s/%20/_/g; # URL-encoded space is %20 + + return $base . $frag; +} + + +sub mkdirp +{ + my($directory, $mode) = @_; + my @dirs = split(/\//, $directory); + my $path = shift(@dirs); # build it as we go + my $result = 1; # assume it will work + + unless (-d $path) { + $result &&= mkdir($path, $mode); + } + + foreach (@dirs) { + $path .= "/$_"; + if ( ! -d $path) { + $result &&= mkdir($path, $mode); + } + } + + return $result; +} + + +sub find_name +{ + my($url, $type) = @_; + #print "find_name($url, $type)\n"; + + # Translate spaces in URL to underscores (_) if $NOSPACE defined + $url = translate_spaces($url) if (defined $NOSPACE); + + # Translate URL to lowercase if $TOLOWER defined + $url = to_lower($url) if (defined $TOLOWER); + + $url = url($url) unless ref($url); + + my $path = $url->path; + + # trim path until only the basename is left + $path =~ s|(.*/)||; + my $dirname = ".$1"; + if (!$HIER) { + $dirname = ""; + } + elsif (! -d $dirname) { + mkdirp($dirname, 0775); + } + + my $extra = ""; # something to make the name unique + my $suffix; + + if ($KEEPEXT{lc($type)}) { + $suffix = ($path =~ m/\.(.*)/) ? $1 : ""; + } + else { + $suffix = media_suffix($type); + } + + $path =~ s|\..*||; # trim suffix + $path = "index" unless length $path; + + while (1) { + # Construct a new file name + my $file = $dirname . $path . $extra; + $file .= ".$suffix" if $suffix; + # Check if it is unique + return $file unless -f $file; + + # Try something extra + unless ($extra) { + $extra = "001"; + next; + } + $extra++; + } +} + + +sub save +{ + my $name = shift; + #print "save($name,...)\n"; + open(FILE, ">$name") || die "Can't save $name: $!"; + binmode FILE; + print FILE $_[0]; + close(FILE); +} + + +sub usage +{ + print <<""; exit 1; +Usage: $progname [options] +Allowed options are: + --auth=USER:PASS Set authentication credentials for web site + --depth=N Maximum depth to traverse (default is $MAX_DEPTH) + --hier Download into hierarchy (not all files into cwd) + --referer=URI Set initial referer header (or "NONE") + --iis Workaround IIS 2.0 bug by sending "Accept: */*" MIME + header; translates backslashes (\\) to forward slashes (/) + --keepext=type Keep file extension for MIME types (comma-separated list) + --limit=N A limit on the number documents to get (default is $MAX_DOCS) + --nospace Translate spaces URLs (not #fragments) to underscores (_) + --version Print version number and quit + --verbose More output + --quiet No output + --sleep=SECS Sleep between gets, ie. go slowly + --prefix=PREFIX Limit URLs to follow to those which begin with PREFIX + --tolower Translate all URLs to lowercase (useful with IIS servers) + +} + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/makerandom b/Master/tlpkg/tlperl.straw/bin/makerandom new file mode 100755 index 00000000000..29b21c6608c --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/makerandom @@ -0,0 +1,50 @@ +#!/usr/bin/perl -sI../lib -Ilib/ +## +## makerandom - interface to crypt::random +## +## Copyright (c) 1998, Vipul Ved Prakash. All rights reserved. +## This code is free software; you can redistribute it and/or modify +## it under the same terms as Perl itself. +## +## $Id: makerandom,v 1.1.1.1 2001/06/21 15:34:49 vipul Exp $ + +use Crypt::Random qw( makerandom makerandom_itv ); + +unless ( $size || $lower ) { + my $name = $0; + $name =~ s:.*/::; + print "usage: $name [options] \ + -size=bitsize \ + -strength=[01] \ + -dev=device \ + -lower=lower_bound \ + -upper=upper_bound \ + -num=quantity\n\n"; + exit 0; +} + + +$strength = 0 unless $strength; +my $i = 1; + $num = 1 unless $num; + +while ( $i++ <= $num ) { + +my $r; + +if ( $size ) { + $r = makerandom Size => $size, + Strength => $strength, + Device => $dev; +} + +if ( $lower ) { + $r = makerandom_itv Lower => $lower, + Upper => $upper, + Strength => $strength, + Device => $dev; +} + +print "$r\n"; + +} diff --git a/Master/tlpkg/tlperl.straw/bin/makerandom.bat b/Master/tlpkg/tlperl.straw/bin/makerandom.bat new file mode 100755 index 00000000000..672a5dd6812 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/makerandom.bat @@ -0,0 +1,66 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!/usr/bin/perl -sI../lib -Ilib/ +#line 15 +## +## makerandom - interface to crypt::random +## +## Copyright (c) 1998, Vipul Ved Prakash. All rights reserved. +## This code is free software; you can redistribute it and/or modify +## it under the same terms as Perl itself. +## +## $Id: makerandom,v 1.1.1.1 2001/06/21 15:34:49 vipul Exp $ + +use Crypt::Random qw( makerandom makerandom_itv ); + +unless ( $size || $lower ) { + my $name = $0; + $name =~ s:.*/::; + print "usage: $name [options] \ + -size=bitsize \ + -strength=[01] \ + -dev=device \ + -lower=lower_bound \ + -upper=upper_bound \ + -num=quantity\n\n"; + exit 0; +} + + +$strength = 0 unless $strength; +my $i = 1; + $num = 1 unless $num; + +while ( $i++ <= $num ) { + +my $r; + +if ( $size ) { + $r = makerandom Size => $size, + Strength => $strength, + Device => $dev; +} + +if ( $lower ) { + $r = makerandom_itv Lower => $lower, + Upper => $upper, + Strength => $strength, + Device => $dev; +} + +print "$r\n"; + +} + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/parinstallppd b/Master/tlpkg/tlperl.straw/bin/parinstallppd new file mode 100755 index 00000000000..ea4c6385a66 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/parinstallppd @@ -0,0 +1,124 @@ +#!/usr/bin/perl +use strict; +use warnings; + +use Getopt::Long qw/GetOptions/; +use PAR::Dist::InstallPPD; + +our $VERSION = '0.02'; + +=pod + +=head1 NAME + +parinstallppd - Install PPD/PPM packages using PAR + +=head1 SYNOPSIS + +parinstallppd --help + +parinstallppd [-v ...] -u PPD-URI-OR-FILE + +=head1 DESCRIPTION + +This script converts packages for the I +which is specific to ActiveState's perl distributions to F<.par> +files and installs those using L. + +It works much the same way as the L tool but with an additional +installation step after the conversion. + +=head2 Parameters + + -u --uri + Set the place to fetch the .ppd file from. Can be an URL + (http://..., https://..., ftp://...) or a local file. + -v --verbose + Sets the verbose mode. + + --sa --selectarch + Regexp for selecting the implementation based on architecture. + Defaults to the currently running architecture. + --sp --selectperl + Regexp for selecting the implementation based on perl version. + Defaults to the currently running perl version (e.g. 5.8.8) and falls + back to the main version (e.g. 5.8) and then other sub-versions + (e.g. 5.8.7) + +=head1 SEE ALSO + +This tool is implemented using the L module. Please +refer to that module's documentation for details on how this all works. + +PAR has a mailing list, , that you can write to; send +an empty mail to to join the list and +participate in the discussion. + +Please send bug reports to . + +The official PAR website may be of help, too: http://par.perl.org + +For details on the I, please refer to ActiveState's +website at L. + +=head1 AUTHOR + +Steffen Mueller, Esmueller at cpan dot orgE + +=head1 COPYRIGHT AND LICENSE + +Copyright (C) 2006 by Steffen Mueller + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself, either Perl version 5.6 or, +at your option, any later version of Perl 5 you may have available. + +=cut + +my $usage = <<"HERE"; +$0 --help # for help + +$0 [-v --no-docs] -u PPD-URI-OR-FILE + +This script converts packages for the I +which is specific to ActiveState's perl distributions to F<.par> +files and installs those using L. + +It works much the same way as the L tool but with an additional +installation step after the conversion. + +-u --uri + Set the place to fetch the .ppd file from. Can be an URL + (http://..., https://..., ftp://...) or a local file. +-v --verbose + Sets the verbose mode. + +--sa --selectarch + Regexp for selecting the implementation based on architecture. + Defaults to the currently running architecture. +--sp --selectperl + Regexp for selecting the implementation based on perl version. + Defaults to the currently running perl version (e.g. 5.8.8) and + falls back to the main version (e.g. 5.8) and then other + sub-versions (e.g. 5.8.7) +HERE + +my $uri; +my $v = 0; +my $sperl; +my $sarch; +GetOptions( + 'sa|selectarch=s' => \$sarch, + 'sp|selectperl=s' => \$sperl, + 'h|help' => sub { print $usage; exit(1) }, + 'u|uri=s' => \$uri, + 'v|verbose' => \$v, +); + +par_install_ppd( + uri => $uri, + ($v ? (verbose => 1 ) : ()), + ($sarch ? (selectarch => $sarch ) : ()), + ($sperl ? (selectperl => $sperl ) : ()), +); + diff --git a/Master/tlpkg/tlperl.straw/bin/parinstallppd.bat b/Master/tlpkg/tlperl.straw/bin/parinstallppd.bat new file mode 100755 index 00000000000..1a7478353b7 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/parinstallppd.bat @@ -0,0 +1,140 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!/usr/bin/perl +#line 15 +use strict; +use warnings; + +use Getopt::Long qw/GetOptions/; +use PAR::Dist::InstallPPD; + +our $VERSION = '0.02'; + +=pod + +=head1 NAME + +parinstallppd - Install PPD/PPM packages using PAR + +=head1 SYNOPSIS + +parinstallppd --help + +parinstallppd [-v ...] -u PPD-URI-OR-FILE + +=head1 DESCRIPTION + +This script converts packages for the I +which is specific to ActiveState's perl distributions to F<.par> +files and installs those using L. + +It works much the same way as the L tool but with an additional +installation step after the conversion. + +=head2 Parameters + + -u --uri + Set the place to fetch the .ppd file from. Can be an URL + (http://..., https://..., ftp://...) or a local file. + -v --verbose + Sets the verbose mode. + + --sa --selectarch + Regexp for selecting the implementation based on architecture. + Defaults to the currently running architecture. + --sp --selectperl + Regexp for selecting the implementation based on perl version. + Defaults to the currently running perl version (e.g. 5.8.8) and falls + back to the main version (e.g. 5.8) and then other sub-versions + (e.g. 5.8.7) + +=head1 SEE ALSO + +This tool is implemented using the L module. Please +refer to that module's documentation for details on how this all works. + +PAR has a mailing list, , that you can write to; send +an empty mail to to join the list and +participate in the discussion. + +Please send bug reports to . + +The official PAR website may be of help, too: http://par.perl.org + +For details on the I, please refer to ActiveState's +website at L. + +=head1 AUTHOR + +Steffen Mueller, Esmueller at cpan dot orgE + +=head1 COPYRIGHT AND LICENSE + +Copyright (C) 2006 by Steffen Mueller + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself, either Perl version 5.6 or, +at your option, any later version of Perl 5 you may have available. + +=cut + +my $usage = <<"HERE"; +$0 --help # for help + +$0 [-v --no-docs] -u PPD-URI-OR-FILE + +This script converts packages for the I +which is specific to ActiveState's perl distributions to F<.par> +files and installs those using L. + +It works much the same way as the L tool but with an additional +installation step after the conversion. + +-u --uri + Set the place to fetch the .ppd file from. Can be an URL + (http://..., https://..., ftp://...) or a local file. +-v --verbose + Sets the verbose mode. + +--sa --selectarch + Regexp for selecting the implementation based on architecture. + Defaults to the currently running architecture. +--sp --selectperl + Regexp for selecting the implementation based on perl version. + Defaults to the currently running perl version (e.g. 5.8.8) and + falls back to the main version (e.g. 5.8) and then other + sub-versions (e.g. 5.8.7) +HERE + +my $uri; +my $v = 0; +my $sperl; +my $sarch; +GetOptions( + 'sa|selectarch=s' => \$sarch, + 'sp|selectperl=s' => \$sperl, + 'h|help' => sub { print $usage; exit(1) }, + 'u|uri=s' => \$uri, + 'v|verbose' => \$v, +); + +par_install_ppd( + uri => $uri, + ($v ? (verbose => 1 ) : ()), + ($sarch ? (selectarch => $sarch ) : ()), + ($sperl ? (selectperl => $sperl ) : ()), +); + + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/perl.exe b/Master/tlpkg/tlperl.straw/bin/perl.exe new file mode 100755 index 00000000000..e66a18bb962 Binary files /dev/null and b/Master/tlpkg/tlperl.straw/bin/perl.exe differ diff --git a/Master/tlpkg/tlperl.straw/bin/perl5.10.1.exe b/Master/tlpkg/tlperl.straw/bin/perl5.10.1.exe new file mode 100755 index 00000000000..e66a18bb962 Binary files /dev/null and b/Master/tlpkg/tlperl.straw/bin/perl5.10.1.exe differ diff --git a/Master/tlpkg/tlperl.straw/bin/perl510.dll b/Master/tlpkg/tlperl.straw/bin/perl510.dll new file mode 100755 index 00000000000..4a533b76803 Binary files /dev/null and b/Master/tlpkg/tlperl.straw/bin/perl510.dll differ diff --git a/Master/tlpkg/tlperl.straw/bin/perlbug.bat b/Master/tlpkg/tlperl.straw/bin/perlbug.bat new file mode 100755 index 00000000000..2d37b78d2ba --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/perlbug.bat @@ -0,0 +1,1478 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!perl +#line 15 + eval 'exec C:\strawberry\perl\bin\perl.exe -S $0 ${1+"$@"}' + if $running_under_some_shell; + +my $config_tag1 = '5.10.1 - Wed Jan 27 23:29:27 2010'; + +my $patchlevel_date = 1250639291; +my $patch_tags = ''; +my @patches = ( + '' +); + +use warnings; +no warnings 'once'; # Eventually, the $::opt_ stuff should get cleaned up +use strict; +use Config; +use File::Spec; # keep perlbug Perl 5.005 compatible +use Getopt::Std; +use File::Basename 'basename'; + +sub paraprint; + +BEGIN { + eval { require Mail::Send;}; + $::HaveSend = ($@ eq ""); + eval { require Mail::Util; } ; + $::HaveUtil = ($@ eq ""); + # use secure tempfiles wherever possible + eval { require File::Temp; }; + $::HaveTemp = ($@ eq ""); + eval { require Module::CoreList; }; + $::HaveCoreList = ($@ eq ""); +}; + +my $Version = "1.39"; + +# Changed in 1.06 to skip Mail::Send and Mail::Util if not available. +# Changed in 1.07 to see more sendmail execs, and added pipe output. +# Changed in 1.08 to use correct address for sendmail. +# Changed in 1.09 to close the REP file before calling it up in the editor. +# Also removed some old comments duplicated elsewhere. +# Changed in 1.10 to run under VMS without Mail::Send; also fixed +# temp filename generation. +# Changed in 1.11 to clean up some text and removed Mail::Send deactivator. +# Changed in 1.12 to check for editor errors, make save/send distinction +# clearer and add $ENV{REPLYTO}. +# Changed in 1.13 to hopefully make it more difficult to accidentally +# send mail +# Changed in 1.14 to make the prompts a little more clear on providing +# helpful information. Also let file read fail gracefully. +# Changed in 1.15 to add warnings to stop people using perlbug for non-bugs. +# Also report selected environment variables. +# Changed in 1.16 to include @INC, and allow user to re-edit if no changes. +# Changed in 1.17 Win32 support added. GSAR 97-04-12 +# Changed in 1.18 add '-ok' option for reporting build success. CFR 97-06-18 +# Changed in 1.19 '-ok' default not '-v' +# add local patch information +# warn on '-ok' if this is an old system; add '-okay' +# Changed in 1.20 Added patchlevel.h reading and version/config checks +# Changed in 1.21 Added '-nok' for reporting build failure DFD 98-05-05 +# Changed in 1.22 Heavy reformatting & minor bugfixes HVDS 98-05-10 +# Changed in 1.23 Restore -ok(ay): say 'success'; don't prompt +# Changed in 1.24 Added '-F' to save report HVDS 98-07-01 +# Changed in 1.25 Warn on failure to open save file. HVDS 98-07-12 +# Changed in 1.26 Don't require -t STDIN for -ok. HVDS 98-07-15 +# Changed in 1.27 Added Mac OS and File::Spec support CNANDOR 99-07-27 +# Changed in 1.28 Additional questions for Perlbugtron RFOLEY 20.03.2000 +# Changed in 1.29 Perlbug(tron): auto(-ok), short prompts RFOLEY 05-05-2000 +# Changed in 1.30 Added warnings on failure to open files MSTEVENS 13-07-2000 +# Changed in 1.31 Add checks on close().Fix my $var unless. TJENNESS 26-07-2000 +# Changed in 1.32 Use File::Spec->tmpdir TJENNESS 20-08-2000 +# Changed in 1.33 Don't require -t STDOUT for -ok. +# Changed in 1.34 Added Message-Id RFOLEY 18-06-2002 +# Changed in 1.35 Use File::Temp (patch from Solar Designer) NWCLARK 28-02-2004 +# Changed in 1.36 Initial Module::CoreList support Alexandr Ciornii 11-07-2007 +# Changed in 1.37 Killed some string evals, rewrote most prose JESSE 2008-06-08 +# Changed in 1.38 Actually enforce the CoreList check, +# Record the module the user enters if they do so +# Refactor prompts to use common code JESSE 2008-06-08 +# Changed in 1.39 Trap mail sending failures (simple ones) so JESSE 2008-06-08 +# users might be able to recover their bug reports +# Refactor mail sending routines +# Unify message building code +# Unify message header building +# Fix "module" prompting to not squish "category" prompting +# use warnings; (except 'once' warnings) +# Unified report fingerprint/change detection code +# Removed some labeled 'gotos' +#TODO: +# make sure failure (transmission-wise) of Mail::Send is accounted for. +# (This may work now. Unsure of the original author's issue -JESSE 2008-06-08) +# - Test -b option + +my( $file, $usefile, $cc, $address, $bugaddress, $testaddress, $thanksaddress, + $filename, $messageid, $domain, $subject, $from, $verbose, $ed, $outfile, + $fh, $me, $body, $andcc, %REP, $ok, $thanks, $progname, + $Is_MacOS, $Is_MSWin32, $Is_Linux, $Is_VMS, $Is_OpenBSD, + $report_about_module, $category, $severity, + +); + +my $perl_version = $^V ? sprintf("%vd", $^V) : $]; + +my $config_tag2 = "$perl_version - $Config{cf_time}"; + +Init(); + +if ($::opt_h) { Help(); exit; } +if ($::opt_d) { Dump(*STDOUT); exit; } +if (!-t STDIN && !($ok and not $::opt_n)) { + paraprint <<"EOF"; +Please use $progname interactively. If you want to +include a file, you can use the -f switch. +EOF + die "\n"; +} + +Query(); +Edit() unless $usefile || ($ok and not $::opt_n); +NowWhat(); +if ($outfile) { + save_message_to_disk($outfile); +} else { + Send(); + if ($thanks) { + print "\nThank you for taking the time to send a thank-you message!\n\n"; + } else { + print "\nThank you for taking the time to file a bug report!\n\n"; + } +} + +exit; + +sub ask_for_alternatives { # (category|severity) + my $name = shift; + my %alts = ( + 'category' => { + 'default' => 'core', + 'ok' => 'install', + # Inevitably some of these will end up in RT whatever we do: + 'thanks' => 'thanks', + 'opts' => [qw(core docs install library utilities)], # patch, notabug + }, + 'severity' => { + 'default' => 'low', + 'ok' => 'none', + 'thanks' => 'none', + 'opts' => [qw(critical high medium low wishlist none)], # zero + }, + ); + die "Invalid alternative ($name) requested\n" unless grep(/^$name$/, keys %alts); + my $alt = ""; + my $what = $ok || $thanks; + if ($what) { + $alt = $alts{$name}{$what}; + } else { + my @alts = @{$alts{$name}{'opts'}}; + print "\n\n"; + paraprint < 5) { + die "Invalid $name: aborting.\n"; + } + $alt = _prompt('', "\u$name", $alts{$name}{'default'}); + $alt ||= $alts{$name}{'default'}; + } while !((($alt) = grep(/^$alt/i, @alts))); + } + lc $alt; +} + +sub Init { + # -------- Setup -------- + + $Is_MSWin32 = $^O eq 'MSWin32'; + $Is_VMS = $^O eq 'VMS'; + $Is_Linux = lc($^O) eq 'linux'; + $Is_OpenBSD = lc($^O) eq 'openbsd'; + $Is_MacOS = $^O eq 'MacOS'; + + @ARGV = split m/\s+/, + MacPerl::Ask('Provide command line args here (-h for help):') + if $Is_MacOS && $MacPerl::Version =~ /App/; + + if (!getopts("Adhva:s:b:f:F:r:e:SCc:to:n:T")) { Help(); exit; }; + + # This comment is needed to notify metaconfig that we are + # using the $perladmin, $cf_by, and $cf_time definitions. + + # -------- Configuration --------- + + # perlbug address + $bugaddress = 'perlbug@perl.org'; + + # Test address + $testaddress = 'perlbug-test@perl.org'; + + # Thanks address + $thanksaddress = 'perl-thanks@perl.org'; + + if (basename ($0) =~ /^perlthanks/i) { + # invoked as perlthanks + $::opt_T = 1; + $::opt_C = 1; # don't send a copy to the local admin + } + + if ($::opt_T) { + $thanks = 'thanks'; + } + + $progname = $thanks ? 'perlthanks' : 'perlbug'; + # Target address + $address = $::opt_a || ($::opt_t ? $testaddress + : $thanks ? $thanksaddress : $bugaddress); + + # Users address, used in message and in Reply-To header + $from = $::opt_r || ""; + + # Include verbose configuration information + $verbose = $::opt_v || 0; + + # Subject of bug-report message + $subject = $::opt_s || ""; + + # Send a file + $usefile = ($::opt_f || 0); + + # File to send as report + $file = $::opt_f || ""; + + # File to output to + $outfile = $::opt_F || ""; + + # Body of report + $body = $::opt_b || ""; + + # Editor + $ed = $::opt_e || $ENV{VISUAL} || $ENV{EDITOR} || $ENV{EDIT} + || ($Is_VMS && "edit/tpu") + || ($Is_MSWin32 && "notepad") + || ($Is_MacOS && '') + || "vi"; + + # Not OK - provide build failure template by finessing OK report + if ($::opt_n) { + if (substr($::opt_n, 0, 2) eq 'ok' ) { + $::opt_o = substr($::opt_n, 1); + } else { + Help(); + exit(); + } + } + + # OK - send "OK" report for build on this system + $ok = ''; + if ($::opt_o) { + if ($::opt_o eq 'k' or $::opt_o eq 'kay') { + my $age = time - $patchlevel_date; + if ($::opt_o eq 'k' and $age > 60 * 24 * 60 * 60 ) { + my $date = localtime $patchlevel_date; + print <<"EOF"; +"perlbug -ok" and "perlbug -nok" do not report on Perl versions which +are more than 60 days old. This Perl version was constructed on +$date. If you really want to report this, use +"perlbug -okay" or "perlbug -nokay". +EOF + exit(); + } + # force these options + unless ($::opt_n) { + $::opt_S = 1; # don't prompt for send + $::opt_b = 1; # we have a body + $body = "Perl reported to build OK on this system.\n"; + } + $::opt_C = 1; # don't send a copy to the local admin + $::opt_s = 1; # we have a subject line + $subject = ($::opt_n ? 'Not ' : '') + . "OK: perl $perl_version ${patch_tags}on" + ." $::Config{'archname'} $::Config{'osvers'} $subject"; + $ok = 'ok'; + } else { + Help(); + exit(); + } + } + + # Possible administrator addresses, in order of confidence + # (Note that cf_email is not mentioned to metaconfig, since + # we don't really want it. We'll just take it if we have to.) + # + # This has to be after the $ok stuff above because of the way + # that $::opt_C is forced. + $cc = $::opt_C ? "" : ( + $::opt_c || $::Config{'perladmin'} + || $::Config{'cf_email'} || $::Config{'cf_by'} + ); + + if ($::HaveUtil) { + $domain = Mail::Util::maildomain(); + } elsif ($Is_MSWin32) { + $domain = $ENV{'USERDOMAIN'}; + } else { + require Sys::Hostname; + $domain = Sys::Hostname::hostname(); + } + + # Message-Id - rjsf + $messageid = "<$::Config{'version'}_${$}_".time."\@$domain>"; + + # My username + $me = $Is_MSWin32 ? $ENV{'USERNAME'} + : $^O eq 'os2' ? $ENV{'USER'} || $ENV{'LOGNAME'} + : $Is_MacOS ? $ENV{'USER'} + : eval { getpwuid($<) }; # May be missing + + $from = $::Config{'cf_email'} + if !$from && $::Config{'cf_email'} && $::Config{'cf_by'} && $me && + ($me eq $::Config{'cf_by'}); +} # sub Init + +sub Query { + # Explain what perlbug is + unless ($ok) { + if ($thanks) { + paraprint <<'EOF'; +This program provides an easy way to send a thank-you message back to the +authors and maintainers of perl. + +If you wish to submit a bug report, please run it without the -T flag +(or run the program perlbug rather than perlthanks) +EOF + } else { + paraprint <<"EOF"; +This program provides an easy way to create a message reporting a +bug in the core perl distribution (along with tests or patches) +to the volunteers who maintain perl at $address. To send a thank-you +note to $thanksaddress instead of a bug report, please run 'perlthanks'. + +Please do not use $0 to send test messages, test whether perl +works, or to report bugs in perl modules from CPAN. + +For help using perl, try posting to the Usenet newsgroup +comp.lang.perl.misc. +EOF + } + } + + # Prompt for subject of message, if needed + + if ($subject && TrivialSubject($subject)) { + $subject = ''; + } + + unless ($subject) { + print +"First of all, please provide a subject for the message.\n"; + if ( not $thanks) { + paraprint <first_release($entry); + if ($entry and not $first_release) { + paraprint <$filename") or die "Unable to create report file '$filename': $!\n"; + my $reptype = !$ok ? ($thanks ? 'thank-you' : 'bug') + : $::opt_n ? "build failure" : "success"; + + print REP <) { + print REP $_ + } + close(F) or die "Error closing '$file': $!"; + } else { + if ($thanks) { + print REP <<'EOF'; + +----------------------------------------------------------------- +[Please enter your thank-you message here] + + + +[You're welcome to delete anything below this line] +----------------------------------------------------------------- +EOF + } else { + print REP <<'EOF'; + +----------------------------------------------------------------- +[Please describe your issue here] + + + +[Please do not change anything below this line] +----------------------------------------------------------------- +EOF + } + } + Dump(*REP); + close(REP) or die "Error closing report file: $!"; + + # Set up an initial report fingerprint so we can compare it later + _fingerprint_lines_in_report(); + +} # sub Query + +sub Dump { + local(*OUT) = @_; + + print OUT <etry dit + next; + } elsif ( $action =~ /^[cq]/i ) { # ancel, uit + Cancel(); # cancel exits + } + } + # Ok. the user did what they needed to; + return; + + } +} + + +sub Cancel { + 1 while unlink($filename); # remove all versions under VMS + print "\nQuitting without sending your message.\n"; + exit(0); +} + +sub NowWhat { + # Report is done, prompt for further action + if( !$::opt_S ) { + while(1) { + my $menu = <ile/ve + if ( SaveMessage() ) { exit } + } elsif ($action =~ /^(d|l|sh)/i ) { # isplay, ist, ow + # Display the message + open(REP, "<$filename") or die "Couldn't open file '$filename': $!\n"; + while () { print $_ } + close(REP) or die "Error closing report file '$filename': $!"; + } elsif ($action =~ /^su/i) { # bject + my $reply = _prompt( "Subject: $subject", "If the above subject is fine, press Enter. Otherwise, type a replacement now\nSubject"); + if ($reply ne '') { + unless (TrivialSubject($reply)) { + $subject = $reply; + print "Subject: $subject\n"; + } + } + } elsif ($action =~ /^se/i) { # end + # Send the message + my $reply = _prompt( "Are you certain you want to send this message?", 'Please type "yes" if you are','no'); + if ($reply =~ /^yes$/) { + last; + } else { + paraprint <dit, e-edit + # edit the message + Edit(); + } elsif ($action =~ /^[qc]/i) { # ancel, uit + Cancel(); + } elsif ($action =~ /^s/i) { + paraprint < 1); + close($fh); + return $filename; + } else { + # Bah. Fall back to doing things less securely. + my $dir = File::Spec->tmpdir(); + $filename = "bugrep0$$"; + $filename++ while -e File::Spec->catfile($dir, $filename); + $filename = File::Spec->catfile($dir, $filename); + } +} + +sub paraprint { + my @paragraphs = split /\n{2,}/, "@_"; + for (@paragraphs) { # implicit local $_ + s/(\S)\s*\n/$1 /g; + write; + print "\n"; + } +} + +sub _prompt { + my ($explanation, $prompt, $default) = (@_); + if ($explanation) { + print "\n\n"; + paraprint $explanation; + } + print $prompt. ($default ? " [$default]" :''). ": "; + my $result = scalar(<>); + chomp($result); + $result =~ s/^\s*(.*?)\s*$/$1/s; + if ($default && $result eq '') { + return $default; + } else { + return $result; + } +} + +sub _build_header { + my %attr = (@_); + + my $head = ''; + for my $header (keys %attr) { + $head .= "$header: ".$attr{$header}."\n"; + } + return $head; +} + +sub _message_headers { + my %headers = ( To => $address, Subject => $subject ); + $headers{'Cc'} = $cc if ($cc); + $headers{'Message-Id'} = $messageid if ($messageid); + $headers{'Reply-To'} = $from if ($from); + return \%headers; +} + +sub build_complete_message { + my $content = _build_header(%{_message_headers()}) . "\n\n"; + open( REP, "<$filename" ) or die "Couldn't open file '$filename': $!\n"; + while () { $content .= $_; } + close(REP) or die "Error closing report file '$filename': $!"; + return $content; +} + +sub save_message_to_disk { + my $file = shift; + + open OUTFILE, ">$file" or do { warn "Couldn't open '$file': $!\n"; return undef}; + print OUTFILE build_complete_message(); + close(OUTFILE) or do { warn "Error closing $file: $!"; return undef }; + print "\nMessage saved.\n"; + return 1; +} + +sub _send_message_vms { + if ( ( $address =~ /@/ and $address !~ /^\w+%"/ ) + or ( $cc =~ /@/ and $cc !~ /^\w+%"/ ) ) { + my $prefix; + foreach ( qw[ IN MX SMTP UCX PONY WINS ], '' ) { + $prefix = "$_%", last if $ENV{"MAIL\$PROTOCOL_$_"}; + } + $address = qq[${prefix}"$address"] unless $address =~ /^\w+%"/; + $cc = qq[${prefix}"$cc"] unless !$cc || $cc =~ /^\w+%"/; + } + $subject =~ s/"/""/g; + $address =~ s/"/""/g; + $cc =~ s/"/""/g; + my $sts = system(qq[mail/Subject="$subject" $filename. "$address","$cc"]); + if ($sts) { + die "Can't spawn off mail (leaving bug report in $filename): $sts"; + } +} + +sub _send_message_mailsend { + my $msg = Mail::Send->new(); + my %headers = %{_message_headers()}; + for my $key ( keys %headers) { + $msg->add($key => $headers{$key}); + } + + $fh = $msg->open; + open(REP, "<$filename") or die "Couldn't open '$filename': $!\n"; + while () { print $fh $_ } + close(REP) or die "Error closing $filename: $!"; + $fh->close; + + print "\nMessage sent.\n"; +} + +sub _probe_for_sendmail { + my $sendmail = ""; + for (qw(/usr/lib/sendmail /usr/sbin/sendmail /usr/ucblib/sendmail)) { + $sendmail = $_, last if -e $_; + } + if ( $^O eq 'os2' and $sendmail eq "" ) { + my $path = $ENV{PATH}; + $path =~ s:\\:/:; + my @path = split /$Config{'path_sep'}/, $path; + for (@path) { + $sendmail = "$_/sendmail", last if -e "$_/sendmail"; + $sendmail = "$_/sendmail.exe", last if -e "$_/sendmail.exe"; + } + } + return $sendmail; +} + +sub _send_message_sendmail { + my $sendmail = _probe_for_sendmail(); + unless ($sendmail) { + paraprint(<<"EOF"), die "\n"; +It appears that there is no program which looks like "sendmail" on +your system and that the Mail::Send library from CPAN isn't available. +Because of this, there's no easy way to automatically send your +message. + +A copy of your message has been saved in '$filename' for you to +send to '$address' with your normal mail client. +EOF + } + + open( SENDMAIL, "|$sendmail -t -oi" ) + || die "'|$sendmail -t -oi' failed: $!"; + print SENDMAIL build_complete_message(); + if ( close(SENDMAIL) ) { + print "\nMessage sent\n"; + } else { + warn "\nSendmail returned status '", $? >> 8, "'\n"; + } +} + + + +# a strange way to check whether any significant editing +# has been done: check whether any new non-empty lines +# have been added. + +sub _fingerprint_lines_in_report { + my $new_lines = 0; + # read in the report template once so that + # we can track whether the user does any editing. + # yes, *all* whitespace is ignored. + + open(REP, "<$filename") or die "Unable to open report file '$filename': $!\n"; + while (my $line = ) { + $line =~ s/\s+//g; + $new_lines++ if (!$REP{$line}); + + } + close(REP) or die "Error closing report file '$filename': $!"; + # returns the number of lines with content that wasn't there when last we looked + return $new_lines; +} + + + +format STDOUT = +^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ~~ +$_ +. + +__END__ + +=head1 NAME + +perlbug - how to submit bug reports on Perl + +=head1 SYNOPSIS + +B + +B S<[ B<-v> ]> S<[ B<-a> I
]> S<[ B<-s> I ]> +S<[ B<-b> I | B<-f> I ]> S<[ B<-F> I ]> +S<[ B<-r> I ]> +S<[ B<-e> I ]> S<[ B<-c> I | B<-C> ]> +S<[ B<-S> ]> S<[ B<-t> ]> S<[ B<-d> ]> S<[ B<-A> ]> S<[ B<-h> ]> S<[ B<-T> ]> + +B S<[ B<-v> ]> S<[ B<-r> I ]> + S<[ B<-A> ]> S<[ B<-ok> | B<-okay> | B<-nok> | B<-nokay> ]> + +B + +=head1 DESCRIPTION + + +This program is designed to help you generate and send bug reports +(and thank-you notes) about perl5 and the modules which ship with it. + +In most cases, you can just run it interactively from a command +line without any special arguments and follow the prompts. + +If you have found a bug with a non-standard port (one that was not +part of the I), a binary distribution, or a +non-core module (such as Tk, DBI, etc), then please see the +documentation that came with that distribution to determine the +correct place to report bugs. + +If you are unable to send your report using B (most likely +because your system doesn't have a way to send mail that perlbug +recognizes), you may be able to use this tool to compose your report +and save it to a file which you can then send to B +using your regular mail client. + +In extreme cases, B may not work well enough on your system +to guide you through composing a bug report. In those cases, you +may be able to use B to get system configuration +information to include in a manually composed bug report to +B. + + +When reporting a bug, please run through this checklist: + +=over 4 + +=item What version of Perl you are running? + +Type C at the command line to find out. + +=item Are you running the latest released version of perl? + +Look at http://www.perl.org/ to find out. If you are not using the +latest released version, please try to replicate your bug on the +latest stable release. + +Note that reports about bugs in old versions of Perl, especially +those which indicate you haven't also tested the current stable +release of Perl, are likely to receive less attention from the +volunteers who build and maintain Perl than reports about bugs in +the current release. + +This tool isn't apropriate for reporting bugs in any version +prior to Perl 5.0. + +=item Are you sure what you have is a bug? + +A significant number of the bug reports we get turn out to be +documented features in Perl. Make sure the issue you've run into +isn't intentional by glancing through the documentation that comes +with the Perl distribution. + +Given the sheer volume of Perl documentation, this isn't a trivial +undertaking, but if you can point to documentation that suggests +the behaviour you're seeing is I, your issue is likely to +receive more attention. You may want to start with B +L for pointers to common traps that new (and experienced) +Perl programmers run into. + +If you're unsure of the meaning of an error message you've run +across, B L for an explanation. If the message +isn't in perldiag, it probably isn't generated by Perl. You may +have luck consulting your operating system documentation instead. + +If you are on a non-UNIX platform B L, as some +features may be unimplemented or work differently. + +You may be able to figure out what's going wrong using the Perl +debugger. For information about how to use the debugger B +L. + +=item Do you have a proper test case? + +The easier it is to reproduce your bug, the more likely it will be +fixed -- if nobody can duplicate your problem, it probably won't be +addressed. + +A good test case has most of these attributes: short, simple code; +few dependencies on external commands, modules, or libraries; no +platform-dependent code (unless it's a platform-specific bug); +clear, simple documentation. + +A good test case is almost always a good candidate to be included in +Perl's test suite. If you have the time, consider writing your test case so +that it can be easily included into the standard test suite. + +=item Have you included all relevant information? + +Be sure to include the B error messages, if any. +"Perl gave an error" is not an exact error message. + +If you get a core dump (or equivalent), you may use a debugger +(B, B, etc) to produce a stack trace to include in the bug +report. + +NOTE: unless your Perl has been compiled with debug info +(often B<-g>), the stack trace is likely to be somewhat hard to use +because it will most probably contain only the function names and not +their arguments. If possible, recompile your Perl with debug info and +reproduce the crash and the stack trace. + +=item Can you describe the bug in plain English? + +The easier it is to understand a reproducible bug, the more likely +it will be fixed. Any insight you can provide into the problem +will help a great deal. In other words, try to analyze the problem +(to the extent you can) and report your discoveries. + +=item Can you fix the bug yourself? + +A bug report which I will almost +definitely be fixed. When sending a patch, please use the C +program with the C<-u> option to generate "unified" diff files. +Bug reports with patches are likely to receive significantly more +attention and interest than those without patches. + +Your patch may be returned with requests for changes, or requests for more +detailed explanations about your fix. + +Here are a few hints for creating high-quality patches: + +Make sure the patch is not reversed (the first argument to diff is +typically the original file, the second argument your changed file). +Make sure you test your patch by applying it with the C +program before you send it on its way. Try to follow the same style +as the code you are trying to patch. Make sure your patch really +does work (C, if the thing you're patching is covered +by Perl's test suite). + +=item Can you use C to submit the report? + +B will, amongst other things, ensure your report includes +crucial information about your version of perl. If C is +unable to mail your report after you have typed it in, you may have +to compose the message yourself, add the output produced by C and email it to B. If, for some reason, you +cannot run C at all on your system, be sure to include the +entire output produced by running C (note the uppercase V). + +Whether you use C or send the email manually, please make +your Subject line informative. "a bug" is not informative. Neither +is "perl crashes" nor is "HELP!!!". These don't help. A compact +description of what's wrong is fine. + +=item Can you use C to submit a thank-you note? + +Yes, you can do this by either using the C<-T> option, or by invoking +the program as C. Thank-you notes are good. It makes people +smile. + +=back + +Having done your bit, please be prepared to wait, to be told the +bug is in your code, or possibly to get no reply at all. The +volunteers who maintain Perl are busy folks, so if your problem is +an obvious bug in your own code, is difficult to understand or is +a duplicate of an existing report, you may not receive a personal +reply. + +If it is important to you that your bug be fixed, do monitor the +perl5-porters@perl.org mailing list and the commit logs to development +versions of Perl, and encourage the maintainers with kind words or +offers of frosty beverages. (Please do be kind to the maintainers. +Harassing or flaming them is likely to have the opposite effect of +the one you want.) + +Feel free to update the ticket about your bug on http://rt.perl.org +if a new version of Perl is released and your bug is still present. + +=head1 OPTIONS + +=over 8 + +=item B<-a> + +Address to send the report to. Defaults to B. + +=item B<-A> + +Don't send a bug received acknowledgement to the reply address. +Generally it is only a sensible to use this option if you are a +perl maintainer actively watching perl porters for your message to +arrive. + +=item B<-b> + +Body of the report. If not included on the command line, or +in a file with B<-f>, you will get a chance to edit the message. + +=item B<-C> + +Don't send copy to administrator. + +=item B<-c> + +Address to send copy of report to. Defaults to the address of the +local perl administrator (recorded when perl was built). + +=item B<-d> + +Data mode (the default if you redirect or pipe output). This prints out +your configuration data, without mailing anything. You can use this +with B<-v> to get more complete data. + +=item B<-e> + +Editor to use. + +=item B<-f> + +File containing the body of the report. Use this to quickly send a +prepared message. + +=item B<-F> + +File to output the results to instead of sending as an email. Useful +particularly when running perlbug on a machine with no direct internet +connection. + +=item B<-h> + +Prints a brief summary of the options. + +=item B<-ok> + +Report successful build on this system to perl porters. Forces B<-S> +and B<-C>. Forces and supplies values for B<-s> and B<-b>. Only +prompts for a return address if it cannot guess it (for use with +B). Honors return address specified with B<-r>. You can use this +with B<-v> to get more complete data. Only makes a report if this +system is less than 60 days old. + +=item B<-okay> + +As B<-ok> except it will report on older systems. + +=item B<-nok> + +Report unsuccessful build on this system. Forces B<-C>. Forces and +supplies a value for B<-s>, then requires you to edit the report +and say what went wrong. Alternatively, a prepared report may be +supplied using B<-f>. Only prompts for a return address if it +cannot guess it (for use with B). Honors return address +specified with B<-r>. You can use this with B<-v> to get more +complete data. Only makes a report if this system is less than 60 +days old. + +=item B<-nokay> + +As B<-nok> except it will report on older systems. + +=item B<-r> + +Your return address. The program will ask you to confirm its default +if you don't use this option. + +=item B<-S> + +Send without asking for confirmation. + +=item B<-s> + +Subject to include with the message. You will be prompted if you don't +supply one on the command line. + +=item B<-t> + +Test mode. The target address defaults to B. + +=item B<-T> + +Send a thank-you note instead of a bug report. + +=item B<-v> + +Include verbose configuration data in the report. + +=back + +=head1 AUTHORS + +Kenneth Albanowski (Ekjahds@kjahds.comE), subsequently +Itored by Gurusamy Sarathy (Egsar@activestate.comE), +Tom Christiansen (Etchrist@perl.comE), Nathan Torkington +(Egnat@frii.comE), Charles F. Randall (Ecfr@pobox.comE), +Mike Guy (Emjtg@cam.a.ukE), Dominic Dunlop +(Edomo@computer.orgE), Hugo van der Sanden (Ehv@crypt.org), +Jarkko Hietaniemi (Ejhi@iki.fiE), Chris Nandor +(Epudge@pobox.comE), Jon Orwant (Eorwant@media.mit.eduE, +Richard Foley (Erichard.foley@rfi.netE), and Jesse Vincent +(Ejesse@bestpractical.com). + +=head1 SEE ALSO + +perl(1), perldebug(1), perldiag(1), perlport(1), perltrap(1), +diff(1), patch(1), dbx(1), gdb(1) + +=head1 BUGS + +None known (guess what must have been used to report them?) + +=cut + + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/perldoc b/Master/tlpkg/tlperl.straw/bin/perldoc new file mode 100755 index 00000000000..48f9b79ba42 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/perldoc @@ -0,0 +1,7 @@ +#!/usr/bin/perl + +require 5; +BEGIN { $^W = 1 if $ENV{'PERLDOCDEBUG'} } +use Pod::Perldoc; +exit( Pod::Perldoc->run() ); + diff --git a/Master/tlpkg/tlperl.straw/bin/perldoc.bat b/Master/tlpkg/tlperl.straw/bin/perldoc.bat new file mode 100755 index 00000000000..a6fc80ed1da --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/perldoc.bat @@ -0,0 +1,23 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!/usr/bin/perl +#line 15 + +require 5; +BEGIN { $^W = 1 if $ENV{'PERLDOCDEBUG'} } +use Pod::Perldoc; +exit( Pod::Perldoc->run() ); + + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/perlglob.bat b/Master/tlpkg/tlperl.straw/bin/perlglob.bat new file mode 100755 index 00000000000..f4a81850873 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/perlglob.bat @@ -0,0 +1,69 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!perl -w +#line 15 +use File::DosGlob; +$| = 1; +while (@ARGV) { + my $arg = shift; + my @m = File::DosGlob::doglob(1,$arg); + print (@m ? join("\0", sort @m) : $arg); + print "\0" if @ARGV; +} +__END__ + +=head1 NAME + +perlglob.bat - a more capable perlglob.exe replacement + +=head1 SYNOPSIS + + @perlfiles = glob "..\\pe?l/*.p?"; + print <..\\pe?l/*.p?>; + + # more efficient version + > perl -MFile::DosGlob=glob -e "print <../pe?l/*.p?>" + +=head1 DESCRIPTION + +This file is a portable replacement for perlglob.exe. It +is largely compatible with perlglob.exe (the Microsoft setargv.obj +version) in all but one respect--it understands wildcards in +directory components. + +It prints null-separated filenames to standard output. + +For details of the globbing features implemented, see +L. + +While one may replace perlglob.exe with this, usage by overriding +CORE::glob with File::DosGlob::glob should be much more efficient, +because it avoids launching a separate process, and is therefore +strongly recommended. See L for details of overriding +builtins. + +=head1 AUTHOR + +Gurusamy Sarathy + +=head1 SEE ALSO + +perl + +File::DosGlob + +=cut + + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/perlglob.exe b/Master/tlpkg/tlperl.straw/bin/perlglob.exe new file mode 100755 index 00000000000..ba5b1d47623 Binary files /dev/null and b/Master/tlpkg/tlperl.straw/bin/perlglob.exe differ diff --git a/Master/tlpkg/tlperl.straw/bin/perlivp.bat b/Master/tlpkg/tlperl.straw/bin/perlivp.bat new file mode 100755 index 00000000000..c44e6a85615 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/perlivp.bat @@ -0,0 +1,456 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!perl +#line 15 + eval 'exec C:\strawberry\perl\bin\perl.exe -S $0 ${1+"$@"}' + if $running_under_some_shell; + +# perlivp v5.10.1 + +sub usage { + warn "@_\n" if @_; + print << " EOUSAGE"; +Usage: + + $0 [-a] [-p] [-v] | [-h] + + -a Run all tests (default is to skip .ph tests) + -p Print a preface before each test telling what it will test. + -v Verbose mode in which extra information about test results + is printed. Test failures always print out some extra information + regardless of whether or not this switch is set. + -h Prints this help message. + EOUSAGE + exit; +} + +use vars qw(%opt); # allow testing with older versions (do not use our) + +@opt{ qw/? H h P p V v/ } = qw(0 0 0 0 0 0 0); + +while ($ARGV[0] =~ /^-/) { + $ARGV[0] =~ s/^-//; + for my $flag (split(//,$ARGV[0])) { + usage() if '?' =~ /\Q$flag/; + usage() if 'h' =~ /\Q$flag/; + usage() if 'H' =~ /\Q$flag/; + usage("unknown flag: `$flag'") unless 'HhPpVva' =~ /\Q$flag/; + warn "$0: `$flag' flag already set\n" if $opt{$flag}++; + } + shift; +} + +$opt{p}++ if $opt{P}; +$opt{v}++ if $opt{V}; + +my $pass__total = 0; +my $error_total = 0; +my $tests_total = 0; + +my $perlpath = 'C:\strawberry\perl\bin\perl.exe'; +my $useithreads = 'define'; + +print "## Checking Perl binary via variable `\$perlpath' = $perlpath.\n" if $opt{'p'}; + +if (-x $perlpath) { + print "## Perl binary `$perlpath' appears executable.\n" if $opt{'v'}; + print "ok 1\n"; + $pass__total++; +} +else { + print "# Perl binary `$perlpath' does not appear executable.\n"; + print "not ok 1\n"; + $error_total++; +} +$tests_total++; + + +print "## Checking Perl version via variable `\$]'.\n" if $opt{'p'}; + +my $ivp_VERSION = "5.010001"; + +if ($ivp_VERSION eq $]) { + print "## Perl version `$]' appears installed as expected.\n" if $opt{'v'}; + print "ok 2\n"; + $pass__total++; +} +else { + print "# Perl version `$]' installed, expected $ivp_VERSION.\n"; + print "not ok 2\n"; + $error_total++; +} +$tests_total++; + + +print "## Checking roots of the Perl library directory tree via variable `\@INC'.\n" if $opt{'p'}; + +my $INC_total = 0; +my $INC_there = 0; +foreach (@INC) { + next if $_ eq '.'; # skip -d test here + if ($^O eq 'MacOS') { + next if $_ eq ':'; # skip -d test here + next if $_ eq 'Dev:Pseudo:'; # why is this in @INC? + } + if (-d $_) { + print "## Perl \@INC directory `$_' exists.\n" if $opt{'v'}; + $INC_there++; + } + else { + print "# Perl \@INC directory `$_' does not appear to exist.\n"; + } + $INC_total++; +} +if ($INC_total == $INC_there) { + print "ok 3\n"; + $pass__total++; +} +else { + print "not ok 3\n"; + $error_total++; +} +$tests_total++; + + +print "## Checking installations of modules necessary for ivp.\n" if $opt{'p'}; + +my $needed_total = 0; +my $needed_there = 0; +foreach (qw(Config.pm ExtUtils/Installed.pm)) { + $@ = undef; + $needed_total++; + eval "require \"$_\";"; + if (!$@) { + print "## Module `$_' appears to be installed.\n" if $opt{'v'}; + $needed_there++; + } + else { + print "# Needed module `$_' does not appear to be properly installed.\n"; + } + $@ = undef; +} +if ($needed_total == $needed_there) { + print "ok 4\n"; + $pass__total++; +} +else { + print "not ok 4\n"; + $error_total++; +} +$tests_total++; + + +print "## Checking installations of extensions built with perl.\n" if $opt{'p'}; + +use Config; + +my $extensions_total = 0; +my $extensions_there = 0; +if (defined($Config{'extensions'})) { + my @extensions = split(/\s+/,$Config{'extensions'}); + foreach (@extensions) { + next if ($_ eq ''); + if ( $useithreads !~ /define/i ) { + next if ($_ eq 'threads'); + next if ($_ eq 'threads/shared'); + } + # that's a distribution name, not a module name + next if $_ eq 'IO/Compress'; + next if $_ eq 'Devel/DProf'; + # test modules + next if $_ eq 'XS/APItest'; + next if $_ eq 'XS/Typemap'; + # VMS$ perl -e "eval ""require \""Devel/DProf.pm\"";"" print $@" + # \NT> perl -e "eval \"require 'Devel/DProf.pm'\"; print $@" + # DProf: run perl with -d to use DProf. + # Compilation failed in require at (eval 1) line 1. + eval " require \"$_.pm\"; "; + if (!$@) { + print "## Module `$_' appears to be installed.\n" if $opt{'v'}; + $extensions_there++; + } + else { + print "# Required module `$_' does not appear to be properly installed.\n"; + $@ = undef; + } + $extensions_total++; + } + + # A silly name for a module (that hopefully won't ever exist). + # Note that this test serves more as a check of the validity of the + # actuall required module tests above. + my $unnecessary = 'bLuRfle'; + + if (!grep(/$unnecessary/, @extensions)) { + $@ = undef; + eval " require \"$unnecessary.pm\"; "; + if ($@) { + print "## Unnecessary module `$unnecessary' does not appear to be installed.\n" if $opt{'v'}; + } + else { + print "# Unnecessary module `$unnecessary' appears to be installed.\n"; + $extensions_there++; + } + } + $@ = undef; +} +if ($extensions_total == $extensions_there) { + print "ok 5\n"; + $pass__total++; +} +else { + print "not ok 5\n"; + $error_total++; +} +$tests_total++; + + +print "## Checking installations of later additional extensions.\n" if $opt{'p'}; + +use ExtUtils::Installed; + +my $installed_total = 0; +my $installed_there = 0; +my $version_check = 0; +my $installed = ExtUtils::Installed -> new(); +my @modules = $installed -> modules(); +my @missing = (); +my $version = undef; +for (@modules) { + $installed_total++; + # Consider it there if it contains one or more files, + # and has zero missing files, + # and has a defined version + $version = undef; + $version = $installed -> version($_); + if ($version) { + print "## $_; $version\n" if $opt{'v'}; + $version_check++; + } + else { + print "# $_; NO VERSION\n" if $opt{'v'}; + } + $version = undef; + @missing = (); + @missing = $installed -> validate($_); + + # .bs files are optional + @missing = grep { ! /\.bs$/ } @missing; + # man files are often compressed + @missing = grep { ! ( -s "$_.gz" || -s "$_.bz2" ) } @missing; + + if ($#missing >= 0) { + print "# file",+($#missing == 0) ? '' : 's'," missing from installation:\n"; + print '# ',join(' ',@missing),"\n"; + } + elsif ($#missing == -1) { + $installed_there++; + } + @missing = (); +} +if (($installed_total == $installed_there) && + ($installed_total == $version_check)) { + print "ok 6\n"; + $pass__total++; +} +else { + print "not ok 6\n"; + $error_total++; +} +$tests_total++; + + +if ($opt{'a'}) { +print "## Checking installations of *.h -> *.ph header files.\n" if $opt{'p'}; +my $ph_there = 0; +my $var = undef; +my $val = undef; +my $h_file = undef; +# Just about "any" C implementation ought to have a stdio.h (even if +# Config.pm may not list a i_stdio var). +my @ph_files = qw(stdio.ph); +# Add the ones that we know that perl thinks are there: +while (($var, $val) = each %Config) { + if ($var =~ m/i_(.+)/ && $val eq 'define') { + $h_file = $1; + # Some header and symbol names don't match for hysterical raisins. + $h_file = 'arpa/inet' if $h_file eq 'arpainet'; + $h_file = 'netinet/in' if $h_file eq 'niin'; + $h_file = 'netinet/tcp' if $h_file eq 'netinettcp'; + $h_file = 'sys/resource' if $h_file eq 'sysresrc'; + $h_file = 'sys/select' if $h_file eq 'sysselct'; + $h_file = 'sys/security' if $h_file eq 'syssecrt'; + $h_file = 'rpcsvc/dbm' if $h_file eq 'rpcsvcdbm'; + # This ought to distinguish syslog from sys/syslog. + # (NB syslog.ph is heavily used for the DBI pre-requisites). + $h_file =~ s{^sys(\w.+)}{sys/$1} unless $h_file eq 'syslog'; + push(@ph_files, "$h_file.ph"); + } +} +#foreach (qw(stdio.ph syslog.ph)) { +foreach (@ph_files) { + $@ = undef; + eval "require \"$_\";"; + if (!$@) { + print "## Perl header `$_' appears to be installed.\n" if $opt{'v'}; + $ph_there++; + } + else { + print "# Perl header `$_' does not appear to be properly installed.\n"; + } + $@ = undef; +} + +if (scalar(@ph_files) == $ph_there) { + print "ok 7\n"; + $pass__total++; +} +else { + print "not ok 7\n"; + $error_total++; +} +$tests_total++; +} +else { + print "## Skip checking of *.ph header files.\n" if $opt{'p'}; +} + +# Final report (rather than feed ousrselves to Test::Harness::runtests() +# we simply format some output on our own to keep things simple and +# easier to "fix" - at least for now. + +if ($error_total == 0 && $tests_total) { + print "All tests successful.\n"; +} elsif ($tests_total==0){ + die "FAILED--no tests were run for some reason.\n"; +} else { + my $rate = 0.0; + if ($tests_total > 0) { $rate = sprintf "%.2f", 100.0 * ($pass__total / $tests_total); } + printf " %d/%d subtests failed, %.2f%% okay.\n", + $error_total, $tests_total, $rate; +} + +=head1 NAME + +perlivp - Perl Installation Verification Procedure + +=head1 SYNOPSIS + +B [B<-a>] [B<-p>] [B<-v>] [B<-h>] + +=head1 DESCRIPTION + +The B program is set up at Perl source code build time to test the +Perl version it was built under. It can be used after running: + + make install + +(or your platform's equivalent procedure) to verify that B and its +libraries have been installed correctly. A correct installation is verified +by output that looks like: + + ok 1 + ok 2 + +etc. + +=head1 OPTIONS + +=over 5 + +=item B<-h> help + +Prints out a brief help message. + +=item B<-a> run all tests + +Normally tests for optional features are skipped. With -a all tests +are executed. + +=item B<-p> print preface + +Gives a description of each test prior to performing it. + +=item B<-v> verbose + +Gives more detailed information about each test, after it has been performed. +Note that any failed tests ought to print out some extra information whether +or not -v is thrown. + +=back + +=head1 DIAGNOSTICS + +=over 4 + +=item * print "# Perl binary `$perlpath' does not appear executable.\n"; + +Likely to occur for a perl binary that was not properly installed. +Correct by conducting a proper installation. + +=item * print "# Perl version `$]' installed, expected $ivp_VERSION.\n"; + +Likely to occur for a perl that was not properly installed. +Correct by conducting a proper installation. + +=item * print "# Perl \@INC directory `$_' does not appear to exist.\n"; + +Likely to occur for a perl library tree that was not properly installed. +Correct by conducting a proper installation. + +=item * print "# Needed module `$_' does not appear to be properly installed.\n"; + +One of the two modules that is used by perlivp was not present in the +installation. This is a serious error since it adversely affects perlivp's +ability to function. You may be able to correct this by performing a +proper perl installation. + +=item * print "# Required module `$_' does not appear to be properly installed.\n"; + +An attempt to C failed, even though the list of +extensions indicated that it should succeed. Correct by conducting a proper +installation. + +=item * print "# Unnecessary module `bLuRfle' appears to be installed.\n"; + +This test not coming out ok could indicate that you have in fact installed +a bLuRfle.pm module or that the C +test may give misleading results with your installation of perl. If yours +is the latter case then please let the author know. + +=item * print "# file",+($#missing == 0) ? '' : 's'," missing from installation:\n"; + +One or more files turned up missing according to a run of +C validate()> over your installation. +Correct by conducting a proper installation. + +=item * print "# Perl header `$_' does not appear to be properly installed.\n"; + +Correct by running B over your system's C header files. If necessary, +edit the resulting *.ph files to eliminate perl syntax errors. + +=back + +For further information on how to conduct a proper installation consult the +INSTALL file that comes with the perl source and the README file for your +platform. + +=head1 AUTHOR + +Peter Prymmer + +=cut + + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/perlthanks.bat b/Master/tlpkg/tlperl.straw/bin/perlthanks.bat new file mode 100755 index 00000000000..2d37b78d2ba --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/perlthanks.bat @@ -0,0 +1,1478 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!perl +#line 15 + eval 'exec C:\strawberry\perl\bin\perl.exe -S $0 ${1+"$@"}' + if $running_under_some_shell; + +my $config_tag1 = '5.10.1 - Wed Jan 27 23:29:27 2010'; + +my $patchlevel_date = 1250639291; +my $patch_tags = ''; +my @patches = ( + '' +); + +use warnings; +no warnings 'once'; # Eventually, the $::opt_ stuff should get cleaned up +use strict; +use Config; +use File::Spec; # keep perlbug Perl 5.005 compatible +use Getopt::Std; +use File::Basename 'basename'; + +sub paraprint; + +BEGIN { + eval { require Mail::Send;}; + $::HaveSend = ($@ eq ""); + eval { require Mail::Util; } ; + $::HaveUtil = ($@ eq ""); + # use secure tempfiles wherever possible + eval { require File::Temp; }; + $::HaveTemp = ($@ eq ""); + eval { require Module::CoreList; }; + $::HaveCoreList = ($@ eq ""); +}; + +my $Version = "1.39"; + +# Changed in 1.06 to skip Mail::Send and Mail::Util if not available. +# Changed in 1.07 to see more sendmail execs, and added pipe output. +# Changed in 1.08 to use correct address for sendmail. +# Changed in 1.09 to close the REP file before calling it up in the editor. +# Also removed some old comments duplicated elsewhere. +# Changed in 1.10 to run under VMS without Mail::Send; also fixed +# temp filename generation. +# Changed in 1.11 to clean up some text and removed Mail::Send deactivator. +# Changed in 1.12 to check for editor errors, make save/send distinction +# clearer and add $ENV{REPLYTO}. +# Changed in 1.13 to hopefully make it more difficult to accidentally +# send mail +# Changed in 1.14 to make the prompts a little more clear on providing +# helpful information. Also let file read fail gracefully. +# Changed in 1.15 to add warnings to stop people using perlbug for non-bugs. +# Also report selected environment variables. +# Changed in 1.16 to include @INC, and allow user to re-edit if no changes. +# Changed in 1.17 Win32 support added. GSAR 97-04-12 +# Changed in 1.18 add '-ok' option for reporting build success. CFR 97-06-18 +# Changed in 1.19 '-ok' default not '-v' +# add local patch information +# warn on '-ok' if this is an old system; add '-okay' +# Changed in 1.20 Added patchlevel.h reading and version/config checks +# Changed in 1.21 Added '-nok' for reporting build failure DFD 98-05-05 +# Changed in 1.22 Heavy reformatting & minor bugfixes HVDS 98-05-10 +# Changed in 1.23 Restore -ok(ay): say 'success'; don't prompt +# Changed in 1.24 Added '-F' to save report HVDS 98-07-01 +# Changed in 1.25 Warn on failure to open save file. HVDS 98-07-12 +# Changed in 1.26 Don't require -t STDIN for -ok. HVDS 98-07-15 +# Changed in 1.27 Added Mac OS and File::Spec support CNANDOR 99-07-27 +# Changed in 1.28 Additional questions for Perlbugtron RFOLEY 20.03.2000 +# Changed in 1.29 Perlbug(tron): auto(-ok), short prompts RFOLEY 05-05-2000 +# Changed in 1.30 Added warnings on failure to open files MSTEVENS 13-07-2000 +# Changed in 1.31 Add checks on close().Fix my $var unless. TJENNESS 26-07-2000 +# Changed in 1.32 Use File::Spec->tmpdir TJENNESS 20-08-2000 +# Changed in 1.33 Don't require -t STDOUT for -ok. +# Changed in 1.34 Added Message-Id RFOLEY 18-06-2002 +# Changed in 1.35 Use File::Temp (patch from Solar Designer) NWCLARK 28-02-2004 +# Changed in 1.36 Initial Module::CoreList support Alexandr Ciornii 11-07-2007 +# Changed in 1.37 Killed some string evals, rewrote most prose JESSE 2008-06-08 +# Changed in 1.38 Actually enforce the CoreList check, +# Record the module the user enters if they do so +# Refactor prompts to use common code JESSE 2008-06-08 +# Changed in 1.39 Trap mail sending failures (simple ones) so JESSE 2008-06-08 +# users might be able to recover their bug reports +# Refactor mail sending routines +# Unify message building code +# Unify message header building +# Fix "module" prompting to not squish "category" prompting +# use warnings; (except 'once' warnings) +# Unified report fingerprint/change detection code +# Removed some labeled 'gotos' +#TODO: +# make sure failure (transmission-wise) of Mail::Send is accounted for. +# (This may work now. Unsure of the original author's issue -JESSE 2008-06-08) +# - Test -b option + +my( $file, $usefile, $cc, $address, $bugaddress, $testaddress, $thanksaddress, + $filename, $messageid, $domain, $subject, $from, $verbose, $ed, $outfile, + $fh, $me, $body, $andcc, %REP, $ok, $thanks, $progname, + $Is_MacOS, $Is_MSWin32, $Is_Linux, $Is_VMS, $Is_OpenBSD, + $report_about_module, $category, $severity, + +); + +my $perl_version = $^V ? sprintf("%vd", $^V) : $]; + +my $config_tag2 = "$perl_version - $Config{cf_time}"; + +Init(); + +if ($::opt_h) { Help(); exit; } +if ($::opt_d) { Dump(*STDOUT); exit; } +if (!-t STDIN && !($ok and not $::opt_n)) { + paraprint <<"EOF"; +Please use $progname interactively. If you want to +include a file, you can use the -f switch. +EOF + die "\n"; +} + +Query(); +Edit() unless $usefile || ($ok and not $::opt_n); +NowWhat(); +if ($outfile) { + save_message_to_disk($outfile); +} else { + Send(); + if ($thanks) { + print "\nThank you for taking the time to send a thank-you message!\n\n"; + } else { + print "\nThank you for taking the time to file a bug report!\n\n"; + } +} + +exit; + +sub ask_for_alternatives { # (category|severity) + my $name = shift; + my %alts = ( + 'category' => { + 'default' => 'core', + 'ok' => 'install', + # Inevitably some of these will end up in RT whatever we do: + 'thanks' => 'thanks', + 'opts' => [qw(core docs install library utilities)], # patch, notabug + }, + 'severity' => { + 'default' => 'low', + 'ok' => 'none', + 'thanks' => 'none', + 'opts' => [qw(critical high medium low wishlist none)], # zero + }, + ); + die "Invalid alternative ($name) requested\n" unless grep(/^$name$/, keys %alts); + my $alt = ""; + my $what = $ok || $thanks; + if ($what) { + $alt = $alts{$name}{$what}; + } else { + my @alts = @{$alts{$name}{'opts'}}; + print "\n\n"; + paraprint < 5) { + die "Invalid $name: aborting.\n"; + } + $alt = _prompt('', "\u$name", $alts{$name}{'default'}); + $alt ||= $alts{$name}{'default'}; + } while !((($alt) = grep(/^$alt/i, @alts))); + } + lc $alt; +} + +sub Init { + # -------- Setup -------- + + $Is_MSWin32 = $^O eq 'MSWin32'; + $Is_VMS = $^O eq 'VMS'; + $Is_Linux = lc($^O) eq 'linux'; + $Is_OpenBSD = lc($^O) eq 'openbsd'; + $Is_MacOS = $^O eq 'MacOS'; + + @ARGV = split m/\s+/, + MacPerl::Ask('Provide command line args here (-h for help):') + if $Is_MacOS && $MacPerl::Version =~ /App/; + + if (!getopts("Adhva:s:b:f:F:r:e:SCc:to:n:T")) { Help(); exit; }; + + # This comment is needed to notify metaconfig that we are + # using the $perladmin, $cf_by, and $cf_time definitions. + + # -------- Configuration --------- + + # perlbug address + $bugaddress = 'perlbug@perl.org'; + + # Test address + $testaddress = 'perlbug-test@perl.org'; + + # Thanks address + $thanksaddress = 'perl-thanks@perl.org'; + + if (basename ($0) =~ /^perlthanks/i) { + # invoked as perlthanks + $::opt_T = 1; + $::opt_C = 1; # don't send a copy to the local admin + } + + if ($::opt_T) { + $thanks = 'thanks'; + } + + $progname = $thanks ? 'perlthanks' : 'perlbug'; + # Target address + $address = $::opt_a || ($::opt_t ? $testaddress + : $thanks ? $thanksaddress : $bugaddress); + + # Users address, used in message and in Reply-To header + $from = $::opt_r || ""; + + # Include verbose configuration information + $verbose = $::opt_v || 0; + + # Subject of bug-report message + $subject = $::opt_s || ""; + + # Send a file + $usefile = ($::opt_f || 0); + + # File to send as report + $file = $::opt_f || ""; + + # File to output to + $outfile = $::opt_F || ""; + + # Body of report + $body = $::opt_b || ""; + + # Editor + $ed = $::opt_e || $ENV{VISUAL} || $ENV{EDITOR} || $ENV{EDIT} + || ($Is_VMS && "edit/tpu") + || ($Is_MSWin32 && "notepad") + || ($Is_MacOS && '') + || "vi"; + + # Not OK - provide build failure template by finessing OK report + if ($::opt_n) { + if (substr($::opt_n, 0, 2) eq 'ok' ) { + $::opt_o = substr($::opt_n, 1); + } else { + Help(); + exit(); + } + } + + # OK - send "OK" report for build on this system + $ok = ''; + if ($::opt_o) { + if ($::opt_o eq 'k' or $::opt_o eq 'kay') { + my $age = time - $patchlevel_date; + if ($::opt_o eq 'k' and $age > 60 * 24 * 60 * 60 ) { + my $date = localtime $patchlevel_date; + print <<"EOF"; +"perlbug -ok" and "perlbug -nok" do not report on Perl versions which +are more than 60 days old. This Perl version was constructed on +$date. If you really want to report this, use +"perlbug -okay" or "perlbug -nokay". +EOF + exit(); + } + # force these options + unless ($::opt_n) { + $::opt_S = 1; # don't prompt for send + $::opt_b = 1; # we have a body + $body = "Perl reported to build OK on this system.\n"; + } + $::opt_C = 1; # don't send a copy to the local admin + $::opt_s = 1; # we have a subject line + $subject = ($::opt_n ? 'Not ' : '') + . "OK: perl $perl_version ${patch_tags}on" + ." $::Config{'archname'} $::Config{'osvers'} $subject"; + $ok = 'ok'; + } else { + Help(); + exit(); + } + } + + # Possible administrator addresses, in order of confidence + # (Note that cf_email is not mentioned to metaconfig, since + # we don't really want it. We'll just take it if we have to.) + # + # This has to be after the $ok stuff above because of the way + # that $::opt_C is forced. + $cc = $::opt_C ? "" : ( + $::opt_c || $::Config{'perladmin'} + || $::Config{'cf_email'} || $::Config{'cf_by'} + ); + + if ($::HaveUtil) { + $domain = Mail::Util::maildomain(); + } elsif ($Is_MSWin32) { + $domain = $ENV{'USERDOMAIN'}; + } else { + require Sys::Hostname; + $domain = Sys::Hostname::hostname(); + } + + # Message-Id - rjsf + $messageid = "<$::Config{'version'}_${$}_".time."\@$domain>"; + + # My username + $me = $Is_MSWin32 ? $ENV{'USERNAME'} + : $^O eq 'os2' ? $ENV{'USER'} || $ENV{'LOGNAME'} + : $Is_MacOS ? $ENV{'USER'} + : eval { getpwuid($<) }; # May be missing + + $from = $::Config{'cf_email'} + if !$from && $::Config{'cf_email'} && $::Config{'cf_by'} && $me && + ($me eq $::Config{'cf_by'}); +} # sub Init + +sub Query { + # Explain what perlbug is + unless ($ok) { + if ($thanks) { + paraprint <<'EOF'; +This program provides an easy way to send a thank-you message back to the +authors and maintainers of perl. + +If you wish to submit a bug report, please run it without the -T flag +(or run the program perlbug rather than perlthanks) +EOF + } else { + paraprint <<"EOF"; +This program provides an easy way to create a message reporting a +bug in the core perl distribution (along with tests or patches) +to the volunteers who maintain perl at $address. To send a thank-you +note to $thanksaddress instead of a bug report, please run 'perlthanks'. + +Please do not use $0 to send test messages, test whether perl +works, or to report bugs in perl modules from CPAN. + +For help using perl, try posting to the Usenet newsgroup +comp.lang.perl.misc. +EOF + } + } + + # Prompt for subject of message, if needed + + if ($subject && TrivialSubject($subject)) { + $subject = ''; + } + + unless ($subject) { + print +"First of all, please provide a subject for the message.\n"; + if ( not $thanks) { + paraprint <first_release($entry); + if ($entry and not $first_release) { + paraprint <$filename") or die "Unable to create report file '$filename': $!\n"; + my $reptype = !$ok ? ($thanks ? 'thank-you' : 'bug') + : $::opt_n ? "build failure" : "success"; + + print REP <) { + print REP $_ + } + close(F) or die "Error closing '$file': $!"; + } else { + if ($thanks) { + print REP <<'EOF'; + +----------------------------------------------------------------- +[Please enter your thank-you message here] + + + +[You're welcome to delete anything below this line] +----------------------------------------------------------------- +EOF + } else { + print REP <<'EOF'; + +----------------------------------------------------------------- +[Please describe your issue here] + + + +[Please do not change anything below this line] +----------------------------------------------------------------- +EOF + } + } + Dump(*REP); + close(REP) or die "Error closing report file: $!"; + + # Set up an initial report fingerprint so we can compare it later + _fingerprint_lines_in_report(); + +} # sub Query + +sub Dump { + local(*OUT) = @_; + + print OUT <etry dit + next; + } elsif ( $action =~ /^[cq]/i ) { # ancel, uit + Cancel(); # cancel exits + } + } + # Ok. the user did what they needed to; + return; + + } +} + + +sub Cancel { + 1 while unlink($filename); # remove all versions under VMS + print "\nQuitting without sending your message.\n"; + exit(0); +} + +sub NowWhat { + # Report is done, prompt for further action + if( !$::opt_S ) { + while(1) { + my $menu = <ile/ve + if ( SaveMessage() ) { exit } + } elsif ($action =~ /^(d|l|sh)/i ) { # isplay, ist, ow + # Display the message + open(REP, "<$filename") or die "Couldn't open file '$filename': $!\n"; + while () { print $_ } + close(REP) or die "Error closing report file '$filename': $!"; + } elsif ($action =~ /^su/i) { # bject + my $reply = _prompt( "Subject: $subject", "If the above subject is fine, press Enter. Otherwise, type a replacement now\nSubject"); + if ($reply ne '') { + unless (TrivialSubject($reply)) { + $subject = $reply; + print "Subject: $subject\n"; + } + } + } elsif ($action =~ /^se/i) { # end + # Send the message + my $reply = _prompt( "Are you certain you want to send this message?", 'Please type "yes" if you are','no'); + if ($reply =~ /^yes$/) { + last; + } else { + paraprint <dit, e-edit + # edit the message + Edit(); + } elsif ($action =~ /^[qc]/i) { # ancel, uit + Cancel(); + } elsif ($action =~ /^s/i) { + paraprint < 1); + close($fh); + return $filename; + } else { + # Bah. Fall back to doing things less securely. + my $dir = File::Spec->tmpdir(); + $filename = "bugrep0$$"; + $filename++ while -e File::Spec->catfile($dir, $filename); + $filename = File::Spec->catfile($dir, $filename); + } +} + +sub paraprint { + my @paragraphs = split /\n{2,}/, "@_"; + for (@paragraphs) { # implicit local $_ + s/(\S)\s*\n/$1 /g; + write; + print "\n"; + } +} + +sub _prompt { + my ($explanation, $prompt, $default) = (@_); + if ($explanation) { + print "\n\n"; + paraprint $explanation; + } + print $prompt. ($default ? " [$default]" :''). ": "; + my $result = scalar(<>); + chomp($result); + $result =~ s/^\s*(.*?)\s*$/$1/s; + if ($default && $result eq '') { + return $default; + } else { + return $result; + } +} + +sub _build_header { + my %attr = (@_); + + my $head = ''; + for my $header (keys %attr) { + $head .= "$header: ".$attr{$header}."\n"; + } + return $head; +} + +sub _message_headers { + my %headers = ( To => $address, Subject => $subject ); + $headers{'Cc'} = $cc if ($cc); + $headers{'Message-Id'} = $messageid if ($messageid); + $headers{'Reply-To'} = $from if ($from); + return \%headers; +} + +sub build_complete_message { + my $content = _build_header(%{_message_headers()}) . "\n\n"; + open( REP, "<$filename" ) or die "Couldn't open file '$filename': $!\n"; + while () { $content .= $_; } + close(REP) or die "Error closing report file '$filename': $!"; + return $content; +} + +sub save_message_to_disk { + my $file = shift; + + open OUTFILE, ">$file" or do { warn "Couldn't open '$file': $!\n"; return undef}; + print OUTFILE build_complete_message(); + close(OUTFILE) or do { warn "Error closing $file: $!"; return undef }; + print "\nMessage saved.\n"; + return 1; +} + +sub _send_message_vms { + if ( ( $address =~ /@/ and $address !~ /^\w+%"/ ) + or ( $cc =~ /@/ and $cc !~ /^\w+%"/ ) ) { + my $prefix; + foreach ( qw[ IN MX SMTP UCX PONY WINS ], '' ) { + $prefix = "$_%", last if $ENV{"MAIL\$PROTOCOL_$_"}; + } + $address = qq[${prefix}"$address"] unless $address =~ /^\w+%"/; + $cc = qq[${prefix}"$cc"] unless !$cc || $cc =~ /^\w+%"/; + } + $subject =~ s/"/""/g; + $address =~ s/"/""/g; + $cc =~ s/"/""/g; + my $sts = system(qq[mail/Subject="$subject" $filename. "$address","$cc"]); + if ($sts) { + die "Can't spawn off mail (leaving bug report in $filename): $sts"; + } +} + +sub _send_message_mailsend { + my $msg = Mail::Send->new(); + my %headers = %{_message_headers()}; + for my $key ( keys %headers) { + $msg->add($key => $headers{$key}); + } + + $fh = $msg->open; + open(REP, "<$filename") or die "Couldn't open '$filename': $!\n"; + while () { print $fh $_ } + close(REP) or die "Error closing $filename: $!"; + $fh->close; + + print "\nMessage sent.\n"; +} + +sub _probe_for_sendmail { + my $sendmail = ""; + for (qw(/usr/lib/sendmail /usr/sbin/sendmail /usr/ucblib/sendmail)) { + $sendmail = $_, last if -e $_; + } + if ( $^O eq 'os2' and $sendmail eq "" ) { + my $path = $ENV{PATH}; + $path =~ s:\\:/:; + my @path = split /$Config{'path_sep'}/, $path; + for (@path) { + $sendmail = "$_/sendmail", last if -e "$_/sendmail"; + $sendmail = "$_/sendmail.exe", last if -e "$_/sendmail.exe"; + } + } + return $sendmail; +} + +sub _send_message_sendmail { + my $sendmail = _probe_for_sendmail(); + unless ($sendmail) { + paraprint(<<"EOF"), die "\n"; +It appears that there is no program which looks like "sendmail" on +your system and that the Mail::Send library from CPAN isn't available. +Because of this, there's no easy way to automatically send your +message. + +A copy of your message has been saved in '$filename' for you to +send to '$address' with your normal mail client. +EOF + } + + open( SENDMAIL, "|$sendmail -t -oi" ) + || die "'|$sendmail -t -oi' failed: $!"; + print SENDMAIL build_complete_message(); + if ( close(SENDMAIL) ) { + print "\nMessage sent\n"; + } else { + warn "\nSendmail returned status '", $? >> 8, "'\n"; + } +} + + + +# a strange way to check whether any significant editing +# has been done: check whether any new non-empty lines +# have been added. + +sub _fingerprint_lines_in_report { + my $new_lines = 0; + # read in the report template once so that + # we can track whether the user does any editing. + # yes, *all* whitespace is ignored. + + open(REP, "<$filename") or die "Unable to open report file '$filename': $!\n"; + while (my $line = ) { + $line =~ s/\s+//g; + $new_lines++ if (!$REP{$line}); + + } + close(REP) or die "Error closing report file '$filename': $!"; + # returns the number of lines with content that wasn't there when last we looked + return $new_lines; +} + + + +format STDOUT = +^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ~~ +$_ +. + +__END__ + +=head1 NAME + +perlbug - how to submit bug reports on Perl + +=head1 SYNOPSIS + +B + +B S<[ B<-v> ]> S<[ B<-a> I
]> S<[ B<-s> I ]> +S<[ B<-b> I | B<-f> I ]> S<[ B<-F> I ]> +S<[ B<-r> I ]> +S<[ B<-e> I ]> S<[ B<-c> I | B<-C> ]> +S<[ B<-S> ]> S<[ B<-t> ]> S<[ B<-d> ]> S<[ B<-A> ]> S<[ B<-h> ]> S<[ B<-T> ]> + +B S<[ B<-v> ]> S<[ B<-r> I ]> + S<[ B<-A> ]> S<[ B<-ok> | B<-okay> | B<-nok> | B<-nokay> ]> + +B + +=head1 DESCRIPTION + + +This program is designed to help you generate and send bug reports +(and thank-you notes) about perl5 and the modules which ship with it. + +In most cases, you can just run it interactively from a command +line without any special arguments and follow the prompts. + +If you have found a bug with a non-standard port (one that was not +part of the I), a binary distribution, or a +non-core module (such as Tk, DBI, etc), then please see the +documentation that came with that distribution to determine the +correct place to report bugs. + +If you are unable to send your report using B (most likely +because your system doesn't have a way to send mail that perlbug +recognizes), you may be able to use this tool to compose your report +and save it to a file which you can then send to B +using your regular mail client. + +In extreme cases, B may not work well enough on your system +to guide you through composing a bug report. In those cases, you +may be able to use B to get system configuration +information to include in a manually composed bug report to +B. + + +When reporting a bug, please run through this checklist: + +=over 4 + +=item What version of Perl you are running? + +Type C at the command line to find out. + +=item Are you running the latest released version of perl? + +Look at http://www.perl.org/ to find out. If you are not using the +latest released version, please try to replicate your bug on the +latest stable release. + +Note that reports about bugs in old versions of Perl, especially +those which indicate you haven't also tested the current stable +release of Perl, are likely to receive less attention from the +volunteers who build and maintain Perl than reports about bugs in +the current release. + +This tool isn't apropriate for reporting bugs in any version +prior to Perl 5.0. + +=item Are you sure what you have is a bug? + +A significant number of the bug reports we get turn out to be +documented features in Perl. Make sure the issue you've run into +isn't intentional by glancing through the documentation that comes +with the Perl distribution. + +Given the sheer volume of Perl documentation, this isn't a trivial +undertaking, but if you can point to documentation that suggests +the behaviour you're seeing is I, your issue is likely to +receive more attention. You may want to start with B +L for pointers to common traps that new (and experienced) +Perl programmers run into. + +If you're unsure of the meaning of an error message you've run +across, B L for an explanation. If the message +isn't in perldiag, it probably isn't generated by Perl. You may +have luck consulting your operating system documentation instead. + +If you are on a non-UNIX platform B L, as some +features may be unimplemented or work differently. + +You may be able to figure out what's going wrong using the Perl +debugger. For information about how to use the debugger B +L. + +=item Do you have a proper test case? + +The easier it is to reproduce your bug, the more likely it will be +fixed -- if nobody can duplicate your problem, it probably won't be +addressed. + +A good test case has most of these attributes: short, simple code; +few dependencies on external commands, modules, or libraries; no +platform-dependent code (unless it's a platform-specific bug); +clear, simple documentation. + +A good test case is almost always a good candidate to be included in +Perl's test suite. If you have the time, consider writing your test case so +that it can be easily included into the standard test suite. + +=item Have you included all relevant information? + +Be sure to include the B error messages, if any. +"Perl gave an error" is not an exact error message. + +If you get a core dump (or equivalent), you may use a debugger +(B, B, etc) to produce a stack trace to include in the bug +report. + +NOTE: unless your Perl has been compiled with debug info +(often B<-g>), the stack trace is likely to be somewhat hard to use +because it will most probably contain only the function names and not +their arguments. If possible, recompile your Perl with debug info and +reproduce the crash and the stack trace. + +=item Can you describe the bug in plain English? + +The easier it is to understand a reproducible bug, the more likely +it will be fixed. Any insight you can provide into the problem +will help a great deal. In other words, try to analyze the problem +(to the extent you can) and report your discoveries. + +=item Can you fix the bug yourself? + +A bug report which I will almost +definitely be fixed. When sending a patch, please use the C +program with the C<-u> option to generate "unified" diff files. +Bug reports with patches are likely to receive significantly more +attention and interest than those without patches. + +Your patch may be returned with requests for changes, or requests for more +detailed explanations about your fix. + +Here are a few hints for creating high-quality patches: + +Make sure the patch is not reversed (the first argument to diff is +typically the original file, the second argument your changed file). +Make sure you test your patch by applying it with the C +program before you send it on its way. Try to follow the same style +as the code you are trying to patch. Make sure your patch really +does work (C, if the thing you're patching is covered +by Perl's test suite). + +=item Can you use C to submit the report? + +B will, amongst other things, ensure your report includes +crucial information about your version of perl. If C is +unable to mail your report after you have typed it in, you may have +to compose the message yourself, add the output produced by C and email it to B. If, for some reason, you +cannot run C at all on your system, be sure to include the +entire output produced by running C (note the uppercase V). + +Whether you use C or send the email manually, please make +your Subject line informative. "a bug" is not informative. Neither +is "perl crashes" nor is "HELP!!!". These don't help. A compact +description of what's wrong is fine. + +=item Can you use C to submit a thank-you note? + +Yes, you can do this by either using the C<-T> option, or by invoking +the program as C. Thank-you notes are good. It makes people +smile. + +=back + +Having done your bit, please be prepared to wait, to be told the +bug is in your code, or possibly to get no reply at all. The +volunteers who maintain Perl are busy folks, so if your problem is +an obvious bug in your own code, is difficult to understand or is +a duplicate of an existing report, you may not receive a personal +reply. + +If it is important to you that your bug be fixed, do monitor the +perl5-porters@perl.org mailing list and the commit logs to development +versions of Perl, and encourage the maintainers with kind words or +offers of frosty beverages. (Please do be kind to the maintainers. +Harassing or flaming them is likely to have the opposite effect of +the one you want.) + +Feel free to update the ticket about your bug on http://rt.perl.org +if a new version of Perl is released and your bug is still present. + +=head1 OPTIONS + +=over 8 + +=item B<-a> + +Address to send the report to. Defaults to B. + +=item B<-A> + +Don't send a bug received acknowledgement to the reply address. +Generally it is only a sensible to use this option if you are a +perl maintainer actively watching perl porters for your message to +arrive. + +=item B<-b> + +Body of the report. If not included on the command line, or +in a file with B<-f>, you will get a chance to edit the message. + +=item B<-C> + +Don't send copy to administrator. + +=item B<-c> + +Address to send copy of report to. Defaults to the address of the +local perl administrator (recorded when perl was built). + +=item B<-d> + +Data mode (the default if you redirect or pipe output). This prints out +your configuration data, without mailing anything. You can use this +with B<-v> to get more complete data. + +=item B<-e> + +Editor to use. + +=item B<-f> + +File containing the body of the report. Use this to quickly send a +prepared message. + +=item B<-F> + +File to output the results to instead of sending as an email. Useful +particularly when running perlbug on a machine with no direct internet +connection. + +=item B<-h> + +Prints a brief summary of the options. + +=item B<-ok> + +Report successful build on this system to perl porters. Forces B<-S> +and B<-C>. Forces and supplies values for B<-s> and B<-b>. Only +prompts for a return address if it cannot guess it (for use with +B). Honors return address specified with B<-r>. You can use this +with B<-v> to get more complete data. Only makes a report if this +system is less than 60 days old. + +=item B<-okay> + +As B<-ok> except it will report on older systems. + +=item B<-nok> + +Report unsuccessful build on this system. Forces B<-C>. Forces and +supplies a value for B<-s>, then requires you to edit the report +and say what went wrong. Alternatively, a prepared report may be +supplied using B<-f>. Only prompts for a return address if it +cannot guess it (for use with B). Honors return address +specified with B<-r>. You can use this with B<-v> to get more +complete data. Only makes a report if this system is less than 60 +days old. + +=item B<-nokay> + +As B<-nok> except it will report on older systems. + +=item B<-r> + +Your return address. The program will ask you to confirm its default +if you don't use this option. + +=item B<-S> + +Send without asking for confirmation. + +=item B<-s> + +Subject to include with the message. You will be prompted if you don't +supply one on the command line. + +=item B<-t> + +Test mode. The target address defaults to B. + +=item B<-T> + +Send a thank-you note instead of a bug report. + +=item B<-v> + +Include verbose configuration data in the report. + +=back + +=head1 AUTHORS + +Kenneth Albanowski (Ekjahds@kjahds.comE), subsequently +Itored by Gurusamy Sarathy (Egsar@activestate.comE), +Tom Christiansen (Etchrist@perl.comE), Nathan Torkington +(Egnat@frii.comE), Charles F. Randall (Ecfr@pobox.comE), +Mike Guy (Emjtg@cam.a.ukE), Dominic Dunlop +(Edomo@computer.orgE), Hugo van der Sanden (Ehv@crypt.org), +Jarkko Hietaniemi (Ejhi@iki.fiE), Chris Nandor +(Epudge@pobox.comE), Jon Orwant (Eorwant@media.mit.eduE, +Richard Foley (Erichard.foley@rfi.netE), and Jesse Vincent +(Ejesse@bestpractical.com). + +=head1 SEE ALSO + +perl(1), perldebug(1), perldiag(1), perlport(1), perltrap(1), +diff(1), patch(1), dbx(1), gdb(1) + +=head1 BUGS + +None known (guess what must have been used to report them?) + +=cut + + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/piconv b/Master/tlpkg/tlperl.straw/bin/piconv new file mode 100755 index 00000000000..9fdebd193cf --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/piconv @@ -0,0 +1,299 @@ +#!./perl +# $Id: piconv,v 2.4 2009/07/08 13:34:15 dankogai Exp $ +# +use 5.8.0; +use strict; +use Encode ; +use Encode::Alias; +my %Scheme = map {$_ => 1} qw(from_to decode_encode perlio); + +use File::Basename; +my $name = basename($0); + +use Getopt::Long qw(:config no_ignore_case); + +my %Opt; + +help() + unless + GetOptions(\%Opt, + 'from|f=s', + 'to|t=s', + 'list|l', + 'string|s=s', + 'check|C=i', + 'c', + 'perlqq|p', + 'htmlcref', + 'xmlcref', + 'debug|D', + 'scheme|S=s', + 'resolve|r=s', + 'help', + ); + +$Opt{help} and help(); +$Opt{list} and list_encodings(); +my $locale = $ENV{LC_CTYPE} || $ENV{LC_ALL} || $ENV{LANG}; +defined $Opt{resolve} and resolve_encoding($Opt{resolve}); +$Opt{from} || $Opt{to} || help(); +my $from = $Opt{from} || $locale or help("from_encoding unspecified"); +my $to = $Opt{to} || $locale or help("to_encoding unspecified"); +$Opt{string} and Encode::from_to($Opt{string}, $from, $to) and print $Opt{string} and exit; +my $scheme = do { + if (defined $Opt{scheme}) { + if (!exists $Scheme{$Opt{scheme}}) { + warn "Unknown scheme '$Opt{scheme}', fallback to 'from_to'.\n"; + 'from_to'; + } else { + $Opt{scheme}; + } + } else { + 'from_to'; + } +}; + +$Opt{check} ||= $Opt{c}; +$Opt{perlqq} and $Opt{check} = Encode::PERLQQ; +$Opt{htmlcref} and $Opt{check} = Encode::HTMLCREF; +$Opt{xmlcref} and $Opt{check} = Encode::XMLCREF; + +if ($Opt{debug}){ + my $cfrom = Encode->getEncoding($from)->name; + my $cto = Encode->getEncoding($to)->name; + print <<"EOT"; +Scheme: $scheme +From: $from => $cfrom +To: $to => $cto +EOT +} + +my %use_bom = map { $_ => 1 } qw/UTF-16 UTF-32/; + +# we do not use <> (or ARGV) for the sake of binmode() +@ARGV or push @ARGV, \*STDIN; + +unless ( $scheme eq 'perlio' ) { + binmode STDOUT; + my $need2slurp = $use_bom{ find_encoding($to)->name }; + for my $argv (@ARGV) { + my $ifh = ref $argv ? $argv : undef; + $ifh or open $ifh, "<", $argv or warn "Can't open $argv: $!" and next; + $ifh or open $ifh, "<", $argv or next; + binmode $ifh; + if ( $scheme eq 'from_to' ) { # default + if ($need2slurp){ + local $/; + $_ = <$ifh>; + Encode::from_to( $_, $from, $to, $Opt{check} ); + print; + }else{ + while (<$ifh>) { + Encode::from_to( $_, $from, $to, $Opt{check} ); + print; + } + } + } + elsif ( $scheme eq 'decode_encode' ) { # step-by-step + if ($need2slurp){ + local $/; + $_ = <$ifh>; + my $decoded = decode( $from, $_, $Opt{check} ); + my $encoded = encode( $to, $decoded ); + print $encoded; + }else{ + while (<$ifh>) { + my $decoded = decode( $from, $_, $Opt{check} ); + my $encoded = encode( $to, $decoded ); + print $encoded; + } + } + } + else { # won't reach + die "$name: unknown scheme: $scheme"; + } + } +} +else { + + # NI-S favorite + binmode STDOUT => "raw:encoding($to)"; + for my $argv (@ARGV) { + my $ifh = ref $argv ? $argv : undef; + $ifh or open $ifh, "<", $argv or warn "Can't open $argv: $!" and next; + $ifh or open $ifh, "<", $argv or next; + binmode $ifh => "raw:encoding($from)"; + print while (<$ifh>); + } +} + +sub list_encodings { + print join( "\n", Encode->encodings(":all") ), "\n"; + exit 0; +} + +sub resolve_encoding { + if ( my $alias = Encode::resolve_alias( $_[0] ) ) { + print $alias, "\n"; + exit 0; + } + else { + warn "$name: $_[0] is not known to Encode\n"; + exit 1; + } +} + +sub help { + my $message = shift; + $message and print STDERR "$name error: $message\n"; + print STDERR <<"EOT"; +$name [-f from_encoding] [-t to_encoding] [-s string] [files...] +$name -l +$name -r encoding_alias + -l,--list + lists all available encodings + -r,--resolve encoding_alias + resolve encoding to its (Encode) canonical name + -f,--from from_encoding + when omitted, the current locale will be used + -t,--to to_encoding + when omitted, the current locale will be used + -s,--string string + "string" will be the input instead of STDIN or files +The following are mainly of interest to Encode hackers: + -D,--debug show debug information + -C N | -c check the validity of the input + -S,--scheme scheme use the scheme for conversion +Those are handy when you can only see ascii characters: + -p,--perlqq + --htmlcref + --xmlcref +EOT + exit; +} + +__END__ + +=head1 NAME + +piconv -- iconv(1), reinvented in perl + +=head1 SYNOPSIS + + piconv [-f from_encoding] [-t to_encoding] [-s string] [files...] + piconv -l + piconv [-C N|-c|-p] + piconv -S scheme ... + piconv -r encoding + piconv -D ... + piconv -h + +=head1 DESCRIPTION + +B is perl version of B, a character encoding converter +widely available for various Unixen today. This script was primarily +a technology demonstrator for Perl 5.8.0, but you can use piconv in the +place of iconv for virtually any case. + +piconv converts the character encoding of either STDIN or files +specified in the argument and prints out to STDOUT. + +Here is the list of options. Each option can be in short format (-f) +or long (--from). + +=over 4 + +=item -f,--from from_encoding + +Specifies the encoding you are converting from. Unlike B, +this option can be omitted. In such cases, the current locale is used. + +=item -t,--to to_encoding + +Specifies the encoding you are converting to. Unlike B, +this option can be omitted. In such cases, the current locale is used. + +Therefore, when both -f and -t are omitted, B just acts +like B. + +=item -s,--string I + +uses I instead of file for the source of text. + +=item -l,--list + +Lists all available encodings, one per line, in case-insensitive +order. Note that only the canonical names are listed; many aliases +exist. For example, the names are case-insensitive, and many standard +and common aliases work, such as "latin1" for "ISO-8859-1", or "ibm850" +instead of "cp850", or "winlatin1" for "cp1252". See L +for a full discussion. + +=item -C,--check I + +Check the validity of the stream if I = 1. When I = -1, something +interesting happens when it encounters an invalid character. + +=item -c + +Same as C<-C 1>. + +=item -p,--perlqq + +=item --htmlcref + +=item --xmlcref + +Applies PERLQQ, HTMLCREF, XMLCREF, respectively. Try + + piconv -f utf8 -t ascii --perlqq + +To see what it does. + +=item -h,--help + +Show usage. + +=item -D,--debug + +Invokes debugging mode. Primarily for Encode hackers. + +=item -S,--scheme scheme + +Selects which scheme is to be used for conversion. Available schemes +are as follows: + +=over 4 + +=item from_to + +Uses Encode::from_to for conversion. This is the default. + +=item decode_encode + +Input strings are decode()d then encode()d. A straight two-step +implementation. + +=item perlio + +The new perlIO layer is used. NI-S' favorite. + +You should use this option if you are using UTF-16 and others which +linefeed is not $/. + +=back + +Like the I<-D> option, this is also for Encode hackers. + +=back + +=head1 SEE ALSO + +L +L +L +L +L +L + +=cut diff --git a/Master/tlpkg/tlperl.straw/bin/piconv.bat b/Master/tlpkg/tlperl.straw/bin/piconv.bat new file mode 100755 index 00000000000..a255687f2af --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/piconv.bat @@ -0,0 +1,315 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!./perl +#line 15 +# $Id: piconv,v 2.4 2009/07/08 13:34:15 dankogai Exp $ +# +use 5.8.0; +use strict; +use Encode ; +use Encode::Alias; +my %Scheme = map {$_ => 1} qw(from_to decode_encode perlio); + +use File::Basename; +my $name = basename($0); + +use Getopt::Long qw(:config no_ignore_case); + +my %Opt; + +help() + unless + GetOptions(\%Opt, + 'from|f=s', + 'to|t=s', + 'list|l', + 'string|s=s', + 'check|C=i', + 'c', + 'perlqq|p', + 'htmlcref', + 'xmlcref', + 'debug|D', + 'scheme|S=s', + 'resolve|r=s', + 'help', + ); + +$Opt{help} and help(); +$Opt{list} and list_encodings(); +my $locale = $ENV{LC_CTYPE} || $ENV{LC_ALL} || $ENV{LANG}; +defined $Opt{resolve} and resolve_encoding($Opt{resolve}); +$Opt{from} || $Opt{to} || help(); +my $from = $Opt{from} || $locale or help("from_encoding unspecified"); +my $to = $Opt{to} || $locale or help("to_encoding unspecified"); +$Opt{string} and Encode::from_to($Opt{string}, $from, $to) and print $Opt{string} and exit; +my $scheme = do { + if (defined $Opt{scheme}) { + if (!exists $Scheme{$Opt{scheme}}) { + warn "Unknown scheme '$Opt{scheme}', fallback to 'from_to'.\n"; + 'from_to'; + } else { + $Opt{scheme}; + } + } else { + 'from_to'; + } +}; + +$Opt{check} ||= $Opt{c}; +$Opt{perlqq} and $Opt{check} = Encode::PERLQQ; +$Opt{htmlcref} and $Opt{check} = Encode::HTMLCREF; +$Opt{xmlcref} and $Opt{check} = Encode::XMLCREF; + +if ($Opt{debug}){ + my $cfrom = Encode->getEncoding($from)->name; + my $cto = Encode->getEncoding($to)->name; + print <<"EOT"; +Scheme: $scheme +From: $from => $cfrom +To: $to => $cto +EOT +} + +my %use_bom = map { $_ => 1 } qw/UTF-16 UTF-32/; + +# we do not use <> (or ARGV) for the sake of binmode() +@ARGV or push @ARGV, \*STDIN; + +unless ( $scheme eq 'perlio' ) { + binmode STDOUT; + my $need2slurp = $use_bom{ find_encoding($to)->name }; + for my $argv (@ARGV) { + my $ifh = ref $argv ? $argv : undef; + $ifh or open $ifh, "<", $argv or warn "Can't open $argv: $!" and next; + $ifh or open $ifh, "<", $argv or next; + binmode $ifh; + if ( $scheme eq 'from_to' ) { # default + if ($need2slurp){ + local $/; + $_ = <$ifh>; + Encode::from_to( $_, $from, $to, $Opt{check} ); + print; + }else{ + while (<$ifh>) { + Encode::from_to( $_, $from, $to, $Opt{check} ); + print; + } + } + } + elsif ( $scheme eq 'decode_encode' ) { # step-by-step + if ($need2slurp){ + local $/; + $_ = <$ifh>; + my $decoded = decode( $from, $_, $Opt{check} ); + my $encoded = encode( $to, $decoded ); + print $encoded; + }else{ + while (<$ifh>) { + my $decoded = decode( $from, $_, $Opt{check} ); + my $encoded = encode( $to, $decoded ); + print $encoded; + } + } + } + else { # won't reach + die "$name: unknown scheme: $scheme"; + } + } +} +else { + + # NI-S favorite + binmode STDOUT => "raw:encoding($to)"; + for my $argv (@ARGV) { + my $ifh = ref $argv ? $argv : undef; + $ifh or open $ifh, "<", $argv or warn "Can't open $argv: $!" and next; + $ifh or open $ifh, "<", $argv or next; + binmode $ifh => "raw:encoding($from)"; + print while (<$ifh>); + } +} + +sub list_encodings { + print join( "\n", Encode->encodings(":all") ), "\n"; + exit 0; +} + +sub resolve_encoding { + if ( my $alias = Encode::resolve_alias( $_[0] ) ) { + print $alias, "\n"; + exit 0; + } + else { + warn "$name: $_[0] is not known to Encode\n"; + exit 1; + } +} + +sub help { + my $message = shift; + $message and print STDERR "$name error: $message\n"; + print STDERR <<"EOT"; +$name [-f from_encoding] [-t to_encoding] [-s string] [files...] +$name -l +$name -r encoding_alias + -l,--list + lists all available encodings + -r,--resolve encoding_alias + resolve encoding to its (Encode) canonical name + -f,--from from_encoding + when omitted, the current locale will be used + -t,--to to_encoding + when omitted, the current locale will be used + -s,--string string + "string" will be the input instead of STDIN or files +The following are mainly of interest to Encode hackers: + -D,--debug show debug information + -C N | -c check the validity of the input + -S,--scheme scheme use the scheme for conversion +Those are handy when you can only see ascii characters: + -p,--perlqq + --htmlcref + --xmlcref +EOT + exit; +} + +__END__ + +=head1 NAME + +piconv -- iconv(1), reinvented in perl + +=head1 SYNOPSIS + + piconv [-f from_encoding] [-t to_encoding] [-s string] [files...] + piconv -l + piconv [-C N|-c|-p] + piconv -S scheme ... + piconv -r encoding + piconv -D ... + piconv -h + +=head1 DESCRIPTION + +B is perl version of B, a character encoding converter +widely available for various Unixen today. This script was primarily +a technology demonstrator for Perl 5.8.0, but you can use piconv in the +place of iconv for virtually any case. + +piconv converts the character encoding of either STDIN or files +specified in the argument and prints out to STDOUT. + +Here is the list of options. Each option can be in short format (-f) +or long (--from). + +=over 4 + +=item -f,--from from_encoding + +Specifies the encoding you are converting from. Unlike B, +this option can be omitted. In such cases, the current locale is used. + +=item -t,--to to_encoding + +Specifies the encoding you are converting to. Unlike B, +this option can be omitted. In such cases, the current locale is used. + +Therefore, when both -f and -t are omitted, B just acts +like B. + +=item -s,--string I + +uses I instead of file for the source of text. + +=item -l,--list + +Lists all available encodings, one per line, in case-insensitive +order. Note that only the canonical names are listed; many aliases +exist. For example, the names are case-insensitive, and many standard +and common aliases work, such as "latin1" for "ISO-8859-1", or "ibm850" +instead of "cp850", or "winlatin1" for "cp1252". See L +for a full discussion. + +=item -C,--check I + +Check the validity of the stream if I = 1. When I = -1, something +interesting happens when it encounters an invalid character. + +=item -c + +Same as C<-C 1>. + +=item -p,--perlqq + +=item --htmlcref + +=item --xmlcref + +Applies PERLQQ, HTMLCREF, XMLCREF, respectively. Try + + piconv -f utf8 -t ascii --perlqq + +To see what it does. + +=item -h,--help + +Show usage. + +=item -D,--debug + +Invokes debugging mode. Primarily for Encode hackers. + +=item -S,--scheme scheme + +Selects which scheme is to be used for conversion. Available schemes +are as follows: + +=over 4 + +=item from_to + +Uses Encode::from_to for conversion. This is the default. + +=item decode_encode + +Input strings are decode()d then encode()d. A straight two-step +implementation. + +=item perlio + +The new perlIO layer is used. NI-S' favorite. + +You should use this option if you are using UTF-16 and others which +linefeed is not $/. + +=back + +Like the I<-D> option, this is also for Encode hackers. + +=back + +=head1 SEE ALSO + +L +L +L +L +L +L + +=cut + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/pip b/Master/tlpkg/tlperl.straw/bin/pip new file mode 100755 index 00000000000..f7f5a41df7d --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/pip @@ -0,0 +1,23 @@ +#!/usr/bin/perl + +use 5.00503; +use strict; +use pip; + +use vars qw{$VERSION}; +BEGIN { + $VERSION = '1.16'; +} + +eval { + pip::main( @ARGV ); +}; + +if ( $@ ) { + my $errstr = $@; + $errstr =~ s/\sat line\b.+$//; + print "Unexpected Error: $errstr\n"; + exit(255); +} + +exit(0); diff --git a/Master/tlpkg/tlperl.straw/bin/pip.bat b/Master/tlpkg/tlperl.straw/bin/pip.bat new file mode 100755 index 00000000000..eea5b74873c --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/pip.bat @@ -0,0 +1,39 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!/usr/bin/perl +#line 15 + +use 5.00503; +use strict; +use pip; + +use vars qw{$VERSION}; +BEGIN { + $VERSION = '1.16'; +} + +eval { + pip::main( @ARGV ); +}; + +if ( $@ ) { + my $errstr = $@; + $errstr =~ s/\sat line\b.+$//; + print "Unexpected Error: $errstr\n"; + exit(255); +} + +exit(0); + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/pl2bat.bat b/Master/tlpkg/tlperl.straw/bin/pl2bat.bat new file mode 100755 index 00000000000..64887875c96 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/pl2bat.bat @@ -0,0 +1,430 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!perl +#line 15 + eval 'exec perl -x -S "$0" ${1+"$@"}' + if 0; # In case running under some shell + +require 5; +use Getopt::Std; +use Config; + +$0 =~ s|.*[/\\]||; + +my $usage = <nul + goto endofperl + \@rem '; +EOT +} +$head =~ s/^\t//gm; +my $headlines = 2 + ($head =~ tr/\n/\n/); +my $tail = "\n__END__\n:endofperl\n"; + +@ARGV = ('-') unless @ARGV; + +foreach ( @ARGV ) { + process($_); +} + +sub process { + my( $file )= @_; + my $myhead = $head; + my $linedone = 0; + my $taildone = 0; + my $linenum = 0; + my $skiplines = 0; + my $line; + my $start= $Config{startperl}; + $start= "#!perl" unless $start =~ /^#!.*perl/; + open( FILE, $file ) or die "$0: Can't open $file: $!"; + @file = ; + foreach $line ( @file ) { + $linenum++; + if ( $line =~ /^:endofperl\b/ ) { + if( ! exists $OPT{'u'} ) { + warn "$0: $file has already been converted to a batch file!\n"; + return; + } + $taildone++; + } + if ( not $linedone and $line =~ /^#!.*perl/ ) { + if( exists $OPT{'u'} ) { + $skiplines = $linenum - 1; + $line .= "#line ".(1+$headlines)."\n"; + } else { + $line .= "#line ".($linenum+$headlines)."\n"; + } + $linedone++; + } + if ( $line =~ /^#\s*line\b/ and $linenum == 2 + $skiplines ) { + $line = ""; + } + } + close( FILE ); + $file =~ s/$OPT{'s'}$//oi; + $file .= '.bat' unless $file =~ /\.bat$/i or $file =~ /^-$/; + open( FILE, ">$file" ) or die "Can't open $file: $!"; + print FILE $myhead; + print FILE $start, ( $OPT{'w'} ? " -w" : "" ), + "\n#line ", ($headlines+1), "\n" unless $linedone; + print FILE @file[$skiplines..$#file]; + print FILE $tail unless $taildone; + close( FILE ); +} +__END__ + +=head1 NAME + +pl2bat - wrap perl code into a batch file + +=head1 SYNOPSIS + +B B<-h> + +B [B<-w>] S<[B<-a> I]> S<[B<-s> I]> [files] + +B [B<-w>] S<[B<-n> I]> S<[B<-o> I]> S<[B<-s> I]> [files] + +=head1 DESCRIPTION + +This utility converts a perl script into a batch file that can be +executed on DOS-like operating systems. This is intended to allow +you to use a Perl script like regular programs and batch files where +you just enter the name of the script [probably minus the extension] +plus any command-line arguments and the script is found in your B +and run. + +=head2 ADVANTAGES + +There are several alternatives to this method of running a Perl script. +They each have disadvantages that help you understand the motivation +for using B. + +=over + +=item 1 + + C:> perl x:/path/to/script.pl [args] + +=item 2 + + C:> perl -S script.pl [args] + +=item 3 + + C:> perl -S script [args] + +=item 4 + + C:> ftype Perl=perl.exe "%1" %* + C:> assoc .pl=Perl + then + C:> script.pl [args] + +=item 5 + + C:> ftype Perl=perl.exe "%1" %* + C:> assoc .pl=Perl + C:> set PathExt=%PathExt%;.PL + then + C:> script [args] + +=back + +B<1> and B<2> are the most basic invocation methods that should work on +any system [DOS-like or not]. They require extra typing and require +that the script user know that the script is written in Perl. This +is a pain when you have lots of scripts, some written in Perl and some +not. It can be quite difficult to keep track of which scripts need to +be run through Perl and which do not. Even worse, scripts often get +rewritten from simple batch files into more powerful Perl scripts in +which case these methods would require all existing users of the scripts +be updated. + +B<3> works on modern Win32 versions of Perl. It allows the user to +omit the ".pl" or ".bat" file extension, which is a minor improvement. + +B<4> and B<5> work on some Win32 operating systems with some command +shells. One major disadvantage with both is that you can't use them +in pipelines nor with file redirection. For example, none of the +following will work properly if you used method B<4> or B<5>: + + C:> script.pl script.pl >outfile + C:> echo y | script.pl + C:> script.pl | more + +This is due to a Win32 bug which Perl has no control over. This bug +is the major motivation for B [which was originally written +for DOS] being used on Win32 systems. + +Note also that B<5> works on a smaller range of combinations of Win32 +systems and command shells while B<4> requires that the user know +that the script is a Perl script [because the ".pl" extension must +be entered]. This makes it hard to standardize on either of these +methods. + +=head2 DISADVANTAGES + +There are several potential traps you should be aware of when you +use B. + +The generated batch file is initially processed as a batch file each +time it is run. This means that, to use it from within another batch +file you should precede it with C or else the calling batch +file will not run any commands after the script: + + call script [args] + +Except under Windows NT, if you specify more than 9 arguments to +the generated batch file then the 10th and subsequent arguments +are silently ignored. + +Except when using F under Windows NT, if F is not +in your B, then trying to run the script will give you a generic +"Command not found"-type of error message that will probably make you +think that the script itself is not in your B. When using +F under Windows NT, the generic error message is followed by +"You do not have Perl in your PATH", to make this clearer. + +On most DOS-like operating systems, the only way to exit a batch file +is to "fall off the end" of the file. B implements this by +doing C and adding C<__END__> and C<:endofperl> as +the last two lines of the generated batch file. This means: + +=over + +=item No line of your script should start with a colon. + +In particular, for this version of B, C<:endofperl>, +C<:WinNT>, and C<:script_failed_so_exit_with_non_zero_val> should not +be used. + +=item Care must be taken when using C<__END__> and the C file handle. + +One approach is: + + . #!perl + . while( ) { + . last if /^__END__$/; + . [...] + . } + . __END__ + . lines of data + . to be processed + . __END__ + . :endofperl + +The dots in the first column are only there to prevent F to interpret +the C<:endofperl> line in this documentation. Otherwise F itself +wouldn't work. See the previous item. :-) + +=item The batch file always "succeeds" + +The following commands illustrate the problem: + + C:> echo exit(99); >fail.pl + C:> pl2bat fail.pl + C:> perl -e "print system('perl fail.pl')" + 99 + C:> perl -e "print system('fail.bat')" + 0 + +So F always reports that it completed successfully. Actually, +under Windows NT, we have: + + C:> perl -e "print system('fail.bat')" + 1 + +So, for Windows NT, F fails when the Perl script fails, but +the return code is always C<1>, not the return code from the Perl script. + +=back + +=head2 FUNCTION + +By default, the ".pl" suffix will be stripped before adding a ".bat" suffix +to the supplied file names. This can be controlled with the C<-s> option. + +The default behavior is to have the batch file compare the C +environment variable against C<"Windows_NT">. If they match, it +uses the C<%*> construct to refer to all the command line arguments +that were given to it, so you'll need to make sure that works on your +variant of the command shell. It is known to work in the F shell +under Windows NT. 4DOS/NT users will want to put a C +line in their initialization file, or execute C in +the shell startup file. + +On Windows95 and other platforms a nine-argument limit is imposed +on command-line arguments given to the generated batch file, since +they may not support C<%*> in batch files. + +These can be overridden using the C<-n> and C<-o> options or the +deprecated C<-a> option. + +=head1 OPTIONS + +=over 8 + +=item B<-n> I + +Arguments to invoke perl with in generated batch file when run from +Windows NT (or Windows 98, probably). Defaults to S<'-x -S %0 %*'>. + +=item B<-o> I + +Arguments to invoke perl with in generated batch file except when +run from Windows NT (ie. when run from DOS, Windows 3.1, or Windows 95). +Defaults to S<'-x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9'>. + +=item B<-a> I + +Arguments to invoke perl with in generated batch file. Specifying +B<-a> prevents the batch file from checking the C environment +variable to determine which operating system it is being run from. + +=item B<-s> I + +Strip a suffix string from file name before appending a ".bat" +suffix. The suffix is not case-sensitive. It can be a regex if +it begins with `/' (the trailing '/' is optional and a trailing +C<$> is always assumed). Defaults to C. + +=item B<-w> + +If no line matching C is found in the script, then such +a line is inserted just after the new preamble. The exact line +depends on C<$Config{startperl}> [see L]. With the B<-w> +option, C<" -w"> is added after the value of C<$Config{startperl}>. +If a line matching C already exists in the script, +then it is not changed and the B<-w> option is ignored. + +=item B<-u> + +If the script appears to have already been processed by B, +then the script is skipped and not processed unless B<-u> was +specified. If B<-u> is specified, the existing preamble is replaced. + +=item B<-h> + +Show command line usage. + +=back + +=head1 EXAMPLES + + C:\> pl2bat foo.pl bar.PM + [..creates foo.bat, bar.PM.bat..] + + C:\> pl2bat -s "/\.pl|\.pm/" foo.pl bar.PM + [..creates foo.bat, bar.bat..] + + C:\> pl2bat < somefile > another.bat + + C:\> pl2bat > another.bat + print scalar reverse "rekcah lrep rehtona tsuj\n"; + ^Z + [..another.bat is now a certified japh application..] + + C:\> ren *.bat *.pl + C:\> pl2bat -u *.pl + [..updates the wrapping of some previously wrapped scripts..] + + C:\> pl2bat -u -s .bat *.bat + [..same as previous example except more dangerous..] + +=head1 BUGS + +C<$0> will contain the full name, including the ".bat" suffix +when the generated batch file runs. If you don't like this, +see runperl.bat for an alternative way to invoke perl scripts. + +Default behavior is to invoke Perl with the B<-S> flag, so Perl will +search the B to find the script. This may have undesirable +effects. + +On really old versions of Win32 Perl, you can't run the script +via + + C:> script.bat [args] + +and must use + + C:> script [args] + +A loop should be used to build up the argument list when not on +Windows NT so more than 9 arguments can be processed. + +See also L. + +=head1 SEE ALSO + +perl, perlwin32, runperl.bat + +=cut + + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/pl2pm.bat b/Master/tlpkg/tlperl.straw/bin/pl2pm.bat new file mode 100755 index 00000000000..ec126bdf156 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/pl2pm.bat @@ -0,0 +1,394 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!perl +#line 15 + eval 'exec C:\strawberry\perl\bin\perl.exe -S $0 ${1+"$@"}' + if $running_under_some_shell; + +=head1 NAME + +pl2pm - Rough tool to translate Perl4 .pl files to Perl5 .pm modules. + +=head1 SYNOPSIS + +B F + +=head1 DESCRIPTION + +B is a tool to aid in the conversion of Perl4-style .pl +library files to Perl5-style library modules. Usually, your old .pl +file will still work fine and you should only use this tool if you +plan to update your library to use some of the newer Perl 5 features, +such as AutoLoading. + +=head1 LIMITATIONS + +It's just a first step, but it's usually a good first step. + +=head1 AUTHOR + +Larry Wall + +=cut + +use strict; +use warnings; + +my %keyword = (); + +while () { + chomp; + $keyword{$_} = 1; +} + +local $/; + +while (<>) { + my $newname = $ARGV; + $newname =~ s/\.pl$/.pm/ || next; + $newname =~ s#(.*/)?(\w+)#$1\u$2#; + if (-f $newname) { + warn "Won't overwrite existing $newname\n"; + next; + } + my $oldpack = $2; + my $newpack = "\u$2"; + my @export = (); + + s/\bstd(in|out|err)\b/\U$&/g; + s/(sub\s+)(\w+)(\s*\{[ \t]*\n)\s*package\s+$oldpack\s*;[ \t]*\n+/${1}main'$2$3/ig; + if (/sub\s+\w+'/) { + @export = m/sub\s+\w+'(\w+)/g; + s/(sub\s+)main'(\w+)/$1$2/g; + } + else { + @export = m/sub\s+([A-Za-z]\w*)/g; + } + my @export_ok = grep($keyword{$_}, @export); + @export = grep(!$keyword{$_}, @export); + + my %export = (); + @export{@export} = (1) x @export; + + s/(^\s*);#/$1#/g; + s/(#.*)require ['"]$oldpack\.pl['"]/$1use $newpack/; + s/(package\s*)($oldpack)\s*;[ \t]*\n+//ig; + s/([\$\@%&*])'(\w+)/&xlate($1,"",$2,$newpack,$oldpack,\%export)/eg; + s/([\$\@%&*]?)(\w+)'(\w+)/&xlate($1,$2,$3,$newpack,$oldpack,\%export)/eg; + if (!/\$\[\s*\)?\s*=\s*[^0\s]/) { + s/^\s*(local\s*\()?\s*\$\[\s*\)?\s*=\s*0\s*;[ \t]*\n//g; + s/\$\[\s*\+\s*//g; + s/\s*\+\s*\$\[//g; + s/\$\[/0/g; + } + s/open\s+(\w+)/open($1)/g; + + my $export_ok = ''; + my $carp =''; + + + if (s/\bdie\b/croak/g) { + $carp = "use Carp;\n"; + s/croak "([^"]*)\\n"/croak "$1"/g; + } + + if (@export_ok) { + $export_ok = "\@EXPORT_OK = qw(@export_ok);\n"; + } + + if ( open(PM, ">$newname") ) { + print PM <<"END"; +package $newpack; +use 5.006; +require Exporter; +$carp +\@ISA = qw(Exporter); +\@EXPORT = qw(@export); +$export_ok +$_ +END + } + else { + warn "Can't create $newname: $!\n"; + } +} + +sub xlate { + my ($prefix, $pack, $ident,$newpack,$oldpack,$export) = @_; + + my $xlated ; + if ($prefix eq '' && $ident =~ /^(t|s|m|d|ing|ll|ed|ve|re)$/) { + $xlated = "${pack}'$ident"; + } + elsif ($pack eq '' || $pack eq 'main') { + if ($export->{$ident}) { + $xlated = "$prefix$ident"; + } + else { + $xlated = "$prefix${pack}::$ident"; + } + } + elsif ($pack eq $oldpack) { + $xlated = "$prefix${newpack}::$ident"; + } + else { + $xlated = "$prefix${pack}::$ident"; + } + + return $xlated; +} +__END__ +AUTOLOAD +BEGIN +CHECK +CORE +DESTROY +END +INIT +UNITCHECK +abs +accept +alarm +and +atan2 +bind +binmode +bless +caller +chdir +chmod +chomp +chop +chown +chr +chroot +close +closedir +cmp +connect +continue +cos +crypt +dbmclose +dbmopen +defined +delete +die +do +dump +each +else +elsif +endgrent +endhostent +endnetent +endprotoent +endpwent +endservent +eof +eq +eval +exec +exists +exit +exp +fcntl +fileno +flock +for +foreach +fork +format +formline +ge +getc +getgrent +getgrgid +getgrnam +gethostbyaddr +gethostbyname +gethostent +getlogin +getnetbyaddr +getnetbyname +getnetent +getpeername +getpgrp +getppid +getpriority +getprotobyname +getprotobynumber +getprotoent +getpwent +getpwnam +getpwuid +getservbyname +getservbyport +getservent +getsockname +getsockopt +glob +gmtime +goto +grep +gt +hex +if +index +int +ioctl +join +keys +kill +last +lc +lcfirst +le +length +link +listen +local +localtime +lock +log +lstat +lt +m +map +mkdir +msgctl +msgget +msgrcv +msgsnd +my +ne +next +no +not +oct +open +opendir +or +ord +our +pack +package +pipe +pop +pos +print +printf +prototype +push +q +qq +qr +quotemeta +qw +qx +rand +read +readdir +readline +readlink +readpipe +recv +redo +ref +rename +require +reset +return +reverse +rewinddir +rindex +rmdir +s +scalar +seek +seekdir +select +semctl +semget +semop +send +setgrent +sethostent +setnetent +setpgrp +setpriority +setprotoent +setpwent +setservent +setsockopt +shift +shmctl +shmget +shmread +shmwrite +shutdown +sin +sleep +socket +socketpair +sort +splice +split +sprintf +sqrt +srand +stat +study +sub +substr +symlink +syscall +sysopen +sysread +sysseek +system +syswrite +tell +telldir +tie +tied +time +times +tr +truncate +uc +ucfirst +umask +undef +unless +unlink +unpack +unshift +untie +until +use +utime +values +vec +wait +waitpid +wantarray +warn +while +write +x +xor +y + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/pler b/Master/tlpkg/tlperl.straw/bin/pler new file mode 100755 index 00000000000..01002aa034b --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/pler @@ -0,0 +1,27 @@ +#!/usr/bin/perl + +use 5.00503; +use strict; + +# On some platforms (mostly Windows), we get errors because +# of Term::Cap issues. To avoid this, set TERM=dumb if the +# user does not have a TERM value already. +# This doesn't remove all possible errors, just the most +# annoying and common ones. +BEGIN { + $ENV{TERM} ||= 'dumb'; +} + +use vars qw{$VERSION}; +BEGIN { + $VERSION = '1.05'; +} + +use pler (); + +unless ( $VERSION eq $pler::VERSION ) { + die "Error: Version mismatch (launch script $VERSION using module $pler::VERSION)"; +} +pler::main(@ARGV); + +exit(0); diff --git a/Master/tlpkg/tlperl.straw/bin/pler.bat b/Master/tlpkg/tlperl.straw/bin/pler.bat new file mode 100755 index 00000000000..924a81f64fd --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/pler.bat @@ -0,0 +1,43 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!/usr/bin/perl +#line 15 + +use 5.00503; +use strict; + +# On some platforms (mostly Windows), we get errors because +# of Term::Cap issues. To avoid this, set TERM=dumb if the +# user does not have a TERM value already. +# This doesn't remove all possible errors, just the most +# annoying and common ones. +BEGIN { + $ENV{TERM} ||= 'dumb'; +} + +use vars qw{$VERSION}; +BEGIN { + $VERSION = '1.05'; +} + +use pler (); + +unless ( $VERSION eq $pler::VERSION ) { + die "Error: Version mismatch (launch script $VERSION using module $pler::VERSION)"; +} +pler::main(@ARGV); + +exit(0); + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/pod2html.bat b/Master/tlpkg/tlperl.straw/bin/pod2html.bat new file mode 100755 index 00000000000..75cf111f655 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/pod2html.bat @@ -0,0 +1,160 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!perl +#line 15 + eval 'exec C:\strawberry\perl\bin\perl.exe -S $0 ${1+"$@"}' + if $running_under_some_shell; +=pod + +=head1 NAME + +pod2html - convert .pod files to .html files + +=head1 SYNOPSIS + + pod2html --help --htmlroot= --infile= --outfile= + --podpath=:...: --podroot= + --libpods=:...: --recurse --norecurse --verbose + --index --noindex --title= + +=head1 DESCRIPTION + +Converts files from pod format (see L) to HTML format. + +=head1 ARGUMENTS + +pod2html takes the following arguments: + +=over 4 + +=item help + + --help + +Displays the usage message. + +=item htmlroot + + --htmlroot=name + +Sets the base URL for the HTML files. When cross-references are made, +the HTML root is prepended to the URL. + +=item infile + + --infile=name + +Specify the pod file to convert. Input is taken from STDIN if no +infile is specified. + +=item outfile + + --outfile=name + +Specify the HTML file to create. Output goes to STDOUT if no outfile +is specified. + +=item podroot + + --podroot=name + +Specify the base directory for finding library pods. + +=item podpath + + --podpath=name:...:name + +Specify which subdirectories of the podroot contain pod files whose +HTML converted forms can be linked-to in cross-references. + +=item libpods + + --libpods=name:...:name + +List of page names (eg, "perlfunc") which contain linkable C<=item>s. + +=item netscape + + --netscape + +Use Netscape HTML directives when applicable. + +=item nonetscape + + --nonetscape + +Do not use Netscape HTML directives (default). + +=item index + + --index + +Generate an index at the top of the HTML file (default behaviour). + +=item noindex + + --noindex + +Do not generate an index at the top of the HTML file. + + +=item recurse + + --recurse + +Recurse into subdirectories specified in podpath (default behaviour). + +=item norecurse + + --norecurse + +Do not recurse into subdirectories specified in podpath. + +=item title + + --title=title + +Specify the title of the resulting HTML file. + +=item verbose + + --verbose + +Display progress messages. + +=back + +=head1 AUTHOR + +Tom Christiansen, Etchrist@perl.comE. + +=head1 BUGS + +See L for a list of known bugs in the translator. + +=head1 SEE ALSO + +L, L + +=head1 COPYRIGHT + +This program is distributed under the Artistic License. + +=cut + +use Pod::Html; + +pod2html @ARGV; + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/pod2latex.bat b/Master/tlpkg/tlperl.straw/bin/pod2latex.bat new file mode 100755 index 00000000000..3cc895461a4 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/pod2latex.bat @@ -0,0 +1,398 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!perl +#line 15 + eval 'exec C:\strawberry\perl\bin\perl.exe -S $0 ${1+"$@"}' + if $running_under_some_shell; + +# pod2latex conversion program + +use strict; +use Pod::LaTeX; +use Pod::Find qw/ pod_find /; +use Pod::Usage; +use Getopt::Long; +use File::Basename; +use Symbol; + +my $VERSION = "1.01"; + +# return the entire contents of a text file +# whose name is given as argument +sub _get { + my $fn = shift; + my $infh = gensym; + open $infh, $fn + or die "Could not open file $fn: $!\n"; + local $/; + return <$infh>; +} + +# Read command line arguments + +my %options = ( + "help" => 0, + "man" => 0, + "sections" => [], + "full" => 0, + "out" => undef, + "verbose" => 0, + "modify" => 0, + "h1level" => 1, # section is equivalent to H1 + "preamble" => [], + "postamble" => [], + ); +# "prefile" is just like "preamble", but the argument +# comes from the file named by the argument +$options{"prefile"} = sub { shift; push @{$options{"preamble"}}, _get(shift) }; +# the same between "postfile" and "postamble" +$options{"postfile"} = sub { shift; push @{$options{"postamble"}}, _get(shift) }; + +GetOptions(\%options, + "help", + "man", + "verbose", + "full", + "sections=s@", + "out=s", + "modify", + "h1level=i", + "preamble=s@", + "postamble=s@", + "prefile=s", + "postfile=s" + ) || pod2usage(2); + +pod2usage(1) if ($options{help}); +pod2usage(-verbose => 2) if ($options{man}); + + +# Read all the files from the command line +my @files = @ARGV; + +# Now find which ones are real pods and convert +# directories to their contents. + +# Extract the pods from each arg since some of them might +# be directories +# This is not as efficient as using pod_find to search through +# everything at once but it allows us to preserve the order +# supplied by the user + +my @pods; +foreach my $arg (@files) { + my %pods = pod_find($arg); + push(@pods, sort keys %pods); +} + +# Abort if nothing to do +if ($#pods == -1) { + warn "None of the supplied Pod files actually exist\n"; + exit; +} + +# Only want to override the preamble and postamble if we have +# been given values. +my %User; +$User{UserPreamble} = join("\n", @{$options{'preamble'}}) + if ($options{preamble} && @{$options{preamble}}); +$User{UserPostamble} = join("\n", @{$options{'postamble'}}) + if ($options{postamble} && @{$options{postamble}}); + + + +# If $options{'out'} is set we are processing to a single output file +my $multi_documents; +if (exists $options{'out'} && defined $options{'out'}) { + $multi_documents = 0; +} else { + $multi_documents = 1; +} + +# If the output file is not specified it is assumed that +# a single output file is required per input file using +# a .tex extension rather than any exisiting extension + +if ($multi_documents) { + + # Case where we just generate one input per output + + foreach my $pod (@pods) { + + if (-f $pod) { + + my $output = $pod; + $output = basename($output, '.pm', '.pod','.pl') . '.tex'; + + # Create a new parser object + my $parser = new Pod::LaTeX( + AddPreamble => $options{'full'}, + AddPostamble => $options{'full'}, + MakeIndex => $options{'full'}, + TableOfContents => $options{'full'}, + ReplaceNAMEwithSection => $options{'modify'}, + UniqueLabels => $options{'modify'}, + Head1Level => $options{'h1level'}, + LevelNoNum => $options{'h1level'} + 1, + %User, + ); + + # Select sections if supplied + $parser->select(@{ $options{'sections'}}) + if @{$options{'sections'}}; + + # Derive the input file from the output file + $parser->parse_from_file($pod, $output); + + print "Written output to $output\n" if $options{'verbose'}; + + } else { + warn "File $pod not found\n"; + } + + } +} else { + + # Case where we want everything to be in a single document + + # Need to open the output file ourselves + my $output = $options{'out'}; + $output .= '.tex' unless $output =~ /\.tex$/; + + # Use auto-vivified file handle in perl 5.6 + my $outfh = gensym; + open ($outfh, ">$output") || die "Could not open output file: $!\n"; + + # Flag to indicate whether we have converted at least one file + # indicates how many files have been converted + my $converted = 0; + + # Loop over the input files + foreach my $pod (@pods) { + + if (-f $pod) { + + warn "Converting $pod\n" if $options{'verbose'}; + + # Open the file (need the handle) + # Use auto-vivified handle in perl 5.6 + my $podfh = gensym; + open ($podfh, "<$pod") || die "Could not open pod file $pod: $!\n"; + + # if this is the first file to be converted we may want to add + # a preamble (controlled by command line option) + my $preamble = 0; + $preamble = 1 if ($converted == 0 && $options{'full'}); + + # if this is the last file to be converted may want to add + # a postamble (controlled by command line option) + # relies on a previous pass to check existence of all pods we + # are converting. + my $postamble = ( ($converted == $#pods && $options{'full'}) ? 1 : 0 ); + + # Open parser object + # May want to start with a preamble for the first one and + # end with an index for the last + my $parser = new Pod::LaTeX( + MakeIndex => $options{'full'}, + TableOfContents => $preamble, + ReplaceNAMEwithSection => $options{'modify'}, + UniqueLabels => $options{'modify'}, + StartWithNewPage => $options{'full'}, + AddPreamble => $preamble, + AddPostamble => $postamble, + Head1Level => $options{'h1level'}, + LevelNoNum => $options{'h1level'} + 1, + %User + ); + + # Store the file name for error messages + # This is a kluge that breaks the data hiding of the object + $parser->{_INFILE} = $pod; + + # Select sections if supplied + $parser->select(@{ $options{'sections'}}) + if @{$options{'sections'}}; + + # Parse it + $parser->parse_from_filehandle($podfh, $outfh); + + # We have converted at least one file + $converted++; + + } else { + warn "File $pod not found\n"; + } + + } + + # Should unlink the file if we didn't convert anything! + # dont check for return status of unlink + # since there is not a lot to be done if the unlink failed + # and the program does not rely upon it. + unlink "$output" unless $converted; + + # If verbose + warn "Converted $converted files\n" if $options{'verbose'}; + +} + +exit; + +__END__ + +=head1 NAME + +pod2latex - convert pod documentation to latex format + +=head1 SYNOPSIS + + pod2latex *.pm + + pod2latex -out mytex.tex *.pod + + pod2latex -full -sections 'DESCRIPTION|NAME' SomeDir + + pod2latex -prefile h.tex -postfile t.tex my.pod + +=head1 DESCRIPTION + +C is a program to convert POD format documentation +(L) into latex. It can process multiple input documents at a +time and either generate a latex file per input document or a single +combined output file. + +=head1 OPTIONS AND ARGUMENTS + +This section describes the supported command line options. Minimum +matching is supported. + +=over 4 + +=item B<-out> + +Name of the output file to be used. If there are multiple input pods +it is assumed that the intention is to write all translated output +into a single file. C<.tex> is appended if not present. If the +argument is not supplied, a single document will be created for each +input file. + +=item B<-full> + +Creates a complete C file that can be processed immediately +(unless C<=for/=begin> directives are used that rely on extra packages). +Table of contents and index generation commands are included in the +wrapper C code. + +=item B<-sections> + +Specify pod sections to include (or remove if negated) in the +translation. See L for the +format to use for I. This option may be given multiple +times on the command line.This is identical to the similar option in +the C command. + +=item B<-modify> + +This option causes the output C to be slightly +modified from the input pod such that when a C<=head1 NAME> +is encountered a section is created containing the actual +pod name (rather than B) and all subsequent C<=head1> +directives are treated as subsections. This has the advantage +that the description of a module will be in its own section +which is helpful for including module descriptions in documentation. +Also forces C label and index entries to be prefixed by the +name of the module. + +=item B<-h1level> + +Specifies the C section that is equivalent to a C

pod +directive. This is an integer between 0 and 5 with 0 equivalent to a +C chapter, 1 equivalent to a C section etc. The default +is 1 (C

equivalent to a latex section). + +=item B<-help> + +Print a brief help message and exit. + +=item B<-man> + +Print the manual page and exit. + +=item B<-verbose> + +Print information messages as each document is processed. + +=item B<-preamble> + +A user-supplied preamble for the LaTeX code. Multiple values +are supported and appended in order separated by "\n". +See B<-prefile> for reading the preamble from a file. + +=item B<-postamble> + +A user supplied postamble for the LaTeX code. Multiple values +are supported and appended in order separated by "\n". +See B<-postfile> for reading the postamble from a file. + +=item B<-prefile> + +A user-supplied preamble for the LaTeX code to be read from the +named file. Multiple values are supported and appended in +order. See B<-preamble>. + +=item B<-postfile> + +A user-supplied postamble for the LaTeX code to be read from the +named file. Multiple values are supported and appended in +order. See B<-postamble>. + +=back + +=head1 BUGS + +Known bugs are: + +=over 4 + +=item * + +Cross references between documents are not resolved when multiple +pod documents are converted into a single output C file. + +=item * + +Functions and variables are not automatically recognized +and they will therefore not be marked up in any special way +unless instructed by an explicit pod command. + +=back + +=head1 SEE ALSO + +L + +=head1 AUTHOR + +Tim Jenness Etjenness@cpan.orgE + +This program is free software; you can redistribute it +and/or modify it under the same terms as Perl itself. + +Copyright (C) 2000, 2003, 2004 Tim Jenness. All Rights Reserved. + +=cut + + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/pod2man b/Master/tlpkg/tlperl.straw/bin/pod2man new file mode 100755 index 00000000000..1eff3ca275f --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/pod2man @@ -0,0 +1,549 @@ +#!perl + eval 'exec C:\strawberry\perl\bin\perl.exe -S $0 ${1+"$@"}' + if $running_under_some_shell; + +# pod2man -- Convert POD data to formatted *roff input. +# +# Copyright 1999, 2000, 2001, 2004, 2006, 2008 Russ Allbery +# +# This program is free software; you may redistribute it and/or modify it +# under the same terms as Perl itself. + +require 5.004; + +use Getopt::Long qw(GetOptions); +use Pod::Man (); +use Pod::Usage qw(pod2usage); + +use strict; + +# Silence -w warnings. +use vars qw($running_under_some_shell); + +# Insert -- into @ARGV before any single dash argument to hide it from +# Getopt::Long; we want to interpret it as meaning stdin. +my $stdin; +@ARGV = map { $_ eq '-' && !$stdin++ ? ('--', $_) : $_ } @ARGV; + +# Parse our options, trying to retain backward compatibility with pod2man but +# allowing short forms as well. --lax is currently ignored. +my %options; +$options{errors} = 'pod'; +Getopt::Long::config ('bundling_override'); +GetOptions (\%options, 'center|c=s', 'date|d=s', 'fixed=s', 'fixedbold=s', + 'fixeditalic=s', 'fixedbolditalic=s', 'help|h', 'lax|l', + 'name|n=s', 'official|o', 'quotes|q=s', 'release|r:s', + 'section|s=s', 'stderr', 'verbose|v', 'utf8|u') or exit 1; +pod2usage (0) if $options{help}; + +# Official sets --center, but don't override things explicitly set. +if ($options{official} && !defined $options{center}) { + $options{center} = 'Perl Programmers Reference Guide'; +} + +# Verbose is only our flag, not a Pod::Man flag. +my $verbose = $options{verbose}; +delete $options{verbose}; + +# This isn't a valid Pod::Man option and is only accepted for backward +# compatibility. +delete $options{lax}; + +# Initialize and run the formatter, pulling a pair of input and output off at +# a time. +my $parser = Pod::Man->new (%options); +my @files; +do { + @files = splice (@ARGV, 0, 2); + print " $files[1]\n" if $verbose; + $parser->parse_from_file (@files); +} while (@ARGV); + +__END__ + +=head1 NAME + +pod2man - Convert POD data to formatted *roff input + +=for stopwords +en em --stderr stderr --utf8 UTF-8 overdo markup MT-LEVEL Allbery Solaris +URL troff troff-specific formatters uppercased Christiansen + +=head1 SYNOPSIS + +pod2man [B<--center>=I] [B<--date>=I] + [B<--fixed>=I] [B<--fixedbold>=I] [B<--fixeditalic>=I] + [B<--fixedbolditalic>=I] [B<--name>=I] [B<--official>] + [B<--quotes>=I] [B<--release>[=I]] + [B<--section>=I] [B<--stderr>] [B<--utf8>] [B<--verbose>] + [I [I] ...] + +pod2man B<--help> + +=head1 DESCRIPTION + +B is a front-end for Pod::Man, using it to generate *roff input +from POD source. The resulting *roff code is suitable for display on a +terminal using nroff(1), normally via man(1), or printing using troff(1). + +I is the file to read for POD source (the POD can be embedded in +code). If I isn't given, it defaults to C. I, if +given, is the file to which to write the formatted output. If I +isn't given, the formatted output is written to C. Several POD +files can be processed in the same B invocation (saving module +load and compile times) by providing multiple pairs of I and +I files on the command line. + +B<--section>, B<--release>, B<--center>, B<--date>, and B<--official> can +be used to set the headers and footers to use; if not given, Pod::Man will +assume various defaults. See below or L for details. + +B assumes that your *roff formatters have a fixed-width font +named C. If yours is called something else (like C), use +B<--fixed> to specify it. This generally only matters for troff output +for printing. Similarly, you can set the fonts used for bold, italic, and +bold italic fixed-width output. + +Besides the obvious pod conversions, Pod::Man, and therefore pod2man also +takes care of formatting func(), func(n), and simple variable references +like $foo or @bar so you don't have to use code escapes for them; complex +expressions like C<$fred{'stuff'}> will still need to be escaped, though. +It also translates dashes that aren't used as hyphens into en dashes, makes +long dashes--like this--into proper em dashes, fixes "paired quotes," and +takes care of several other troff-specific tweaks. See L for +complete information. + +=head1 OPTIONS + +=over 4 + +=item B<-c> I, B<--center>=I + +Sets the centered page header to I. The default is "User +Contributed Perl Documentation", but also see B<--official> below. + +=item B<-d> I, B<--date>=I + +Set the left-hand footer string to this value. By default, the modification +date of the input file will be used, or the current date if input comes from +C. + +=item B<--fixed>=I + +The fixed-width font to use for verbatim text and code. Defaults to +C. Some systems may want C instead. Only matters for troff(1) +output. + +=item B<--fixedbold>=I + +Bold version of the fixed-width font. Defaults to C. Only matters +for troff(1) output. + +=item B<--fixeditalic>=I + +Italic version of the fixed-width font (actually, something of a misnomer, +since most fixed-width fonts only have an oblique version, not an italic +version). Defaults to C. Only matters for troff(1) output. + +=item B<--fixedbolditalic>=I + +Bold italic (probably actually oblique) version of the fixed-width font. +Pod::Man doesn't assume you have this, and defaults to C. Some +systems (such as Solaris) have this font available as C. Only matters +for troff(1) output. + +=item B<-h>, B<--help> + +Print out usage information. + +=item B<-l>, B<--lax> + +No longer used. B used to check its input for validity as a +manual page, but this should now be done by L instead. +Accepted for backward compatibility; this option no longer does anything. + +=item B<-n> I, B<--name>=I + +Set the name of the manual page to I. Without this option, the manual +name is set to the uppercased base name of the file being converted unless +the manual section is 3, in which case the path is parsed to see if it is a +Perl module path. If it is, a path like C<.../lib/Pod/Man.pm> is converted +into a name like C. This option, if given, overrides any +automatic determination of the name. + +Note that this option is probably not useful when converting multiple POD +files at once. The convention for Unix man pages for commands is for the +man page title to be in all-uppercase even if the command isn't. + +=item B<-o>, B<--official> + +Set the default header to indicate that this page is part of the standard +Perl release, if B<--center> is not also given. + +=item B<-q> I, B<--quotes>=I + +Sets the quote marks used to surround CE> text to I. If +I is a single character, it is used as both the left and right +quote; if I is two characters, the first character is used as the +left quote and the second as the right quoted; and if I is four +characters, the first two are used as the left quote and the second two as +the right quote. + +I may also be set to the special value C, in which case no +quote marks are added around CE> text (but the font is still changed for +troff output). + +=item B<-r>, B<--release> + +Set the centered footer. By default, this is the version of Perl you run +B under. Note that some system an macro sets assume that the +centered footer will be a modification date and will prepend something like +"Last modified: "; if this is the case, you may want to set B<--release> to +the last modified date and B<--date> to the version number. + +=item B<-s>, B<--section> + +Set the section for the C<.TH> macro. The standard section numbering +convention is to use 1 for user commands, 2 for system calls, 3 for +functions, 4 for devices, 5 for file formats, 6 for games, 7 for +miscellaneous information, and 8 for administrator commands. There is a lot +of variation here, however; some systems (like Solaris) use 4 for file +formats, 5 for miscellaneous information, and 7 for devices. Still others +use 1m instead of 8, or some mix of both. About the only section numbers +that are reliably consistent are 1, 2, and 3. + +By default, section 1 will be used unless the file ends in C<.pm>, in +which case section 3 will be selected. + +=item B<--stderr> + +By default, B puts any errors detected in the POD input in a POD +ERRORS section in the output manual page. If B<--stderr> is given, errors +are sent to standard error instead and the POD ERRORS section is +suppressed. + +=item B<-u>, B<--utf8> + +By default, B produces the most conservative possible *roff +output to try to ensure that it will work with as many different *roff +implementations as possible. Many *roff implementations cannot handle +non-ASCII characters, so this means all non-ASCII characters are converted +either to a *roff escape sequence that tries to create a properly accented +character (at least for troff output) or to C. + +This option says to instead output literal UTF-8 characters. If your +*roff implementation can handle it, this is the best output format to use +and avoids corruption of documents containing non-ASCII characters. +However, be warned that *roff source with literal UTF-8 characters is not +supported by many implementations and may even result in segfaults and +other bad behavior. + +Be aware that, when using this option, the input encoding of your POD +source must be properly declared unless it is US-ASCII or Latin-1. POD +input without an C<=encoding> command will be assumed to be in Latin-1, +and if it's actually in UTF-8, the output will be double-encoded. See +L for more information on the C<=encoding> command. + +=item B<-v>, B<--verbose> + +Print out the name of each output file as it is being generated. + +=back + +=head1 DIAGNOSTICS + +If B fails with errors, see L and L for +information about what those errors might mean. + +=head1 EXAMPLES + + pod2man program > program.1 + pod2man SomeModule.pm /usr/perl/man/man3/SomeModule.3 + pod2man --section=7 note.pod > note.7 + +If you would like to print out a lot of man page continuously, you probably +want to set the C and D registers to set contiguous page numbering and +even/odd paging, at least on some versions of man(7). + + troff -man -rC1 -rD1 perl.1 perldata.1 perlsyn.1 ... + +To get index entries on C, turn on the F register, as in: + + troff -man -rF1 perl.1 + +The indexing merely outputs messages via C<.tm> for each major page, +section, subsection, item, and any CE> directives. See +L for more details. + +=head1 BUGS + +Lots of this documentation is duplicated from L. + +=head1 NOTES + +For those not sure of the proper layout of a man page, here are some notes +on writing a proper man page. + +The name of the program being documented is conventionally written in bold +(using BEE) wherever it occurs, as are all program options. +Arguments should be written in italics (IEE). Functions are +traditionally written in italics; if you write a function as function(), +Pod::Man will take care of this for you. Literal code or commands should +be in CEE. References to other man pages should be in the form +C, and Pod::Man will automatically format those +appropriately. As an exception, it's traditional not to use this form when +referring to module documentation; use CModule::NameE> instead. + +References to other programs or functions are normally in the form of man +page references so that cross-referencing tools can provide the user with +links and the like. It's possible to overdo this, though, so be careful not +to clutter your documentation with too much markup. + +The major headers should be set out using a C<=head1> directive, and are +historically written in the rather startling ALL UPPER CASE format, although +this is not mandatory. Minor headers may be included using C<=head2>, and +are typically in mixed case. + +The standard sections of a manual page are: + +=over 4 + +=item NAME + +Mandatory section; should be a comma-separated list of programs or functions +documented by this POD page, such as: + + foo, bar - programs to do something + +Manual page indexers are often extremely picky about the format of this +section, so don't put anything in it except this line. A single dash, and +only a single dash, should separate the list of programs or functions from +the description. Do not use any markup such as CEE or +BEE. Functions should not be qualified with C<()> or the like. +The description should ideally fit on a single line, even if a man program +replaces the dash with a few tabs. + +=item SYNOPSIS + +A short usage summary for programs and functions. This section is mandatory +for section 3 pages. + +=item DESCRIPTION + +Extended description and discussion of the program or functions, or the body +of the documentation for man pages that document something else. If +particularly long, it's a good idea to break this up into subsections +C<=head2> directives like: + + =head2 Normal Usage + + =head2 Advanced Features + + =head2 Writing Configuration Files + +or whatever is appropriate for your documentation. + +=item OPTIONS + +Detailed description of each of the command-line options taken by the +program. This should be separate from the description for the use of things +like L. This is normally presented as a list, with +each option as a separate C<=item>. The specific option string should be +enclosed in BEE. Any values that the option takes should be +enclosed in IEE. For example, the section for the option +B<--section>=I would be introduced with: + + =item B<--section>=I + +Synonymous options (like both the short and long forms) are separated by a +comma and a space on the same C<=item> line, or optionally listed as their +own item with a reference to the canonical name. For example, since +B<--section> can also be written as B<-s>, the above would be: + + =item B<-s> I, B<--section>=I + +(Writing the short option first is arguably easier to read, since the long +option is long enough to draw the eye to it anyway and the short option can +otherwise get lost in visual noise.) + +=item RETURN VALUE + +What the program or function returns, if successful. This section can be +omitted for programs whose precise exit codes aren't important, provided +they return 0 on success as is standard. It should always be present for +functions. + +=item ERRORS + +Exceptions, error return codes, exit statuses, and errno settings. +Typically used for function documentation; program documentation uses +DIAGNOSTICS instead. The general rule of thumb is that errors printed to +C or C and intended for the end user are documented in +DIAGNOSTICS while errors passed internal to the calling program and +intended for other programmers are documented in ERRORS. When documenting +a function that sets errno, a full list of the possible errno values +should be given here. + +=item DIAGNOSTICS + +All possible messages the program can print out--and what they mean. You +may wish to follow the same documentation style as the Perl documentation; +see perldiag(1) for more details (and look at the POD source as well). + +If applicable, please include details on what the user should do to correct +the error; documenting an error as indicating "the input buffer is too +small" without telling the user how to increase the size of the input buffer +(or at least telling them that it isn't possible) aren't very useful. + +=item EXAMPLES + +Give some example uses of the program or function. Don't skimp; users often +find this the most useful part of the documentation. The examples are +generally given as verbatim paragraphs. + +Don't just present an example without explaining what it does. Adding a +short paragraph saying what the example will do can increase the value of +the example immensely. + +=item ENVIRONMENT + +Environment variables that the program cares about, normally presented as a +list using C<=over>, C<=item>, and C<=back>. For example: + + =over 6 + + =item HOME + + Used to determine the user's home directory. F<.foorc> in this + directory is read for configuration details, if it exists. + + =back + +Since environment variables are normally in all uppercase, no additional +special formatting is generally needed; they're glaring enough as it is. + +=item FILES + +All files used by the program or function, normally presented as a list, and +what it uses them for. File names should be enclosed in FEE. It's +particularly important to document files that will be potentially modified. + +=item CAVEATS + +Things to take special care with, sometimes called WARNINGS. + +=item BUGS + +Things that are broken or just don't work quite right. + +=item RESTRICTIONS + +Bugs you don't plan to fix. :-) + +=item NOTES + +Miscellaneous commentary. + +=item AUTHOR + +Who wrote it (use AUTHORS for multiple people). Including your current +e-mail address (or some e-mail address to which bug reports should be sent) +so that users have a way of contacting you is a good idea. Remember that +program documentation tends to roam the wild for far longer than you expect +and pick an e-mail address that's likely to last if possible. + +=item HISTORY + +Programs derived from other sources sometimes have this, or you might keep +a modification log here. If the log gets overly long or detailed, +consider maintaining it in a separate file, though. + +=item COPYRIGHT AND LICENSE + +For copyright + + Copyright YEAR(s) by YOUR NAME(s) + +(No, (C) is not needed. No, "all rights reserved" is not needed.) + +For licensing the easiest way is to use the same licensing as Perl itself: + + This library is free software; you may redistribute it and/or modify + it under the same terms as Perl itself. + +This makes it easy for people to use your module with Perl. Note that +this licensing is neither an endorsement or a requirement, you are of +course free to choose any licensing. + +=item SEE ALSO + +Other man pages to check out, like man(1), man(7), makewhatis(8), or +catman(8). Normally a simple list of man pages separated by commas, or a +paragraph giving the name of a reference work. Man page references, if they +use the standard C form, don't have to be enclosed in +LEE (although it's recommended), but other things in this section +probably should be when appropriate. + +If the package has a mailing list, include a URL or subscription +instructions here. + +If the package has a web site, include a URL here. + +=back + +In addition, some systems use CONFORMING TO to note conformance to relevant +standards and MT-LEVEL to note safeness for use in threaded programs or +signal handlers. These headings are primarily useful when documenting parts +of a C library. Documentation of object-oriented libraries or modules may +use CONSTRUCTORS and METHODS sections for detailed documentation of the +parts of the library and save the DESCRIPTION section for an overview; other +large modules may use FUNCTIONS for similar reasons. Some people use +OVERVIEW to summarize the description if it's quite long. + +Section ordering varies, although NAME should I be the first section +(you'll break some man page systems otherwise), and NAME, SYNOPSIS, +DESCRIPTION, and OPTIONS generally always occur first and in that order if +present. In general, SEE ALSO, AUTHOR, and similar material should be left +for last. Some systems also move WARNINGS and NOTES to last. The order +given above should be reasonable for most purposes. + +Finally, as a general note, try not to use an excessive amount of markup. +As documented here and in L, you can safely leave Perl variables, +function names, man page references, and the like unadorned by markup and +the POD translators will figure it out for you. This makes it much easier +to later edit the documentation. Note that many existing translators +(including this one currently) will do the wrong thing with e-mail addresses +when wrapped in LEE, so don't do that. + +For additional information that may be more accurate for your specific +system, see either L or L depending on your system manual +section numbering conventions. + +=head1 SEE ALSO + +L, L, L, L, L, +L, L, L + +The man page documenting the an macro set may be L instead of +L on your system. + +The current version of this script is always available from its web site at +L. It is also part of the +Perl core distribution as of 5.6.0. + +=head1 AUTHOR + +Russ Allbery , based I heavily on the original +B by Larry Wall and Tom Christiansen. Large portions of this +documentation, particularly the sections on the anatomy of a proper man +page, are taken from the B documentation by Tom. + +=head1 COPYRIGHT AND LICENSE + +Copyright 1999, 2000, 2001, 2004, 2006, 2008 Russ Allbery +. + +This program is free software; you may redistribute it and/or modify it +under the same terms as Perl itself. + +=cut diff --git a/Master/tlpkg/tlperl.straw/bin/pod2man.bat b/Master/tlpkg/tlperl.straw/bin/pod2man.bat new file mode 100755 index 00000000000..f2555659bc3 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/pod2man.bat @@ -0,0 +1,565 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!perl +#line 15 + eval 'exec C:\strawberry\perl\bin\perl.exe -S $0 ${1+"$@"}' + if $running_under_some_shell; + +# pod2man -- Convert POD data to formatted *roff input. +# +# Copyright 1999, 2000, 2001, 2004, 2006, 2008 Russ Allbery +# +# This program is free software; you may redistribute it and/or modify it +# under the same terms as Perl itself. + +require 5.004; + +use Getopt::Long qw(GetOptions); +use Pod::Man (); +use Pod::Usage qw(pod2usage); + +use strict; + +# Silence -w warnings. +use vars qw($running_under_some_shell); + +# Insert -- into @ARGV before any single dash argument to hide it from +# Getopt::Long; we want to interpret it as meaning stdin. +my $stdin; +@ARGV = map { $_ eq '-' && !$stdin++ ? ('--', $_) : $_ } @ARGV; + +# Parse our options, trying to retain backward compatibility with pod2man but +# allowing short forms as well. --lax is currently ignored. +my %options; +$options{errors} = 'pod'; +Getopt::Long::config ('bundling_override'); +GetOptions (\%options, 'center|c=s', 'date|d=s', 'fixed=s', 'fixedbold=s', + 'fixeditalic=s', 'fixedbolditalic=s', 'help|h', 'lax|l', + 'name|n=s', 'official|o', 'quotes|q=s', 'release|r:s', + 'section|s=s', 'stderr', 'verbose|v', 'utf8|u') or exit 1; +pod2usage (0) if $options{help}; + +# Official sets --center, but don't override things explicitly set. +if ($options{official} && !defined $options{center}) { + $options{center} = 'Perl Programmers Reference Guide'; +} + +# Verbose is only our flag, not a Pod::Man flag. +my $verbose = $options{verbose}; +delete $options{verbose}; + +# This isn't a valid Pod::Man option and is only accepted for backward +# compatibility. +delete $options{lax}; + +# Initialize and run the formatter, pulling a pair of input and output off at +# a time. +my $parser = Pod::Man->new (%options); +my @files; +do { + @files = splice (@ARGV, 0, 2); + print " $files[1]\n" if $verbose; + $parser->parse_from_file (@files); +} while (@ARGV); + +__END__ + +=head1 NAME + +pod2man - Convert POD data to formatted *roff input + +=for stopwords +en em --stderr stderr --utf8 UTF-8 overdo markup MT-LEVEL Allbery Solaris +URL troff troff-specific formatters uppercased Christiansen + +=head1 SYNOPSIS + +pod2man [B<--center>=I] [B<--date>=I] + [B<--fixed>=I] [B<--fixedbold>=I] [B<--fixeditalic>=I] + [B<--fixedbolditalic>=I] [B<--name>=I] [B<--official>] + [B<--quotes>=I] [B<--release>[=I]] + [B<--section>=I] [B<--stderr>] [B<--utf8>] [B<--verbose>] + [I [I] ...] + +pod2man B<--help> + +=head1 DESCRIPTION + +B is a front-end for Pod::Man, using it to generate *roff input +from POD source. The resulting *roff code is suitable for display on a +terminal using nroff(1), normally via man(1), or printing using troff(1). + +I is the file to read for POD source (the POD can be embedded in +code). If I isn't given, it defaults to C. I, if +given, is the file to which to write the formatted output. If I +isn't given, the formatted output is written to C. Several POD +files can be processed in the same B invocation (saving module +load and compile times) by providing multiple pairs of I and +I files on the command line. + +B<--section>, B<--release>, B<--center>, B<--date>, and B<--official> can +be used to set the headers and footers to use; if not given, Pod::Man will +assume various defaults. See below or L for details. + +B assumes that your *roff formatters have a fixed-width font +named C. If yours is called something else (like C), use +B<--fixed> to specify it. This generally only matters for troff output +for printing. Similarly, you can set the fonts used for bold, italic, and +bold italic fixed-width output. + +Besides the obvious pod conversions, Pod::Man, and therefore pod2man also +takes care of formatting func(), func(n), and simple variable references +like $foo or @bar so you don't have to use code escapes for them; complex +expressions like C<$fred{'stuff'}> will still need to be escaped, though. +It also translates dashes that aren't used as hyphens into en dashes, makes +long dashes--like this--into proper em dashes, fixes "paired quotes," and +takes care of several other troff-specific tweaks. See L for +complete information. + +=head1 OPTIONS + +=over 4 + +=item B<-c> I, B<--center>=I + +Sets the centered page header to I. The default is "User +Contributed Perl Documentation", but also see B<--official> below. + +=item B<-d> I, B<--date>=I + +Set the left-hand footer string to this value. By default, the modification +date of the input file will be used, or the current date if input comes from +C. + +=item B<--fixed>=I + +The fixed-width font to use for verbatim text and code. Defaults to +C. Some systems may want C instead. Only matters for troff(1) +output. + +=item B<--fixedbold>=I + +Bold version of the fixed-width font. Defaults to C. Only matters +for troff(1) output. + +=item B<--fixeditalic>=I + +Italic version of the fixed-width font (actually, something of a misnomer, +since most fixed-width fonts only have an oblique version, not an italic +version). Defaults to C. Only matters for troff(1) output. + +=item B<--fixedbolditalic>=I + +Bold italic (probably actually oblique) version of the fixed-width font. +Pod::Man doesn't assume you have this, and defaults to C. Some +systems (such as Solaris) have this font available as C. Only matters +for troff(1) output. + +=item B<-h>, B<--help> + +Print out usage information. + +=item B<-l>, B<--lax> + +No longer used. B used to check its input for validity as a +manual page, but this should now be done by L instead. +Accepted for backward compatibility; this option no longer does anything. + +=item B<-n> I, B<--name>=I + +Set the name of the manual page to I. Without this option, the manual +name is set to the uppercased base name of the file being converted unless +the manual section is 3, in which case the path is parsed to see if it is a +Perl module path. If it is, a path like C<.../lib/Pod/Man.pm> is converted +into a name like C. This option, if given, overrides any +automatic determination of the name. + +Note that this option is probably not useful when converting multiple POD +files at once. The convention for Unix man pages for commands is for the +man page title to be in all-uppercase even if the command isn't. + +=item B<-o>, B<--official> + +Set the default header to indicate that this page is part of the standard +Perl release, if B<--center> is not also given. + +=item B<-q> I, B<--quotes>=I + +Sets the quote marks used to surround CE> text to I. If +I is a single character, it is used as both the left and right +quote; if I is two characters, the first character is used as the +left quote and the second as the right quoted; and if I is four +characters, the first two are used as the left quote and the second two as +the right quote. + +I may also be set to the special value C, in which case no +quote marks are added around CE> text (but the font is still changed for +troff output). + +=item B<-r>, B<--release> + +Set the centered footer. By default, this is the version of Perl you run +B under. Note that some system an macro sets assume that the +centered footer will be a modification date and will prepend something like +"Last modified: "; if this is the case, you may want to set B<--release> to +the last modified date and B<--date> to the version number. + +=item B<-s>, B<--section> + +Set the section for the C<.TH> macro. The standard section numbering +convention is to use 1 for user commands, 2 for system calls, 3 for +functions, 4 for devices, 5 for file formats, 6 for games, 7 for +miscellaneous information, and 8 for administrator commands. There is a lot +of variation here, however; some systems (like Solaris) use 4 for file +formats, 5 for miscellaneous information, and 7 for devices. Still others +use 1m instead of 8, or some mix of both. About the only section numbers +that are reliably consistent are 1, 2, and 3. + +By default, section 1 will be used unless the file ends in C<.pm>, in +which case section 3 will be selected. + +=item B<--stderr> + +By default, B puts any errors detected in the POD input in a POD +ERRORS section in the output manual page. If B<--stderr> is given, errors +are sent to standard error instead and the POD ERRORS section is +suppressed. + +=item B<-u>, B<--utf8> + +By default, B produces the most conservative possible *roff +output to try to ensure that it will work with as many different *roff +implementations as possible. Many *roff implementations cannot handle +non-ASCII characters, so this means all non-ASCII characters are converted +either to a *roff escape sequence that tries to create a properly accented +character (at least for troff output) or to C. + +This option says to instead output literal UTF-8 characters. If your +*roff implementation can handle it, this is the best output format to use +and avoids corruption of documents containing non-ASCII characters. +However, be warned that *roff source with literal UTF-8 characters is not +supported by many implementations and may even result in segfaults and +other bad behavior. + +Be aware that, when using this option, the input encoding of your POD +source must be properly declared unless it is US-ASCII or Latin-1. POD +input without an C<=encoding> command will be assumed to be in Latin-1, +and if it's actually in UTF-8, the output will be double-encoded. See +L for more information on the C<=encoding> command. + +=item B<-v>, B<--verbose> + +Print out the name of each output file as it is being generated. + +=back + +=head1 DIAGNOSTICS + +If B fails with errors, see L and L for +information about what those errors might mean. + +=head1 EXAMPLES + + pod2man program > program.1 + pod2man SomeModule.pm /usr/perl/man/man3/SomeModule.3 + pod2man --section=7 note.pod > note.7 + +If you would like to print out a lot of man page continuously, you probably +want to set the C and D registers to set contiguous page numbering and +even/odd paging, at least on some versions of man(7). + + troff -man -rC1 -rD1 perl.1 perldata.1 perlsyn.1 ... + +To get index entries on C, turn on the F register, as in: + + troff -man -rF1 perl.1 + +The indexing merely outputs messages via C<.tm> for each major page, +section, subsection, item, and any CE> directives. See +L for more details. + +=head1 BUGS + +Lots of this documentation is duplicated from L. + +=head1 NOTES + +For those not sure of the proper layout of a man page, here are some notes +on writing a proper man page. + +The name of the program being documented is conventionally written in bold +(using BEE) wherever it occurs, as are all program options. +Arguments should be written in italics (IEE). Functions are +traditionally written in italics; if you write a function as function(), +Pod::Man will take care of this for you. Literal code or commands should +be in CEE. References to other man pages should be in the form +C, and Pod::Man will automatically format those +appropriately. As an exception, it's traditional not to use this form when +referring to module documentation; use CModule::NameE> instead. + +References to other programs or functions are normally in the form of man +page references so that cross-referencing tools can provide the user with +links and the like. It's possible to overdo this, though, so be careful not +to clutter your documentation with too much markup. + +The major headers should be set out using a C<=head1> directive, and are +historically written in the rather startling ALL UPPER CASE format, although +this is not mandatory. Minor headers may be included using C<=head2>, and +are typically in mixed case. + +The standard sections of a manual page are: + +=over 4 + +=item NAME + +Mandatory section; should be a comma-separated list of programs or functions +documented by this POD page, such as: + + foo, bar - programs to do something + +Manual page indexers are often extremely picky about the format of this +section, so don't put anything in it except this line. A single dash, and +only a single dash, should separate the list of programs or functions from +the description. Do not use any markup such as CEE or +BEE. Functions should not be qualified with C<()> or the like. +The description should ideally fit on a single line, even if a man program +replaces the dash with a few tabs. + +=item SYNOPSIS + +A short usage summary for programs and functions. This section is mandatory +for section 3 pages. + +=item DESCRIPTION + +Extended description and discussion of the program or functions, or the body +of the documentation for man pages that document something else. If +particularly long, it's a good idea to break this up into subsections +C<=head2> directives like: + + =head2 Normal Usage + + =head2 Advanced Features + + =head2 Writing Configuration Files + +or whatever is appropriate for your documentation. + +=item OPTIONS + +Detailed description of each of the command-line options taken by the +program. This should be separate from the description for the use of things +like L. This is normally presented as a list, with +each option as a separate C<=item>. The specific option string should be +enclosed in BEE. Any values that the option takes should be +enclosed in IEE. For example, the section for the option +B<--section>=I would be introduced with: + + =item B<--section>=I + +Synonymous options (like both the short and long forms) are separated by a +comma and a space on the same C<=item> line, or optionally listed as their +own item with a reference to the canonical name. For example, since +B<--section> can also be written as B<-s>, the above would be: + + =item B<-s> I, B<--section>=I + +(Writing the short option first is arguably easier to read, since the long +option is long enough to draw the eye to it anyway and the short option can +otherwise get lost in visual noise.) + +=item RETURN VALUE + +What the program or function returns, if successful. This section can be +omitted for programs whose precise exit codes aren't important, provided +they return 0 on success as is standard. It should always be present for +functions. + +=item ERRORS + +Exceptions, error return codes, exit statuses, and errno settings. +Typically used for function documentation; program documentation uses +DIAGNOSTICS instead. The general rule of thumb is that errors printed to +C or C and intended for the end user are documented in +DIAGNOSTICS while errors passed internal to the calling program and +intended for other programmers are documented in ERRORS. When documenting +a function that sets errno, a full list of the possible errno values +should be given here. + +=item DIAGNOSTICS + +All possible messages the program can print out--and what they mean. You +may wish to follow the same documentation style as the Perl documentation; +see perldiag(1) for more details (and look at the POD source as well). + +If applicable, please include details on what the user should do to correct +the error; documenting an error as indicating "the input buffer is too +small" without telling the user how to increase the size of the input buffer +(or at least telling them that it isn't possible) aren't very useful. + +=item EXAMPLES + +Give some example uses of the program or function. Don't skimp; users often +find this the most useful part of the documentation. The examples are +generally given as verbatim paragraphs. + +Don't just present an example without explaining what it does. Adding a +short paragraph saying what the example will do can increase the value of +the example immensely. + +=item ENVIRONMENT + +Environment variables that the program cares about, normally presented as a +list using C<=over>, C<=item>, and C<=back>. For example: + + =over 6 + + =item HOME + + Used to determine the user's home directory. F<.foorc> in this + directory is read for configuration details, if it exists. + + =back + +Since environment variables are normally in all uppercase, no additional +special formatting is generally needed; they're glaring enough as it is. + +=item FILES + +All files used by the program or function, normally presented as a list, and +what it uses them for. File names should be enclosed in FEE. It's +particularly important to document files that will be potentially modified. + +=item CAVEATS + +Things to take special care with, sometimes called WARNINGS. + +=item BUGS + +Things that are broken or just don't work quite right. + +=item RESTRICTIONS + +Bugs you don't plan to fix. :-) + +=item NOTES + +Miscellaneous commentary. + +=item AUTHOR + +Who wrote it (use AUTHORS for multiple people). Including your current +e-mail address (or some e-mail address to which bug reports should be sent) +so that users have a way of contacting you is a good idea. Remember that +program documentation tends to roam the wild for far longer than you expect +and pick an e-mail address that's likely to last if possible. + +=item HISTORY + +Programs derived from other sources sometimes have this, or you might keep +a modification log here. If the log gets overly long or detailed, +consider maintaining it in a separate file, though. + +=item COPYRIGHT AND LICENSE + +For copyright + + Copyright YEAR(s) by YOUR NAME(s) + +(No, (C) is not needed. No, "all rights reserved" is not needed.) + +For licensing the easiest way is to use the same licensing as Perl itself: + + This library is free software; you may redistribute it and/or modify + it under the same terms as Perl itself. + +This makes it easy for people to use your module with Perl. Note that +this licensing is neither an endorsement or a requirement, you are of +course free to choose any licensing. + +=item SEE ALSO + +Other man pages to check out, like man(1), man(7), makewhatis(8), or +catman(8). Normally a simple list of man pages separated by commas, or a +paragraph giving the name of a reference work. Man page references, if they +use the standard C form, don't have to be enclosed in +LEE (although it's recommended), but other things in this section +probably should be when appropriate. + +If the package has a mailing list, include a URL or subscription +instructions here. + +If the package has a web site, include a URL here. + +=back + +In addition, some systems use CONFORMING TO to note conformance to relevant +standards and MT-LEVEL to note safeness for use in threaded programs or +signal handlers. These headings are primarily useful when documenting parts +of a C library. Documentation of object-oriented libraries or modules may +use CONSTRUCTORS and METHODS sections for detailed documentation of the +parts of the library and save the DESCRIPTION section for an overview; other +large modules may use FUNCTIONS for similar reasons. Some people use +OVERVIEW to summarize the description if it's quite long. + +Section ordering varies, although NAME should I be the first section +(you'll break some man page systems otherwise), and NAME, SYNOPSIS, +DESCRIPTION, and OPTIONS generally always occur first and in that order if +present. In general, SEE ALSO, AUTHOR, and similar material should be left +for last. Some systems also move WARNINGS and NOTES to last. The order +given above should be reasonable for most purposes. + +Finally, as a general note, try not to use an excessive amount of markup. +As documented here and in L, you can safely leave Perl variables, +function names, man page references, and the like unadorned by markup and +the POD translators will figure it out for you. This makes it much easier +to later edit the documentation. Note that many existing translators +(including this one currently) will do the wrong thing with e-mail addresses +when wrapped in LEE, so don't do that. + +For additional information that may be more accurate for your specific +system, see either L or L depending on your system manual +section numbering conventions. + +=head1 SEE ALSO + +L, L, L, L, L, +L, L, L + +The man page documenting the an macro set may be L instead of +L on your system. + +The current version of this script is always available from its web site at +L. It is also part of the +Perl core distribution as of 5.6.0. + +=head1 AUTHOR + +Russ Allbery , based I heavily on the original +B by Larry Wall and Tom Christiansen. Large portions of this +documentation, particularly the sections on the anatomy of a proper man +page, are taken from the B documentation by Tom. + +=head1 COPYRIGHT AND LICENSE + +Copyright 1999, 2000, 2001, 2004, 2006, 2008 Russ Allbery +. + +This program is free software; you may redistribute it and/or modify it +under the same terms as Perl itself. + +=cut + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/pod2text b/Master/tlpkg/tlperl.straw/bin/pod2text new file mode 100755 index 00000000000..d1f230fd90d --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/pod2text @@ -0,0 +1,273 @@ +#!perl + eval 'exec C:\strawberry\perl\bin\perl.exe -S $0 ${1+"$@"}' + if $running_under_some_shell; + +# pod2text -- Convert POD data to formatted ASCII text. +# +# Copyright 1999, 2000, 2001, 2004, 2006, 2008 Russ Allbery +# +# This program is free software; you may redistribute it and/or modify it +# under the same terms as Perl itself. +# +# The driver script for Pod::Text, Pod::Text::Termcap, and Pod::Text::Color, +# invoked by perldoc -t among other things. + +require 5.004; + +use Getopt::Long qw(GetOptions); +use Pod::Text (); +use Pod::Usage qw(pod2usage); + +use strict; + +# Silence -w warnings. +use vars qw($running_under_some_shell); + +# Take an initial pass through our options, looking for one of the form +# -. We turn that into -w for compatibility with the +# original pod2text script. +for (my $i = 0; $i < @ARGV; $i++) { + last if $ARGV[$i] =~ /^--$/; + if ($ARGV[$i] =~ /^-(\d+)$/) { + splice (@ARGV, $i++, 1, '-w', $1); + } +} + +# Insert -- into @ARGV before any single dash argument to hide it from +# Getopt::Long; we want to interpret it as meaning stdin (which Pod::Simple +# does correctly). +my $stdin; +@ARGV = map { $_ eq '-' && !$stdin++ ? ('--', $_) : $_ } @ARGV; + +# Parse our options. Use the same names as Pod::Text for simplicity, and +# default to sentence boundaries turned off for compatibility. +my %options; +$options{sentence} = 0; +Getopt::Long::config ('bundling'); +GetOptions (\%options, 'alt|a', 'code', 'color|c', 'help|h', 'indent|i=i', + 'loose|l', 'margin|left-margin|m=i', 'overstrike|o', + 'quotes|q=s', 'sentence|s', 'stderr', 'termcap|t', 'utf8|u', + 'width|w=i') + or exit 1; +pod2usage (1) if $options{help}; + +# Figure out what formatter we're going to use. -c overrides -t. +my $formatter = 'Pod::Text'; +if ($options{color}) { + $formatter = 'Pod::Text::Color'; + eval { require Term::ANSIColor }; + if ($@) { die "-c (--color) requires Term::ANSIColor be installed\n" } + require Pod::Text::Color; +} elsif ($options{termcap}) { + $formatter = 'Pod::Text::Termcap'; + require Pod::Text::Termcap; +} elsif ($options{overstrike}) { + $formatter = 'Pod::Text::Overstrike'; + require Pod::Text::Overstrike; +} +delete @options{'color', 'termcap', 'overstrike'}; + +# Initialize and run the formatter. +my $parser = $formatter->new (%options); +do { + my ($input, $output) = splice (@ARGV, 0, 2); + $parser->parse_from_file ($input, $output); +} while (@ARGV); + +__END__ + +=head1 NAME + +pod2text - Convert POD data to formatted ASCII text + +=for stopwords +-aclostu --alt --stderr Allbery --overstrike overstrike --termcap --utf8 +UTF-8 + +=head1 SYNOPSIS + +pod2text [B<-aclostu>] [B<--code>] [B<-i> I] S<[B<-q> I]> + [B<--stderr>] S<[B<-w> I]> [I [I ...]] + +pod2text B<-h> + +=head1 DESCRIPTION + +B is a front-end for Pod::Text and its subclasses. It uses them +to generate formatted ASCII text from POD source. It can optionally use +either termcap sequences or ANSI color escape sequences to format the text. + +I is the file to read for POD source (the POD can be embedded in +code). If I isn't given, it defaults to C. I, if +given, is the file to which to write the formatted output. If I +isn't given, the formatted output is written to C. Several POD +files can be processed in the same B invocation (saving module +load and compile times) by providing multiple pairs of I and +I files on the command line. + +=head1 OPTIONS + +=over 4 + +=item B<-a>, B<--alt> + +Use an alternate output format that, among other things, uses a different +heading style and marks C<=item> entries with a colon in the left margin. + +=item B<--code> + +Include any non-POD text from the input file in the output as well. Useful +for viewing code documented with POD blocks with the POD rendered and the +code left intact. + +=item B<-c>, B<--color> + +Format the output with ANSI color escape sequences. Using this option +requires that Term::ANSIColor be installed on your system. + +=item B<-i> I, B<--indent=>I + +Set the number of spaces to indent regular text, and the default indentation +for C<=over> blocks. Defaults to 4 spaces if this option isn't given. + +=item B<-h>, B<--help> + +Print out usage information and exit. + +=item B<-l>, B<--loose> + +Print a blank line after a C<=head1> heading. Normally, no blank line is +printed after C<=head1>, although one is still printed after C<=head2>, +because this is the expected formatting for manual pages; if you're +formatting arbitrary text documents, using this option is recommended. + +=item B<-m> I, B<--left-margin>=I, B<--margin>=I + +The width of the left margin in spaces. Defaults to 0. This is the margin +for all text, including headings, not the amount by which regular text is +indented; for the latter, see B<-i> option. + +=item B<-o>, B<--overstrike> + +Format the output with overstrike printing. Bold text is rendered as +character, backspace, character. Italics and file names are rendered as +underscore, backspace, character. Many pagers, such as B, know how +to convert this to bold or underlined text. + +=item B<-q> I, B<--quotes>=I + +Sets the quote marks used to surround CE> text to I. If +I is a single character, it is used as both the left and right +quote; if I is two characters, the first character is used as the +left quote and the second as the right quoted; and if I is four +characters, the first two are used as the left quote and the second two as +the right quote. + +I may also be set to the special value C, in which case no +quote marks are added around CE> text. + +=item B<-s>, B<--sentence> + +Assume each sentence ends with two spaces and try to preserve that spacing. +Without this option, all consecutive whitespace in non-verbatim paragraphs +is compressed into a single space. + +=item B<--stderr> + +By default, B puts any errors detected in the POD input in a POD +ERRORS section in the output manual page. If B<--stderr> is given, errors +are sent to standard error instead and the POD ERRORS section is +suppressed. + +=item B<-t>, B<--termcap> + +Try to determine the width of the screen and the bold and underline +sequences for the terminal from termcap, and use that information in +formatting the output. Output will be wrapped at two columns less than the +width of your terminal device. Using this option requires that your system +have a termcap file somewhere where Term::Cap can find it and requires that +your system support termios. With this option, the output of B +will contain terminal control sequences for your current terminal type. + +=item B<-u>, B<--utf8> + +By default, B tries to use the same output encoding as its input +encoding (to be backward-compatible with older versions). This option +says to instead force the output encoding to UTF-8. + +Be aware that, when using this option, the input encoding of your POD +source must be properly declared unless it is US-ASCII or Latin-1. POD +input without an C<=encoding> command will be assumed to be in Latin-1, +and if it's actually in UTF-8, the output will be double-encoded. See +L for more information on the C<=encoding> command. + +=item B<-w>, B<--width=>I, B<->I + +The column at which to wrap text on the right-hand side. Defaults to 76, +unless B<-t> is given, in which case it's two columns less than the width of +your terminal device. + +=back + +=head1 DIAGNOSTICS + +If B fails with errors, see L and L for +information about what those errors might mean. Internally, it can also +produce the following diagnostics: + +=over 4 + +=item -c (--color) requires Term::ANSIColor be installed + +(F) B<-c> or B<--color> were given, but Term::ANSIColor could not be +loaded. + +=item Unknown option: %s + +(F) An unknown command line option was given. + +=back + +In addition, other L error messages may result from invalid +command-line options. + +=head1 ENVIRONMENT + +=over 4 + +=item COLUMNS + +If B<-t> is given, B will take the current width of your screen +from this environment variable, if available. It overrides terminal width +information in TERMCAP. + +=item TERMCAP + +If B<-t> is given, B will use the contents of this environment +variable if available to determine the correct formatting sequences for your +current terminal device. + +=back + +=head1 SEE ALSO + +L, L, L, +L, L, L + +The current version of this script is always available from its web site at +L. It is also part of the +Perl core distribution as of 5.6.0. + +=head1 AUTHOR + +Russ Allbery . + +=head1 COPYRIGHT AND LICENSE + +Copyright 1999, 2000, 2001, 2004, 2006, 2008 Russ Allbery +. + +This program is free software; you may redistribute it and/or modify it +under the same terms as Perl itself. + +=cut diff --git a/Master/tlpkg/tlperl.straw/bin/pod2text.bat b/Master/tlpkg/tlperl.straw/bin/pod2text.bat new file mode 100755 index 00000000000..2ef787155af --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/pod2text.bat @@ -0,0 +1,289 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!perl +#line 15 + eval 'exec C:\strawberry\perl\bin\perl.exe -S $0 ${1+"$@"}' + if $running_under_some_shell; + +# pod2text -- Convert POD data to formatted ASCII text. +# +# Copyright 1999, 2000, 2001, 2004, 2006, 2008 Russ Allbery +# +# This program is free software; you may redistribute it and/or modify it +# under the same terms as Perl itself. +# +# The driver script for Pod::Text, Pod::Text::Termcap, and Pod::Text::Color, +# invoked by perldoc -t among other things. + +require 5.004; + +use Getopt::Long qw(GetOptions); +use Pod::Text (); +use Pod::Usage qw(pod2usage); + +use strict; + +# Silence -w warnings. +use vars qw($running_under_some_shell); + +# Take an initial pass through our options, looking for one of the form +# -. We turn that into -w for compatibility with the +# original pod2text script. +for (my $i = 0; $i < @ARGV; $i++) { + last if $ARGV[$i] =~ /^--$/; + if ($ARGV[$i] =~ /^-(\d+)$/) { + splice (@ARGV, $i++, 1, '-w', $1); + } +} + +# Insert -- into @ARGV before any single dash argument to hide it from +# Getopt::Long; we want to interpret it as meaning stdin (which Pod::Simple +# does correctly). +my $stdin; +@ARGV = map { $_ eq '-' && !$stdin++ ? ('--', $_) : $_ } @ARGV; + +# Parse our options. Use the same names as Pod::Text for simplicity, and +# default to sentence boundaries turned off for compatibility. +my %options; +$options{sentence} = 0; +Getopt::Long::config ('bundling'); +GetOptions (\%options, 'alt|a', 'code', 'color|c', 'help|h', 'indent|i=i', + 'loose|l', 'margin|left-margin|m=i', 'overstrike|o', + 'quotes|q=s', 'sentence|s', 'stderr', 'termcap|t', 'utf8|u', + 'width|w=i') + or exit 1; +pod2usage (1) if $options{help}; + +# Figure out what formatter we're going to use. -c overrides -t. +my $formatter = 'Pod::Text'; +if ($options{color}) { + $formatter = 'Pod::Text::Color'; + eval { require Term::ANSIColor }; + if ($@) { die "-c (--color) requires Term::ANSIColor be installed\n" } + require Pod::Text::Color; +} elsif ($options{termcap}) { + $formatter = 'Pod::Text::Termcap'; + require Pod::Text::Termcap; +} elsif ($options{overstrike}) { + $formatter = 'Pod::Text::Overstrike'; + require Pod::Text::Overstrike; +} +delete @options{'color', 'termcap', 'overstrike'}; + +# Initialize and run the formatter. +my $parser = $formatter->new (%options); +do { + my ($input, $output) = splice (@ARGV, 0, 2); + $parser->parse_from_file ($input, $output); +} while (@ARGV); + +__END__ + +=head1 NAME + +pod2text - Convert POD data to formatted ASCII text + +=for stopwords +-aclostu --alt --stderr Allbery --overstrike overstrike --termcap --utf8 +UTF-8 + +=head1 SYNOPSIS + +pod2text [B<-aclostu>] [B<--code>] [B<-i> I] S<[B<-q> I]> + [B<--stderr>] S<[B<-w> I]> [I [I ...]] + +pod2text B<-h> + +=head1 DESCRIPTION + +B is a front-end for Pod::Text and its subclasses. It uses them +to generate formatted ASCII text from POD source. It can optionally use +either termcap sequences or ANSI color escape sequences to format the text. + +I is the file to read for POD source (the POD can be embedded in +code). If I isn't given, it defaults to C. I, if +given, is the file to which to write the formatted output. If I +isn't given, the formatted output is written to C. Several POD +files can be processed in the same B invocation (saving module +load and compile times) by providing multiple pairs of I and +I files on the command line. + +=head1 OPTIONS + +=over 4 + +=item B<-a>, B<--alt> + +Use an alternate output format that, among other things, uses a different +heading style and marks C<=item> entries with a colon in the left margin. + +=item B<--code> + +Include any non-POD text from the input file in the output as well. Useful +for viewing code documented with POD blocks with the POD rendered and the +code left intact. + +=item B<-c>, B<--color> + +Format the output with ANSI color escape sequences. Using this option +requires that Term::ANSIColor be installed on your system. + +=item B<-i> I, B<--indent=>I + +Set the number of spaces to indent regular text, and the default indentation +for C<=over> blocks. Defaults to 4 spaces if this option isn't given. + +=item B<-h>, B<--help> + +Print out usage information and exit. + +=item B<-l>, B<--loose> + +Print a blank line after a C<=head1> heading. Normally, no blank line is +printed after C<=head1>, although one is still printed after C<=head2>, +because this is the expected formatting for manual pages; if you're +formatting arbitrary text documents, using this option is recommended. + +=item B<-m> I, B<--left-margin>=I, B<--margin>=I + +The width of the left margin in spaces. Defaults to 0. This is the margin +for all text, including headings, not the amount by which regular text is +indented; for the latter, see B<-i> option. + +=item B<-o>, B<--overstrike> + +Format the output with overstrike printing. Bold text is rendered as +character, backspace, character. Italics and file names are rendered as +underscore, backspace, character. Many pagers, such as B, know how +to convert this to bold or underlined text. + +=item B<-q> I, B<--quotes>=I + +Sets the quote marks used to surround CE> text to I. If +I is a single character, it is used as both the left and right +quote; if I is two characters, the first character is used as the +left quote and the second as the right quoted; and if I is four +characters, the first two are used as the left quote and the second two as +the right quote. + +I may also be set to the special value C, in which case no +quote marks are added around CE> text. + +=item B<-s>, B<--sentence> + +Assume each sentence ends with two spaces and try to preserve that spacing. +Without this option, all consecutive whitespace in non-verbatim paragraphs +is compressed into a single space. + +=item B<--stderr> + +By default, B puts any errors detected in the POD input in a POD +ERRORS section in the output manual page. If B<--stderr> is given, errors +are sent to standard error instead and the POD ERRORS section is +suppressed. + +=item B<-t>, B<--termcap> + +Try to determine the width of the screen and the bold and underline +sequences for the terminal from termcap, and use that information in +formatting the output. Output will be wrapped at two columns less than the +width of your terminal device. Using this option requires that your system +have a termcap file somewhere where Term::Cap can find it and requires that +your system support termios. With this option, the output of B +will contain terminal control sequences for your current terminal type. + +=item B<-u>, B<--utf8> + +By default, B tries to use the same output encoding as its input +encoding (to be backward-compatible with older versions). This option +says to instead force the output encoding to UTF-8. + +Be aware that, when using this option, the input encoding of your POD +source must be properly declared unless it is US-ASCII or Latin-1. POD +input without an C<=encoding> command will be assumed to be in Latin-1, +and if it's actually in UTF-8, the output will be double-encoded. See +L for more information on the C<=encoding> command. + +=item B<-w>, B<--width=>I, B<->I + +The column at which to wrap text on the right-hand side. Defaults to 76, +unless B<-t> is given, in which case it's two columns less than the width of +your terminal device. + +=back + +=head1 DIAGNOSTICS + +If B fails with errors, see L and L for +information about what those errors might mean. Internally, it can also +produce the following diagnostics: + +=over 4 + +=item -c (--color) requires Term::ANSIColor be installed + +(F) B<-c> or B<--color> were given, but Term::ANSIColor could not be +loaded. + +=item Unknown option: %s + +(F) An unknown command line option was given. + +=back + +In addition, other L error messages may result from invalid +command-line options. + +=head1 ENVIRONMENT + +=over 4 + +=item COLUMNS + +If B<-t> is given, B will take the current width of your screen +from this environment variable, if available. It overrides terminal width +information in TERMCAP. + +=item TERMCAP + +If B<-t> is given, B will use the contents of this environment +variable if available to determine the correct formatting sequences for your +current terminal device. + +=back + +=head1 SEE ALSO + +L, L, L, +L, L, L + +The current version of this script is always available from its web site at +L. It is also part of the +Perl core distribution as of 5.6.0. + +=head1 AUTHOR + +Russ Allbery . + +=head1 COPYRIGHT AND LICENSE + +Copyright 1999, 2000, 2001, 2004, 2006, 2008 Russ Allbery +. + +This program is free software; you may redistribute it and/or modify it +under the same terms as Perl itself. + +=cut + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/pod2usage.bat b/Master/tlpkg/tlperl.straw/bin/pod2usage.bat new file mode 100755 index 00000000000..94d50856f08 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/pod2usage.bat @@ -0,0 +1,157 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!perl +#line 15 + eval 'exec perl -S $0 "$@"' + if 0; + +############################################################################# +# pod2usage -- command to print usage messages from embedded pod docs +# +# Copyright (c) 1996-2000 by Bradford Appleton. All rights reserved. +# This file is part of "PodParser". PodParser is free software; +# you can redistribute it and/or modify it under the same terms +# as Perl itself. +############################################################################# + +use strict; +#use diagnostics; + +=head1 NAME + +pod2usage - print usage messages from embedded pod docs in files + +=head1 SYNOPSIS + +=over 12 + +=item B + +[B<-help>] +[B<-man>] +[B<-exit>S< >I] +[B<-output>S< >I] +[B<-verbose> I] +[B<-pathlist> I] +I + +=back + +=head1 OPTIONS AND ARGUMENTS + +=over 8 + +=item B<-help> + +Print a brief help message and exit. + +=item B<-man> + +Print this command's manual page and exit. + +=item B<-exit> I + +The exit status value to return. + +=item B<-output> I + +The output file to print to. If the special names "-" or ">&1" or ">&STDOUT" +are used then standard output is used. If ">&2" or ">&STDERR" is used then +standard error is used. + +=item B<-verbose> I + +The desired level of verbosity to use: + + 1 : print SYNOPSIS only + 2 : print SYNOPSIS sections and any OPTIONS/ARGUMENTS sections + 3 : print the entire manpage (similar to running pod2text) + +=item B<-pathlist> I + +Specifies one or more directories to search for the input file if it +was not supplied with an absolute path. Each directory path in the given +list should be separated by a ':' on Unix (';' on MSWin32 and DOS). + +=item I + +The pathname of a file containing pod documentation to be output in +usage message format (defaults to standard input). + +=back + +=head1 DESCRIPTION + +B will read the given input file looking for pod +documentation and will print the corresponding usage message. +If no input file is specified then standard input is read. + +B invokes the B function in the B +module. Please see L. + +=head1 SEE ALSO + +L, L + +=head1 AUTHOR + +Please report bugs using L. + +Brad Appleton Ebradapp@enteract.comE + +Based on code for B written by +Tom Christiansen Etchrist@mox.perl.comE + +=cut + +use Pod::Usage; +use Getopt::Long; + +## Define options +my %options = (); +my @opt_specs = ( + 'help', + 'man', + 'exit=i', + 'output=s', + 'pathlist=s', + 'verbose=i', +); + +## Parse options +GetOptions(\%options, @opt_specs) || pod2usage(2); +pod2usage(1) if ($options{help}); +pod2usage(VERBOSE => 2) if ($options{man}); + +## Dont default to STDIN if connected to a terminal +pod2usage(2) if ((@ARGV == 0) && (-t STDIN)); + +@ARGV = ('-') unless (@ARGV); +if (@ARGV > 1) { + print STDERR "pod2usage: Too many filenames given\n\n"; + pod2usage(2); +} + +my %usage = (); +$usage{-input} = shift(@ARGV); +$usage{-exitval} = $options{'exit'} if (defined $options{'exit'}); +$usage{-output} = $options{'output'} if (defined $options{'output'}); +$usage{-verbose} = $options{'verbose'} if (defined $options{'verbose'}); +$usage{-pathlist} = $options{'pathlist'} if (defined $options{'pathlist'}); + +pod2usage(\%usage); + + + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/podchecker.bat b/Master/tlpkg/tlperl.straw/bin/podchecker.bat new file mode 100755 index 00000000000..4763503eca9 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/podchecker.bat @@ -0,0 +1,161 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!perl +#line 15 + eval 'exec perl -S $0 "$@"' + if 0; +############################################################################# +# podchecker -- command to invoke the podchecker function in Pod::Checker +# +# Copyright (c) 1998-2000 by Bradford Appleton. All rights reserved. +# This file is part of "PodParser". PodParser is free software; +# you can redistribute it and/or modify it under the same terms +# as Perl itself. +############################################################################# + +use strict; +#use diagnostics; + +=head1 NAME + +podchecker - check the syntax of POD format documentation files + +=head1 SYNOPSIS + +B [B<-help>] [B<-man>] [B<-(no)warnings>] [IS< >...] + +=head1 OPTIONS AND ARGUMENTS + +=over 8 + +=item B<-help> + +Print a brief help message and exit. + +=item B<-man> + +Print the manual page and exit. + +=item B<-warnings> B<-nowarnings> + +Turn on/off printing of warnings. Repeating B<-warnings> increases the +warning level, i.e. more warnings are printed. Currently increasing to +level two causes flagging of unescaped "E,E" characters. + +=item I + +The pathname of a POD file to syntax-check (defaults to standard input). + +=back + +=head1 DESCRIPTION + +B will read the given input files looking for POD +syntax errors in the POD documentation and will print any errors +it find to STDERR. At the end, it will print a status message +indicating the number of errors found. + +Directories are ignored, an appropriate warning message is printed. + +B invokes the B function exported by B +Please see L for more details. + +=head1 RETURN VALUE + +B returns a 0 (zero) exit status if all specified +POD files are ok. + +=head1 ERRORS + +B returns the exit status 1 if at least one of +the given POD files has syntax errors. + +The status 2 indicates that at least one of the specified +files does not contain I POD commands. + +Status 1 overrides status 2. If you want unambiguous +results, call B with one single argument only. + +=head1 SEE ALSO + +L and L + +=head1 AUTHORS + +Please report bugs using L. + +Brad Appleton Ebradapp@enteract.comE, +Marek Rouchal Emarekr@cpan.orgE + +Based on code for B written by +Tom Christiansen Etchrist@mox.perl.comE + +=cut + + +use Pod::Checker; +use Pod::Usage; +use Getopt::Long; + +## Define options +my %options; + +## Parse options +GetOptions(\%options, qw(help man warnings+ nowarnings)) || pod2usage(2); +pod2usage(1) if ($options{help}); +pod2usage(-verbose => 2) if ($options{man}); + +if($options{nowarnings}) { + $options{warnings} = 0; +} +elsif(!defined $options{warnings}) { + $options{warnings} = 1; # default is warnings on +} + +## Dont default to STDIN if connected to a terminal +pod2usage(2) if ((@ARGV == 0) && (-t STDIN)); + +## Invoke podchecker() +my $status = 0; +@ARGV = qw(-) unless(@ARGV); +for my $podfile (@ARGV) { + if($podfile eq '-') { + $podfile = '<&STDIN'; + } + elsif(-d $podfile) { + warn "podchecker: Warning: Ignoring directory '$podfile'\n"; + next; + } + my $errors = + podchecker($podfile, undef, '-warnings' => $options{warnings}); + if($errors > 0) { + # errors occurred + $status = 1; + printf STDERR ("%s has %d pod syntax %s.\n", + $podfile, $errors, + ($errors == 1) ? 'error' : 'errors'); + } + elsif($errors < 0) { + # no pod found + $status = 2 unless($status); + print STDERR "$podfile does not contain any pod commands.\n"; + } + else { + print STDERR "$podfile pod syntax OK.\n"; + } +} +exit $status; + + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/podselect.bat b/Master/tlpkg/tlperl.straw/bin/podselect.bat new file mode 100755 index 00000000000..d9d05ec85c8 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/podselect.bat @@ -0,0 +1,120 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!perl +#line 15 + eval 'exec perl -S $0 "$@"' + if 0; + +############################################################################# +# podselect -- command to invoke the podselect function in Pod::Select +# +# Copyright (c) 1996-2000 by Bradford Appleton. All rights reserved. +# This file is part of "PodParser". PodParser is free software; +# you can redistribute it and/or modify it under the same terms +# as Perl itself. +############################################################################# + +use strict; +#use diagnostics; + +=head1 NAME + +podselect - print selected sections of pod documentation on standard output + +=head1 SYNOPSIS + +B [B<-help>] [B<-man>] [B<-section>S< >I] +[IS< >...] + +=head1 OPTIONS AND ARGUMENTS + +=over 8 + +=item B<-help> + +Print a brief help message and exit. + +=item B<-man> + +Print the manual page and exit. + +=item B<-section>S< >I + +Specify a section to include in the output. +See L +for the format to use for I. +This option may be given multiple times on the command line. + +=item I + +The pathname of a file from which to select sections of pod +documentation (defaults to standard input). + +=back + +=head1 DESCRIPTION + +B will read the given input files looking for pod +documentation and will print out (in raw pod format) all sections that +match one ore more of the given section specifications. If no section +specifications are given than all pod sections encountered are output. + +B invokes the B function exported by B +Please see L for more details. + +=head1 SEE ALSO + +L and L + +=head1 AUTHOR + +Please report bugs using L. + +Brad Appleton Ebradapp@enteract.comE + +Based on code for B written by +Tom Christiansen Etchrist@mox.perl.comE + +=cut + +use Pod::Select; +use Pod::Usage; +use Getopt::Long; + +## Define options +my %options = ( + 'help' => 0, + 'man' => 0, + 'sections' => [], +); + +## Parse options +GetOptions(\%options, 'help', 'man', 'sections|select=s@') || pod2usage(2); +pod2usage(1) if ($options{help}); +pod2usage(-verbose => 2) if ($options{man}); + +## Dont default to STDIN if connected to a terminal +pod2usage(2) if ((@ARGV == 0) && (-t STDIN)); + +## Invoke podselect(). +if (@{ $options{'sections'} } > 0) { + podselect({ -sections => $options{'sections'} }, @ARGV); +} +else { + podselect(@ARGV); +} + + + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/ppd2par b/Master/tlpkg/tlperl.straw/bin/ppd2par new file mode 100755 index 00000000000..64bcb5dc3c7 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/ppd2par @@ -0,0 +1,167 @@ +#!/usr/bin/perl +use strict; +use warnings; + +use Getopt::Long qw/GetOptions/; +use PAR::Dist::FromPPD; + +our $VERSION = '0.01'; + +=pod + +=head1 NAME + +ppd2par - Create PAR distributions from PPD XML files + +=head1 SYNOPSIS + +ppd2par --help + +ppd2par [-v -o DIR ...] -u PPD-URI-OR-FILE + +=head1 DESCRIPTION + +This script creates PAR distributions from packages for the +I which is specific to ActiveState's +perl distributions. In order to do this, F parses +a PPD document (which is XML). The PPD document +contains meta data and URIs for the actual F<.tar.gz> packages +of the PPM package. + +=head2 Parameters + + -u --uri + Set the place to fetch the .ppd file from. Can be an URL + (http://..., https://..., ftp://...) or a local file. + -v --verbose + Sets the verbose mode. + -o --out + Sets the output directory. (default: .) + --no-docs + Strip all documentation (man pages, html documentation) from the + resulting PAR distribution. + (This step is carried out at the end. If something goes wrong, + it will be skipped.) + +You can also set various bits of meta data by hand: + + -n --distname + Distribution name + --dv --distversion + Distribution version (Note: This is not -v!) + -p --perlversion + Perl version (can be set to 'any_version') + -a --arch + Architecture string (can be set to 'any_arch') + --sa --selectarch + Regexp for selecting the implementation based on architecture + --sp --selectperl + Regexp for selecting the implementation based on perl version + +=head1 SEE ALSO + +This tool is implemented using the L module. Please +refer to that module's documentation for details on how this all works. + +PAR has a mailing list, , that you can write to; send +an empty mail to to join the list and +participate in the discussion. + +Please send bug reports to . + +The official PAR website may be of help, too: http://par.perl.org + +For details on the I, please refer to ActiveState's +website at L. + +=head1 AUTHOR + +Steffen Mueller, Esmueller at cpan dot orgE + +=head1 COPYRIGHT AND LICENSE + +Copyright (C) 2006 by Steffen Mueller + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself, either Perl version 5.6 or, +at your option, any later version of Perl 5 you may have available. + +=cut + +my $usage = <<"HERE"; +$0 --help # for help + +$0 [-v -o DIR --no-docs] -u PPD-URI-OR-FILE + +This script creates PAR distributions from packages for the +Perl Package Manager which is specific to ActiveState's +perl distributions. In order to do this, it parses +a PPD document (which is XML). The PPD document +contains meta data and URIs for the actual .tar.gz packages +of the PPM package. + +-u --uri + Set the place to fetch the .ppd file from. Can be an URL + (http://..., https://..., ftp://...) or a local file. +-v --verbose + Sets the verbose mode. +-o --out + Sets the output directory. (default: .) +--no-docs + Strip all documentation (man pages, html documentation) from the + resulting PAR distribution. + (This step is carried out at the end. If something goes wrong, + it will be skipped.) + +You can also set various bits of meta data by hand: +-n --distname + Distribution name +--dv --distversion + Distribution version (Note: This is not -v!) +-p --perlversion + Perl version (can be set to 'any_version') +-a --arch + Architecture string (can be set to 'any_arch') +--sa --selectarch + Regexp for selecting the implementation based on architecture +--sp --selectperl + Regexp for selecting the implementation based on perl version +HERE + +my $uri; +my $outdir = '.'; +my $v = 0; +my $nodocs = 0; +my $distname; +my $distversion; +my $arch; +my $perl; +my $sperl; +my $sarch; +GetOptions( + 'n|distname=s' => \$distname, + 'dv|distversion=s' => \$distversion, + 'a|arch=s' => \$arch, + 'p|perlversion=s' => \$perl, + 'sa|selectarch=s' => \$sarch, + 'sp|selectperl=s' => \$sperl, + 'h|help' => sub { print $usage; exit(1) }, + 'o|out=s' => \$outdir, + 'u|uri=s' => \$uri, + 'v|verbose' => \$v, + 'no-docs' => \$nodocs, +); + +ppd_to_par( + uri => $uri, + ($v ? (verbose => 1 ) : ()), + (defined($outdir) ? (out => $outdir ) : ()), + ($nodocs ? (strip_docs => 1 ) : ()), + ($distname ? (distname => $distname ) : ()), + ($distversion ? (distversion => $distversion ) : ()), + ($arch ? (arch => $arch ) : ()), + ($perl ? (perlversion => $perl ) : ()), + ($sarch ? (selectarch => $sarch ) : ()), + ($sperl ? (selectperl => $sperl ) : ()), +); + diff --git a/Master/tlpkg/tlperl.straw/bin/ppd2par.bat b/Master/tlpkg/tlperl.straw/bin/ppd2par.bat new file mode 100755 index 00000000000..eecd3c79243 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/ppd2par.bat @@ -0,0 +1,183 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!/usr/bin/perl +#line 15 +use strict; +use warnings; + +use Getopt::Long qw/GetOptions/; +use PAR::Dist::FromPPD; + +our $VERSION = '0.01'; + +=pod + +=head1 NAME + +ppd2par - Create PAR distributions from PPD XML files + +=head1 SYNOPSIS + +ppd2par --help + +ppd2par [-v -o DIR ...] -u PPD-URI-OR-FILE + +=head1 DESCRIPTION + +This script creates PAR distributions from packages for the +I which is specific to ActiveState's +perl distributions. In order to do this, F parses +a PPD document (which is XML). The PPD document +contains meta data and URIs for the actual F<.tar.gz> packages +of the PPM package. + +=head2 Parameters + + -u --uri + Set the place to fetch the .ppd file from. Can be an URL + (http://..., https://..., ftp://...) or a local file. + -v --verbose + Sets the verbose mode. + -o --out + Sets the output directory. (default: .) + --no-docs + Strip all documentation (man pages, html documentation) from the + resulting PAR distribution. + (This step is carried out at the end. If something goes wrong, + it will be skipped.) + +You can also set various bits of meta data by hand: + + -n --distname + Distribution name + --dv --distversion + Distribution version (Note: This is not -v!) + -p --perlversion + Perl version (can be set to 'any_version') + -a --arch + Architecture string (can be set to 'any_arch') + --sa --selectarch + Regexp for selecting the implementation based on architecture + --sp --selectperl + Regexp for selecting the implementation based on perl version + +=head1 SEE ALSO + +This tool is implemented using the L module. Please +refer to that module's documentation for details on how this all works. + +PAR has a mailing list, , that you can write to; send +an empty mail to to join the list and +participate in the discussion. + +Please send bug reports to . + +The official PAR website may be of help, too: http://par.perl.org + +For details on the I, please refer to ActiveState's +website at L. + +=head1 AUTHOR + +Steffen Mueller, Esmueller at cpan dot orgE + +=head1 COPYRIGHT AND LICENSE + +Copyright (C) 2006 by Steffen Mueller + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself, either Perl version 5.6 or, +at your option, any later version of Perl 5 you may have available. + +=cut + +my $usage = <<"HERE"; +$0 --help # for help + +$0 [-v -o DIR --no-docs] -u PPD-URI-OR-FILE + +This script creates PAR distributions from packages for the +Perl Package Manager which is specific to ActiveState's +perl distributions. In order to do this, it parses +a PPD document (which is XML). The PPD document +contains meta data and URIs for the actual .tar.gz packages +of the PPM package. + +-u --uri + Set the place to fetch the .ppd file from. Can be an URL + (http://..., https://..., ftp://...) or a local file. +-v --verbose + Sets the verbose mode. +-o --out + Sets the output directory. (default: .) +--no-docs + Strip all documentation (man pages, html documentation) from the + resulting PAR distribution. + (This step is carried out at the end. If something goes wrong, + it will be skipped.) + +You can also set various bits of meta data by hand: +-n --distname + Distribution name +--dv --distversion + Distribution version (Note: This is not -v!) +-p --perlversion + Perl version (can be set to 'any_version') +-a --arch + Architecture string (can be set to 'any_arch') +--sa --selectarch + Regexp for selecting the implementation based on architecture +--sp --selectperl + Regexp for selecting the implementation based on perl version +HERE + +my $uri; +my $outdir = '.'; +my $v = 0; +my $nodocs = 0; +my $distname; +my $distversion; +my $arch; +my $perl; +my $sperl; +my $sarch; +GetOptions( + 'n|distname=s' => \$distname, + 'dv|distversion=s' => \$distversion, + 'a|arch=s' => \$arch, + 'p|perlversion=s' => \$perl, + 'sa|selectarch=s' => \$sarch, + 'sp|selectperl=s' => \$sperl, + 'h|help' => sub { print $usage; exit(1) }, + 'o|out=s' => \$outdir, + 'u|uri=s' => \$uri, + 'v|verbose' => \$v, + 'no-docs' => \$nodocs, +); + +ppd_to_par( + uri => $uri, + ($v ? (verbose => 1 ) : ()), + (defined($outdir) ? (out => $outdir ) : ()), + ($nodocs ? (strip_docs => 1 ) : ()), + ($distname ? (distname => $distname ) : ()), + ($distversion ? (distversion => $distversion ) : ()), + ($arch ? (arch => $arch ) : ()), + ($perl ? (perlversion => $perl ) : ()), + ($sarch ? (selectarch => $sarch ) : ()), + ($sperl ? (selectperl => $sperl ) : ()), +); + + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/ppm.bat b/Master/tlpkg/tlperl.straw/bin/ppm.bat new file mode 100755 index 00000000000..a02cf726d6c --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/ppm.bat @@ -0,0 +1,1066 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!/usr/bin/perl +#line 15 + +use Getopt::Long; +use File::Basename; +use Config; +use strict; + +use PPM; + +$PPM::VERSION = '0.01_01'; + +my %help; + +# mapping of POD sections to command topics +my %topic = ( + 'Error Recovery' => 'genconfig', + 'Installing' => 'install', + 'Querying' => 'query', + 'Removing' => 'remove', + 'Searching' => 'search', + 'Summarizing' => 'summary', + 'Verifying' => 'verify', + 'Synopsis' => 'usage', + 'Options' => 'set', +); + +$help{'help'} = <<'EOT'; +Commands: + exit - leave the program. + help [command] - prints this screen, or help on 'command'. + install PACKAGES - installs specified PACKAGES. + quit - leave the program. + query [options] - query information about installed packages. + remove PACKAGES - removes the specified PACKAGES from the system. + search [options] - search information about available packages. + set [options] - set/display current options. + verify [options] - verifies current install is up to date. + version - displays PPM version number + +EOT + +# Build the rest of the online help from the POD +$/ = "\n="; +while () { + next unless my ($topic,$text) = /^(?:item|head[12]) ([^\n]+)\n\n(.*)=/s; + next unless $topic{$topic}; + ($help{$topic{$topic}} = "\n$text"); # =~ s/\n *([^\n])/\n $1/sg; +} +$/ = "\n"; + +# Need to do this here, because the user's config file is probably +# hosed. +if ($#ARGV == 0 && $ARGV[0] eq 'genconfig') { + &genconfig; + exit 0; +} + +if ($#ARGV == 0 && $ARGV[0] eq 'getconfig') { + print $PPM::PPMdat; + exit 0; +} + +my %options = PPM::GetPPMOptions(); +my $location; + +my $moremsg = "[Press return to continue or 'q' to quit] "; +my $interactive = 0; + +my %repositories = PPM::ListOfRepositories(); + +my $prefix_pattern = $^O eq "MSWin32" ? '(--|-|\+|/)' : '(--|-|\+)'; + +$PPM::PPMShell = 1; + +Getopt::Long::Configure("prefix_pattern=$prefix_pattern"); + +if ($#ARGV == -1 || ($#ARGV == 0 && $ARGV[0] =~ /^${prefix_pattern}location/)) { + my $prompt = 'PPM> '; + $interactive = 1; + GetOptions("location=s" => \$location); + + print "PPM interactive shell ($PPM::VERSION) - type 'help' for available commands.\n"; + $| = 1; + while () { + print $prompt; + last unless defined ($_ = <> ); + chomp; + s/^\s+//; + @ARGV = split(/\s+/, $_); + next unless @ARGV; + # exit/quit + if (command($ARGV[0], "qu|it") or command($ARGV[0], "|exit")) { + print "Quit!\n"; + last; + } + exec_command(); + } + exit 0; +} + +exit exec_command(); + +sub exec_command +{ + my $cmd = lc shift @ARGV; + + for (@ARGV) { + s/::/-/g; + } + + # help + if (command($cmd, "|help")) { + help(@ARGV); + } + # query + elsif (command($cmd, "qu|ery")) { + GetOptions("case!" => \my $case, "abstract" => \my $abstract, + "author" => \my $author ); + + my %summary = InstalledPackageProperties(); + if (@ARGV) { + my $searchtag; + if ($abstract || $author) { + $searchtag = ($abstract ? 'ABSTRACT' : 'AUTHOR'); + } + my $RE = shift @ARGV; + eval { $RE =~ /$RE/ }; + if ($@) { + print "'$RE': invalid regular expression.\n"; + return 1; + } + $case = !$options{'IGNORECASE'} unless defined $case; + $RE = "(?i)$RE" if ($case == 0); + foreach(keys %summary) { + if ($searchtag) { + delete $summary{$_} unless $summary{$_}{$searchtag} =~ /$RE/; + } + else { + delete $summary{$_} unless /$RE/; + } + } + } + print_formatted(1, %summary); + } + # install + elsif (command($cmd, "in|stall")) { + my $location = $location; + GetOptions("location=s" => \$location); + unless (@ARGV) { + if (!$interactive && -d "blib" && -f "Makefile") { + return if InstallPackage(location => $location); + print "Error installing blib: $PPM::PPMERR\n"; + return 1; + } + print "Package not specified.\n"; + return 1; + } + + my %installed = InstalledPackageProperties(); + foreach my $package (@ARGV) { + $package =~ s/::/-/g; + if (my $pkg = (grep {/^$package$/i} keys %installed)[0]) { + my $version = $installed{$pkg}{'VERSION'}; + $version =~ s/(,0)*$//; + $version =~ tr/,/./; + print "Version $version of '$pkg' is already installed.\n" . + "Remove it, or use 'verify --upgrade $pkg'.\n"; + next; + } + elsif ($interactive && $options{'CONFIRM'}) { + print "Install package '$package?' (y/N): "; + next unless <> =~ /^[yY]/; + } + print "Installing package '$package'...\n"; + if(!InstallPackage("package" => $package, "location" => $location)) { + print "Error installing package '$package': $PPM::PPMERR\n"; + } + } + } + # remove + elsif (command($cmd, "|remove")) { + unless (@ARGV) { + print "Package not specified.\n"; + return 1; + } + foreach my $package (@ARGV) { + $package =~ s/::/-/g; + if ($interactive && $options{'CONFIRM'}) { + print "Remove package '$package?' (y/N): "; + next unless <> =~ /[yY]/; + } + unless (RemovePackage("package" => $package)) { + print "Error removing $package: $PPM::PPMERR\n"; + } + } + } + # search + elsif (command($cmd, "se|arch")) { + my (%summary, $searchtag); + my $location = $location; + GetOptions("case!" => \my $case, "location=s" => \$location, + "abstract" => \my $abstract, "author" => \my $author ); + my $searchRE = shift @ARGV; + if (defined $searchRE) { + eval { $searchRE =~ /$searchRE/ }; + if ($@) { + print "'$searchRE': invalid regular expression.\n"; + return 1; + } + } + $case = !$options{'IGNORECASE'} unless defined $case; + if ($abstract || $author) { + $searchtag = ($abstract ? 'ABSTRACT' : 'AUTHOR'); + } + %summary = search_PPDs("location" => $location, "ignorecase" => !$case, + "searchtag" => $searchtag, "searchRE" => $searchRE); + foreach (keys %summary) { + print "Packages available from $_:\n"; + print_formatted(2, %{$summary{$_}}); + } + } + # set + elsif (command($cmd, "se|t")) { + unless (set(@ARGV) || $interactive) { + PPM::SetPPMOptions("options" => \%options, "save" => 1); + } + } + # verify + elsif (command($cmd, "ver|ify")) { + my $location = $location; + GetOptions("force" => \my $force, "location=s" => \$location, + "upgrade" => \my $upgrade); + if ($interactive && $upgrade && $options{'CONFIRM'}) { + printf "Upgrade package%s? (y/N): ", @ARGV == 1 ? " '$ARGV[0]'" : "s"; + return unless <> =~ /^[yY]/; + } + verify_packages("packages" => \@ARGV, "location" => $location, + "upgrade" => $upgrade, "force" => $force); + } + elsif (command($cmd, "ver|sion")) { + print "$PPM::VERSION\n"; + } + elsif ($cmd eq "purge") { + my %summary = InstalledPackageProperties(); + foreach(keys %summary) { + print "Purging $_\n"; + RemovePackage("package" => $_, "force" => 1); + } + } + elsif ($cmd eq 'refresh') { + my %summary = InstalledPackageProperties(); + foreach(keys %summary) { + print "Refreshing $_\n"; + InstallPackage("package" => $_); + } + } + else { + print "Unknown or ambiguous command '$cmd'; type 'help' for commands.\n"; + } +} + +sub help { + my $topic = @_ && $help{lc $_[0]} ? lc $_[0] : 'help'; + my $help = $help{$topic}; + $help =~ s/^(\s*)ppm\s+/$1/mg if $interactive; + print $help; +} + +sub more +{ + my ($lines) = shift @_; + if (++$$lines >= $options{'MORE'}) { + print $moremsg; + $_ = <>; + $$lines = $_ eq "q\n" ? -1 : 1; + } +} + +# This nasty piece of business splits $pattern into a required prefix +# and a "match any of this substring" suffix. E.g. "in|stall" will +# match a $cmd of "ins", "inst", ..., "install". +sub command +{ + my ($cmd, $pattern) = @_; + my @pattern = split(/\|/, $pattern); + if ($pattern[1]) { + my @optchars = split(//, $pattern[1]); + # build up a "foo(b|ba|bar)" string + $pattern = "$pattern[0]("; + $pattern[1] = shift @optchars; + $pattern[1] .= "|$pattern[1]$_" foreach @optchars; + $pattern .= "$pattern[1])"; + } + return ($cmd =~ /^${pattern}$/i); +} + +# This routine prints the output for query and search +# in a nicely formatted way, if $options{'VERBOSE'} is set. +sub print_formatted +{ + my ($lines, %summary) = @_; + my $package; + + unless ($options{'VERBOSE'}) { + foreach $package (sort keys %summary) { + print "$package\n"; + &more(\$lines) if $options{'MORE'} && $interactive; + last if $lines == -1; + } + return; + } + + my ($maxname, $maxversion) = (0, 0); + # find the longest package name and version strings, so we can + # format them nicely + $maxname < length($_) and $maxname = length($_) for keys %summary; + foreach $package (keys %summary) { + $summary{$package}{'VERSION'} =~ s/(,0)*$//; + $summary{$package}{'VERSION'} =~ tr/,/./; + $maxversion = length $summary{$package}{'VERSION'} > $maxversion ? + length $summary{$package}{'VERSION'} : $maxversion; + } + my $columns = $ENV{COLUMNS} ? $ENV{COLUMNS} : 80; + my $namefield = "@" . "<" x ($maxname - 1); + my $versionfield = "@" . "<" x ($maxversion - 1); + my $abstractfield = "^" . "<" x ($columns - (6 + $maxname + $maxversion)); + my $abstractpad = " " x ($maxname + $maxversion + 3); + + foreach $package (sort keys %summary) { + eval "format STDOUT = \n" + . "$namefield [$versionfield] $abstractfield\n" + . '$package, $summary{$package}{VERSION}, $summary{$package}{ABSTRACT}' + . "\n" + . "$abstractpad $abstractfield~~\n" + . '$summary{$package}{ABSTRACT}' + . "\n" + . ".\n"; + + my $diff = $-; + write; + $diff -= $-; + $lines += ($diff - 1) if $diff > 1; + &more(\$lines) if $options{'MORE'} && $interactive; + last if $lines == -1; + } +} + +sub set +{ + my $option = lc shift @_; + + unless ($option) { + print "Commands will " . ($options{'CONFIRM'} ? "" : "not ") . + "be confirmed.\n"; + print "Temporary files will " . ($options{'CLEAN'} ? "" : "not ") . + "be deleted.\n"; + print "Download status will " . (($options{'DOWNLOADSTATUS'} > 0) ? + "be updated every $options{'DOWNLOADSTATUS'} bytes.\n" : + "not be updated.\n"); + print "Case-" . ($options{'IGNORECASE'} ? "in" : "") . + "sensitive searches will be performed.\n"; + print "Package installations will " . + ($options{'FORCE_INSTALL'} ? "" : "not ") . + "continue if a dependency cannot be installed.\n"; + print "Tracing info will " . (($options{'TRACE'} > 0 ) ? + "be written to '$options{'TRACEFILE'}'.\n" : "not be written.\n"); + print "Screens will " . ($options{'MORE'} > 0 ? + "pause after $options{'MORE'} lines.\n" : "not pause.\n"); + print "Query/search results will " . + ($options{'VERBOSE'} ? "" : "not ") . "be verbose.\n"; + if (defined $location) { print "Current PPD repository: $location\n"; } + else { + print "Current PPD repository paths:\n"; + foreach $_ (keys %repositories) { + print "\t$_: $repositories{$_}\n"; + } + } + print "Packages will be installed under: $options{'ROOT'}\n" + if ($options{'ROOT'}); + print "Packages will be built under: $options{'BUILDDIR'}\n" + if ($options{'BUILDDIR'}); + return; + } + + my $value = shift @_; + if (command($option, "r|epository")) { + if ($value =~ /${prefix_pattern}remove/i) { + $value = join(" ", @_); + print "Location not specified.\n" and return 1 + unless (defined $value); + PPM::RemoveRepository("repository" => $value); + %repositories = PPM::ListOfRepositories(); + } + else { + my $location = shift @_; + print "Repository not specified.\n" and return 1 + unless (defined $value and defined $location); + PPM::AddRepository("repository" => $value, + "location" => $location); + %repositories = PPM::ListOfRepositories(); + } + } + else { + if (command($option, "c|onfirm")) { + $options{'CONFIRM'} = defined $value ? + ($value != 0) : ($options{'CONFIRM'} ? 0 : 1); + print "Commands will " . ($options{'CONFIRM'} ? "" : "not ") . + "be confirmed.\n"; + } + elsif (command($option, "|save")) { + PPM::SetPPMOptions("options" => \%options, "save" => 1); + return 0; + } + elsif (command($option, "c|ase")) { + $options{'IGNORECASE'} = defined $value ? + ($value == 0) : ($options{'IGNORECASE'} ? 0 : 1); + print "Case-" . ($options{'IGNORECASE'} ? "in" : "") . + "sensitive searches will be performed.\n"; + } + elsif (command($option, "r|oot")) { + my $old_root; + print "Directory not specified.\n" and return 1 unless ($value); + print "$PPM::PPMERR" and return 1 + unless ($old_root = PPM::chroot("location" => $value)); + $options{'ROOT'} = $value; + print "Root is now $value [was $old_root].\n"; + } + elsif (command($option, "|build")) { + print "Directory not specified.\n" and return 1 unless ($value); + print "Directory '$value' does not exist.\n" and return 1 + unless (-d $value); + $options{'BUILDDIR'} = $value; + print "Build directory is now $value.\n"; + } + elsif (command($option, "|force_install")) { + $options{'FORCE_INSTALL'} = defined $value ? ($value != 0) : + ($options{'FORCE_INSTALL'} ? 0 : 1); + print "Package installations will " . + ($options{'FORCE_INSTALL'} ? "" : "not ") . + "continue if a dependency cannot be installed.\n"; + } + elsif (command($option, "c|lean")) { + $options{'CLEAN'} = defined $value ? + ($value != 0) : ($options{'CLEAN'} ? 0 : 1); + print "Temporary files will " . ($options{'CLEAN'} ? "" : "not ") . + "be deleted.\n"; + } + elsif (command($option, "|downloadstatus")) { + print "Numeric value must be given.\n" and return 1 + unless (defined $value && $value =~ /^\d+$/); + $options{'DOWNLOADSTATUS'} = $value; + print "Download status will " . (($options{'DOWNLOADSTATUS'} > 0) ? + "be updated every $options{'DOWNLOADSTATUS'} bytes.\n" : + "not be updated.\n"); + } + elsif (command($option, "|more")) { + print "Numeric value must be given.\n" and return 1 + unless (defined $value && $value =~ /^\d+$/); + $options{'MORE'} = $value; + print "Screens will " . ($options{'MORE'} > 0 ? + "pause after $options{'MORE'} lines.\n" : "not pause.\n"); + } + elsif (command($option, "trace|file")) { + print "Filename not specified.\n" and return 1 unless ($value); + $options{'TRACEFILE'} = $value; + print "Tracing info will be written to $options{'TRACEFILE'}.\n"; + } + elsif (command($option, "trace")) { + print "Numeric value between 0 and 4 must be given.\n" and return 1 + unless (defined $value && + $value =~ /^\d+$/ && $value >= 0 && $value <= 4); + $options{'TRACE'} = $value; + print "Tracing info will " . ($options{'TRACE'} > 0 ? + "be written to $options{'TRACEFILE'}.\n" : "not be written.\n"); + } + elsif (command($option, "|verbose")) { + $options{'VERBOSE'} = defined $value ? + ($value != 0) : ($options{'VERBOSE'} ? 0 : 1); + print "Query/search results will " . + ($options{'VERBOSE'} ? "" : "not ") . "be verbose.\n"; + } + else { + print "Unknown or ambiguous option '$option'; see 'help set' for available options.\n"; + return 1; + } + PPM::SetPPMOptions("options" => \%options); + } + return; +} + +sub search_PPDs +{ + my %argv = @_; + my @locations = $argv{'location'} || $location; + my $searchtag = $argv{'searchtag'}; + my $ignorecase = defined $argv{'ignorecase'} ? + $argv{'ignorecase'} : $options{'IGNORECASE'}; + my $searchRE = $argv{'searchRE'}; + if (defined $searchRE) { + eval { $searchRE =~ /$searchRE/ }; + if ($@) { + print "'$searchRE': invalid regular expression.\n"; + return; + } + $searchRE = "(?i)$searchRE" if $ignorecase; + } + + my %packages; + unless (defined $locations[0]) { + my %reps = PPM::ListOfRepositories; + @locations = values %reps; + } + foreach my $loc (@locations) { + my %summary; + + # see if the repository has server-side searching + if (defined $searchRE && (%summary = ServerSearch('location' => $loc, + 'searchRE' => $searchRE, 'searchtag' => $searchtag))) { + # XXX: clean this up + foreach my $package (keys %{$summary{$loc}}) { + $packages{$loc}{$package} = \%{$summary{$loc}{$package}}; + } + next; + } + + # see if a summary file is available + %summary = RepositorySummary("location" => $loc); + if (%summary) { + foreach my $package (keys %{$summary{$loc}}) { + next if (defined $searchtag && + $summary{$loc}{$package}{$searchtag} !~ /$searchRE/); + next if (!defined $searchtag && + defined $searchRE && $package !~ /$searchRE/); + $packages{$loc}{$package} = \%{$summary{$loc}{$package}}; + } + } + else { + my %ppds = PPM::RepositoryPackages("location" => $loc); + # No summary: oh my, nothing but 'Net + foreach my $package (@{$ppds{$loc}}) { + my %package_details = RepositoryPackageProperties( + "package" => $package, "location" => $loc); + next unless %package_details; + next if (defined $searchtag && + $package_details{$searchtag} !~ /$searchRE/); + next if (!defined $searchtag && + defined $searchRE && $package !~ /$searchRE/); + $packages{$loc}{$package} = \%package_details; + } + } + } + return %packages; +} + +sub verify_packages +{ + my %argv = @_; + my @packages = @{$argv{'packages'}}; + my $upgrade = $argv{'upgrade'}; + my $force = $argv{'force'}; + my $location = $argv{'location'} || $location; + unless ($packages[0]) { + my %info = QueryInstalledPackages(); + @packages = sort keys %info; + } + + my $package = shift @packages; + while ($package) { + my $status = VerifyPackage("package" => $package, + "location" => $location, "upgrade" => $upgrade, "force" => $force); + if (defined $status) { + if ($status eq "0") { + print "Package \'$package\' is up to date.\n"; + } + elsif ($upgrade) { + print "Package $package upgraded to version $status\n"; + } + else { + print "An upgrade to package \'$package\' is available.\n"; + } + } + else { + # Couldn't find a PPD to compare it with. + print "Package \'$package\' is up to date.\n"; + } + $package = shift @packages; + } +} + +sub genconfig +{ + my $repositories = + {'5.6' => { + 'ActiveState' => + {location => 'http://ppm.ActiveState.com/cgibin/PPM/ppmserver.pl?urn:/PPMServer', + summaryfile => 'fetch_summary', + }, + 'Bribes' => + {location => 'http://www.bribes.org/perl/ppm', + summaryfile => 'searchsummary.ppm', + }, + 'UWinnipeg' => + {location => 'http://theoryx5.uwinnipeg.ca/cgi-bin/ppmserver?urn:/PPMServer', + summaryfile => 'fetch_summary', + }, + }, + '5.8' => { + 'ActiveState' => + {location => 'http://ppm.activestate.com/PPMPackages/5.8-windows', + summaryfile => 'searchsummary.ppm', + }, + 'Bribes' => + {location => 'http://www.bribes.org/perl/ppm', + summaryfile => 'searchsummary.ppm', + }, + 'UWinnipeg' => + {location => 'http://theoryx5.uwinnipeg.ca/ppms', + summaryfile => 'searchsummary.ppm', + }, + 'Trouchelle' => + {location => 'http://trouchelle.com/ppm', + summaryfile => 'searchsummary.ppm', + }, + }, + '5.10' => { + 'ActiveState' => + {location => 'http://ppm.activestate.com/PPMPackages/5.10-windows', + summaryfile => 'searchsummary.ppm', + }, + 'Bribes' => + {location => 'http://www.bribes.org/perl/ppm', + summaryfile => 'searchsummary.ppm', + }, + 'UWinnipeg' => + {location => 'http://cpan.uwinnipeg.ca/PPMPackages/10xx', + summaryfile => 'searchsummary.ppm', + }, + 'Trouchelle' => + {location => 'http://trouchelle.com/ppm10', + summaryfile => 'package.xml', + }, + }, + }; + my ($perl_version); + PERLV: { + ($] < 5.008) and do { + $perl_version = '5.6'; + last PERLV; + }; + ($] < 5.01) and do { + $perl_version = '5.8'; + last PERLV; + }; + $perl_version = '5.10'; + } + my $reps = $repositories->{$perl_version}; + my $PerlDir = $Config{'prefix'}; + +print <<"EOF"; + + 2,1,8,0 + + +EOF + foreach my $name(sort keys %$reps) { + my $loc = $reps->{$name}->{location}; + my $sf = $reps->{$name}->{summaryfile}; + print << "EOF"; + +EOF + } + print <<"EOF"; + Compress-Zlib;Archive-Tar;Digest-MD5;File-CounterFile;Font-AFM;HTML-Parser;HTML-Tree;MIME-Base64;URI;XML-Element;libwww-perl;XML-Parser;SOAP-Lite;PPM;libnet;libwin32 + +EOF +} + +__DATA__ + +=head1 NAME + +PPM - Perl Package Manager: locate, install, upgrade software packages. + +=head1 SYNOPSIS + + ppm genconfig + ppm help [command] + ppm install [--location=location] package1 [... packageN] + ppm query [--case|nocase] [--abstract|author] PATTERN + ppm remove package1 [... packageN] + ppm search [--case|nocase] [--location=location] [--abstract|author] PATTERN + ppm set [option] + ppm verify [--location=location] [--upgrade] [--force] [package1 ... packageN] + ppm version + ppm [--location=location] + +=head1 DESCRIPTION + +ppm is a utility intended to simplify the tasks of locating, installing, +upgrading and removing software packages. It is a front-end to the +functionality provided in PPM.pm. It can determine if the most recent +version of a software package is installed on a system, and can install +or upgrade that package from a local or remote host. + +ppm runs in one of two modes: an interactive shell from which commands +may be entered; and command-line mode, in which one specific action is +performed per invocation of the program. + +ppm uses files containing an extended form of the Open Software +Description (OSD) specification for information about software packages. +These description files, which are written in Extensible Markup +Language (XML) code, are referred to as 'PPD' files. Information about +OSD can be found at the W3C web site (at the time of this writing, +http://www.w3.org/TR/NOTE-OSD.html). The extensions to OSD used by ppm +are documented in PPM.ppd. + +=head1 Using PPM + +=over 4 + +=item Interactive mode + +If ppm is invoked with no command specified, it is started in interactive +mode. If the '--location' argument is specified, it is used as the +search location, otherwise the repositories specified in the PPM data file +are used. + +The syntax of PPM commands is the same in interactive mode as it is in +command-line mode. The 'help' command lists the available commands. + +ppm commands may be abbreviated to their shortest unique form. + +=item Installing + + ppm install [--location=location] package1 [... packageN] + +Installs the specified software packages. Attempts to install from the +URL or directory 'location' if the '--location' option is specfied. + +The 'package' arguments may be either package names ('foo'), pathnames +(p:/packages/foo.ppd) or URLs (http://www.ActiveState.com/packages/foo.ppd) +to specific PPD files. + +In the case where a package name is specified, and the '--location' +option is not used, ppm will refer to the default repository locations. + +See also: 'confirm' option. + +=item Removing + + ppm remove package1 [... packageN] + +Reads information from the PPD file for the named software package and +removes the package from the system. + +See also: 'confirm' option. + +=item Verifying + + ppm verify [--location=location] [--upgrade] [--force] [package1 ... packageN] + +Verifies that the currently installed packages are up to date. If no +packages are specified as arguments, all installed packages will be verified. + +If the '--upgrade' option is specified, any package for which an upgrade +is available will be upgraded. + +If the '--location' option is specified, upgrades will be looked for at +the specified URL or directory. + +If the '--force' option is specified, all currently installed packages will +be reinstalled regardless of whether they are out of date or not. + +See also: 'confirm' option. + +=item Querying + + ppm query [--case|nocase] [--abstract|author] PATTERN + +Searches for 'PATTERN' (a regular expression) in the name of any installed +package. If a search is successful, information about the matching +package(s) is displayed. If 'PATTERN' is omitted, information about +all installed packages will be displayed. + +If either '--abstract' or '--author' is specified, PATTERN will be +searched for in the or tags of the installed packages. + +The '--case' and '--nocase' options can be used to override the default +case-sensitivity search settings. + +See also: 'case' option. + +=item Searching + + ppm search [--case|nocase] [--location=location] [--abstract|author] PATTERN + +Displays a list of any packages matching 'PATTERN' (a regular expression) +available from the specified location. If 'PATTERN' is omitted, information +about all available packages will be displayed. + +If the '--location' option is specified, the specified URL or directory +will be searched. If '--location' is not specified, the repository location +as specified in the PPM data file will be searched. + +If either '--abstract' or '--author' is specified, PATTERN will be +searched for in the or tags of the available packages. + +The '--case' and '--nocase' options can be used to override the default +case-sensitivity search settings. + +See also: 'case' option. + +=item Error Recovery + + ppm genconfig + ppm getconfig + +The genconfig command will print a valid PPM config file (ppm.xml) to STDOUT. +This can be useful if the PPM config file ever gets damaged leaving PPM +unusable. + +If required, this command should be run from a shell prompt: + + C:\Perl\site\lib> ppm genconfig > ppm.xml + +The getconfig command prints the location of the PPM configuration file +used at PPM startup. + +=item Options + + ppm set [option value] + +Sets or displays current options. With no arguments, current option +settings are displayed. + +Available options: + + build DIRECTORY + - Changes the package build directory. + + case [1|0] + - Sets case-sensitive searches. If one of '1' or '0' is + not specified, the current setting is toggled. + + clean [1|0] + - Sets removal of temporary files from package's build + area, on successful installation of a package. If one of + '1' or '0' is not specified, the current setting is + toggled. + + confirm [1|0] + - Sets confirmation of 'install', 'remove' and 'upgrade'. + If one of '1' or '0' is not specified, the current + setting is toggled. + + downloadstatus NUMBER + - If non-zero, updates the download status after each NUMBER + of bytes transferred during an 'install'. This can be + reassuring when installing a large package (e.g. Tk) over + a low-speed connection. + + force_install [1|0] + - Continue installing a package even if a dependency cannot + be installed. + + more NUMBER + - Causes output to pause after NUMBER lines have been + displayed. Specifying '0' turns off this capability. + + set repository --remove NAME + - Removes the repository 'NAME' from the list of repositories. + + set repository NAME LOCATION + - Adds a repository to the list of PPD repositories for this + session. 'NAME' is the name by which this repository will + be referred; 'LOCATION' is a URL or directory name. + + root DIRECTORY + - Changes the install root directory. Packages will be + installed under this new root. + + save + - Saves the current options as default options for future + sessions. + + trace + - Tracing level--default is 1, maximum is 4, 0 indicates + no tracing. + + tracefile + - File to contain tracing information, default is 'PPM.LOG'. + + verbose [1|0] + - Display additional package information for 'query' and + 'search' commands. + +=back + +=head1 EXAMPLES + +=over 4 + +=item ppm + +Starts ppm in interactive mode, using the repository locations specified +in the PPM data file. A session might look like this: + + [show all available packages] + PPM> search + Packages available from P:\PACKAGES: + bar [2.91 ] supplies bar methods for perl5. + bax [0.072] module for manipulation of bax archives. + baz [1.03 ] Interface to baz library + foo [2.23 ] Foo parser class + + [list what has already been installed] + PPM> query + bax [0.071] module for manipulation of bax archives. + baz [1.02 ] Interface to baz library + + [install a package] + PPM> install foo + Install package foo? (y/N): y + [...] + + [toggle confirmations] + PPM> set confirm + Commands will not be confirmed. + + [see if 'baz' is up-to-date] + PPM> verify baz + An upgrade to package 'baz' is available. + + [upgrade 'baz'] + PPM> verify --upgrade baz + [...] + + [forced upgrade of 'baz'] + PPM> verify --upgrade --force baz + [...] + + [toggle case-sensitive searches] + PPM> set case + Case-sensitive searches will be performed. + + [display all available packages beginning with 'b'] + PPM> search ^b + bar [2.91 ] supplies bar methods for perl5. + bax [0.072] module for manipulation of bax archives. + baz [1.03 ] Interface to baz library + + [search for installed packages containing 'baz' in the ABSTRACT tag] + PPM> query --abstract baz + Matching packages found at P:\PACKAGES: + baz [1.03 ] Interface to baz library + PPM> quit + +=item ppm install http://www.ActiveState.com/packages/foo.ppd + +Installs the software package 'foo' based on the information in the PPD +obtained from the specified URL. + +=item ppm verify --upgrade foo + +Compares the currently installed version of the software package 'foo' +to the one available according to the PPD obtained from the location +specified for this package in the PPM data file, and upgrades +to a newer version if available. + +=item ppm verify --location=P:\PACKAGES --upgrade foo + +Compares the currently installed version of the software package 'foo' +to the one available according to the PPD obtained from the specified +directory, and upgrades to a newer version if available. + +=item ppm verify --upgrade --force + +Forces verification and reinstalls every installed package on the system, +using upgrade locations specified in the PPM data file. + +=item ppm search --location=http://ppm.ActiveState.com/PPMpackages/5.6 + +Displays the packages with PPD files available at the specified location. + +=item ppm search --location=P:\PACKAGES --author ActiveState + +Searches the specified location for any package with an tag +containing the string 'ActiveState'. On a successful search, the package +name and the matching string are displayed. + +=back + +=head1 ENVIRONMENT VARIABLES + +=over 4 + +=item HTTP_proxy + +If the environment variable 'HTTP_proxy' is set, then it will +be used as the address of a proxy server for accessing the Internet. + +The value should be of the form: 'http://proxy:port'. + +=back + +=head1 FILES + +The following files are fully described in the 'Files' section of PPM:ppm. + +=over 4 + +=item package.ppd + +A description of a software package, in extended Open Software Description +(OSD) format. More information on this file format can be found in +PPM::ppd. + +=item ppm.xml - PPM data file. + +An XML format file containing information about the local system, +specifics regarding the locations from which PPM obtains PPD files, and +the installation details for any package installed by ppm. + +This file usually resides in '[perl]/site/lib'. If the environment +variable 'PPM_DAT' is set, its value will be used as the full pathname +to a PPM data file. If all else fails, ppm will look for a data file +in the current directory. + +=back + +=head1 AUTHOR + +Murray Nesbitt, EFE + +=head1 CREDITS + +=over 4 + +=item * + +The "geek-pit" at ActiveState. + +=item * + +Paul Kulchenko for his SOAP-Lite package, and for his enthusiastic +assistance in getting PPM to work with SOAP-Lite. + +=back + +=cut + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/ppm.pl b/Master/tlpkg/tlperl.straw/bin/ppm.pl new file mode 100755 index 00000000000..9773e9470c1 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/ppm.pl @@ -0,0 +1,1050 @@ +#!/usr/bin/perl + +use Getopt::Long; +use File::Basename; +use Config; +use strict; + +use PPM; + +$PPM::VERSION = '0.01_01'; + +my %help; + +# mapping of POD sections to command topics +my %topic = ( + 'Error Recovery' => 'genconfig', + 'Installing' => 'install', + 'Querying' => 'query', + 'Removing' => 'remove', + 'Searching' => 'search', + 'Summarizing' => 'summary', + 'Verifying' => 'verify', + 'Synopsis' => 'usage', + 'Options' => 'set', +); + +$help{'help'} = <<'EOT'; +Commands: + exit - leave the program. + help [command] - prints this screen, or help on 'command'. + install PACKAGES - installs specified PACKAGES. + quit - leave the program. + query [options] - query information about installed packages. + remove PACKAGES - removes the specified PACKAGES from the system. + search [options] - search information about available packages. + set [options] - set/display current options. + verify [options] - verifies current install is up to date. + version - displays PPM version number + +EOT + +# Build the rest of the online help from the POD +$/ = "\n="; +while () { + next unless my ($topic,$text) = /^(?:item|head[12]) ([^\n]+)\n\n(.*)=/s; + next unless $topic{$topic}; + ($help{$topic{$topic}} = "\n$text"); # =~ s/\n *([^\n])/\n $1/sg; +} +$/ = "\n"; + +# Need to do this here, because the user's config file is probably +# hosed. +if ($#ARGV == 0 && $ARGV[0] eq 'genconfig') { + &genconfig; + exit 0; +} + +if ($#ARGV == 0 && $ARGV[0] eq 'getconfig') { + print $PPM::PPMdat; + exit 0; +} + +my %options = PPM::GetPPMOptions(); +my $location; + +my $moremsg = "[Press return to continue or 'q' to quit] "; +my $interactive = 0; + +my %repositories = PPM::ListOfRepositories(); + +my $prefix_pattern = $^O eq "MSWin32" ? '(--|-|\+|/)' : '(--|-|\+)'; + +$PPM::PPMShell = 1; + +Getopt::Long::Configure("prefix_pattern=$prefix_pattern"); + +if ($#ARGV == -1 || ($#ARGV == 0 && $ARGV[0] =~ /^${prefix_pattern}location/)) { + my $prompt = 'PPM> '; + $interactive = 1; + GetOptions("location=s" => \$location); + + print "PPM interactive shell ($PPM::VERSION) - type 'help' for available commands.\n"; + $| = 1; + while () { + print $prompt; + last unless defined ($_ = <> ); + chomp; + s/^\s+//; + @ARGV = split(/\s+/, $_); + next unless @ARGV; + # exit/quit + if (command($ARGV[0], "qu|it") or command($ARGV[0], "|exit")) { + print "Quit!\n"; + last; + } + exec_command(); + } + exit 0; +} + +exit exec_command(); + +sub exec_command +{ + my $cmd = lc shift @ARGV; + + for (@ARGV) { + s/::/-/g; + } + + # help + if (command($cmd, "|help")) { + help(@ARGV); + } + # query + elsif (command($cmd, "qu|ery")) { + GetOptions("case!" => \my $case, "abstract" => \my $abstract, + "author" => \my $author ); + + my %summary = InstalledPackageProperties(); + if (@ARGV) { + my $searchtag; + if ($abstract || $author) { + $searchtag = ($abstract ? 'ABSTRACT' : 'AUTHOR'); + } + my $RE = shift @ARGV; + eval { $RE =~ /$RE/ }; + if ($@) { + print "'$RE': invalid regular expression.\n"; + return 1; + } + $case = !$options{'IGNORECASE'} unless defined $case; + $RE = "(?i)$RE" if ($case == 0); + foreach(keys %summary) { + if ($searchtag) { + delete $summary{$_} unless $summary{$_}{$searchtag} =~ /$RE/; + } + else { + delete $summary{$_} unless /$RE/; + } + } + } + print_formatted(1, %summary); + } + # install + elsif (command($cmd, "in|stall")) { + my $location = $location; + GetOptions("location=s" => \$location); + unless (@ARGV) { + if (!$interactive && -d "blib" && -f "Makefile") { + return if InstallPackage(location => $location); + print "Error installing blib: $PPM::PPMERR\n"; + return 1; + } + print "Package not specified.\n"; + return 1; + } + + my %installed = InstalledPackageProperties(); + foreach my $package (@ARGV) { + $package =~ s/::/-/g; + if (my $pkg = (grep {/^$package$/i} keys %installed)[0]) { + my $version = $installed{$pkg}{'VERSION'}; + $version =~ s/(,0)*$//; + $version =~ tr/,/./; + print "Version $version of '$pkg' is already installed.\n" . + "Remove it, or use 'verify --upgrade $pkg'.\n"; + next; + } + elsif ($interactive && $options{'CONFIRM'}) { + print "Install package '$package?' (y/N): "; + next unless <> =~ /^[yY]/; + } + print "Installing package '$package'...\n"; + if(!InstallPackage("package" => $package, "location" => $location)) { + print "Error installing package '$package': $PPM::PPMERR\n"; + } + } + } + # remove + elsif (command($cmd, "|remove")) { + unless (@ARGV) { + print "Package not specified.\n"; + return 1; + } + foreach my $package (@ARGV) { + $package =~ s/::/-/g; + if ($interactive && $options{'CONFIRM'}) { + print "Remove package '$package?' (y/N): "; + next unless <> =~ /[yY]/; + } + unless (RemovePackage("package" => $package)) { + print "Error removing $package: $PPM::PPMERR\n"; + } + } + } + # search + elsif (command($cmd, "se|arch")) { + my (%summary, $searchtag); + my $location = $location; + GetOptions("case!" => \my $case, "location=s" => \$location, + "abstract" => \my $abstract, "author" => \my $author ); + my $searchRE = shift @ARGV; + if (defined $searchRE) { + eval { $searchRE =~ /$searchRE/ }; + if ($@) { + print "'$searchRE': invalid regular expression.\n"; + return 1; + } + } + $case = !$options{'IGNORECASE'} unless defined $case; + if ($abstract || $author) { + $searchtag = ($abstract ? 'ABSTRACT' : 'AUTHOR'); + } + %summary = search_PPDs("location" => $location, "ignorecase" => !$case, + "searchtag" => $searchtag, "searchRE" => $searchRE); + foreach (keys %summary) { + print "Packages available from $_:\n"; + print_formatted(2, %{$summary{$_}}); + } + } + # set + elsif (command($cmd, "se|t")) { + unless (set(@ARGV) || $interactive) { + PPM::SetPPMOptions("options" => \%options, "save" => 1); + } + } + # verify + elsif (command($cmd, "ver|ify")) { + my $location = $location; + GetOptions("force" => \my $force, "location=s" => \$location, + "upgrade" => \my $upgrade); + if ($interactive && $upgrade && $options{'CONFIRM'}) { + printf "Upgrade package%s? (y/N): ", @ARGV == 1 ? " '$ARGV[0]'" : "s"; + return unless <> =~ /^[yY]/; + } + verify_packages("packages" => \@ARGV, "location" => $location, + "upgrade" => $upgrade, "force" => $force); + } + elsif (command($cmd, "ver|sion")) { + print "$PPM::VERSION\n"; + } + elsif ($cmd eq "purge") { + my %summary = InstalledPackageProperties(); + foreach(keys %summary) { + print "Purging $_\n"; + RemovePackage("package" => $_, "force" => 1); + } + } + elsif ($cmd eq 'refresh') { + my %summary = InstalledPackageProperties(); + foreach(keys %summary) { + print "Refreshing $_\n"; + InstallPackage("package" => $_); + } + } + else { + print "Unknown or ambiguous command '$cmd'; type 'help' for commands.\n"; + } +} + +sub help { + my $topic = @_ && $help{lc $_[0]} ? lc $_[0] : 'help'; + my $help = $help{$topic}; + $help =~ s/^(\s*)ppm\s+/$1/mg if $interactive; + print $help; +} + +sub more +{ + my ($lines) = shift @_; + if (++$$lines >= $options{'MORE'}) { + print $moremsg; + $_ = <>; + $$lines = $_ eq "q\n" ? -1 : 1; + } +} + +# This nasty piece of business splits $pattern into a required prefix +# and a "match any of this substring" suffix. E.g. "in|stall" will +# match a $cmd of "ins", "inst", ..., "install". +sub command +{ + my ($cmd, $pattern) = @_; + my @pattern = split(/\|/, $pattern); + if ($pattern[1]) { + my @optchars = split(//, $pattern[1]); + # build up a "foo(b|ba|bar)" string + $pattern = "$pattern[0]("; + $pattern[1] = shift @optchars; + $pattern[1] .= "|$pattern[1]$_" foreach @optchars; + $pattern .= "$pattern[1])"; + } + return ($cmd =~ /^${pattern}$/i); +} + +# This routine prints the output for query and search +# in a nicely formatted way, if $options{'VERBOSE'} is set. +sub print_formatted +{ + my ($lines, %summary) = @_; + my $package; + + unless ($options{'VERBOSE'}) { + foreach $package (sort keys %summary) { + print "$package\n"; + &more(\$lines) if $options{'MORE'} && $interactive; + last if $lines == -1; + } + return; + } + + my ($maxname, $maxversion) = (0, 0); + # find the longest package name and version strings, so we can + # format them nicely + $maxname < length($_) and $maxname = length($_) for keys %summary; + foreach $package (keys %summary) { + $summary{$package}{'VERSION'} =~ s/(,0)*$//; + $summary{$package}{'VERSION'} =~ tr/,/./; + $maxversion = length $summary{$package}{'VERSION'} > $maxversion ? + length $summary{$package}{'VERSION'} : $maxversion; + } + my $columns = $ENV{COLUMNS} ? $ENV{COLUMNS} : 80; + my $namefield = "@" . "<" x ($maxname - 1); + my $versionfield = "@" . "<" x ($maxversion - 1); + my $abstractfield = "^" . "<" x ($columns - (6 + $maxname + $maxversion)); + my $abstractpad = " " x ($maxname + $maxversion + 3); + + foreach $package (sort keys %summary) { + eval "format STDOUT = \n" + . "$namefield [$versionfield] $abstractfield\n" + . '$package, $summary{$package}{VERSION}, $summary{$package}{ABSTRACT}' + . "\n" + . "$abstractpad $abstractfield~~\n" + . '$summary{$package}{ABSTRACT}' + . "\n" + . ".\n"; + + my $diff = $-; + write; + $diff -= $-; + $lines += ($diff - 1) if $diff > 1; + &more(\$lines) if $options{'MORE'} && $interactive; + last if $lines == -1; + } +} + +sub set +{ + my $option = lc shift @_; + + unless ($option) { + print "Commands will " . ($options{'CONFIRM'} ? "" : "not ") . + "be confirmed.\n"; + print "Temporary files will " . ($options{'CLEAN'} ? "" : "not ") . + "be deleted.\n"; + print "Download status will " . (($options{'DOWNLOADSTATUS'} > 0) ? + "be updated every $options{'DOWNLOADSTATUS'} bytes.\n" : + "not be updated.\n"); + print "Case-" . ($options{'IGNORECASE'} ? "in" : "") . + "sensitive searches will be performed.\n"; + print "Package installations will " . + ($options{'FORCE_INSTALL'} ? "" : "not ") . + "continue if a dependency cannot be installed.\n"; + print "Tracing info will " . (($options{'TRACE'} > 0 ) ? + "be written to '$options{'TRACEFILE'}'.\n" : "not be written.\n"); + print "Screens will " . ($options{'MORE'} > 0 ? + "pause after $options{'MORE'} lines.\n" : "not pause.\n"); + print "Query/search results will " . + ($options{'VERBOSE'} ? "" : "not ") . "be verbose.\n"; + if (defined $location) { print "Current PPD repository: $location\n"; } + else { + print "Current PPD repository paths:\n"; + foreach $_ (keys %repositories) { + print "\t$_: $repositories{$_}\n"; + } + } + print "Packages will be installed under: $options{'ROOT'}\n" + if ($options{'ROOT'}); + print "Packages will be built under: $options{'BUILDDIR'}\n" + if ($options{'BUILDDIR'}); + return; + } + + my $value = shift @_; + if (command($option, "r|epository")) { + if ($value =~ /${prefix_pattern}remove/i) { + $value = join(" ", @_); + print "Location not specified.\n" and return 1 + unless (defined $value); + PPM::RemoveRepository("repository" => $value); + %repositories = PPM::ListOfRepositories(); + } + else { + my $location = shift @_; + print "Repository not specified.\n" and return 1 + unless (defined $value and defined $location); + PPM::AddRepository("repository" => $value, + "location" => $location); + %repositories = PPM::ListOfRepositories(); + } + } + else { + if (command($option, "c|onfirm")) { + $options{'CONFIRM'} = defined $value ? + ($value != 0) : ($options{'CONFIRM'} ? 0 : 1); + print "Commands will " . ($options{'CONFIRM'} ? "" : "not ") . + "be confirmed.\n"; + } + elsif (command($option, "|save")) { + PPM::SetPPMOptions("options" => \%options, "save" => 1); + return 0; + } + elsif (command($option, "c|ase")) { + $options{'IGNORECASE'} = defined $value ? + ($value == 0) : ($options{'IGNORECASE'} ? 0 : 1); + print "Case-" . ($options{'IGNORECASE'} ? "in" : "") . + "sensitive searches will be performed.\n"; + } + elsif (command($option, "r|oot")) { + my $old_root; + print "Directory not specified.\n" and return 1 unless ($value); + print "$PPM::PPMERR" and return 1 + unless ($old_root = PPM::chroot("location" => $value)); + $options{'ROOT'} = $value; + print "Root is now $value [was $old_root].\n"; + } + elsif (command($option, "|build")) { + print "Directory not specified.\n" and return 1 unless ($value); + print "Directory '$value' does not exist.\n" and return 1 + unless (-d $value); + $options{'BUILDDIR'} = $value; + print "Build directory is now $value.\n"; + } + elsif (command($option, "|force_install")) { + $options{'FORCE_INSTALL'} = defined $value ? ($value != 0) : + ($options{'FORCE_INSTALL'} ? 0 : 1); + print "Package installations will " . + ($options{'FORCE_INSTALL'} ? "" : "not ") . + "continue if a dependency cannot be installed.\n"; + } + elsif (command($option, "c|lean")) { + $options{'CLEAN'} = defined $value ? + ($value != 0) : ($options{'CLEAN'} ? 0 : 1); + print "Temporary files will " . ($options{'CLEAN'} ? "" : "not ") . + "be deleted.\n"; + } + elsif (command($option, "|downloadstatus")) { + print "Numeric value must be given.\n" and return 1 + unless (defined $value && $value =~ /^\d+$/); + $options{'DOWNLOADSTATUS'} = $value; + print "Download status will " . (($options{'DOWNLOADSTATUS'} > 0) ? + "be updated every $options{'DOWNLOADSTATUS'} bytes.\n" : + "not be updated.\n"); + } + elsif (command($option, "|more")) { + print "Numeric value must be given.\n" and return 1 + unless (defined $value && $value =~ /^\d+$/); + $options{'MORE'} = $value; + print "Screens will " . ($options{'MORE'} > 0 ? + "pause after $options{'MORE'} lines.\n" : "not pause.\n"); + } + elsif (command($option, "trace|file")) { + print "Filename not specified.\n" and return 1 unless ($value); + $options{'TRACEFILE'} = $value; + print "Tracing info will be written to $options{'TRACEFILE'}.\n"; + } + elsif (command($option, "trace")) { + print "Numeric value between 0 and 4 must be given.\n" and return 1 + unless (defined $value && + $value =~ /^\d+$/ && $value >= 0 && $value <= 4); + $options{'TRACE'} = $value; + print "Tracing info will " . ($options{'TRACE'} > 0 ? + "be written to $options{'TRACEFILE'}.\n" : "not be written.\n"); + } + elsif (command($option, "|verbose")) { + $options{'VERBOSE'} = defined $value ? + ($value != 0) : ($options{'VERBOSE'} ? 0 : 1); + print "Query/search results will " . + ($options{'VERBOSE'} ? "" : "not ") . "be verbose.\n"; + } + else { + print "Unknown or ambiguous option '$option'; see 'help set' for available options.\n"; + return 1; + } + PPM::SetPPMOptions("options" => \%options); + } + return; +} + +sub search_PPDs +{ + my %argv = @_; + my @locations = $argv{'location'} || $location; + my $searchtag = $argv{'searchtag'}; + my $ignorecase = defined $argv{'ignorecase'} ? + $argv{'ignorecase'} : $options{'IGNORECASE'}; + my $searchRE = $argv{'searchRE'}; + if (defined $searchRE) { + eval { $searchRE =~ /$searchRE/ }; + if ($@) { + print "'$searchRE': invalid regular expression.\n"; + return; + } + $searchRE = "(?i)$searchRE" if $ignorecase; + } + + my %packages; + unless (defined $locations[0]) { + my %reps = PPM::ListOfRepositories; + @locations = values %reps; + } + foreach my $loc (@locations) { + my %summary; + + # see if the repository has server-side searching + if (defined $searchRE && (%summary = ServerSearch('location' => $loc, + 'searchRE' => $searchRE, 'searchtag' => $searchtag))) { + # XXX: clean this up + foreach my $package (keys %{$summary{$loc}}) { + $packages{$loc}{$package} = \%{$summary{$loc}{$package}}; + } + next; + } + + # see if a summary file is available + %summary = RepositorySummary("location" => $loc); + if (%summary) { + foreach my $package (keys %{$summary{$loc}}) { + next if (defined $searchtag && + $summary{$loc}{$package}{$searchtag} !~ /$searchRE/); + next if (!defined $searchtag && + defined $searchRE && $package !~ /$searchRE/); + $packages{$loc}{$package} = \%{$summary{$loc}{$package}}; + } + } + else { + my %ppds = PPM::RepositoryPackages("location" => $loc); + # No summary: oh my, nothing but 'Net + foreach my $package (@{$ppds{$loc}}) { + my %package_details = RepositoryPackageProperties( + "package" => $package, "location" => $loc); + next unless %package_details; + next if (defined $searchtag && + $package_details{$searchtag} !~ /$searchRE/); + next if (!defined $searchtag && + defined $searchRE && $package !~ /$searchRE/); + $packages{$loc}{$package} = \%package_details; + } + } + } + return %packages; +} + +sub verify_packages +{ + my %argv = @_; + my @packages = @{$argv{'packages'}}; + my $upgrade = $argv{'upgrade'}; + my $force = $argv{'force'}; + my $location = $argv{'location'} || $location; + unless ($packages[0]) { + my %info = QueryInstalledPackages(); + @packages = sort keys %info; + } + + my $package = shift @packages; + while ($package) { + my $status = VerifyPackage("package" => $package, + "location" => $location, "upgrade" => $upgrade, "force" => $force); + if (defined $status) { + if ($status eq "0") { + print "Package \'$package\' is up to date.\n"; + } + elsif ($upgrade) { + print "Package $package upgraded to version $status\n"; + } + else { + print "An upgrade to package \'$package\' is available.\n"; + } + } + else { + # Couldn't find a PPD to compare it with. + print "Package \'$package\' is up to date.\n"; + } + $package = shift @packages; + } +} + +sub genconfig +{ + my $repositories = + {'5.6' => { + 'ActiveState' => + {location => 'http://ppm.ActiveState.com/cgibin/PPM/ppmserver.pl?urn:/PPMServer', + summaryfile => 'fetch_summary', + }, + 'Bribes' => + {location => 'http://www.bribes.org/perl/ppm', + summaryfile => 'searchsummary.ppm', + }, + 'UWinnipeg' => + {location => 'http://theoryx5.uwinnipeg.ca/cgi-bin/ppmserver?urn:/PPMServer', + summaryfile => 'fetch_summary', + }, + }, + '5.8' => { + 'ActiveState' => + {location => 'http://ppm.activestate.com/PPMPackages/5.8-windows', + summaryfile => 'searchsummary.ppm', + }, + 'Bribes' => + {location => 'http://www.bribes.org/perl/ppm', + summaryfile => 'searchsummary.ppm', + }, + 'UWinnipeg' => + {location => 'http://theoryx5.uwinnipeg.ca/ppms', + summaryfile => 'searchsummary.ppm', + }, + 'Trouchelle' => + {location => 'http://trouchelle.com/ppm', + summaryfile => 'searchsummary.ppm', + }, + }, + '5.10' => { + 'ActiveState' => + {location => 'http://ppm.activestate.com/PPMPackages/5.10-windows', + summaryfile => 'searchsummary.ppm', + }, + 'Bribes' => + {location => 'http://www.bribes.org/perl/ppm', + summaryfile => 'searchsummary.ppm', + }, + 'UWinnipeg' => + {location => 'http://cpan.uwinnipeg.ca/PPMPackages/10xx', + summaryfile => 'searchsummary.ppm', + }, + 'Trouchelle' => + {location => 'http://trouchelle.com/ppm10', + summaryfile => 'package.xml', + }, + }, + }; + my ($perl_version); + PERLV: { + ($] < 5.008) and do { + $perl_version = '5.6'; + last PERLV; + }; + ($] < 5.01) and do { + $perl_version = '5.8'; + last PERLV; + }; + $perl_version = '5.10'; + } + my $reps = $repositories->{$perl_version}; + my $PerlDir = $Config{'prefix'}; + +print <<"EOF"; + + 2,1,8,0 + + +EOF + foreach my $name(sort keys %$reps) { + my $loc = $reps->{$name}->{location}; + my $sf = $reps->{$name}->{summaryfile}; + print << "EOF"; + +EOF + } + print <<"EOF"; + Compress-Zlib;Archive-Tar;Digest-MD5;File-CounterFile;Font-AFM;HTML-Parser;HTML-Tree;MIME-Base64;URI;XML-Element;libwww-perl;XML-Parser;SOAP-Lite;PPM;libnet;libwin32 + +EOF +} + +__DATA__ + +=head1 NAME + +PPM - Perl Package Manager: locate, install, upgrade software packages. + +=head1 SYNOPSIS + + ppm genconfig + ppm help [command] + ppm install [--location=location] package1 [... packageN] + ppm query [--case|nocase] [--abstract|author] PATTERN + ppm remove package1 [... packageN] + ppm search [--case|nocase] [--location=location] [--abstract|author] PATTERN + ppm set [option] + ppm verify [--location=location] [--upgrade] [--force] [package1 ... packageN] + ppm version + ppm [--location=location] + +=head1 DESCRIPTION + +ppm is a utility intended to simplify the tasks of locating, installing, +upgrading and removing software packages. It is a front-end to the +functionality provided in PPM.pm. It can determine if the most recent +version of a software package is installed on a system, and can install +or upgrade that package from a local or remote host. + +ppm runs in one of two modes: an interactive shell from which commands +may be entered; and command-line mode, in which one specific action is +performed per invocation of the program. + +ppm uses files containing an extended form of the Open Software +Description (OSD) specification for information about software packages. +These description files, which are written in Extensible Markup +Language (XML) code, are referred to as 'PPD' files. Information about +OSD can be found at the W3C web site (at the time of this writing, +http://www.w3.org/TR/NOTE-OSD.html). The extensions to OSD used by ppm +are documented in PPM.ppd. + +=head1 Using PPM + +=over 4 + +=item Interactive mode + +If ppm is invoked with no command specified, it is started in interactive +mode. If the '--location' argument is specified, it is used as the +search location, otherwise the repositories specified in the PPM data file +are used. + +The syntax of PPM commands is the same in interactive mode as it is in +command-line mode. The 'help' command lists the available commands. + +ppm commands may be abbreviated to their shortest unique form. + +=item Installing + + ppm install [--location=location] package1 [... packageN] + +Installs the specified software packages. Attempts to install from the +URL or directory 'location' if the '--location' option is specfied. + +The 'package' arguments may be either package names ('foo'), pathnames +(p:/packages/foo.ppd) or URLs (http://www.ActiveState.com/packages/foo.ppd) +to specific PPD files. + +In the case where a package name is specified, and the '--location' +option is not used, ppm will refer to the default repository locations. + +See also: 'confirm' option. + +=item Removing + + ppm remove package1 [... packageN] + +Reads information from the PPD file for the named software package and +removes the package from the system. + +See also: 'confirm' option. + +=item Verifying + + ppm verify [--location=location] [--upgrade] [--force] [package1 ... packageN] + +Verifies that the currently installed packages are up to date. If no +packages are specified as arguments, all installed packages will be verified. + +If the '--upgrade' option is specified, any package for which an upgrade +is available will be upgraded. + +If the '--location' option is specified, upgrades will be looked for at +the specified URL or directory. + +If the '--force' option is specified, all currently installed packages will +be reinstalled regardless of whether they are out of date or not. + +See also: 'confirm' option. + +=item Querying + + ppm query [--case|nocase] [--abstract|author] PATTERN + +Searches for 'PATTERN' (a regular expression) in the name of any installed +package. If a search is successful, information about the matching +package(s) is displayed. If 'PATTERN' is omitted, information about +all installed packages will be displayed. + +If either '--abstract' or '--author' is specified, PATTERN will be +searched for in the or tags of the installed packages. + +The '--case' and '--nocase' options can be used to override the default +case-sensitivity search settings. + +See also: 'case' option. + +=item Searching + + ppm search [--case|nocase] [--location=location] [--abstract|author] PATTERN + +Displays a list of any packages matching 'PATTERN' (a regular expression) +available from the specified location. If 'PATTERN' is omitted, information +about all available packages will be displayed. + +If the '--location' option is specified, the specified URL or directory +will be searched. If '--location' is not specified, the repository location +as specified in the PPM data file will be searched. + +If either '--abstract' or '--author' is specified, PATTERN will be +searched for in the or tags of the available packages. + +The '--case' and '--nocase' options can be used to override the default +case-sensitivity search settings. + +See also: 'case' option. + +=item Error Recovery + + ppm genconfig + ppm getconfig + +The genconfig command will print a valid PPM config file (ppm.xml) to STDOUT. +This can be useful if the PPM config file ever gets damaged leaving PPM +unusable. + +If required, this command should be run from a shell prompt: + + C:\Perl\site\lib> ppm genconfig > ppm.xml + +The getconfig command prints the location of the PPM configuration file +used at PPM startup. + +=item Options + + ppm set [option value] + +Sets or displays current options. With no arguments, current option +settings are displayed. + +Available options: + + build DIRECTORY + - Changes the package build directory. + + case [1|0] + - Sets case-sensitive searches. If one of '1' or '0' is + not specified, the current setting is toggled. + + clean [1|0] + - Sets removal of temporary files from package's build + area, on successful installation of a package. If one of + '1' or '0' is not specified, the current setting is + toggled. + + confirm [1|0] + - Sets confirmation of 'install', 'remove' and 'upgrade'. + If one of '1' or '0' is not specified, the current + setting is toggled. + + downloadstatus NUMBER + - If non-zero, updates the download status after each NUMBER + of bytes transferred during an 'install'. This can be + reassuring when installing a large package (e.g. Tk) over + a low-speed connection. + + force_install [1|0] + - Continue installing a package even if a dependency cannot + be installed. + + more NUMBER + - Causes output to pause after NUMBER lines have been + displayed. Specifying '0' turns off this capability. + + set repository --remove NAME + - Removes the repository 'NAME' from the list of repositories. + + set repository NAME LOCATION + - Adds a repository to the list of PPD repositories for this + session. 'NAME' is the name by which this repository will + be referred; 'LOCATION' is a URL or directory name. + + root DIRECTORY + - Changes the install root directory. Packages will be + installed under this new root. + + save + - Saves the current options as default options for future + sessions. + + trace + - Tracing level--default is 1, maximum is 4, 0 indicates + no tracing. + + tracefile + - File to contain tracing information, default is 'PPM.LOG'. + + verbose [1|0] + - Display additional package information for 'query' and + 'search' commands. + +=back + +=head1 EXAMPLES + +=over 4 + +=item ppm + +Starts ppm in interactive mode, using the repository locations specified +in the PPM data file. A session might look like this: + + [show all available packages] + PPM> search + Packages available from P:\PACKAGES: + bar [2.91 ] supplies bar methods for perl5. + bax [0.072] module for manipulation of bax archives. + baz [1.03 ] Interface to baz library + foo [2.23 ] Foo parser class + + [list what has already been installed] + PPM> query + bax [0.071] module for manipulation of bax archives. + baz [1.02 ] Interface to baz library + + [install a package] + PPM> install foo + Install package foo? (y/N): y + [...] + + [toggle confirmations] + PPM> set confirm + Commands will not be confirmed. + + [see if 'baz' is up-to-date] + PPM> verify baz + An upgrade to package 'baz' is available. + + [upgrade 'baz'] + PPM> verify --upgrade baz + [...] + + [forced upgrade of 'baz'] + PPM> verify --upgrade --force baz + [...] + + [toggle case-sensitive searches] + PPM> set case + Case-sensitive searches will be performed. + + [display all available packages beginning with 'b'] + PPM> search ^b + bar [2.91 ] supplies bar methods for perl5. + bax [0.072] module for manipulation of bax archives. + baz [1.03 ] Interface to baz library + + [search for installed packages containing 'baz' in the ABSTRACT tag] + PPM> query --abstract baz + Matching packages found at P:\PACKAGES: + baz [1.03 ] Interface to baz library + PPM> quit + +=item ppm install http://www.ActiveState.com/packages/foo.ppd + +Installs the software package 'foo' based on the information in the PPD +obtained from the specified URL. + +=item ppm verify --upgrade foo + +Compares the currently installed version of the software package 'foo' +to the one available according to the PPD obtained from the location +specified for this package in the PPM data file, and upgrades +to a newer version if available. + +=item ppm verify --location=P:\PACKAGES --upgrade foo + +Compares the currently installed version of the software package 'foo' +to the one available according to the PPD obtained from the specified +directory, and upgrades to a newer version if available. + +=item ppm verify --upgrade --force + +Forces verification and reinstalls every installed package on the system, +using upgrade locations specified in the PPM data file. + +=item ppm search --location=http://ppm.ActiveState.com/PPMpackages/5.6 + +Displays the packages with PPD files available at the specified location. + +=item ppm search --location=P:\PACKAGES --author ActiveState + +Searches the specified location for any package with an tag +containing the string 'ActiveState'. On a successful search, the package +name and the matching string are displayed. + +=back + +=head1 ENVIRONMENT VARIABLES + +=over 4 + +=item HTTP_proxy + +If the environment variable 'HTTP_proxy' is set, then it will +be used as the address of a proxy server for accessing the Internet. + +The value should be of the form: 'http://proxy:port'. + +=back + +=head1 FILES + +The following files are fully described in the 'Files' section of PPM:ppm. + +=over 4 + +=item package.ppd + +A description of a software package, in extended Open Software Description +(OSD) format. More information on this file format can be found in +PPM::ppd. + +=item ppm.xml - PPM data file. + +An XML format file containing information about the local system, +specifics regarding the locations from which PPM obtains PPD files, and +the installation details for any package installed by ppm. + +This file usually resides in '[perl]/site/lib'. If the environment +variable 'PPM_DAT' is set, its value will be used as the full pathname +to a PPM data file. If all else fails, ppm will look for a data file +in the current directory. + +=back + +=head1 AUTHOR + +Murray Nesbitt, EFE + +=head1 CREDITS + +=over 4 + +=item * + +The "geek-pit" at ActiveState. + +=item * + +Paul Kulchenko for his SOAP-Lite package, and for his enthusiastic +assistance in getting PPM to work with SOAP-Lite. + +=back + +=cut diff --git a/Master/tlpkg/tlperl.straw/bin/prove b/Master/tlpkg/tlperl.straw/bin/prove new file mode 100755 index 00000000000..bb419ed2db7 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/prove @@ -0,0 +1,338 @@ +#!C:\strawberry\perl\bin\perl.exe -w + +use strict; +use App::Prove; + +my $app = App::Prove->new; +$app->process_args(@ARGV); +exit( $app->run ? 0 : 1 ); + +__END__ + +=head1 NAME + +prove - Run tests through a TAP harness. + +=head1 USAGE + + prove [options] [files or directories] + +=head1 OPTIONS + +Boolean options: + + -v, --verbose Print all test lines. + -l, --lib Add 'lib' to the path for your tests (-Ilib). + -b, --blib Add 'blib/lib' and 'blib/arch' to the path for + your tests + -s, --shuffle Run the tests in random order. + -c, --color Colored test output (default). + --nocolor Do not color test output. + --count Show the X/Y test count when not verbose + (default) + --nocount Disable the X/Y test count. + -D --dry Dry run. Show test that would have run. + --ext Set the extension for tests (default '.t') + -f, --failures Show failed tests. + -o, --comments Show comments. + --ignore-exit Ignore exit status from test scripts. + -m, --merge Merge test scripts' STDERR with their STDOUT. + -r, --recurse Recursively descend into directories. + --reverse Run the tests in reverse order. + -q, --quiet Suppress some test output while running tests. + -Q, --QUIET Only print summary results. + -p, --parse Show full list of TAP parse errors, if any. + --directives Only show results with TODO or SKIP directives. + --timer Print elapsed time after each test. + --normalize Normalize TAP output in verbose output + -T Enable tainting checks. + -t Enable tainting warnings. + -W Enable fatal warnings. + -w Enable warnings. + -h, --help Display this help + -?, Display this help + -H, --man Longer manpage for prove + --norc Don't process default .proverc + +Options that take arguments: + + -I Library paths to include. + -P Load plugin (searches App::Prove::Plugin::*.) + -M Load a module. + -e, --exec Interpreter to run the tests ('' for compiled + tests.) + --harness Define test harness to use. See TAP::Harness. + --formatter Result formatter to use. See FORMATTERS. + --source Load and/or configure a SourceHandler. See + SOURCE HANDLERS. + -a, --archive out.tgz Store the resulting TAP in an archive file. + -j, --jobs N Run N test jobs in parallel (try 9.) + --state=opts Control prove's persistent state. + --rc=rcfile Process options from rcfile + +=head1 NOTES + +=head2 .proverc + +If F<~/.proverc> or F<./.proverc> exist they will be read and any +options they contain processed before the command line options. Options +in F<.proverc> are specified in the same way as command line options: + + # .proverc + --state=hot,fast,save + -j9 + +Additional option files may be specified with the C<--rc> option. +Default option file processing is disabled by the C<--norc> option. + +Under Windows and VMS the option file is named F<_proverc> rather than +F<.proverc> and is sought only in the current directory. + +=head2 Reading from C + +If you have a list of tests (or URLs, or anything else you want to test) in a +file, you can add them to your tests by using a '-': + + prove - < my_list_of_things_to_test.txt + +See the C in the C directory of this distribution. + +=head2 Default Test Directory + +If no files or directories are supplied, C looks for all files +matching the pattern C. + +=head2 Colored Test Output + +Colored test output is the default, but if output is not to a +terminal, color is disabled. You can override this by adding the +C<--color> switch. + +Color support requires L on Unix-like platforms and +L windows. If the necessary module is not installed +colored output will not be available. + +=head2 Exit Code + +If the tests fail C will exit with non-zero status. + +=head2 Arguments to Tests + +It is possible to supply arguments to tests. To do so separate them from +prove's own arguments with the arisdottle, '::'. For example + + prove -v t/mytest.t :: --url http://example.com + +would run F with the options '--url http://example.com'. +When running multiple tests they will each receive the same arguments. + +=head2 C<--exec> + +Normally you can just pass a list of Perl tests and the harness will know how +to execute them. However, if your tests are not written in Perl or if you +want all tests invoked exactly the same way, use the C<-e>, or C<--exec> +switch: + + prove --exec '/usr/bin/ruby -w' t/ + prove --exec '/usr/bin/perl -Tw -mstrict -Ilib' t/ + prove --exec '/path/to/my/customer/exec' + +=head2 C<--merge> + +If you need to make sure your diagnostics are displayed in the correct +order relative to test results you can use the C<--merge> option to +merge the test scripts' STDERR into their STDOUT. + +This guarantees that STDOUT (where the test results appear) and STDOUT +(where the diagnostics appear) will stay in sync. The harness will +display any diagnostics your tests emit on STDERR. + +Caveat: this is a bit of a kludge. In particular note that if anything +that appears on STDERR looks like a test result the test harness will +get confused. Use this option only if you understand the consequences +and can live with the risk. + +=head2 C<--state> + +You can ask C to remember the state of previous test runs and +select and/or order the tests to be run based on that saved state. + +The C<--state> switch requires an argument which must be a comma +separated list of one or more of the following options. + +=over + +=item C + +Run the same tests as the last time the state was saved. This makes it +possible, for example, to recreate the ordering of a shuffled test. + + # Run all tests in random order + $ prove -b --state=save --shuffle + + # Run them again in the same order + $ prove -b --state=last + +=item C + +Run only the tests that failed on the last run. + + # Run all tests + $ prove -b --state=save + + # Run failures + $ prove -b --state=failed + +If you also specify the C option newly passing tests will be +excluded from subsequent runs. + + # Repeat until no more failures + $ prove -b --state=failed,save + +=item C + +Run only the passed tests from last time. Useful to make sure that no +new problems have been introduced. + +=item C + +Run all tests in normal order. Multple options may be specified, so to +run all tests with the failures from last time first: + + $ prove -b --state=failed,all,save + +=item C + +Run the tests that most recently failed first. The last failure time of +each test is stored. The C option causes tests to be run in most-recent- +failure order. + + $ prove -b --state=hot,save + +Tests that have never failed will not be selected. To run all tests with +the most recently failed first use + + $ prove -b --state=hot,all,save + +This combination of options may also be specified thus + + $ prove -b --state=adrian + +=item C + +Run any tests with todos. + +=item C + +Run the tests in slowest to fastest order. This is useful in conjunction +with the C<-j> parallel testing switch to ensure that your slowest tests +start running first. + + $ prove -b --state=slow -j9 + +=item C + +Run test tests in fastest to slowest order. + +=item C + +Run the tests in newest to oldest order based on the modification times +of the test scripts. + +=item C + +Run the tests in oldest to newest order. + +=item C + +Run those test scripts that have been modified since the last test run. + +=item C + +Save the state on exit. The state is stored in a file called F<.prove> +(F<_prove> on Windows and VMS) in the current directory. + +=back + +The C<--state> switch may be used more than once. + + $ prove -b --state=hot --state=all,save + +=head2 @INC + +prove introduces a separation between "options passed to the perl which +runs prove" and "options passed to the perl which runs tests"; this +distinction is by design. Thus the perl which is running a test starts +with the default C<@INC>. Additional library directories can be added +via the C environment variable, via -Ifoo in C or +via the C<-Ilib> option to F. + +=head2 Taint Mode + +Normally when a Perl program is run in taint mode the contents of the +C environment variable do not appear in C<@INC>. + +Because C is often used during testing to add build +directories to C<@INC> prove passes the names of any directories found +in C as -I switches. The net effect of this is that +C is honoured even when prove is run in taint mode. + + +=head1 FORMATTERS + +You can load a custom L: + + prove --formatter MyFormatter + +=head1 SOURCE HANDLERS + +You can load custom Ls, to change the way the +parser interprets particular I of TAP. + + prove --source MyHandler --source YetAnother t + +If you want to provide config to the source you can use: + + prove --source MyCustom \ + --source Perl --perl-option 'foo=bar baz' --perl-option avg=0.278 \ + --source File --file-option extensions=.txt --file-option extensions=.tmp t + +Each C<--$source-option> option must specify a key/value pair separated by an +C<=>. If an option can take multiple values, just specify it multiple times, +as with the C examples above. + +All C<--sources> are combined into a hash, and passed to L's +C parameter. + +See L for more details on how configuration is +passed to I. + +=head1 PLUGINS + +Plugins can be loaded using the C<< -PI >> syntax, eg: + + prove -PMyPlugin + +This will search for a module named C, or failing +that, C. If the plugin can't be found, C 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 + +=head2 Writing Plugins + +Please see L. + +=cut + +# vim:ts=4:sw=4:et:sta diff --git a/Master/tlpkg/tlperl.straw/bin/prove.bat b/Master/tlpkg/tlperl.straw/bin/prove.bat new file mode 100755 index 00000000000..ef4ca66182b --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/prove.bat @@ -0,0 +1,354 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!C:\strawberry\perl\bin\perl.exe -w +#line 15 + +use strict; +use App::Prove; + +my $app = App::Prove->new; +$app->process_args(@ARGV); +exit( $app->run ? 0 : 1 ); + +__END__ + +=head1 NAME + +prove - Run tests through a TAP harness. + +=head1 USAGE + + prove [options] [files or directories] + +=head1 OPTIONS + +Boolean options: + + -v, --verbose Print all test lines. + -l, --lib Add 'lib' to the path for your tests (-Ilib). + -b, --blib Add 'blib/lib' and 'blib/arch' to the path for + your tests + -s, --shuffle Run the tests in random order. + -c, --color Colored test output (default). + --nocolor Do not color test output. + --count Show the X/Y test count when not verbose + (default) + --nocount Disable the X/Y test count. + -D --dry Dry run. Show test that would have run. + --ext Set the extension for tests (default '.t') + -f, --failures Show failed tests. + -o, --comments Show comments. + --ignore-exit Ignore exit status from test scripts. + -m, --merge Merge test scripts' STDERR with their STDOUT. + -r, --recurse Recursively descend into directories. + --reverse Run the tests in reverse order. + -q, --quiet Suppress some test output while running tests. + -Q, --QUIET Only print summary results. + -p, --parse Show full list of TAP parse errors, if any. + --directives Only show results with TODO or SKIP directives. + --timer Print elapsed time after each test. + --normalize Normalize TAP output in verbose output + -T Enable tainting checks. + -t Enable tainting warnings. + -W Enable fatal warnings. + -w Enable warnings. + -h, --help Display this help + -?, Display this help + -H, --man Longer manpage for prove + --norc Don't process default .proverc + +Options that take arguments: + + -I Library paths to include. + -P Load plugin (searches App::Prove::Plugin::*.) + -M Load a module. + -e, --exec Interpreter to run the tests ('' for compiled + tests.) + --harness Define test harness to use. See TAP::Harness. + --formatter Result formatter to use. See FORMATTERS. + --source Load and/or configure a SourceHandler. See + SOURCE HANDLERS. + -a, --archive out.tgz Store the resulting TAP in an archive file. + -j, --jobs N Run N test jobs in parallel (try 9.) + --state=opts Control prove's persistent state. + --rc=rcfile Process options from rcfile + +=head1 NOTES + +=head2 .proverc + +If F<~/.proverc> or F<./.proverc> exist they will be read and any +options they contain processed before the command line options. Options +in F<.proverc> are specified in the same way as command line options: + + # .proverc + --state=hot,fast,save + -j9 + +Additional option files may be specified with the C<--rc> option. +Default option file processing is disabled by the C<--norc> option. + +Under Windows and VMS the option file is named F<_proverc> rather than +F<.proverc> and is sought only in the current directory. + +=head2 Reading from C + +If you have a list of tests (or URLs, or anything else you want to test) in a +file, you can add them to your tests by using a '-': + + prove - < my_list_of_things_to_test.txt + +See the C in the C directory of this distribution. + +=head2 Default Test Directory + +If no files or directories are supplied, C looks for all files +matching the pattern C. + +=head2 Colored Test Output + +Colored test output is the default, but if output is not to a +terminal, color is disabled. You can override this by adding the +C<--color> switch. + +Color support requires L on Unix-like platforms and +L windows. If the necessary module is not installed +colored output will not be available. + +=head2 Exit Code + +If the tests fail C will exit with non-zero status. + +=head2 Arguments to Tests + +It is possible to supply arguments to tests. To do so separate them from +prove's own arguments with the arisdottle, '::'. For example + + prove -v t/mytest.t :: --url http://example.com + +would run F with the options '--url http://example.com'. +When running multiple tests they will each receive the same arguments. + +=head2 C<--exec> + +Normally you can just pass a list of Perl tests and the harness will know how +to execute them. However, if your tests are not written in Perl or if you +want all tests invoked exactly the same way, use the C<-e>, or C<--exec> +switch: + + prove --exec '/usr/bin/ruby -w' t/ + prove --exec '/usr/bin/perl -Tw -mstrict -Ilib' t/ + prove --exec '/path/to/my/customer/exec' + +=head2 C<--merge> + +If you need to make sure your diagnostics are displayed in the correct +order relative to test results you can use the C<--merge> option to +merge the test scripts' STDERR into their STDOUT. + +This guarantees that STDOUT (where the test results appear) and STDOUT +(where the diagnostics appear) will stay in sync. The harness will +display any diagnostics your tests emit on STDERR. + +Caveat: this is a bit of a kludge. In particular note that if anything +that appears on STDERR looks like a test result the test harness will +get confused. Use this option only if you understand the consequences +and can live with the risk. + +=head2 C<--state> + +You can ask C to remember the state of previous test runs and +select and/or order the tests to be run based on that saved state. + +The C<--state> switch requires an argument which must be a comma +separated list of one or more of the following options. + +=over + +=item C + +Run the same tests as the last time the state was saved. This makes it +possible, for example, to recreate the ordering of a shuffled test. + + # Run all tests in random order + $ prove -b --state=save --shuffle + + # Run them again in the same order + $ prove -b --state=last + +=item C + +Run only the tests that failed on the last run. + + # Run all tests + $ prove -b --state=save + + # Run failures + $ prove -b --state=failed + +If you also specify the C option newly passing tests will be +excluded from subsequent runs. + + # Repeat until no more failures + $ prove -b --state=failed,save + +=item C + +Run only the passed tests from last time. Useful to make sure that no +new problems have been introduced. + +=item C + +Run all tests in normal order. Multple options may be specified, so to +run all tests with the failures from last time first: + + $ prove -b --state=failed,all,save + +=item C + +Run the tests that most recently failed first. The last failure time of +each test is stored. The C option causes tests to be run in most-recent- +failure order. + + $ prove -b --state=hot,save + +Tests that have never failed will not be selected. To run all tests with +the most recently failed first use + + $ prove -b --state=hot,all,save + +This combination of options may also be specified thus + + $ prove -b --state=adrian + +=item C + +Run any tests with todos. + +=item C + +Run the tests in slowest to fastest order. This is useful in conjunction +with the C<-j> parallel testing switch to ensure that your slowest tests +start running first. + + $ prove -b --state=slow -j9 + +=item C + +Run test tests in fastest to slowest order. + +=item C + +Run the tests in newest to oldest order based on the modification times +of the test scripts. + +=item C + +Run the tests in oldest to newest order. + +=item C + +Run those test scripts that have been modified since the last test run. + +=item C + +Save the state on exit. The state is stored in a file called F<.prove> +(F<_prove> on Windows and VMS) in the current directory. + +=back + +The C<--state> switch may be used more than once. + + $ prove -b --state=hot --state=all,save + +=head2 @INC + +prove introduces a separation between "options passed to the perl which +runs prove" and "options passed to the perl which runs tests"; this +distinction is by design. Thus the perl which is running a test starts +with the default C<@INC>. Additional library directories can be added +via the C environment variable, via -Ifoo in C or +via the C<-Ilib> option to F. + +=head2 Taint Mode + +Normally when a Perl program is run in taint mode the contents of the +C environment variable do not appear in C<@INC>. + +Because C is often used during testing to add build +directories to C<@INC> prove passes the names of any directories found +in C as -I switches. The net effect of this is that +C is honoured even when prove is run in taint mode. + + +=head1 FORMATTERS + +You can load a custom L: + + prove --formatter MyFormatter + +=head1 SOURCE HANDLERS + +You can load custom Ls, to change the way the +parser interprets particular I of TAP. + + prove --source MyHandler --source YetAnother t + +If you want to provide config to the source you can use: + + prove --source MyCustom \ + --source Perl --perl-option 'foo=bar baz' --perl-option avg=0.278 \ + --source File --file-option extensions=.txt --file-option extensions=.tmp t + +Each C<--$source-option> option must specify a key/value pair separated by an +C<=>. If an option can take multiple values, just specify it multiple times, +as with the C examples above. + +All C<--sources> are combined into a hash, and passed to L's +C parameter. + +See L for more details on how configuration is +passed to I. + +=head1 PLUGINS + +Plugins can be loaded using the C<< -PI >> syntax, eg: + + prove -PMyPlugin + +This will search for a module named C, or failing +that, C. If the plugin can't be found, C 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 + +=head2 Writing Plugins + +Please see L. + +=cut + +# vim:ts=4:sw=4:et:sta + +__END__ +:endofperl diff --git a/Master/tlpkg/tlperl.straw/bin/psed.bat b/Master/tlpkg/tlperl.straw/bin/psed.bat new file mode 100755 index 00000000000..aaf9845505b --- /dev/null +++ b/Master/tlpkg/tlperl.straw/bin/psed.bat @@ -0,0 +1,2018 @@ +@rem = '--*-Perl-*-- +@echo off +if "%OS%" == "Windows_NT" goto WinNT +perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9 +goto endofperl +:WinNT +perl -x -S %0 %* +if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl +if %errorlevel% == 9009 echo You do not have Perl in your PATH. +if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul +goto endofperl +@rem '; +#!perl +#line 15 + eval 'exec C:\strawberry\perl\bin\perl.exe -S $0 ${1+"$@"}' + if $running_under_some_shell; +my $startperl; +my $perlpath; +($startperl = <<'/../') =~ s/\s*\z//; +#!perl +/../ +($perlpath = <<'/../') =~ s/\s*\z//; +C:\strawberry\perl\bin\perl.exe +/../ + +$0 =~ s/^.*?(\w+)[\.\w]*$/$1/; + +# (p)sed - a stream editor +# History: Aug 12 2000: Original version. +# Mar 25 2002: Rearrange generated Perl program. +# Jul 23 2007: Fix bug in regex stripping (M.Thorland) + +use strict; +use integer; +use Symbol; + +=head1 NAME + +psed - a stream editor + +=head1 SYNOPSIS + + psed [-an] script [file ...] + psed [-an] [-e script] [-f script-file] [file ...] + + s2p [-an] [-e script] [-f script-file] + +=head1 DESCRIPTION + +A stream editor reads the input stream consisting of the specified files +(or standard input, if none are given), processes is line by line by +applying a script consisting of edit commands, and writes resulting lines +to standard output. The filename `C<->' may be used to read standard input. + +The edit script is composed from arguments of B<-e> options and +script-files, in the given order. A single script argument may be specified +as the first parameter. + +If this program is invoked with the name F, it will act as a +sed-to-Perl translator. See L<"sed Script Translation">. + +B returns an exit code of 0 on success or >0 if an error occurred. + +=head1 OPTIONS + +=over 4 + +=item B<-a> + +A file specified as argument to the B edit command is by default +opened before input processing starts. Using B<-a>, opening of such +files is delayed until the first line is actually written to the file. + +=item B<-e> I\n"; + warningsToBrowser(1); # re-enable warnings + +Note: In this respect warningsToBrowser() differs fundamentally from +fatalsToBrowser(), which you should never call yourself! + +=head1 OVERRIDING THE NAME OF THE PROGRAM + +CGI::Carp includes the name of the program that generated the error or +warning in the messages written to the log and the browser window. +Sometimes, Perl can get confused about what the actual name of the +executed program was. In these cases, you can override the program +name that CGI::Carp will use for all messages. + +The quick way to do that is to tell CGI::Carp the name of the program +in its use statement. You can do that by adding +"name=cgi_carp_log_name" to your "use" statement. For example: + + use CGI::Carp qw(name=cgi_carp_log_name); + +. If you want to change the program name partway through the program, +you can use the C function instead. It is not +exported by default, you must import it explicitly by saying + + use CGI::Carp qw(set_progname); + +Once you've done that, you can change the logged name of the program +at any time by calling + + set_progname(new_program_name); + +You can set the program back to the default by calling + + set_progname(undef); + +Note that this override doesn't happen until after the program has +compiled, so any compile-time errors will still show up with the +non-overridden program name + +=head1 CHANGE LOG + +1.29 Patch from Peter Whaite to fix the unfixable problem of CGI::Carp + not behaving correctly in an eval() context. + +1.05 carpout() added and minor corrections by Marc Hedlund + on 11/26/95. + +1.06 fatalsToBrowser() no longer aborts for fatal errors within + eval() statements. + +1.08 set_message() added and carpout() expanded to allow for FileHandle + objects. + +1.09 set_message() now allows users to pass a code REFERENCE for + really custom error messages. croak and carp are now + exported by default. Thanks to Gunther Birznieks for the + patches. + +1.10 Patch from Chris Dean (ctdean@cogit.com) to allow + module to run correctly under mod_perl. + +1.11 Changed order of > and < escapes. + +1.12 Changed die() on line 217 to CORE::die to avoid B<-w> warning. + +1.13 Added cluck() to make the module orthogonal with Carp. + More mod_perl related fixes. + +1.20 Patch from Ilmari Karonen (perl@itz.pp.sci.fi): Added + warningsToBrowser(). Replaced tags with
 in
+     fatalsToBrowser() output.
+
+1.23 ineval() now checks both $^S and inspects the message for the "eval" pattern
+     (hack alert!) in order to accommodate various combinations of Perl and
+     mod_perl.
+
+1.24 Patch from Scott Gifford (sgifford@suspectclass.com): Add support
+     for overriding program name.
+
+1.26 Replaced CORE::GLOBAL::die with the evil $SIG{__DIE__} because the
+     former isn't working in some people's hands.  There is no such thing
+     as reliable exception handling in Perl.
+
+1.27 Replaced tell STDOUT with bytes=tell STDOUT.
+
+=head1 AUTHORS
+
+Copyright 1995-2002, Lincoln D. Stein.  All rights reserved.  
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+Address bug reports and comments to: lstein@cshl.org
+
+=head1 SEE ALSO
+
+Carp, CGI::Base, CGI::BasePlus, CGI::Request, CGI::MiniSvr, CGI::Form,
+CGI::Response
+
+=cut
+
+require 5.000;
+use Exporter;
+#use Carp;
+BEGIN { 
+  require Carp; 
+  *CORE::GLOBAL::die = \&CGI::Carp::die;
+}
+
+use File::Spec;
+
+@ISA = qw(Exporter);
+@EXPORT = qw(confess croak carp);
+@EXPORT_OK = qw(carpout fatalsToBrowser warningsToBrowser wrap set_message set_die_handler set_progname cluck ^name= die);
+
+$main::SIG{__WARN__}=\&CGI::Carp::warn;
+
+$CGI::Carp::VERSION     = '3.45';
+$CGI::Carp::CUSTOM_MSG  = undef;
+$CGI::Carp::DIE_HANDLER = undef;
+
+
+# fancy import routine detects and handles 'errorWrap' specially.
+sub import {
+    my $pkg = shift;
+    my(%routines);
+    my(@name);
+    if (@name=grep(/^name=/,@_))
+      {
+        my($n) = (split(/=/,$name[0]))[1];
+        set_progname($n);
+        @_=grep(!/^name=/,@_);
+      }
+
+    grep($routines{$_}++,@_,@EXPORT);
+    $WRAP++ if $routines{'fatalsToBrowser'} || $routines{'wrap'};
+    $WARN++ if $routines{'warningsToBrowser'};
+    my($oldlevel) = $Exporter::ExportLevel;
+    $Exporter::ExportLevel = 1;
+    Exporter::import($pkg,keys %routines);
+    $Exporter::ExportLevel = $oldlevel;
+    $main::SIG{__DIE__} =\&CGI::Carp::die if $routines{'fatalsToBrowser'};
+#    $pkg->export('CORE::GLOBAL','die');
+}
+
+# These are the originals
+sub realwarn { CORE::warn(@_); }
+sub realdie { CORE::die(@_); }
+
+sub id {
+    my $level = shift;
+    my($pack,$file,$line,$sub) = caller($level);
+    my($dev,$dirs,$id) = File::Spec->splitpath($file);
+    return ($file,$line,$id);
+}
+
+sub stamp {
+    my $time = scalar(localtime);
+    my $frame = 0;
+    my ($id,$pack,$file,$dev,$dirs);
+    if (defined($CGI::Carp::PROGNAME)) {
+        $id = $CGI::Carp::PROGNAME;
+    } else {
+        do {
+  	  $id = $file;
+	  ($pack,$file) = caller($frame++);
+        } until !$file;
+    }
+    ($dev,$dirs,$id) = File::Spec->splitpath($id);
+    return "[$time] $id: ";
+}
+
+sub set_progname {
+    $CGI::Carp::PROGNAME = shift;
+    return $CGI::Carp::PROGNAME;
+}
+
+
+sub warn {
+    my $message = shift;
+    my($file,$line,$id) = id(1);
+    $message .= " at $file line $line.\n" unless $message=~/\n$/;
+    _warn($message) if $WARN;
+    my $stamp = stamp;
+    $message=~s/^/$stamp/gm;
+    realwarn $message;
+}
+
+sub _warn {
+    my $msg = shift;
+    if ($EMIT_WARNINGS) {
+	# We need to mangle the message a bit to make it a valid HTML
+	# comment.  This is done by substituting similar-looking ISO
+	# 8859-1 characters for <, > and -.  This is a hack.
+	$msg =~ tr/<>-/\253\273\255/;
+	chomp $msg;
+	print STDOUT "\n";
+    } else {
+	push @WARNINGS, $msg;
+    }
+}
+
+
+# The mod_perl package Apache::Registry loads CGI programs by calling
+# eval.  These evals don't count when looking at the stack backtrace.
+sub _longmess {
+    my $message = Carp::longmess();
+    $message =~ s,eval[^\n]+(ModPerl|Apache)/(?:Registry|Dispatch)\w*\.pm.*,,s
+        if exists $ENV{MOD_PERL};
+    return $message;
+}
+
+sub ineval {
+  (exists $ENV{MOD_PERL} ? 0 : $^S) || _longmess() =~ /eval [\{\']/m
+}
+
+sub die {
+  my ($arg,@rest) = @_;
+
+  if ($DIE_HANDLER) {
+      &$DIE_HANDLER($arg,@rest);
+  }
+
+  if ( ineval() )  {
+    if (!ref($arg)) {
+      $arg = join("",($arg,@rest)) || "Died";
+      my($file,$line,$id) = id(1);
+      $arg .= " at $file line $line.\n" unless $arg=~/\n$/;
+      realdie($arg);
+    }
+    else {
+      realdie($arg,@rest);
+    }
+  }
+
+  if (!ref($arg)) {
+    $arg = join("", ($arg,@rest));
+    my($file,$line,$id) = id(1);
+    $arg .= " at $file line $line." unless $arg=~/\n$/;
+    &fatalsToBrowser($arg) if $WRAP;
+    if (($arg =~ /\n$/) || !exists($ENV{MOD_PERL})) {
+      my $stamp = stamp;
+      $arg=~s/^/$stamp/gm;
+    }
+    if ($arg !~ /\n$/) {
+      $arg .= "\n";
+    }
+  }
+  realdie $arg;
+}
+
+sub set_message {
+    $CGI::Carp::CUSTOM_MSG = shift;
+    return $CGI::Carp::CUSTOM_MSG;
+}
+
+sub set_die_handler {
+
+    my ($handler) = shift;
+    
+    #setting SIG{__DIE__} here is necessary to catch runtime
+    #errors which are not called by literally saying "die",
+    #such as the line "undef->explode();". however, doing this
+    #will interfere with fatalsToBrowser, which also sets 
+    #SIG{__DIE__} in the import() function above (or the 
+    #import() function above may interfere with this). for
+    #this reason, you should choose to either set the die
+    #handler here, or use fatalsToBrowser, not both. 
+    $main::SIG{__DIE__} = $handler;
+    
+    $CGI::Carp::DIE_HANDLER = $handler; 
+    
+    return $CGI::Carp::DIE_HANDLER;
+}
+
+sub confess { CGI::Carp::die Carp::longmess @_; }
+sub croak   { CGI::Carp::die Carp::shortmess @_; }
+sub carp    { CGI::Carp::warn Carp::shortmess @_; }
+sub cluck   { CGI::Carp::warn Carp::longmess @_; }
+
+# We have to be ready to accept a filehandle as a reference
+# or a string.
+sub carpout {
+    my($in) = @_;
+    my($no) = fileno(to_filehandle($in));
+    realdie("Invalid filehandle $in\n") unless defined $no;
+    
+    open(SAVEERR, ">&STDERR");
+    open(STDERR, ">&$no") or 
+	( print SAVEERR "Unable to redirect STDERR: $!\n" and exit(1) );
+}
+
+sub warningsToBrowser {
+    $EMIT_WARNINGS = @_ ? shift : 1;
+    _warn(shift @WARNINGS) while $EMIT_WARNINGS and @WARNINGS;
+}
+
+# headers
+sub fatalsToBrowser {
+  my($msg) = @_;
+  $msg=~s/&/&/g;
+  $msg=~s/>/>/g;
+  $msg=~s/$ENV{SERVER_ADMIN})] :
+      "this site's webmaster";
+  my ($outer_message) = <Software error:

+
$msg
+

+$outer_message +

+END + ; + + if ($mod_perl) { + my $r; + if ($ENV{MOD_PERL_API_VERSION} && $ENV{MOD_PERL_API_VERSION} == 2) { + $mod_perl = 2; + require Apache2::RequestRec; + require Apache2::RequestIO; + require Apache2::RequestUtil; + require APR::Pool; + require ModPerl::Util; + require Apache2::Response; + $r = Apache2::RequestUtil->request; + } + else { + $r = Apache->request; + } + # If bytes have already been sent, then + # we print the message out directly. + # Otherwise we make a custom error + # handler to produce the doc for us. + if ($r->bytes_sent) { + $r->print($mess); + $mod_perl == 2 ? ModPerl::Util::exit(0) : $r->exit; + } else { + # MSIE won't display a custom 500 response unless it is >512 bytes! + if ($ENV{HTTP_USER_AGENT} =~ /MSIE/) { + $mess = "\n$mess"; + } + $r->custom_response(500,$mess); + } + } else { + my $bytes_written = eval{tell STDOUT}; + if (defined $bytes_written && $bytes_written > 0) { + print STDOUT $mess; + } + else { + print STDOUT "Status: 500\n"; + print STDOUT "Content-type: text/html\n\n"; + print STDOUT $mess; + } + } + + warningsToBrowser(1); # emit warnings before dying +} + +# Cut and paste from CGI.pm so that we don't have the overhead of +# always loading the entire CGI module. +sub to_filehandle { + my $thingy = shift; + return undef unless $thingy; + return $thingy if UNIVERSAL::isa($thingy,'GLOB'); + return $thingy if UNIVERSAL::isa($thingy,'FileHandle'); + if (!ref($thingy)) { + my $caller = 1; + while (my $package = caller($caller++)) { + my($tmp) = $thingy=~/[\':]/ ? $thingy : "$package\:\:$thingy"; + return $tmp if defined(fileno($tmp)); + } + } + return undef; +} + +1; diff --git a/Master/tlpkg/tlperl.straw/lib/CGI/Cookie.pm b/Master/tlpkg/tlperl.straw/lib/CGI/Cookie.pm new file mode 100755 index 00000000000..85a07f0bc05 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/lib/CGI/Cookie.pm @@ -0,0 +1,546 @@ +package CGI::Cookie; + +# See the bottom of this file for the POD documentation. Search for the +# string '=head'. + +# You can run this file through either pod2man or pod2html to produce pretty +# documentation in manual or html file format (these utilities are part of the +# Perl 5 distribution). + +# Copyright 1995-1999, Lincoln D. Stein. All rights reserved. +# It may be used and modified freely, but I do request that this copyright +# notice remain attached to the file. You may modify this module as you +# wish, but if you redistribute a modified version, please attach a note +# listing the modifications you have made. + +$CGI::Cookie::VERSION='1.29'; + +use CGI::Util qw(rearrange unescape escape); +use CGI; +use overload '""' => \&as_string, + 'cmp' => \&compare, + 'fallback'=>1; + +my $PERLEX = 0; +# Turn on special checking for ActiveState's PerlEx +$PERLEX++ if defined($ENV{'GATEWAY_INTERFACE'}) && $ENV{'GATEWAY_INTERFACE'} =~ /^CGI-PerlEx/; + +# Turn on special checking for Doug MacEachern's modperl +# PerlEx::DBI tries to fool DBI by setting MOD_PERL +my $MOD_PERL = 0; +if (exists $ENV{MOD_PERL} && ! $PERLEX) { + if (exists $ENV{MOD_PERL_API_VERSION} && $ENV{MOD_PERL_API_VERSION} == 2) { + $MOD_PERL = 2; + require Apache2::RequestUtil; + require APR::Table; + } else { + $MOD_PERL = 1; + require Apache; + } +} + +# fetch a list of cookies from the environment and +# return as a hash. the cookies are parsed as normal +# escaped URL data. +sub fetch { + my $class = shift; + my $raw_cookie = get_raw_cookie(@_) or return; + return $class->parse($raw_cookie); +} + +# Fetch a list of cookies from the environment or the incoming headers and +# return as a hash. The cookie values are not unescaped or altered in any way. + sub raw_fetch { + my $class = shift; + my $raw_cookie = get_raw_cookie(@_) or return; + my %results; + my($key,$value); + + my @pairs = split("[;,] ?",$raw_cookie); + foreach (@pairs) { + s/\s*(.*?)\s*/$1/; + if (/^([^=]+)=(.*)/) { + $key = $1; + $value = $2; + } + else { + $key = $_; + $value = ''; + } + $results{$key} = $value; + } + return \%results unless wantarray; + return %results; +} + +sub get_raw_cookie { + my $r = shift; + $r ||= eval { $MOD_PERL == 2 ? + Apache2::RequestUtil->request() : + Apache->request } if $MOD_PERL; + if ($r) { + $raw_cookie = $r->headers_in->{'Cookie'}; + } else { + if ($MOD_PERL && !exists $ENV{REQUEST_METHOD}) { + die "Run $r->subprocess_env; before calling fetch()"; + } + $raw_cookie = $ENV{HTTP_COOKIE} || $ENV{COOKIE}; + } +} + + +sub parse { + my ($self,$raw_cookie) = @_; + my %results; + + my @pairs = split("[;,] ?",$raw_cookie); + foreach (@pairs) { + s/\s*(.*?)\s*/$1/; + my($key,$value) = split("=",$_,2); + + # Some foreign cookies are not in name=value format, so ignore + # them. + next if !defined($value); + my @values = (); + if ($value ne '') { + @values = map unescape($_),split(/[&;]/,$value.'&dmy'); + pop @values; + } + $key = unescape($key); + # A bug in Netscape can cause several cookies with same name to + # appear. The FIRST one in HTTP_COOKIE is the most recent version. + $results{$key} ||= $self->new(-name=>$key,-value=>\@values); + } + return \%results unless wantarray; + return %results; +} + +sub new { + my $class = shift; + $class = ref($class) if ref($class); + # Ignore mod_perl request object--compatability with Apache::Cookie. + shift if ref $_[0] + && eval { $_[0]->isa('Apache::Request::Req') || $_[0]->isa('Apache') }; + my($name,$value,$path,$domain,$secure,$expires,$httponly) = + rearrange([NAME,[VALUE,VALUES],PATH,DOMAIN,SECURE,EXPIRES,HTTPONLY],@_); + + # Pull out our parameters. + my @values; + if (ref($value)) { + if (ref($value) eq 'ARRAY') { + @values = @$value; + } elsif (ref($value) eq 'HASH') { + @values = %$value; + } + } else { + @values = ($value); + } + + bless my $self = { + 'name'=>$name, + 'value'=>[@values], + },$class; + + # IE requires the path and domain to be present for some reason. + $path ||= "/"; + # however, this breaks networks which use host tables without fully qualified + # names, so we comment it out. + # $domain = CGI::virtual_host() unless defined $domain; + + $self->path($path) if defined $path; + $self->domain($domain) if defined $domain; + $self->secure($secure) if defined $secure; + $self->expires($expires) if defined $expires; + $self->httponly($httponly) if defined $httponly; +# $self->max_age($expires) if defined $expires; + return $self; +} + +sub as_string { + my $self = shift; + return "" unless $self->name; + + my(@constant_values,$domain,$path,$expires,$max_age,$secure,$httponly); + + push(@constant_values,"domain=$domain") if $domain = $self->domain; + push(@constant_values,"path=$path") if $path = $self->path; + push(@constant_values,"expires=$expires") if $expires = $self->expires; + push(@constant_values,"max-age=$max_age") if $max_age = $self->max_age; + push(@constant_values,"secure") if $secure = $self->secure; + push(@constant_values,"HttpOnly") if $httponly = $self->httponly; + + my($key) = escape($self->name); + my($cookie) = join("=",(defined $key ? $key : ''),join("&",map escape(defined $_ ? $_ : ''),$self->value)); + return join("; ",$cookie,@constant_values); +} + +sub compare { + my $self = shift; + my $value = shift; + return "$self" cmp $value; +} + +sub bake { + my ($self, $r) = @_; + + $r ||= eval { + $MOD_PERL == 2 + ? Apache2::RequestUtil->request() + : Apache->request + } if $MOD_PERL; + if ($r) { + $r->headers_out->add('Set-Cookie' => $self->as_string); + } else { + print CGI::header(-cookie => $self); + } + +} + +# accessors +sub name { + my $self = shift; + my $name = shift; + $self->{'name'} = $name if defined $name; + return $self->{'name'}; +} + +sub value { + my $self = shift; + my $value = shift; + if (defined $value) { + my @values; + if (ref($value)) { + if (ref($value) eq 'ARRAY') { + @values = @$value; + } elsif (ref($value) eq 'HASH') { + @values = %$value; + } + } else { + @values = ($value); + } + $self->{'value'} = [@values]; + } + return wantarray ? @{$self->{'value'}} : $self->{'value'}->[0] +} + +sub domain { + my $self = shift; + my $domain = shift; + $self->{'domain'} = lc $domain if defined $domain; + return $self->{'domain'}; +} + +sub secure { + my $self = shift; + my $secure = shift; + $self->{'secure'} = $secure if defined $secure; + return $self->{'secure'}; +} + +sub expires { + my $self = shift; + my $expires = shift; + $self->{'expires'} = CGI::Util::expires($expires,'cookie') if defined $expires; + return $self->{'expires'}; +} + +sub max_age { + my $self = shift; + my $expires = shift; + $self->{'max-age'} = CGI::Util::expire_calc($expires)-time() if defined $expires; + return $self->{'max-age'}; +} + +sub path { + my $self = shift; + my $path = shift; + $self->{'path'} = $path if defined $path; + return $self->{'path'}; +} + + +sub httponly { # HttpOnly + my $self = shift; + my $httponly = shift; + $self->{'httponly'} = $httponly if defined $httponly; + return $self->{'httponly'}; +} + +1; + +=head1 NAME + +CGI::Cookie - Interface to Netscape Cookies + +=head1 SYNOPSIS + + use CGI qw/:standard/; + use CGI::Cookie; + + # Create new cookies and send them + $cookie1 = new CGI::Cookie(-name=>'ID',-value=>123456); + $cookie2 = new CGI::Cookie(-name=>'preferences', + -value=>{ font => Helvetica, + size => 12 } + ); + print header(-cookie=>[$cookie1,$cookie2]); + + # fetch existing cookies + %cookies = fetch CGI::Cookie; + $id = $cookies{'ID'}->value; + + # create cookies returned from an external source + %cookies = parse CGI::Cookie($ENV{COOKIE}); + +=head1 DESCRIPTION + +CGI::Cookie is an interface to Netscape (HTTP/1.1) cookies, an +innovation that allows Web servers to store persistent information on +the browser's side of the connection. Although CGI::Cookie is +intended to be used in conjunction with CGI.pm (and is in fact used by +it internally), you can use this module independently. + +For full information on cookies see + + http://www.ics.uci.edu/pub/ietf/http/rfc2109.txt + +=head1 USING CGI::Cookie + +CGI::Cookie is object oriented. Each cookie object has a name and a +value. The name is any scalar value. The value is any scalar or +array value (associative arrays are also allowed). Cookies also have +several optional attributes, including: + +=over 4 + +=item B<1. expiration date> + +The expiration date tells the browser how long to hang on to the +cookie. If the cookie specifies an expiration date in the future, the +browser will store the cookie information in a disk file and return it +to the server every time the user reconnects (until the expiration +date is reached). If the cookie species an expiration date in the +past, the browser will remove the cookie from the disk file. If the +expiration date is not specified, the cookie will persist only until +the user quits the browser. + +=item B<2. domain> + +This is a partial or complete domain name for which the cookie is +valid. The browser will return the cookie to any host that matches +the partial domain name. For example, if you specify a domain name +of ".capricorn.com", then Netscape will return the cookie to +Web servers running on any of the machines "www.capricorn.com", +"ftp.capricorn.com", "feckless.capricorn.com", etc. Domain names +must contain at least two periods to prevent attempts to match +on top level domains like ".edu". If no domain is specified, then +the browser will only return the cookie to servers on the host the +cookie originated from. + +=item B<3. path> + +If you provide a cookie path attribute, the browser will check it +against your script's URL before returning the cookie. For example, +if you specify the path "/cgi-bin", then the cookie will be returned +to each of the scripts "/cgi-bin/tally.pl", "/cgi-bin/order.pl", and +"/cgi-bin/customer_service/complain.pl", but not to the script +"/cgi-private/site_admin.pl". By default, the path is set to "/", so +that all scripts at your site will receive the cookie. + +=item B<4. secure flag> + +If the "secure" attribute is set, the cookie will only be sent to your +script if the CGI request is occurring on a secure channel, such as SSL. + +=item B<4. httponly flag> + +If the "httponly" attribute is set, the cookie will only be accessible +through HTTP Requests. This cookie will be inaccessible via JavaScript +(to prevent XSS attacks). + +But, currently this feature only used and recognised by +MS Internet Explorer 6 Service Pack 1 and later. + +See this URL for more information: + +L + +=back + +=head2 Creating New Cookies + + my $c = new CGI::Cookie(-name => 'foo', + -value => 'bar', + -expires => '+3M', + -domain => '.capricorn.com', + -path => '/cgi-bin/database', + -secure => 1 + ); + +Create cookies from scratch with the B method. The B<-name> and +B<-value> parameters are required. The name must be a scalar value. +The value can be a scalar, an array reference, or a hash reference. +(At some point in the future cookies will support one of the Perl +object serialization protocols for full generality). + +B<-expires> accepts any of the relative or absolute date formats +recognized by CGI.pm, for example "+3M" for three months in the +future. See CGI.pm's documentation for details. + +B<-domain> points to a domain name or to a fully qualified host name. +If not specified, the cookie will be returned only to the Web server +that created it. + +B<-path> points to a partial URL on the current server. The cookie +will be returned to all URLs beginning with the specified path. If +not specified, it defaults to '/', which returns the cookie to all +pages at your site. + +B<-secure> if set to a true value instructs the browser to return the +cookie only when a cryptographic protocol is in use. + +B<-httponly> if set to a true value, the cookie will not be accessible +via JavaScript. + +For compatibility with Apache::Cookie, you may optionally pass in +a mod_perl request object as the first argument to C. It will +simply be ignored: + + my $c = new CGI::Cookie($r, + -name => 'foo', + -value => ['bar','baz']); + +=head2 Sending the Cookie to the Browser + +The simplest way to send a cookie to the browser is by calling the bake() +method: + + $c->bake; + +Under mod_perl, pass in an Apache request object: + + $c->bake($r); + +If you want to set the cookie yourself, Within a CGI script you can send +a cookie to the browser by creating one or more Set-Cookie: fields in the +HTTP header. Here is a typical sequence: + + my $c = new CGI::Cookie(-name => 'foo', + -value => ['bar','baz'], + -expires => '+3M'); + + print "Set-Cookie: $c\n"; + print "Content-Type: text/html\n\n"; + +To send more than one cookie, create several Set-Cookie: fields. + +If you are using CGI.pm, you send cookies by providing a -cookie +argument to the header() method: + + print header(-cookie=>$c); + +Mod_perl users can set cookies using the request object's header_out() +method: + + $r->headers_out->set('Set-Cookie' => $c); + +Internally, Cookie overloads the "" operator to call its as_string() +method when incorporated into the HTTP header. as_string() turns the +Cookie's internal representation into an RFC-compliant text +representation. You may call as_string() yourself if you prefer: + + print "Set-Cookie: ",$c->as_string,"\n"; + +=head2 Recovering Previous Cookies + + %cookies = fetch CGI::Cookie; + +B returns an associative array consisting of all cookies +returned by the browser. The keys of the array are the cookie names. You +can iterate through the cookies this way: + + %cookies = fetch CGI::Cookie; + foreach (keys %cookies) { + do_something($cookies{$_}); + } + +In a scalar context, fetch() returns a hash reference, which may be more +efficient if you are manipulating multiple cookies. + +CGI.pm uses the URL escaping methods to save and restore reserved characters +in its cookies. If you are trying to retrieve a cookie set by a foreign server, +this escaping method may trip you up. Use raw_fetch() instead, which has the +same semantics as fetch(), but performs no unescaping. + +You may also retrieve cookies that were stored in some external +form using the parse() class method: + + $COOKIES = `cat /usr/tmp/Cookie_stash`; + %cookies = parse CGI::Cookie($COOKIES); + +If you are in a mod_perl environment, you can save some overhead by +passing the request object to fetch() like this: + + CGI::Cookie->fetch($r); + +=head2 Manipulating Cookies + +Cookie objects have a series of accessor methods to get and set cookie +attributes. Each accessor has a similar syntax. Called without +arguments, the accessor returns the current value of the attribute. +Called with an argument, the accessor changes the attribute and +returns its new value. + +=over 4 + +=item B + +Get or set the cookie's name. Example: + + $name = $c->name; + $new_name = $c->name('fred'); + +=item B + +Get or set the cookie's value. Example: + + $value = $c->value; + @new_value = $c->value(['a','b','c','d']); + +B is context sensitive. In a list context it will return +the current value of the cookie as an array. In a scalar context it +will return the B value of a multivalued cookie. + +=item B + +Get or set the cookie's domain. + +=item B + +Get or set the cookie's path. + +=item B + +Get or set the cookie's expiration time. + +=back + + +=head1 AUTHOR INFORMATION + +Copyright 1997-1998, Lincoln D. Stein. All rights reserved. + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +Address bug reports and comments to: lstein@cshl.org + +=head1 BUGS + +This section intentionally left blank. + +=head1 SEE ALSO + +L, L + +=cut diff --git a/Master/tlpkg/tlperl.straw/lib/CGI/Fast.pm b/Master/tlpkg/tlperl.straw/lib/CGI/Fast.pm new file mode 100755 index 00000000000..67d67ee6856 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/lib/CGI/Fast.pm @@ -0,0 +1,220 @@ +package CGI::Fast; +use strict; +$^W=1; # A way to say "use warnings" that's compatible with even older perls. + +# See the bottom of this file for the POD documentation. Search for the +# string '=head'. + +# You can run this file through either pod2man or pod2html to produce pretty +# documentation in manual or html file format (these utilities are part of the +# Perl 5 distribution). + +# Copyright 1995,1996, Lincoln D. Stein. All rights reserved. +# It may be used and modified freely, but I do request that this copyright +# notice remain attached to the file. You may modify this module as you +# wish, but if you redistribute a modified version, please attach a note +# listing the modifications you have made. + +$CGI::Fast::VERSION='1.07'; + +use CGI; +use FCGI; +# use vars works like "our", but is compatible with older Perls. +use vars qw( + @ISA + $ignore +); +@ISA = ('CGI'); + +# workaround for known bug in libfcgi +while (($ignore) = each %ENV) { } + +# override the initialization behavior so that +# state is NOT maintained between invocations +sub save_request { + # no-op +} + +# If ENV{FCGI_SOCKET_PATH} is specified, we maintain a FCGI Request handle +# in this package variable. +use vars qw($Ext_Request); +BEGIN { + # If ENV{FCGI_SOCKET_PATH} is given, explicitly open the socket, + # and keep the request handle around from which to call Accept(). + if ($ENV{FCGI_SOCKET_PATH}) { + my $path = $ENV{FCGI_SOCKET_PATH}; + my $backlog = $ENV{FCGI_LISTEN_QUEUE} || 100; + my $socket = FCGI::OpenSocket( $path, $backlog ); + $Ext_Request = FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, + \%ENV, $socket, 1 ); + } +} + +# New is slightly different in that it calls FCGI's +# accept() method. +sub new { + my ($self, $initializer, @param) = @_; + unless (defined $initializer) { + if ($Ext_Request) { + return undef unless $Ext_Request->Accept() >= 0; + } else { + return undef unless FCGI::accept() >= 0; + } + } + CGI->_reset_globals; + $self->_setup_symbols(@CGI::SAVED_SYMBOLS) if @CGI::SAVED_SYMBOLS; + return $CGI::Q = $self->SUPER::new($initializer, @param); +} + +1; + +=head1 NAME + +CGI::Fast - CGI Interface for Fast CGI + +=head1 SYNOPSIS + + use CGI::Fast qw(:standard); + $COUNTER = 0; + while (new CGI::Fast) { + print header; + print start_html("Fast CGI Rocks"); + print + h1("Fast CGI Rocks"), + "Invocation number ",b($COUNTER++), + " PID ",b($$),".", + hr; + print end_html; + } + +=head1 DESCRIPTION + +CGI::Fast is a subclass of the CGI object created by CGI.pm. It is +specialized to work well FCGI module, which greatly speeds up CGI +scripts by turning them into persistently running server processes. +Scripts that perform time-consuming initialization processes, such as +loading large modules or opening persistent database connections, will +see large performance improvements. + +=head1 OTHER PIECES OF THE PUZZLE + +In order to use CGI::Fast you'll need the FCGI module. See +http://www.cpan.org/ for details. + +=head1 WRITING FASTCGI PERL SCRIPTS + +FastCGI scripts are persistent: one or more copies of the script +are started up when the server initializes, and stay around until +the server exits or they die a natural death. After performing +whatever one-time initialization it needs, the script enters a +loop waiting for incoming connections, processing the request, and +waiting some more. + +A typical FastCGI script will look like this: + + #!/usr/bin/perl + use CGI::Fast; + &do_some_initialization(); + while ($q = new CGI::Fast) { + &process_request($q); + } + +Each time there's a new request, CGI::Fast returns a +CGI object to your loop. The rest of the time your script +waits in the call to new(). When the server requests that +your script be terminated, new() will return undef. You can +of course exit earlier if you choose. A new version of the +script will be respawned to take its place (this may be +necessary in order to avoid Perl memory leaks in long-running +scripts). + +CGI.pm's default CGI object mode also works. Just modify the loop +this way: + + while (new CGI::Fast) { + &process_request; + } + +Calls to header(), start_form(), etc. will all operate on the +current request. + +=head1 INSTALLING FASTCGI SCRIPTS + +See the FastCGI developer's kit documentation for full details. On +the Apache server, the following line must be added to srm.conf: + + AddType application/x-httpd-fcgi .fcgi + +FastCGI scripts must end in the extension .fcgi. For each script you +install, you must add something like the following to srm.conf: + + FastCgiServer /usr/etc/httpd/fcgi-bin/file_upload.fcgi -processes 2 + +This instructs Apache to launch two copies of file_upload.fcgi at +startup time. + +=head1 USING FASTCGI SCRIPTS AS CGI SCRIPTS + +Any script that works correctly as a FastCGI script will also work +correctly when installed as a vanilla CGI script. However it will +not see any performance benefit. + +=head1 EXTERNAL FASTCGI SERVER INVOCATION + +FastCGI supports a TCP/IP transport mechanism which allows FastCGI scripts to run +external to the webserver, perhaps on a remote machine. To configure the +webserver to connect to an external FastCGI server, you would add the following +to your srm.conf: + + FastCgiExternalServer /usr/etc/httpd/fcgi-bin/file_upload.fcgi -host sputnik:8888 + +Two environment variables affect how the C object is created, +allowing C to be used as an external FastCGI server. (See C +documentation for C for more information.) + +=over + +=item FCGI_SOCKET_PATH + +The address (TCP/IP) or path (UNIX Domain) of the socket the external FastCGI +script to which bind an listen for incoming connections from the web server. + +=item FCGI_LISTEN_QUEUE + +Maximum length of the queue of pending connections. + +=back + +For example: + + #!/usr/local/bin/perl # must be a FastCGI version of perl! + use CGI::Fast; + &do_some_initialization(); + $ENV{FCGI_SOCKET_PATH} = "sputnik:8888"; + $ENV{FCGI_LISTEN_QUEUE} = 100; + while ($q = new CGI::Fast) { + &process_request($q); + } + +=head1 CAVEATS + +I haven't tested this very much. + +=head1 AUTHOR INFORMATION + +Copyright 1996-1998, Lincoln D. Stein. All rights reserved. + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +Address bug reports and comments to: lstein@cshl.org + +=head1 BUGS + +This section intentionally left blank. + +=head1 SEE ALSO + +L, L + +=cut diff --git a/Master/tlpkg/tlperl.straw/lib/CGI/Pretty.pm b/Master/tlpkg/tlperl.straw/lib/CGI/Pretty.pm new file mode 100755 index 00000000000..356747824d5 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/lib/CGI/Pretty.pm @@ -0,0 +1,312 @@ +package CGI::Pretty; + +# See the bottom of this file for the POD documentation. Search for the +# string '=head'. + +# You can run this file through either pod2man or pod2html to produce pretty +# documentation in manual or html file format (these utilities are part of the +# Perl 5 distribution). + +use strict; +use CGI (); + +$CGI::Pretty::VERSION = '3.46'; +$CGI::DefaultClass = __PACKAGE__; +$CGI::Pretty::AutoloadClass = 'CGI'; +@CGI::Pretty::ISA = qw( CGI ); + +initialize_globals(); + +sub _prettyPrint { + my $input = shift; + return if !$$input; + return if !$CGI::Pretty::LINEBREAK || !$CGI::Pretty::INDENT; + +# print STDERR "'", $$input, "'\n"; + + foreach my $i ( @CGI::Pretty::AS_IS ) { + if ( $$input =~ m{}si ) { + my ( $a, $b, $c ) = $$input =~ m{(.*)(<$i[\s/>].*?)(.*)}si; + next if !$b; + $a ||= ""; + $c ||= ""; + + _prettyPrint( \$a ) if $a; + _prettyPrint( \$c ) if $c; + + $b ||= ""; + $$input = "$a$b$c"; + return; + } + } + $$input =~ s/$CGI::Pretty::LINEBREAK/$CGI::Pretty::LINEBREAK$CGI::Pretty::INDENT/g; +} + +sub comment { + my($self,@p) = CGI::self_or_CGI(@_); + + my $s = "@p"; + $s =~ s/$CGI::Pretty::LINEBREAK/$CGI::Pretty::LINEBREAK$CGI::Pretty::INDENT/g if $CGI::Pretty::LINEBREAK; + + return $self->SUPER::comment( "$CGI::Pretty::LINEBREAK$CGI::Pretty::INDENT$s$CGI::Pretty::LINEBREAK" ) . $CGI::Pretty::LINEBREAK; +} + +sub _make_tag_func { + my ($self,$tagname) = @_; + + # As Lincoln as noted, the last else clause is VERY hairy, and it + # took me a while to figure out what I was trying to do. + # What it does is look for tags that shouldn't be indented (e.g. PRE) + # and makes sure that when we nest tags, those tags don't get + # indented. + # For an example, try print td( pre( "hello\nworld" ) ); + # If we didn't care about stuff like that, the code would be + # MUCH simpler. BTW: I won't claim to be a regular expression + # guru, so if anybody wants to contribute something that would + # be quicker, easier to read, etc, I would be more than + # willing to put it in - Brian + + my $func = qq" + sub $tagname {"; + + $func .= q' + shift if $_[0] && + (ref($_[0]) && + (substr(ref($_[0]),0,3) eq "CGI" || + UNIVERSAL::isa($_[0],"CGI"))); + my($attr) = ""; + if (ref($_[0]) && ref($_[0]) eq "HASH") { + my(@attr) = make_attributes(shift()||undef,1); + $attr = " @attr" if @attr; + }'; + + if ($tagname=~/start_(\w+)/i) { + $func .= qq! + return "<\L$1\E\$attr>\$CGI::Pretty::LINEBREAK";} !; + } elsif ($tagname=~/end_(\w+)/i) { + $func .= qq! + return "<\L/$1\E>\$CGI::Pretty::LINEBREAK"; } !; + } else { + $func .= qq# + return ( \$CGI::XHTML ? "<\L$tagname\E\$attr />" : "<\L$tagname\E\$attr>" ) . + \$CGI::Pretty::LINEBREAK unless \@_; + my(\$tag,\$untag) = ("<\L$tagname\E\$attr>","\E"); + + my \%ASIS = map { lc("\$_") => 1 } \@CGI::Pretty::AS_IS; + my \@args; + if ( \$CGI::Pretty::LINEBREAK || \$CGI::Pretty::INDENT ) { + if(ref(\$_[0]) eq 'ARRAY') { + \@args = \@{\$_[0]} + } else { + foreach (\@_) { + \$args[0] .= \$_; + \$args[0] .= \$CGI::Pretty::LINEBREAK if \$args[0] !~ /\$CGI::Pretty::LINEBREAK\$/ && 0; + chomp \$args[0] if exists \$ASIS{ "\L$tagname\E" }; + + \$args[0] .= \$" if \$args[0] !~ /\$CGI::Pretty::LINEBREAK\$/ && 1; + } + chop \$args[0] unless \$" eq ""; + } + } + else { + \@args = ref(\$_[0]) eq 'ARRAY' ? \@{\$_[0]} : "\@_"; + } + + my \@result; + if ( exists \$ASIS{ "\L$tagname\E" } ) { + \@result = map { "\$tag\$_\$untag" } \@args; + } + else { + \@result = map { + chomp; + my \$tmp = \$_; + CGI::Pretty::_prettyPrint( \\\$tmp ); + \$tag . \$CGI::Pretty::LINEBREAK . + \$CGI::Pretty::INDENT . \$tmp . \$CGI::Pretty::LINEBREAK . + \$untag . \$CGI::Pretty::LINEBREAK + } \@args; + } + if (\$CGI::Pretty::LINEBREAK || \$CGI::Pretty::INDENT) { + return join ("", \@result); + } else { + return "\@result"; + } + }#; + } + + return $func; +} + +sub start_html { + return CGI::start_html( @_ ) . $CGI::Pretty::LINEBREAK; +} + +sub end_html { + return CGI::end_html( @_ ) . $CGI::Pretty::LINEBREAK; +} + +sub new { + my $class = shift; + my $this = $class->SUPER::new( @_ ); + + if ($CGI::MOD_PERL) { + if ($CGI::MOD_PERL == 1) { + my $r = Apache->request; + $r->register_cleanup(\&CGI::Pretty::_reset_globals); + } + else { + my $r = Apache2::RequestUtil->request; + $r->pool->cleanup_register(\&CGI::Pretty::_reset_globals); + } + } + $class->_reset_globals if $CGI::PERLEX; + + return bless $this, $class; +} + +sub initialize_globals { + # This is the string used for indentation of tags + $CGI::Pretty::INDENT = "\t"; + + # This is the string used for seperation between tags + $CGI::Pretty::LINEBREAK = $/; + + # These tags are not prettify'd. + # When this list is updated, also update the docs. + @CGI::Pretty::AS_IS = qw( a pre code script textarea td ); + + 1; +} +sub _reset_globals { initialize_globals(); } + +# ugly, but quick fix +sub import { + my $self = shift; + no strict 'refs'; + ${ "$self\::AutoloadClass" } = 'CGI'; + + # This causes modules to clash. + undef %CGI::EXPORT; + undef %CGI::EXPORT; + + $self->_setup_symbols(@_); + my ($callpack, $callfile, $callline) = caller; + + # To allow overriding, search through the packages + # Till we find one in which the correct subroutine is defined. + my @packages = ($self,@{"$self\:\:ISA"}); + foreach my $sym (keys %CGI::EXPORT) { + my $pck; + my $def = ${"$self\:\:AutoloadClass"} || $CGI::DefaultClass; + foreach $pck (@packages) { + if (defined(&{"$pck\:\:$sym"})) { + $def = $pck; + last; + } + } + *{"${callpack}::$sym"} = \&{"$def\:\:$sym"}; + } +} + +1; + +=head1 NAME + +CGI::Pretty - module to produce nicely formatted HTML code + +=head1 SYNOPSIS + + use CGI::Pretty qw( :html3 ); + + # Print a table with a single data element + print table( TR( td( "foo" ) ) ); + +=head1 DESCRIPTION + +CGI::Pretty is a module that derives from CGI. It's sole function is to +allow users of CGI to output nicely formatted HTML code. + +When using the CGI module, the following code: + print table( TR( td( "foo" ) ) ); + +produces the following output: +
foo
+ +If a user were to create a table consisting of many rows and many columns, +the resultant HTML code would be quite difficult to read since it has no +carriage returns or indentation. + +CGI::Pretty fixes this problem. What it does is add a carriage +return and indentation to the HTML code so that one can easily read +it. + + print table( TR( td( "foo" ) ) ); + +now produces the following output: + + + + +
foo
+ +=head2 Recommendation for when to use CGI::Pretty + +CGI::Pretty is far slower than using CGI.pm directly. A benchmark showed that +it could be about 10 times slower. Adding newslines and spaces may alter the +rendered appearance of HTML. Also, the extra newlines and spaces also make the +file size larger, making the files take longer to download. + +With all those considerations, it is recommended that CGI::Pretty be used +primarily for debugging. + +=head2 Tags that won't be formatted + +The following tags are not formatted: ,
, , \n],
+      $self->html_javascript,
+    );
+    $after =~ s{()}{$link\n$1}i;  # otherwise nevermind
+  }
+
+  print {$self->{'output_fh'}}
+    $self->html_header_before_title || '',
+    $title, # already escaped
+    $after,
+  ;
+
+  DEBUG and print "Returning from do_beginning...\n";
+  return 1;
+}
+
+sub _add_top_anchor {
+  my($self, $text_r) = @_;
+  unless($$text_r and $$text_r =~ m/name=['"]___top['"]/) { # a hack
+    $$text_r .= "\n";
+  }
+  return;
+}
+
+sub version_tag_comment {
+  my $self = shift;
+  return sprintf
+   "\n",
+   esc(
+    ref($self), $self->VERSION(), $ISA[0], $ISA[0]->VERSION(),
+    $], scalar(gmtime),
+   ), $self->_modnote(),
+  ;
+}
+
+sub _modnote {
+  my $class = ref($_[0]) || $_[0];
+  return join "\n   " => grep m/\S/, split "\n",
+
+qq{
+If you want to change this HTML document, you probably shouldn't do that
+by changing it directly.  Instead, see about changing the calling options
+to $class, and/or subclassing $class,
+then reconverting this document from the Pod source.
+When in doubt, email the author of $class for advice.
+See 'perldoc $class' for more info.
+};
+
+}
+
+sub do_end {
+  my $self = $_[0];
+  print {$self->{'output_fh'}}  $self->html_footer || '';
+  return 1;
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# Normally this would just be a call to _do_middle_main_loop -- but we
+#  have to do some elaborate things to emit all the content and then
+#  summarize it and output it /before/ the content that it's a summary of.
+
+sub do_middle {
+  my $self = $_[0];
+  return $self->_do_middle_main_loop unless $self->index;
+
+  if( $self->output_string ) {
+    # An efficiency hack
+    my $out = $self->output_string; #it's a reference to it
+    my $sneakytag = "\f\f\e\e\b\bIndex Here\e\e\b\b\f\f\n";
+    $$out .= $sneakytag;
+    $self->_do_middle_main_loop;
+    $sneakytag = quotemeta($sneakytag);
+    my $index = $self->index_as_html();
+    if( $$out =~ s/$sneakytag/$index/s ) {
+      # Expected case
+      DEBUG and print "Inserted ", length($index), " bytes of index HTML into $out.\n";
+    } else {
+      DEBUG and print "Odd, couldn't find where to insert the index in the output!\n";
+      # I don't think this should ever happen.
+    }
+    return 1;
+  }
+
+  unless( $self->output_fh ) {
+    require Carp;
+    Carp::confess("Parser object \$p doesn't seem to have any output object!  I don't know how to deal with that.");
+  }
+
+  # If we get here, we're outputting to a FH.  So we need to do some magic.
+  # Namely, divert all content to a string, which we output after the index.
+  my $fh = $self->output_fh;
+  my $content = '';
+  {
+    # Our horrible bait and switch:
+    $self->output_string( \$content );
+    $self->_do_middle_main_loop;
+    $self->abandon_output_string();
+    $self->output_fh($fh);
+  }
+  print $fh $self->index_as_html();
+  print $fh $content;
+
+  return 1;
+}
+
+###########################################################################
+
+sub index_as_html {
+  my $self = $_[0];
+  # This is meant to be called AFTER the input document has been parsed!
+
+  my $points = $self->{'PSHTML_index_points'} || [];
+  
+  @$points > 1 or return qq[
\n]; + # There's no point in having a 0-item or 1-item index, I dare say. + + my(@out) = qq{\n
}; + my $level = 0; + + my( $target_level, $previous_tagname, $tagname, $text, $anchorname, $indent); + foreach my $p (@$points, ['head0', '(end)']) { + ($tagname, $text) = @$p; + $anchorname = $self->section_escape($text); + if( $tagname =~ m{^head(\d+)$} ) { + $target_level = 0 + $1; + } else { # must be some kinda list item + if($previous_tagname =~ m{^head\d+$} ) { + $target_level = $level + 1; + } else { + $target_level = $level; # no change needed + } + } + + # Get to target_level by opening or closing ULs + while($level > $target_level) + { --$level; push @out, (" " x $level) . ""; } + while($level < $target_level) + { ++$level; push @out, (" " x ($level-1)) + . "
    "; } + + $previous_tagname = $tagname; + next unless $level; + + $indent = ' ' x $level; + push @out, sprintf + "%s
  • %s", + $indent, $level, esc($anchorname), esc($text) + ; + } + push @out, "
\n"; + return join "\n", @out; +} + +########################################################################### + +sub _do_middle_main_loop { + my $self = $_[0]; + my $fh = $self->{'output_fh'}; + my $tagmap = $self->{'Tagmap'}; + + $self->__adjust_html_h_levels; + + my($token, $type, $tagname, $linkto, $linktype); + my @stack; + my $dont_wrap = 0; + + while($token = $self->get_token) { + + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + if( ($type = $token->type) eq 'start' ) { + if(($tagname = $token->tagname) eq 'L') { + $linktype = $token->attr('type') || 'insane'; + + $linkto = $self->do_link($token); + + if(defined $linkto and length $linkto) { + esc($linkto); + # (Yes, SGML-escaping applies on top of %-escaping! + # But it's rarely noticeable in practice.) + print $fh qq{}; + } else { + print $fh ""; # Yes, an 'a' element with no attributes! + } + + } elsif ($tagname eq 'item-text' or $tagname =~ m/^head\d$/s) { + print $fh $tagmap->{$tagname} || next; + + my @to_unget; + while(1) { + push @to_unget, $self->get_token; + last if $to_unget[-1]->is_end + and $to_unget[-1]->tagname eq $tagname; + + # TODO: support for X<...>'s found in here? (maybe hack into linearize_tokens) + } + + my $name = $self->linearize_tokens(@to_unget); + $name = $self->do_section($name, $token) if defined $name; + + print $fh "section_name_tidy( $name ) ); + print $fh qq[name="$esc"]; + DEBUG and print "Linearized ", scalar(@to_unget), + " tokens as \"$name\".\n"; + push @{ $self->{'PSHTML_index_points'} }, [$tagname, $name] + if $ToIndex{ $tagname }; + # Obviously, this discards all formatting codes (saving + # just their content), but ahwell. + + } else { # ludicrously long, so nevermind + DEBUG and print "Linearized ", scalar(@to_unget), + " tokens, but it was too long, so nevermind.\n"; + } + print $fh "\n>"; + $self->unget_token(@to_unget); + + } elsif ($tagname eq 'Data') { + my $next = $self->get_token; + next unless defined $next; + unless( $next->type eq 'text' ) { + $self->unget_token($next); + next; + } + DEBUG and print " raw text ", $next->text, "\n"; + print $fh "\n" . $next->text . "\n"; + next; + + } else { + if( $tagname =~ m/^over-/s ) { + push @stack, ''; + } elsif( $tagname =~ m/^item-/s and @stack and $stack[-1] ) { + print $fh $stack[-1]; + $stack[-1] = ''; + } + print $fh $tagmap->{$tagname} || next; + ++$dont_wrap if $tagname eq 'Verbatim' or $tagname eq "VerbatimFormatted" + or $tagname eq 'X'; + } + + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + } elsif( $type eq 'end' ) { + if( ($tagname = $token->tagname) =~ m/^over-/s ) { + if( my $end = pop @stack ) { + print $fh $end; + } + } elsif( $tagname =~ m/^item-/s and @stack) { + $stack[-1] = $tagmap->{"/$tagname"}; + if( $tagname eq 'item-text' and defined(my $next = $self->get_token) ) { + $self->unget_token($next); + if( $next->type eq 'start' ) { + print $fh $tagmap->{"/item-text"},$tagmap->{"item-body"}; + $stack[-1] = $tagmap->{"/item-body"}; + } + } + next; + } + print $fh $tagmap->{"/$tagname"} || next; + --$dont_wrap if $tagname eq 'Verbatim' or $tagname eq 'X'; + + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + } elsif( $type eq 'text' ) { + esc($type = $token->text); # reuse $type, why not + $type =~ s/([\?\!\"\'\.\,]) /$1\n/g unless $dont_wrap; + print $fh $type; + } + + } + return 1; +} + +########################################################################### +# + +sub do_section { + my($self, $name, $token) = @_; + return $name; +} + +sub do_link { + my($self, $token) = @_; + my $type = $token->attr('type'); + if(!defined $type) { + $self->whine("Typeless L!?", $token->attr('start_line')); + } elsif( $type eq 'pod') { return $self->do_pod_link($token); + } elsif( $type eq 'url') { return $self->do_url_link($token); + } elsif( $type eq 'man') { return $self->do_man_link($token); + } else { + $self->whine("L of unknown type $type!?", $token->attr('start_line')); + } + return 'FNORG'; # should never get called +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub do_url_link { return $_[1]->attr('to') } + +sub do_man_link { + my ($self, $link) = @_; + my $to = $link->attr('to'); + my $frag = $link->attr('section'); + + return undef unless defined $to and length $to; # should never happen + + $frag = $self->section_escape($frag) + if defined $frag and length($frag .= ''); # (stringify) + + DEBUG and print "Resolving \"$to/$frag\"\n\n"; + + return $self->resolve_man_page_link($to, $frag); +} + + +sub do_pod_link { + # And now things get really messy... + my($self, $link) = @_; + my $to = $link->attr('to'); + my $section = $link->attr('section'); + return undef unless( # should never happen + (defined $to and length $to) or + (defined $section and length $section) + ); + + $section = $self->section_escape($section) + if defined $section and length($section .= ''); # (stringify) + + DEBUG and printf "Resolving \"%s\" \"%s\"...\n", + $to || "(nil)", $section || "(nil)"; + + { + # An early hack: + my $complete_url = $self->resolve_pod_link_by_table($to, $section); + if( $complete_url ) { + DEBUG > 1 and print "resolve_pod_link_by_table(T,S) gives ", + $complete_url, "\n (Returning that.)\n"; + return $complete_url; + } else { + DEBUG > 4 and print " resolve_pod_link_by_table(T,S)", + " didn't return anything interesting.\n"; + } + } + + if(defined $to and length $to) { + # Give this routine first hack again + my $there = $self->resolve_pod_link_by_table($to); + if(defined $there and length $there) { + DEBUG > 1 + and print "resolve_pod_link_by_table(T) gives $there\n"; + } else { + $there = + $self->resolve_pod_page_link($to, $section); + # (I pass it the section value, but I don't see a + # particular reason it'd use it.) + DEBUG > 1 and print "resolve_pod_page_link gives ", $to || "(nil)", "\n"; + unless( defined $there and length $there ) { + DEBUG and print "Can't resolve $to\n"; + return undef; + } + # resolve_pod_page_link returning undef is how it + # can signal that it gives up on making a link + } + $to = $there; + } + + #DEBUG and print "So far [", $to||'nil', "] [", $section||'nil', "]\n"; + + my $out = (defined $to and length $to) ? $to : ''; + $out .= "#" . $section if defined $section and length $section; + + unless(length $out) { # sanity check + DEBUG and printf "Oddly, couldn't resolve \"%s\" \"%s\"...\n", + $to || "(nil)", $section || "(nil)"; + return undef; + } + + DEBUG and print "Resolved to $out\n"; + return $out; +} + + +# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + +sub section_escape { + my($self, $section) = @_; + return $self->section_url_escape( + $self->section_name_tidy($section) + ); +} + +sub section_name_tidy { + my($self, $section) = @_; + $section =~ tr/ /_/; + $section =~ tr/\x00-\x1F\x80-\x9F//d if 'A' eq chr(65); # drop crazy characters + $section = $self->unicode_escape_url($section); + $section = '_' unless length $section; + return $section; +} + +sub section_url_escape { shift->general_url_escape(@_) } +sub pagepath_url_escape { shift->general_url_escape(@_) } +sub manpage_url_escape { shift->general_url_escape(@_) } + +sub general_url_escape { + my($self, $string) = @_; + + $string =~ s/([^\x00-\xFF])/join '', map sprintf('%%%02X',$_), unpack 'C*', $1/eg; + # express Unicode things as urlencode(utf(orig)). + + # A pretty conservative escaping, behoovey even for query components + # of a URL (see RFC 2396) + + $string =~ s/([^-_\.!~*()abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789])/sprintf('%%%02X',ord($1))/eg; + # Yes, stipulate the list without a range, so that this can work right on + # all charsets that this module happens to run under. + # Altho, hmm, what about that ord? Presumably that won't work right + # under non-ASCII charsets. Something should be done + # about that, I guess? + + return $string; +} + +#-------------------------------------------------------------------------- +# +# Oh look, a yawning portal to Hell! Let's play touch football right by it! +# + +sub resolve_pod_page_link { + # resolve_pod_page_link must return a properly escaped URL + my $self = shift; + return $self->batch_mode() + ? $self->resolve_pod_page_link_batch_mode(@_) + : $self->resolve_pod_page_link_singleton_mode(@_) + ; +} + +sub resolve_pod_page_link_singleton_mode { + my($self, $it) = @_; + return undef unless defined $it and length $it; + my $url = $self->pagepath_url_escape($it); + + $url =~ s{::$}{}s; # probably never comes up anyway + $url =~ s{::}{/}g unless $self->perldoc_url_prefix =~ m/\?/s; # sane DWIM? + + return undef unless length $url; + return $self->perldoc_url_prefix . $url . $self->perldoc_url_postfix; +} + +sub resolve_pod_page_link_batch_mode { + my($self, $to) = @_; + DEBUG > 1 and print " During batch mode, resolving $to ...\n"; + my @path = grep length($_), split m/::/s, $to, -1; + unless( @path ) { # sanity + DEBUG and print "Very odd! Splitting $to gives (nil)!\n"; + return undef; + } + $self->batch_mode_rectify_path(\@path); + my $out = join('/', map $self->pagepath_url_escape($_), @path) + . $HTML_EXTENSION; + DEBUG > 1 and print " => $out\n"; + return $out; +} + +sub batch_mode_rectify_path { + my($self, $pathbits) = @_; + my $level = $self->batch_mode_current_level; + $level--; # how many levels up to go to get to the root + if($level < 1) { + unshift @$pathbits, '.'; # just to be pretty + } else { + unshift @$pathbits, ('..') x $level; + } + return; +} + +sub resolve_man_page_link { + my ($self, $to, $frag) = @_; + my ($page, $section) = $to =~ /^([^(]+)(?:[(](\d+)[)])?$/; + + return undef unless defined $page and length $page; + $section ||= 1; + + return $self->man_url_prefix . "$section/" + . $self->manpage_url_escape($page) + . $self->man_url_postfix; +} + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +sub resolve_pod_link_by_table { + # A crazy hack to allow specifying custom L => URL mappings + + return unless $_[0]->{'podhtml_LOT'}; # An optimizy shortcut + + my($self, $to, $section) = @_; + + # TODO: add a method that actually populates podhtml_LOT from a file? + + if(defined $section) { + $to = '' unless defined $to and length $to; + return $self->{'podhtml_LOT'}{"$to#$section"}; # quite possibly undef! + } else { + return $self->{'podhtml_LOT'}{$to}; # quite possibly undef! + } + return; +} + +########################################################################### + +sub linearize_tokens { # self, tokens + my $self = shift; + my $out = ''; + + my $t; + while($t = shift @_) { + if(!ref $t or !UNIVERSAL::can($t, 'is_text')) { + $out .= $t; # a string, or some insane thing + } elsif($t->is_text) { + $out .= $t->text; + } elsif($t->is_start and $t->tag eq 'X') { + # Ignore until the end of this X<...> sequence: + my $x_open = 1; + while($x_open) { + next if( ($t = shift @_)->is_text ); + if( $t->is_start and $t->tag eq 'X') { ++$x_open } + elsif($t->is_end and $t->tag eq 'X') { --$x_open } + } + } + } + return undef if length $out > $Linearization_Limit; + return $out; +} + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +sub unicode_escape_url { + my($self, $string) = @_; + $string =~ s/([^\x00-\xFF])/'('.ord($1).')'/eg; + # Turn char 1234 into "(1234)" + return $string; +} + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +sub esc { # a function. + if(defined wantarray) { + if(wantarray) { + @_ = splice @_; # break aliasing + } else { + my $x = shift; + $x =~ s/([^-\n\t !\#\$\%\(\)\*\+,\.\~\/\:\;=\?\@\[\\\]\^_\`\{\|\}abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789])/'&#'.(ord($1)).';'/eg; + return $x; + } + } + foreach my $x (@_) { + # Escape things very cautiously: + $x =~ s/([^-\n\t !\#\$\%\(\)\*\+,\.\~\/\:\;=\?\@\[\\\]\^_\`\{\|\}abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789])/'&#'.(ord($1)).';'/eg + if defined $x; + # Leave out "- so that "--" won't make it thru in X-generated comments + # with text in them. + + # Yes, stipulate the list without a range, so that this can work right on + # all charsets that this module happens to run under. + # Altho, hmm, what about that ord? Presumably that won't work right + # under non-ASCII charsets. Something should be done about that. + } + return @_; +} + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +1; +__END__ + +=head1 NAME + +Pod::Simple::HTML - convert Pod to HTML + +=head1 SYNOPSIS + + perl -MPod::Simple::HTML -e Pod::Simple::HTML::go thingy.pod + + +=head1 DESCRIPTION + +This class is for making an HTML rendering of a Pod document. + +This is a subclass of L and inherits all its +methods (and options). + +Note that if you want to do a batch conversion of a lot of Pod +documents to HTML, you should see the module L. + + + +=head1 CALLING FROM THE COMMAND LINE + +TODO + + perl -MPod::Simple::HTML -e Pod::Simple::HTML::go Thing.pod Thing.html + + + +=head1 CALLING FROM PERL + +TODO make a new object, set any options, and use parse_from_file + + +=head1 METHODS + +TODO +all (most?) accessorized methods + + +=head1 SUBCLASSING + +TODO + + can just set any of: html_css html_javascript title_prefix + 'html_header_before_title', + 'html_header_after_title', + 'html_footer', + +maybe override do_pod_link + +maybe override do_beginning do_end + +=head1 SEE ALSO + +L, L + +TODO: a corpus of sample Pod input and HTML output? Or common +idioms? + +=head1 SUPPORT + +Questions or discussion about POD and Pod::Simple should be sent to the +pod-people@perl.org mail list. Send an empty email to +pod-people-subscribe@perl.org to subscribe. + +This module is managed in an open GitHub repository, +L. Feel free to fork and contribute, or +to clone L and send patches! + +Patches against Pod::Simple are welcome. Please send bug reports to +. + +=head1 COPYRIGHT AND DISCLAIMERS + +Copyright (c) 2002-2004 Sean M. Burke. + +This library is free software; you can redistribute it and/or modify it +under the same terms as Perl itself. + +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. + +=head1 ACKNOWLEDGEMENTS + +Thanks to L for permission to use its +L site for man page links. + +Thanks to L for permission to use the +site for Perl module links. + +=head1 AUTHOR + +Pod::Simple was created by Sean M. Burke . +But don't bother him, he's retired. + +Pod::Simple is maintained by: + +=over + +=item * Allison Randal C + +=item * Hans Dieter Pearcey C + +=item * David E. Wheeler C + +=back + +=cut diff --git a/Master/tlpkg/tlperl.straw/lib/Pod/Simple/HTMLBatch.pm b/Master/tlpkg/tlperl.straw/lib/Pod/Simple/HTMLBatch.pm new file mode 100755 index 00000000000..736ff53bcc1 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/lib/Pod/Simple/HTMLBatch.pm @@ -0,0 +1,1372 @@ + +require 5; +package Pod::Simple::HTMLBatch; +use strict; +use vars qw( $VERSION $HTML_RENDER_CLASS $HTML_EXTENSION + $CSS $JAVASCRIPT $SLEEPY $SEARCH_CLASS @ISA +); +$VERSION = '3.13'; +@ISA = (); # Yup, we're NOT a subclass of Pod::Simple::HTML! + +# TODO: nocontents stylesheets. Strike some of the color variations? + +use Pod::Simple::HTML (); +BEGIN {*esc = \&Pod::Simple::HTML::esc } +use File::Spec (); +use UNIVERSAL (); + # "Isn't the Universe an amazing place? I wouldn't live anywhere else!" + +use Pod::Simple::Search; +$SEARCH_CLASS ||= 'Pod::Simple::Search'; + +BEGIN { + if(defined &DEBUG) { } # no-op + elsif( defined &Pod::Simple::DEBUG ) { *DEBUG = \&Pod::Simple::DEBUG } + else { *DEBUG = sub () {0}; } +} + +$SLEEPY = 1 if !defined $SLEEPY and $^O =~ /mswin|mac/i; +# flag to occasionally sleep for $SLEEPY - 1 seconds. + +$HTML_RENDER_CLASS ||= "Pod::Simple::HTML"; + +# +# Methods beginning with "_" are particularly internal and possibly ugly. +# + +Pod::Simple::_accessorize( __PACKAGE__, + 'verbose', # how verbose to be during batch conversion + 'html_render_class', # what class to use to render + 'search_class', # what to use to search for POD documents + 'contents_file', # If set, should be the name of a file (in current directory) + # to write the list of all modules to + 'index', # will set $htmlpage->index(...) to this (true or false) + 'progress', # progress object + 'contents_page_start', 'contents_page_end', + + 'css_flurry', '_css_wad', 'javascript_flurry', '_javascript_wad', + 'no_contents_links', # set to true to suppress automatic adding of << links. + '_contents', +); + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +# Just so we can run from the command line more easily +sub go { + @ARGV == 2 or die sprintf( + "Usage: perl -M%s -e %s:go indirs outdir\n (or use \"\@INC\" for indirs)\n", + __PACKAGE__, __PACKAGE__, + ); + + if(defined($ARGV[1]) and length($ARGV[1])) { + my $d = $ARGV[1]; + -e $d or die "I see no output directory named \"$d\"\nAborting"; + -d $d or die "But \"$d\" isn't a directory!\nAborting"; + -w $d or die "Directory \"$d\" isn't writeable!\nAborting"; + } + + __PACKAGE__->batch_convert(@ARGV); +} +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +sub new { + my $new = bless {}, ref($_[0]) || $_[0]; + $new->html_render_class($HTML_RENDER_CLASS); + $new->search_class($SEARCH_CLASS); + $new->verbose(1 + DEBUG); + $new->_contents([]); + + $new->index(1); + + $new-> _css_wad([]); $new->css_flurry(1); + $new->_javascript_wad([]); $new->javascript_flurry(1); + + $new->contents_file( + 'index' . ($HTML_EXTENSION || $Pod::Simple::HTML::HTML_EXTENSION) + ); + + $new->contents_page_start( join "\n", grep $_, + $Pod::Simple::HTML::Doctype_decl, + "", + "Perl Documentation", + $Pod::Simple::HTML::Content_decl, + "", + "\n\n

Perl Documentation

\n" + ); # override if you need a different title + + + $new->contents_page_end( sprintf( + "\n\n

Generated by %s v%s under Perl v%s\n
At %s GMT, which is %s local time.

\n\n\n", + esc( + ref($new), + eval {$new->VERSION} || $VERSION, + $], scalar(gmtime), scalar(localtime), + ))); + + return $new; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub muse { + my $self = shift; + if($self->verbose) { + print 'T+', int(time() - $self->{'_batch_start_time'}), "s: ", @_, "\n"; + } + return 1; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub batch_convert { + my($self, $dirs, $outdir) = @_; + $self ||= __PACKAGE__; # tolerate being called as an optionless function + $self = $self->new unless ref $self; # tolerate being used as a class method + + if(!defined($dirs) or $dirs eq '' or $dirs eq '@INC' ) { + $dirs = ''; + } elsif(ref $dirs) { + # OK, it's an explicit set of dirs to scan, specified as an arrayref. + } else { + # OK, it's an explicit set of dirs to scan, specified as a + # string like "/thing:/also:/whatever/perl" (":"-delim, as usual) + # or, under MSWin, like "c:/thing;d:/also;c:/whatever/perl" (";"-delim!) + require Config; + my $ps = quotemeta( $Config::Config{'path_sep'} || ":" ); + $dirs = [ grep length($_), split qr/$ps/, $dirs ]; + } + + $outdir = $self->filespecsys->curdir + unless defined $outdir and length $outdir; + + $self->_batch_convert_main($dirs, $outdir); +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub _batch_convert_main { + my($self, $dirs, $outdir) = @_; + # $dirs is either false, or an arrayref. + # $outdir is a pathspec. + + $self->{'_batch_start_time'} ||= time(); + + $self->muse( "= ", scalar(localtime) ); + $self->muse( "Starting batch conversion to \"$outdir\"" ); + + my $progress = $self->progress; + if(!$progress and $self->verbose > 0 and $self->verbose() <= 5) { + require Pod::Simple::Progress; + $progress = Pod::Simple::Progress->new( + ($self->verbose < 2) ? () # Default omission-delay + : ($self->verbose == 2) ? 1 # Reduce the omission-delay + : 0 # Eliminate the omission-delay + ); + $self->progress($progress); + } + + if($dirs) { + $self->muse(scalar(@$dirs), " dirs to scan: @$dirs"); + } else { + $self->muse("Scanning \@INC. This could take a minute or two."); + } + my $mod2path = $self->find_all_pods($dirs ? $dirs : ()); + $self->muse("Done scanning."); + + my $total = keys %$mod2path; + unless($total) { + $self->muse("No pod found. Aborting batch conversion.\n"); + return $self; + } + + $progress and $progress->goal($total); + $self->muse("Now converting pod files to HTML.", + ($total > 25) ? " This will take a while more." : () + ); + + $self->_spray_css( $outdir ); + $self->_spray_javascript( $outdir ); + + $self->_do_all_batch_conversions($mod2path, $outdir); + + $progress and $progress->done(sprintf ( + "Done converting %d files.", $self->{"__batch_conv_page_count"} + )); + return $self->_batch_convert_finish($outdir); + return $self; +} + + +sub _do_all_batch_conversions { + my($self, $mod2path, $outdir) = @_; + $self->{"__batch_conv_page_count"} = 0; + + foreach my $module (sort {lc($a) cmp lc($b)} keys %$mod2path) { + $self->_do_one_batch_conversion($module, $mod2path, $outdir); + sleep($SLEEPY - 1) if $SLEEPY; + } + + return; +} + +sub _batch_convert_finish { + my($self, $outdir) = @_; + $self->write_contents_file($outdir); + $self->muse("Done with batch conversion. $$self{'__batch_conv_page_count'} files done."); + $self->muse( "= ", scalar(localtime) ); + $self->progress and $self->progress->done("All done!"); + return; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub _do_one_batch_conversion { + my($self, $module, $mod2path, $outdir, $outfile) = @_; + + my $retval; + my $total = scalar keys %$mod2path; + my $infile = $mod2path->{$module}; + my @namelets = grep m/\S/, split "::", $module; + # this can stick around in the contents LoL + my $depth = scalar @namelets; + die "Contentless thingie?! $module $infile" unless @namelets; #sanity + + $outfile ||= do { + my @n = @namelets; + $n[-1] .= $HTML_EXTENSION || $Pod::Simple::HTML::HTML_EXTENSION; + $self->filespecsys->catfile( $outdir, @n ); + }; + + my $progress = $self->progress; + + my $page = $self->html_render_class->new; + if(DEBUG > 5) { + $self->muse($self->{"__batch_conv_page_count"} + 1, "/$total: ", + ref($page), " render ($depth) $module => $outfile"); + } elsif(DEBUG > 2) { + $self->muse($self->{"__batch_conv_page_count"} + 1, "/$total: $module => $outfile") + } + + # Give each class a chance to init the converter: + $page->batch_mode_page_object_init($self, $module, $infile, $outfile, $depth) + if $page->can('batch_mode_page_object_init'); + # Init for the index (TOC), too. + $self->batch_mode_page_object_init($page, $module, $infile, $outfile, $depth) + if $self->can('batch_mode_page_object_init'); + + # Now get busy... + $self->makepath($outdir => \@namelets); + + $progress and $progress->reach($self->{"__batch_conv_page_count"}, "Rendering $module"); + + if( $retval = $page->parse_from_file($infile, $outfile) ) { + ++ $self->{"__batch_conv_page_count"} ; + $self->note_for_contents_file( \@namelets, $infile, $outfile ); + } else { + $self->muse("Odd, parse_from_file(\"$infile\", \"$outfile\") returned false."); + } + + $page->batch_mode_page_object_kill($self, $module, $infile, $outfile, $depth) + if $page->can('batch_mode_page_object_kill'); + # The following isn't a typo. Note that it switches $self and $page. + $self->batch_mode_page_object_kill($page, $module, $infile, $outfile, $depth) + if $self->can('batch_mode_page_object_kill'); + + DEBUG > 4 and printf "%s %sb < $infile %s %sb\n", + $outfile, -s $outfile, $infile, -s $infile + ; + + undef($page); + return $retval; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +sub filespecsys { $_[0]{'_filespecsys'} || 'File::Spec' } + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub note_for_contents_file { + my($self, $namelets, $infile, $outfile) = @_; + + # I think the infile and outfile parts are never used. -- SMB + # But it's handy to have them around for debugging. + + if( $self->contents_file ) { + my $c = $self->_contents(); + push @$c, + [ join("::", @$namelets), $infile, $outfile, $namelets ] + # 0 1 2 3 + ; + DEBUG > 3 and print "Noting @$c[-1]\n"; + } + return; +} + +#_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_- + +sub write_contents_file { + my($self, $outdir) = @_; + my $outfile = $self->_contents_filespec($outdir) || return; + + $self->muse("Preparing list of modules for ToC"); + + my($toplevel, # maps toplevelbit => [all submodules] + $toplevel_form_freq, # ends up being 'foo' => 'Foo' + ) = $self->_prep_contents_breakdown; + + my $Contents = eval { $self->_wopen($outfile) }; + if( $Contents ) { + $self->muse( "Writing contents file $outfile" ); + } else { + warn "Couldn't write-open contents file $outfile: $!\nAbort writing to $outfile at all"; + return; + } + + $self->_write_contents_start( $Contents, $outfile, ); + $self->_write_contents_middle( $Contents, $outfile, $toplevel, $toplevel_form_freq ); + $self->_write_contents_end( $Contents, $outfile, ); + return $outfile; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub _write_contents_start { + my($self, $Contents, $outfile) = @_; + my $starter = $self->contents_page_start || ''; + + { + my $css_wad = $self->_css_wad_to_markup(1); + if( $css_wad ) { + $starter =~ s{()}{\n$css_wad\n$1}i; # otherwise nevermind + } + + my $javascript_wad = $self->_javascript_wad_to_markup(1); + if( $javascript_wad ) { + $starter =~ s{()}{\n$javascript_wad\n$1}i; # otherwise nevermind + } + } + + unless(print $Contents $starter, "
\n" ) { + warn "Couldn't print to $outfile: $!\nAbort writing to $outfile at all"; + close($Contents); + return 0; + } + return 1; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub _write_contents_middle { + my($self, $Contents, $outfile, $toplevel2submodules, $toplevel_form_freq) = @_; + + foreach my $t (sort keys %$toplevel2submodules) { + my @downlines = sort {$a->[-1] cmp $b->[-1]} + @{ $toplevel2submodules->{$t} }; + + printf $Contents qq[
%s
\n
\n], + esc( $t, $toplevel_form_freq->{$t} ) + ; + + my($path, $name); + foreach my $e (@downlines) { + $name = $e->[0]; + $path = join( "/", '.', esc( @{$e->[3]} ) ) + . ($HTML_EXTENSION || $Pod::Simple::HTML::HTML_EXTENSION); + print $Contents qq{ }, esc($name), "  \n"; + } + print $Contents "
\n\n"; + } + return 1; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub _write_contents_end { + my($self, $Contents, $outfile) = @_; + unless( + print $Contents "
\n", + $self->contents_page_end || '', + ) { + warn "Couldn't write to $outfile: $!"; + } + close($Contents) or warn "Couldn't close $outfile: $!"; + return 1; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub _prep_contents_breakdown { + my($self) = @_; + my $contents = $self->_contents; + my %toplevel; # maps lctoplevelbit => [all submodules] + my %toplevel_form_freq; # ends up being 'foo' => 'Foo' + # (mapping anycase forms to most freq form) + + foreach my $entry (@$contents) { + my $toplevel = + $entry->[0] =~ m/^perl\w*$/ ? 'perl_core_docs' + # group all the perlwhatever docs together + : $entry->[3][0] # normal case + ; + ++$toplevel_form_freq{ lc $toplevel }{ $toplevel }; + push @{ $toplevel{ lc $toplevel } }, $entry; + push @$entry, lc($entry->[0]); # add a sort-order key to the end + } + + foreach my $toplevel (sort keys %toplevel) { + my $fgroup = $toplevel_form_freq{$toplevel}; + $toplevel_form_freq{$toplevel} = + ( + sort { $fgroup->{$b} <=> $fgroup->{$a} or $a cmp $b } + keys %$fgroup + # This hash is extremely unlikely to have more than 4 members, so this + # sort isn't so very wasteful + )[0]; + } + + return(\%toplevel, \%toplevel_form_freq) if wantarray; + return \%toplevel; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub _contents_filespec { + my($self, $outdir) = @_; + my $outfile = $self->contents_file; + return unless $outfile; + return $self->filespecsys->catfile( $outdir, $outfile ); +} + +#_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_- + +sub makepath { + my($self, $outdir, $namelets) = @_; + return unless @$namelets > 1; + for my $i (0 .. ($#$namelets - 1)) { + my $dir = $self->filespecsys->catdir( $outdir, @$namelets[0 .. $i] ); + if(-e $dir) { + die "$dir exists but not as a directory!?" unless -d $dir; + next; + } + DEBUG > 3 and print " Making $dir\n"; + mkdir $dir, 0777 + or die "Can't mkdir $dir: $!\nAborting" + ; + } + return; +} + +#_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_- + +sub batch_mode_page_object_init { + my $self = shift; + my($page, $module, $infile, $outfile, $depth) = @_; + + # TODO: any further options to percolate onto this new object here? + + $page->default_title($module); + $page->index( $self->index ); + + $page->html_css( $self-> _css_wad_to_markup($depth) ); + $page->html_javascript( $self->_javascript_wad_to_markup($depth) ); + + $self->add_header_backlink($page, $module, $infile, $outfile, $depth); + $self->add_footer_backlink($page, $module, $infile, $outfile, $depth); + + + return $self; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub add_header_backlink { + my $self = shift; + return if $self->no_contents_links; + my($page, $module, $infile, $outfile, $depth) = @_; + $page->html_header_after_title( join '', + $page->html_header_after_title || '', + + qq[

<<

\n], + ) + if $self->contents_file + ; + return; +} + +sub add_footer_backlink { + my $self = shift; + return if $self->no_contents_links; + my($page, $module, $infile, $outfile, $depth) = @_; + $page->html_footer( join '', + qq[

<<

\n], + + $page->html_footer || '', + ) + if $self->contents_file + ; + return; +} + +sub url_up_to_contents { + my($self, $depth) = @_; + --$depth; + return join '/', ('..') x $depth, esc($self->contents_file); +} + +#_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_- + +sub find_all_pods { + my($self, $dirs) = @_; + # You can override find_all_pods in a subclass if you want to + # do extra filtering or whatnot. But for the moment, we just + # pass to modnames2paths: + return $self->modnames2paths($dirs); +} + +#_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_- + +sub modnames2paths { # return a hashref mapping modulenames => paths + my($self, $dirs) = @_; + + my $m2p; + { + my $search = $self->search_class->new; + DEBUG and print "Searching via $search\n"; + $search->verbose(1) if DEBUG > 10; + $search->progress( $self->progress->copy->goal(0) ) if $self->progress; + $search->shadows(0); # don't bother noting shadowed files + $search->inc( $dirs ? 0 : 1 ); + $search->survey( $dirs ? @$dirs : () ); + $m2p = $search->name2path; + die "What, no name2path?!" unless $m2p; + } + + $self->muse("That's odd... no modules found!") unless keys %$m2p; + if( DEBUG > 4 ) { + print "Modules found (name => path):\n"; + foreach my $m (sort {lc($a) cmp lc($b)} keys %$m2p) { + print " $m $$m2p{$m}\n"; + } + print "(total ", scalar(keys %$m2p), ")\n\n"; + } elsif( DEBUG ) { + print "Found ", scalar(keys %$m2p), " modules.\n"; + } + $self->muse( "Found ", scalar(keys %$m2p), " modules." ); + + # return the Foo::Bar => /whatever/Foo/Bar.pod|pm hashref + return $m2p; +} + +#=========================================================================== + +sub _wopen { + # this is abstracted out so that the daemon class can override it + my($self, $outpath) = @_; + require Symbol; + my $out_fh = Symbol::gensym(); + DEBUG > 5 and print "Write-opening to $outpath\n"; + return $out_fh if open($out_fh, "> $outpath"); + require Carp; + Carp::croak("Can't write-open $outpath: $!"); +} + +#========================================================================== + +sub add_css { + my($self, $url, $is_default, $name, $content_type, $media, $_code) = @_; + return unless $url; + unless($name) { + # cook up a reasonable name based on the URL + $name = $url; + if( $name !~ m/\?/ and $name =~ m{([^/]+)$}s ) { + $name = $1; + $name =~ s/\.css//i; + } + } + $media ||= 'all'; + $content_type ||= 'text/css'; + + my $bunch = [$url, $name, $content_type, $media, $_code]; + if($is_default) { unshift @{ $self->_css_wad }, $bunch } + else { push @{ $self->_css_wad }, $bunch } + return; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub _spray_css { + my($self, $outdir) = @_; + + return unless $self->css_flurry(); + $self->_gen_css_wad(); + + my $lol = $self->_css_wad; + foreach my $chunk (@$lol) { + my $url = $chunk->[0]; + my $outfile; + if( ref($chunk->[-1]) and $url =~ m{^(_[-a-z0-9_]+\.css$)} ) { + $outfile = $self->filespecsys->catfile( $outdir, "$1" ); + DEBUG > 5 and print "Noting $$chunk[0] as a file I'll create.\n"; + } else { + DEBUG > 5 and print "OK, noting $$chunk[0] as an external CSS.\n"; + # Requires no further attention. + next; + } + + #$self->muse( "Writing autogenerated CSS file $outfile" ); + my $Cssout = $self->_wopen($outfile); + print $Cssout ${$chunk->[-1]} + or warn "Couldn't print to $outfile: $!\nAbort writing to $outfile at all"; + close($Cssout); + DEBUG > 5 and print "Wrote $outfile\n"; + } + + return; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub _css_wad_to_markup { + my($self, $depth) = @_; + + my @css = @{ $self->_css_wad || return '' }; + return '' unless @css; + + my $rel = 'stylesheet'; + my $out = ''; + + --$depth; + my $uplink = $depth ? ('../' x $depth) : ''; + + foreach my $chunk (@css) { + next unless $chunk and @$chunk; + + my( $url1, $url2, $title, $type, $media) = ( + $self->_maybe_uplink( $chunk->[0], $uplink ), + esc(grep !ref($_), @$chunk) + ); + + $out .= qq{\n}; + + $rel = 'alternate stylesheet'; # alternates = all non-first iterations + } + return $out; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +sub _maybe_uplink { + # if the given URL looks relative, return the given uplink string -- + # otherwise return emptystring + my($self, $url, $uplink) = @_; + ($url =~ m{^\./} or $url !~ m{[/\:]} ) + ? $uplink + : '' + # qualify it, if/as needed +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +sub _gen_css_wad { + my $self = $_[0]; + my $css_template = $self->_css_template; + foreach my $variation ( + + # Commented out for sake of concision: + # + # 011n=black_with_red_on_white + # 001n=black_with_yellow_on_white + # 101n=black_with_green_on_white + # 110=white_with_yellow_on_black + # 010=white_with_green_on_black + # 011=white_with_blue_on_black + # 100=white_with_red_on_black + '110n=blkbluw', # black_with_blue_on_white + '010n=blkmagw', # black_with_magenta_on_white + '100n=blkcynw', # black_with_cyan_on_white + '101=whtprpk', # white_with_purple_on_black + '001=whtnavk', # white_with_navy_blue_on_black + '010a=grygrnk', # grey_with_green_on_black + '010b=whtgrng', # white_with_green_on_grey + '101an=blkgrng', # black_with_green_on_grey + '101bn=grygrnw', # grey_with_green_on_white + ) { + + my $outname = $variation; + my($flipmode, @swap) = ( ($4 || ''), $1,$2,$3) + if $outname =~ s/^([012])([012])([[012])([a-z]*)=?//s; + @swap = () if '010' eq join '', @swap; # 010 is a swop-no-op! + + my $this_css = + "/* This file is autogenerated. Do not edit. $variation */\n\n" + . $css_template; + + # Only look at three-digitty colors, for now at least. + if( $flipmode =~ m/n/ ) { + $this_css =~ s/(#[0-9a-fA-F]{3})\b/_color_negate($1)/eg; + $this_css =~ s/\bthin\b/medium/g; + } + $this_css =~ s<#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])\b> + < join '', '#', ($1,$2,$3)[@swap] >eg if @swap; + + if( $flipmode =~ m/a/) + { $this_css =~ s/#fff\b/#999/gi } # black -> dark grey + elsif($flipmode =~ m/b/) + { $this_css =~ s/#000\b/#666/gi } # white -> light grey + + my $name = $outname; + $name =~ tr/-_/ /; + $self->add_css( "_$outname.css", 0, $name, 0, 0, \$this_css); + } + + # Now a few indexless variations: + foreach my $variation ( + 'blkbluw', # black_with_blue_on_white + 'whtpurk', # white_with_purple_on_black + 'whtgrng', # white_with_green_on_grey + 'grygrnw', # grey_with_green_on_white + ) { + my $outname = "$variation\_"; + my $this_css = join "\n", + "/* This file is autogenerated. Do not edit. $outname */\n", + "\@import url(\"./_$variation.css\");", + ".indexgroup { display: none; }", + "\n", + ; + my $name = $outname; + $name =~ tr/-_/ /; + $self->add_css( "$outname.css", 0, $name, 0, 0, \$this_css); + } + + return; +} + +sub _color_negate { + my $x = lc $_[0]; + $x =~ tr[0123456789abcdef] + [fedcba9876543210]; + return $x; +} + +#=========================================================================== + +sub add_javascript { + my($self, $url, $content_type, $_code) = @_; + return unless $url; + push @{ $self->_javascript_wad }, [ + $url, $content_type || 'text/javascript', $_code + ]; + return; +} + +sub _spray_javascript { + my($self, $outdir) = @_; + return unless $self->javascript_flurry(); + $self->_gen_javascript_wad(); + + my $lol = $self->_javascript_wad; + foreach my $script (@$lol) { + my $url = $script->[0]; + my $outfile; + + if( ref($script->[-1]) and $url =~ m{^(_[-a-z0-9_]+\.js$)} ) { + $outfile = $self->filespecsys->catfile( $outdir, "$1" ); + DEBUG > 5 and print "Noting $$script[0] as a file I'll create.\n"; + } else { + DEBUG > 5 and print "OK, noting $$script[0] as an external JavaScript.\n"; + next; + } + + #$self->muse( "Writing JavaScript file $outfile" ); + my $Jsout = $self->_wopen($outfile); + + print $Jsout ${$script->[-1]} + or warn "Couldn't print to $outfile: $!\nAbort writing to $outfile at all"; + close($Jsout); + DEBUG > 5 and print "Wrote $outfile\n"; + } + + return; +} + +sub _gen_javascript_wad { + my $self = $_[0]; + my $js_code = $self->_javascript || return; + $self->add_javascript( "_podly.js", 0, \$js_code); + return; +} + +sub _javascript_wad_to_markup { + my($self, $depth) = @_; + + my @scripts = @{ $self->_javascript_wad || return '' }; + return '' unless @scripts; + + my $out = ''; + + --$depth; + my $uplink = $depth ? ('../' x $depth) : ''; + + foreach my $s (@scripts) { + next unless $s and @$s; + + my( $url1, $url2, $type, $media) = ( + $self->_maybe_uplink( $s->[0], $uplink ), + esc(grep !ref($_), @$s) + ); + + $out .= qq{\n}; + } + return $out; +} + +#=========================================================================== + +sub _css_template { return $CSS } +sub _javascript { return $JAVASCRIPT } + +$CSS = <<'EOCSS'; +/* For accessibility reasons, never specify text sizes in px/pt/pc/in/cm/mm */ + +@media all { .hide { display: none; } } + +@media print { + .noprint, div.indexgroup, .backlinktop, .backlinkbottom { display: none } + + * { + border-color: black !important; + color: black !important; + background-color: transparent !important; + background-image: none !important; + } + + dl.superindex > dd { + word-spacing: .6em; + } +} + +@media aural, braille, embossed { + div.indexgroup { display: none; } /* Too noisy, don't you think? */ + dl.superindex > dt:before { content: "Group "; } + dl.superindex > dt:after { content: " contains:"; } + .backlinktop a:before { content: "Back to contents"; } + .backlinkbottom a:before { content: "Back to contents"; } +} + +@media aural { + dl.superindex > dt { pause-before: 600ms; } +} + +@media screen, tty, tv, projection { + .noscreen { display: none; } + + a:link { color: #7070ff; text-decoration: underline; } + a:visited { color: #e030ff; text-decoration: underline; } + a:active { color: #800000; text-decoration: underline; } + body.contentspage a { text-decoration: none; } + a.u { color: #fff !important; text-decoration: none; } + + body.pod { + margin: 0 5px; + color: #fff; + background-color: #000; + } + + body.pod h1, body.pod h2, body.pod h3, body.pod h4 { + font-family: Tahoma, Verdana, Helvetica, Arial, sans-serif; + font-weight: normal; + margin-top: 1.2em; + margin-bottom: .1em; + border-top: thin solid transparent; + /* margin-left: -5px; border-left: 2px #7070ff solid; padding-left: 3px; */ + } + + body.pod h1 { border-top-color: #0a0; } + body.pod h2 { border-top-color: #080; } + body.pod h3 { border-top-color: #040; } + body.pod h4 { border-top-color: #010; } + + p.backlinktop + h1 { border-top: none; margin-top: 0em; } + p.backlinktop + h2 { border-top: none; margin-top: 0em; } + p.backlinktop + h3 { border-top: none; margin-top: 0em; } + p.backlinktop + h4 { border-top: none; margin-top: 0em; } + + body.pod dt { + font-size: 105%; /* just a wee bit more than normal */ + } + + .indexgroup { font-size: 80%; } + + .backlinktop, .backlinkbottom { + margin-left: -5px; + margin-right: -5px; + background-color: #040; + border-top: thin solid #050; + border-bottom: thin solid #050; + } + + .backlinktop a, .backlinkbottom a { + text-decoration: none; + color: #080; + background-color: #000; + border: thin solid #0d0; + } + .backlinkbottom { margin-bottom: 0; padding-bottom: 0; } + .backlinktop { margin-top: 0; padding-top: 0; } + + body.contentspage { + color: #fff; + background-color: #000; + } + + body.contentspage h1 { + color: #0d0; + margin-left: 1em; + margin-right: 1em; + text-indent: -.9em; + font-family: Tahoma, Verdana, Helvetica, Arial, sans-serif; + font-weight: normal; + border-top: thin solid #fff; + border-bottom: thin solid #fff; + text-align: center; + } + + dl.superindex > dt { + font-family: Tahoma, Verdana, Helvetica, Arial, sans-serif; + font-weight: normal; + font-size: 90%; + margin-top: .45em; + /* margin-bottom: -.15em; */ + } + dl.superindex > dd { + word-spacing: .6em; /* most important rule here! */ + } + dl.superindex > a:link { + text-decoration: none; + color: #fff; + } + + .contentsfooty { + border-top: thin solid #999; + font-size: 90%; + } + +} + +/* The End */ + +EOCSS + +#========================================================================== + +$JAVASCRIPT = <<'EOJAVASCRIPT'; + +// From http://www.alistapart.com/articles/alternate/ + +function setActiveStyleSheet(title) { + var i, a, main; + for(i=0 ; (a = document.getElementsByTagName("link")[i]) ; i++) { + if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) { + a.disabled = true; + if(a.getAttribute("title") == title) a.disabled = false; + } + } +} + +function getActiveStyleSheet() { + var i, a; + for(i=0 ; (a = document.getElementsByTagName("link")[i]) ; i++) { + if( a.getAttribute("rel").indexOf("style") != -1 + && a.getAttribute("title") + && !a.disabled + ) return a.getAttribute("title"); + } + return null; +} + +function getPreferredStyleSheet() { + var i, a; + for(i=0 ; (a = document.getElementsByTagName("link")[i]) ; i++) { + if( a.getAttribute("rel").indexOf("style") != -1 + && a.getAttribute("rel").indexOf("alt") == -1 + && a.getAttribute("title") + ) return a.getAttribute("title"); + } + return null; +} + +function createCookie(name,value,days) { + if (days) { + var date = new Date(); + date.setTime(date.getTime()+(days*24*60*60*1000)); + var expires = "; expires="+date.toGMTString(); + } + else expires = ""; + document.cookie = name+"="+value+expires+"; path=/"; +} + +function readCookie(name) { + var nameEQ = name + "="; + var ca = document.cookie.split(';'); + for(var i=0 ; i < ca.length ; i++) { + var c = ca[i]; + while (c.charAt(0)==' ') c = c.substring(1,c.length); + if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); + } + return null; +} + +window.onload = function(e) { + var cookie = readCookie("style"); + var title = cookie ? cookie : getPreferredStyleSheet(); + setActiveStyleSheet(title); +} + +window.onunload = function(e) { + var title = getActiveStyleSheet(); + createCookie("style", title, 365); +} + +var cookie = readCookie("style"); +var title = cookie ? cookie : getPreferredStyleSheet(); +setActiveStyleSheet(title); + +// The End + +EOJAVASCRIPT + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +1; +__END__ + + +=head1 NAME + +Pod::Simple::HTMLBatch - convert several Pod files to several HTML files + +=head1 SYNOPSIS + + perl -MPod::Simple::HTMLBatch -e 'Pod::Simple::HTMLBatch::go' in out + + +=head1 DESCRIPTION + +This module is used for running batch-conversions of a lot of HTML +documents + +This class is NOT a subclass of Pod::Simple::HTML +(nor of bad old Pod::Html) -- although it uses +Pod::Simple::HTML for doing the conversion of each document. + +The normal use of this class is like so: + + use Pod::Simple::HTMLBatch; + my $batchconv = Pod::Simple::HTMLBatch->new; + $batchconv->some_option( some_value ); + $batchconv->some_other_option( some_other_value ); + $batchconv->batch_convert( \@search_dirs, $output_dir ); + +=head2 FROM THE COMMAND LINE + +Note that this class also provides +(but does not export) the function Pod::Simple::HTMLBatch::go. +This is basically just a shortcut for C<< +Pod::Simple::HTMLBatch->batch_convert(@ARGV) >>. +It's meant to be handy for calling from the command line. + +However, the shortcut requires that you specify exactly two command-line +arguments, C and C. + +Example: + + % mkdir out_html + % perl -MPod::Simple::HTMLBatch -e Pod::Simple::HTMLBatch::go @INC out_html + (to convert the pod from Perl's @INC + files under the directory ../htmlversion) + +(Note that the command line there contains a literal atsign-I-N-C. This +is handled as a special case by batch_convert, in order to save you having +to enter the odd-looking "" as the first command-line parameter when you +mean "just use whatever's in @INC".) + +Example: + + % mkdir ../seekrut + % chmod og-rx ../seekrut + % perl -MPod::Simple::HTMLBatch -e Pod::Simple::HTMLBatch::go . ../htmlversion + (to convert the pod under the current dir into HTML + files under the directory ../htmlversion) + +Example: + + % perl -MPod::Simple::HTMLBatch -e Pod::Simple::HTMLBatch::go happydocs . + (to convert all pod from happydocs into the current directory) + + + +=head1 MAIN METHODS + +=over + +=item $batchconv = Pod::Simple::HTMLBatch->new; + +This TODO + + +=item $batchconv->batch_convert( I, I ); + +this TODO + +=item $batchconv->batch_convert( undef , ...); + +=item $batchconv->batch_convert( q{@INC}, ...); + +These two values for I specify that the normal Perl @INC + +=item $batchconv->batch_convert( \@dirs , ...); + +This specifies that the input directories are the items in +the arrayref C<\@dirs>. + +=item $batchconv->batch_convert( "somedir" , ...); + +This specifies that the director "somedir" is the input. +(This can be an absolute or relative path, it doesn't matter.) + +A common value you might want would be just "." for the current +directory: + + $batchconv->batch_convert( "." , ...); + + +=item $batchconv->batch_convert( 'somedir:someother:also' , ...); + +This specifies that you want the dirs "somedir", "somother", and "also" +scanned, just as if you'd passed the arrayref +C<[qw( somedir someother also)]>. Note that a ":"-separator is normal +under Unix, but Under MSWin, you'll need C<'somedir;someother;also'> +instead, since the pathsep on MSWin is ";" instead of ":". (And +I is because ":" often comes up in paths, like +C<"c:/perl/lib">.) + +(Exactly what separator character should be used, is gotten from +C<$Config::Config{'path_sep'}>, via the L module.) + +=item $batchconv->batch_convert( ... , undef ); + +This specifies that you want the HTML output to go into the current +directory. + +(Note that a missing or undefined value means a different thing in +the first slot than in the second. That's so that C +with no arguments (or undef arguments) means "go from @INC, into +the current directory.) + +=item $batchconv->batch_convert( ... , 'somedir' ); + +This specifies that you want the HTML output to go into the +directory 'somedir'. +(This can be an absolute or relative path, it doesn't matter.) + +=back + + +Note that you can also call C as a class method, +like so: + + Pod::Simple::HTMLBatch->batch_convert( ... ); + +That is just short for this: + + Pod::Simple::HTMLBatch-> new-> batch_convert(...); + +That is, it runs a conversion with default options, for +whatever inputdirs and output dir you specify. + + +=head2 ACCESSOR METHODS + +The following are all accessor methods -- that is, they don't do anything +on their own, but just alter the contents of the conversion object, +which comprises the options for this particular batch conversion. + +We show the "put" form of the accessors below (i.e., the syntax you use +for setting the accessor to a specific value). But you can also +call each method with no parameters to get its current value. For +example, C<< $self->contents_file() >> returns the current value of +the contents_file attribute. + +=over + + +=item $batchconv->verbose( I ); + +This controls how verbose to be during batch conversion, as far as +notes to STDOUT (or whatever is C to and I +from the parser. + +Ls handle TAP I. You can configure them +and load custom handlers using the C parameter to L. + +Ls handle TAP I. You can load custom formatters by +using the C parameter to L. To configure a formatter, +you currently need to instantiate it outside of L and pass it in +with the C parameter to L. This I be addressed by adding +a I parameter to L in the future. + +=head2 C + +L version C<0.30> supports C. + +To load C plugins, you'll need to use the C +parameter to C, typically from your C. For example: + + Module::Build->new( + module_name => 'MyApp', + test_file_exts => [qw(.t .tap .txt)], + use_tap_harness => 1, + tap_harness_args => { + sources => { + MyCustom => {}, + File => { + extensions => ['.tap', '.txt'], + }, + }, + formatter => 'TAP::Formatter::HTML', + }, + build_requires => { + 'Module::Build' => '0.30', + 'TAP::Harness' => '3.18', + }, + )->create_build_script; + +See L + +=head2 C + +L does not support L out-of-the-box. + +=head2 C + +L supports C plugins, and has a plugin system of its +own. See L, L and L +for more details. + +=head1 WRITING PLUGINS + +If you can't configure C to do what you want, and you can't find +an existing plugin, consider writing one. + +The two primary use cases supported by L for plugins are I +and I: + +=over 2 + +=item Customize how TAP gets into the parser + +To do this, you can either extend an existing L, +or write your own. It's a pretty simple API, and they can be loaded and +configured using the C parameter to L. + +=item Customize how TAP results are output from the parser + +To do this, you can either extend an existing L, or write your +own. Writing formatters are a bit more involved than writing a +I, as you'll need to understand the L API. A +good place to start is by understanding how L works. + +Custom formatters can be loaded configured using the C +parameter to L. + +=back + +=head1 SUBCLASSING + +If you can't configure C to do exactly what you want, and writing +a plugin isn't an option, consider extending it. It is designed to be (mostly) +easy to subclass, though the cases when sub-classing is necessary should be few +and far between. + +=head2 Methods + +The following methods are ones you may wish to override if you want to +subclass C. + +=over 4 + +=item L + +=item L + +=item L + +=back + +=cut + +=head1 REPLACING + +If you like the C utility and L but you want your +own harness, all you need to do is write one and provide C and +C methods. Then you can use the C utility like so: + + prove --harness My::Test::Harness + +Note that while C accepts a list of tests (or things to be +tested), C has a fairly rich set of arguments. You'll probably want +to read over this code carefully to see how all of them are being used. + +=head1 SEE ALSO + +L + +=cut + +# vim:ts=4:sw=4:et:sta diff --git a/Master/tlpkg/tlperl.straw/lib/TAP/Harness/Beyond.pod b/Master/tlpkg/tlperl.straw/lib/TAP/Harness/Beyond.pod new file mode 100755 index 00000000000..8704f52b280 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/lib/TAP/Harness/Beyond.pod @@ -0,0 +1,416 @@ +=head1 Beyond make test + +Test::Harness is responsible for running test scripts, analysing +their output and reporting success or failure. When I type +F (or F<./Build test>) for a module, Test::Harness is usually +used to run the tests (not all modules use Test::Harness but the +majority do). + +To start exploring some of the features of Test::Harness I need to +switch from F to the F command (which ships with +Test::Harness). For the following examples I'll also need a recent +version of Test::Harness installed; 3.14 is current as I write. + +For the examples I'm going to assume that we're working with a +'normal' Perl module distribution. Specifically I'll assume that +typing F or F<./Build> causes the built, ready-to-install module +code to be available below ./blib/lib and ./blib/arch and that +there's a directory called 't' that contains our tests. Test::Harness +isn't hardwired to that configuration but it saves me from explaining +which files live where for each example. + +Back to F; like F it runs a test suite - but it +provides far more control over which tests are executed, in what +order and how their results are reported. Typically F +runs all the test scripts below the 't' directory. To do the same +thing with prove I type: + + prove -rb t + +The switches here are -r to recurse into any directories below 't' +and -b which adds ./blib/lib and ./blib/arch to Perl's include path +so that the tests can find the code they will be testing. If I'm +testing a module of which an earlier version is already installed +I need to be careful about the include path to make sure I'm not +running my tests against the installed version rather than the new +one that I'm working on. + +Unlike F, typing F doesn't automatically rebuild +my module. If I forget to make before prove I will be testing against +older versions of those files - which inevitably leads to confusion. +I either get into the habit of typing + + make && prove -rb t + +or - if I have no XS code that needs to be built I use the modules +below F instead + + prove -Ilib -r t + +So far I've shown you nothing that F doesn't do. Let's +fix that. + +=head2 Saved State + +If I have failing tests in a test suite that consists of more than +a handful of scripts and takes more than a few seconds to run it +rapidly becomes tedious to run the whole test suite repeatedly as +I track down the problems. + +I can tell prove just to run the tests that are failing like this: + + prove -b t/this_fails.t t/so_does_this.t + +That speeds things up but I have to make a note of which tests are +failing and make sure that I run those tests. Instead I can use +prove's --state switch and have it keep track of failing tests for +me. First I do a complete run of the test suite and tell prove to +save the results: + + prove -rb --state=save t + +That stores a machine readable summary of the test run in a file +called '.prove' in the current directory. If I have failures I can +then run just the failing scripts like this: + + prove -b --state=failed + +I can also tell prove to save the results again so that it updates +its idea of which tests failed: + + prove -b --state=failed,save + +As soon as one of my failing tests passes it will be removed from +the list of failed tests. Eventually I fix them all and prove can +find no failing tests to run: + + Files=0, Tests=0, 0 wallclock secs ( 0.00 usr + 0.00 sys = 0.00 CPU) + Result: NOTESTS + +As I work on a particular part of my module it's most likely that +the tests that cover that code will fail. I'd like to run the whole +test suite but have it prioritize these 'hot' tests. I can tell +prove to do this: + + prove -rb --state=hot,save t + +All the tests will run but those that failed most recently will be +run first. If no tests have failed since I started saving state all +tests will run in their normal order. This combines full test +coverage with early notification of failures. + +The --state switch supports a number of options; for example to run +failed tests first followed by all remaining tests ordered by the +timestamps of the test scripts - and save the results - I can use + + prove -rb --state=failed,new,save t + +See the prove documentation (type prove --man) for the full list +of state options. + +When I tell prove to save state it writes a file called '.prove' +('_prove' on Windows) in the current directory. It's a YAML document +so it's quite easy to write tools of your own that work on the saved +test state - but the format isn't officially documented so it might +change without (much) warning in the future. + +=head2 Parallel Testing + +If my tests take too long to run I may be able to speed them up by +running multiple test scripts in parallel. This is particularly +effective if the tests are I/O bound or if I have multiple CPU +cores. I tell prove to run my tests in parallel like this: + + prove -rb -j 9 t + +The -j switch enables parallel testing; the number that follows it +is the maximum number of tests to run in parallel. Sometimes tests +that pass when run sequentially will fail when run in parallel. For +example if two different test scripts use the same temporary file +or attempt to listen on the same socket I'll have problems running +them in parallel. If I see unexpected failures I need to check my +tests to work out which of them are trampling on the same resource +and rename temporary files or add locks as appropriate. + +To get the most performance benefit I want to have the test scripts +that take the longest to run start first - otherwise I'll be waiting +for the one test that takes nearly a minute to complete after all +the others are done. I can use the --state switch to run the tests +in slowest to fastest order: + + prove -rb -j 9 --state=slow,save t + +=head2 Non-Perl Tests + +The Test Anything Protocol (http://testanything.org/) isn't just +for Perl. Just about any language can be used to write tests that +output TAP. There are TAP based testing libraries for C, C++, PHP, +Python and many others. If I can't find a TAP library for my language +of choice it's easy to generate valid TAP. It looks like this: + + 1..3 + ok 1 - init OK + ok 2 - opened file + not ok 3 - appended to file + +The first line is the plan - it specifies the number of tests I'm +going to run so that it's easy to check that the test script didn't +exit before running all the expected tests. The following lines are +the test results - 'ok' for pass, 'not ok' for fail. Each test has +a number and, optionally, a description. And that's it. Any language +that can produce output like that on STDOUT can be used to write +tests. + +Recently I've been rekindling a two-decades-old interest in Forth. +Evidently I have a masochistic streak that even Perl can't satisfy. +I want to write tests in Forth and run them using prove (you can +find my gforth TAP experiments at +https://svn.hexten.net/andy/Forth/Testing/). I can use the --exec +switch to tell prove to run the tests using gforth like this: + + prove -r --exec gforth t + +Alternately, if the language used to write my tests allows a shebang +line I can use that to specify the interpreter. Here's a test written +in PHP: + + #!/usr/bin/php + + +If I save that as t/phptest.t the shebang line will ensure that it +runs correctly along with all my other tests. + +=head2 Mixing it up + +Subtle interdependencies between test programs can mask problems - +for example an earlier test may neglect to remove a temporary file +that affects the behaviour of a later test. To find this kind of +problem I use the --shuffle and --reverse options to run my tests +in random or reversed order. + +=head2 Rolling My Own + +If I need a feature that prove doesn't provide I can easily write my own. + +Typically you'll want to change how TAP gets I into and I +from the parser. L supports arbitrary plugins, and L +supports custom I and I that you can load using +either L or L; there are many examples to base mine on. +For more details see L, L, and +L. + +If writing a plugin is not enough, you can write your own test harness; one of +the motives for the 3.00 rewrite of Test::Harness was to make it easier to +subclass and extend. + +The Test::Harness module is a compatibility wrapper around TAP::Harness. +For new applications I should use TAP::Harness directly. As we'll +see, prove uses TAP::Harness. + +When I run prove it processes its arguments, figures out which test +scripts to run and then passes control to TAP::Harness to run the +tests, parse, analyse and present the results. By subclassing +TAP::Harness I can customise many aspects of the test run. + +I want to log my test results in a database so I can track them +over time. To do this I override the summary method in TAP::Harness. +I start with a simple prototype that dumps the results as a YAML +document: + + package My::TAP::Harness; + + use base qw( TAP::Harness ); use YAML; + + sub summary { + my ( $self, $aggregate ) = @_; print Dump( $aggregate ); + $self->SUPER::summary( $aggregate ); + } + + 1; + +I need to tell prove to use my My::TAP::Harness. If My::TAP::Harness +is on Perl's @INC include path I can + + prove --harness=My::TAP::Harness -rb t + +If I don't have My::TAP::Harness installed on @INC I need to provide +the correct path to perl when I run prove: + + perl -Ilib `which prove` --harness=My::TAP::Harness -rb t + +I can incorporate these options into my own version of prove. It's +pretty simple. Most of the work of prove is handled by App::Prove. +The important code in prove is just: + + use App::Prove; + + my $app = App::Prove->new; + $app->process_args(@ARGV); + exit( $app->run ? 0 : 1 ); + +If I write a subclass of App::Prove I can customise any aspect of +the test runner while inheriting all of prove's behaviour. Here's +myprove: + + #!/usr/bin/env perl use lib qw( lib ); # Add ./lib to @INC + use App::Prove; + + my $app = App::Prove->new; + + # Use custom TAP::Harness subclass $app->harness( 'My::TAP::Harness' + ); + + $app->process_args( @ARGV ); exit( $app->run ? 0 : 1 ); + +Now I can run my tests like this + + ./myprove -rb t + +=head2 Deeper Customisation + +Now that I know how to subclass and replace TAP::Harness I can +replace any other part of the harness. To do that I need to know +which classes are responsible for which functionality. Here's a +brief guided tour; the default class for each component is shown +in parentheses. Normally any replacements I write will be subclasses +of these default classes. + +When I run my tests TAP::Harness creates a scheduler +(TAP::Parser::Scheduler) to work out the running order for the +tests, an aggregator (TAP::Parser::Aggregator) to collect and analyse +the test results and a formatter (TAP::Formatter::Console) to display +those results. + +If I'm running my tests in parallel there may also be a multiplexer +(TAP::Parser::Multiplexer) - the component that allows multiple +tests to run simultaneously. + +Once it has created those helpers TAP::Harness starts running the +tests. For each test it creates a new parser (TAP::Parser) which +is responsible for running the test script and parsing its output. + +To replace any of these components I call one of these harness +methods with the name of the replacement class: + + aggregator_class + formatter_class + multiplexer_class + parser_class + scheduler_class + +For example, to replace the aggregator I would + + $harness->aggregator_class( 'My::Aggregator' ); + +Alternately I can supply the names of my substitute classes to the +TAP::Harness constructor: + + my $harness = TAP::Harness->new( + { aggregator_class => 'My::Aggregator' } + ); + +If I need to reach even deeper into the internals of the harness I +can replace the classes that TAP::Parser uses to execute test scripts +and tokenise their output. Before running a test script TAP::Parser +creates a grammar (TAP::Parser::Grammar) to decode the raw TAP into +tokens, a result factory (TAP::Parser::ResultFactory) to turn the +decoded TAP results into objects and, depending on whether it's +running a test script or reading TAP from a file, scalar or array +a source or an iterator (TAP::Parser::IteratorFactory). + +Each of these objects may be replaced by calling one of these parser +methods: + + source_class + perl_source_class + grammar_class + iterator_factory_class + result_factory_class + +=head2 Callbacks + +As an alternative to subclassing the components I need to change I +can attach callbacks to the default classes. TAP::Harness exposes +these callbacks: + + parser_args Tweak the parameters used to create the parser + made_parser Just made a new parser + before_runtests About to run tests + after_runtests Have run all tests + after_test Have run an individual test script + +TAP::Parser also supports callbacks; bailout, comment, plan, test, +unknown, version and yaml are called for the corresponding TAP +result types, ALL is called for all results, ELSE is called for all +results for which a named callback is not installed and EOF is +called once at the end of each TAP stream. + +To install a callback I pass the name of the callback and a subroutine +reference to TAP::Harness or TAP::Parser's callback method: + + $harness->callback( after_test => sub { + my ( $script, $desc, $parser ) = @_; + } ); + +I can also pass callbacks to the constructor: + + my $harness = TAP::Harness->new({ + callbacks => { + after_test => sub { + my ( $script, $desc, $parser ) = @_; + # Do something interesting here + } + } + }); + +When it comes to altering the behaviour of the test harness there's +more than one way to do it. Which way is best depends on my +requirements. In general if I only want to observe test execution +without changing the harness' behaviour (for example to log test +results to a database) I choose callbacks. If I want to make the +harness behave differently subclassing gives me more control. + +=head2 Parsing TAP + +Perhaps I don't need a complete test harness. If I already have a +TAP test log that I need to parse all I need is TAP::Parser and the +various classes it depends upon. Here's the code I need to run a +test and parse its TAP output + + use TAP::Parser; + + my $parser = TAP::Parser->new( { source => 't/simple.t' } ); + while ( my $result = $parser->next ) { + print $result->as_string, "\n"; + } + +Alternately I can pass an open filehandle as source and have the +parser read from that rather than attempting to run a test script: + + open my $tap, '<', 'tests.tap' + or die "Can't read TAP transcript ($!)\n"; + my $parser = TAP::Parser->new( { source => $tap } ); + while ( my $result = $parser->next ) { + print $result->as_string, "\n"; + } + +This approach is useful if I need to convert my TAP based test +results into some other representation. See TAP::Convert::TET +(http://search.cpan.org/dist/TAP-Convert-TET/) for an example of +this approach. + +=head2 Getting Support + +The Test::Harness developers hang out on the tapx-dev mailing +list[1]. For discussion of general, language independent TAP issues +there's the tap-l[2] list. Finally there's a wiki dedicated to the +Test Anything Protocol[3]. Contributions to the wiki, patches and +suggestions are all welcome. + +[1] L +[2] L +[3] L diff --git a/Master/tlpkg/tlperl.straw/lib/TAP/Object.pm b/Master/tlpkg/tlperl.straw/lib/TAP/Object.pm new file mode 100755 index 00000000000..aa65082d0af --- /dev/null +++ b/Master/tlpkg/tlperl.straw/lib/TAP/Object.pm @@ -0,0 +1,158 @@ +package TAP::Object; + +use strict; +use vars qw($VERSION); + +=head1 NAME + +TAP::Object - Base class that provides common functionality to all C modules + +=head1 VERSION + +Version 3.20 + +=cut + +$VERSION = '3.20'; + +=head1 SYNOPSIS + + package TAP::Whatever; + + use strict; + use vars qw(@ISA); + + use TAP::Object; + + @ISA = qw(TAP::Object); + + # new() implementation by TAP::Object + sub _initialize { + my ( $self, @args) = @_; + # initialize your object + return $self; + } + + # ... later ... + my $obj = TAP::Whatever->new(@args); + +=head1 DESCRIPTION + +C provides a default constructor and exception model for all +C classes. Exceptions are raised using L. + +=head1 METHODS + +=head2 Class Methods + +=head3 C + +Create a new object. Any arguments passed to C will be passed on to the +L method. Returns a new object. + +=cut + +sub new { + my $class = shift; + my $self = bless {}, $class; + return $self->_initialize(@_); +} + +=head2 Instance Methods + +=head3 C<_initialize> + +Initializes a new object. This method is a stub by default, you should override +it as appropriate. + +I L expects you to return C<$self> or raise an exception. See +L, and L. + +=cut + +sub _initialize { + return $_[0]; +} + +=head3 C<_croak> + +Raise an exception using C from L, eg: + + $self->_croak( 'why me?', 'aaarrgh!' ); + +May also be called as a I method. + + $class->_croak( 'this works too' ); + +=cut + +sub _croak { + my $proto = shift; + require Carp; + Carp::croak(@_); + return; +} + +=head3 C<_confess> + +Raise an exception using C from L, eg: + + $self->_confess( 'why me?', 'aaarrgh!' ); + +May also be called as a I method. + + $class->_confess( 'this works too' ); + +=cut + +sub _confess { + my $proto = shift; + require Carp; + Carp::confess(@_); + return; +} + +=head3 C<_construct> + +Create a new instance of the specified class. + +=cut + +sub _construct { + my ( $self, $class, @args ) = @_; + + $self->_croak("Bad module name $class") + unless $class =~ /^ \w+ (?: :: \w+ ) *$/x; + + unless ( $class->can('new') ) { + local $@; + eval "require $class"; + $self->_croak("Can't load $class") if $@; + } + + return $class->new(@args); +} + +=head3 C + +Create simple getter/setters. + + __PACKAGE__->mk_methods(@method_names); + +=cut + +sub mk_methods { + my ( $class, @methods ) = @_; + for 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/Master/tlpkg/tlperl.straw/lib/TAP/Parser.pm b/Master/tlpkg/tlperl.straw/lib/TAP/Parser.pm new file mode 100755 index 00000000000..f8baa39f312 --- /dev/null +++ b/Master/tlpkg/tlperl.straw/lib/TAP/Parser.pm @@ -0,0 +1,1894 @@ +package TAP::Parser; + +use strict; +use vars qw($VERSION @ISA); + +use TAP::Base (); +use TAP::Parser::Grammar (); +use TAP::Parser::Result (); +use TAP::Parser::ResultFactory (); +use TAP::Parser::Source (); +use TAP::Parser::Iterator (); +use TAP::Parser::IteratorFactory (); +use TAP::Parser::SourceHandler::Executable (); +use TAP::Parser::SourceHandler::Perl (); +use TAP::Parser::SourceHandler::File (); +use TAP::Parser::SourceHandler::RawTAP (); +use TAP::Parser::SourceHandler::Handle (); + +use Carp qw( confess ); + +=head1 NAME + +TAP::Parser - Parse L output + +=head1 VERSION + +Version 3.20 + +=cut + +$VERSION = '3.20'; + +my $DEFAULT_TAP_VERSION = 12; +my $MAX_TAP_VERSION = 13; + +$ENV{TAP_VERSION} = $MAX_TAP_VERSION; + +END { + + # For VMS. + delete $ENV{TAP_VERSION}; +} + +BEGIN { # making accessors + @ISA = qw(TAP::Base); + + __PACKAGE__->mk_methods( + qw( + _iterator + _spool + exec + exit + is_good_plan + plan + tests_planned + tests_run + wait + version + in_todo + start_time + end_time + skip_all + grammar_class + result_factory_class + iterator_factory_class + ) + ); + + sub _stream { # deprecated + my $self = shift; + $self->_iterator(@_); + } +} # done making accessors + +=head1 SYNOPSIS + + use TAP::Parser; + + my $parser = TAP::Parser->new( { source => $source } ); + + while ( my $result = $parser->next ) { + print $result->as_string; + } + +=head1 DESCRIPTION + +C is designed to produce a proper parse of TAP output. For +an example of how to run tests through this module, see the simple +harnesses C. + +There's a wiki dedicated to the Test Anything Protocol: + +L + +It includes the TAP::Parser Cookbook: + +L + +=head1 METHODS + +=head2 Class Methods + +=head3 C + + my $parser = TAP::Parser->new(\%args); + +Returns a new C object. + +The arguments should be a hashref with I of the following keys: + +=over 4 + +=item * C + +I + +This is the preferred method of passing input to the constructor. + +The C is used to create a L that is passed to the +L which in turn figures out how to handle the source and +creates a for it. The iterator is used by the parser to +read in the TAP stream. + +To configure the I use the C parameter below. + +Note that C, C and C are I. + +=item * C + +I + +The value should be the complete TAP output. + +The I is used to create a L that is passed to the +L which in turn figures out how to handle the source and +creates a for it. The iterator is used by the parser to +read in the TAP stream. + +To configure the I use the C parameter below. + +Note that C, C and C are I. + +=item * C + +Must be passed an array reference. + +The I array ref is used to create a L that is passed +to the L which in turn figures out how to handle the +source and creates a for it. The iterator is used by +the parser to read in the TAP stream. + +By default the L class will create a +L object to handle the source. This passes the +array reference strings as command arguments to L: + + exec => [ '/usr/bin/ruby', 't/my_test.rb' ] + +If any C are given they will be appended to the end of the command +argument list. + +To configure the I use the C parameter below. + +Note that C, C and C are I. + +=back + +The following keys are optional. + +=over 4 + +=item * C + +I. + +If set, C must be a hashref containing the names of the +Ls to load and/or configure. The values are a +hash of configuration that will be accessible to to the source handlers via +L. + +For example: + + sources => { + Perl => { exec => '/path/to/custom/perl' }, + File => { extensions => [ '.tap', '.txt' ] }, + MyCustom => { some => 'config' }, + } + +This will cause C to pass custom configuration to two of the built- +in source handlers - L, +L - and attempt to load the C +class. See L for more detail. + +The C parameter affects how C, C and C parameters +are handled. + +See L, L and subclasses for +more details. + +=item * C + +If present, each callback corresponding to a given result type will be called +with the result as the argument if the C method is used: + + my %callbacks = ( + test => \&test_callback, + plan => \&plan_callback, + comment => \&comment_callback, + bailout => \&bailout_callback, + unknown => \&unknown_callback, + ); + + my $aggregator = TAP::Parser::Aggregator->new; + for my $file ( @test_files ) { + my $parser = TAP::Parser->new( + { + source => $file, + callbacks => \%callbacks, + } + ); + $parser->run; + $aggregator->add( $file, $parser ); + } + +=item * C + +If using a Perl file as a source, optional switches may be passed which will +be used when invoking the perl executable. + + my $parser = TAP::Parser->new( { + source => $test_file, + switches => [ '-Ilib' ], + } ); + +=item * C + +Used in conjunction with the C and C option to supply a reference +to an C<@ARGV> style array of arguments to pass to the test program. + +=item * C + +If passed a filehandle will write a copy of all parsed TAP to that handle. + +=item * C + +If false, STDERR is not captured (though it is 'relayed' to keep it +somewhat synchronized with STDOUT.) + +If true, STDERR and STDOUT are the same filehandle. This may cause +breakage if STDERR contains anything resembling TAP format, but does +allow exact synchronization. + +Subtleties of this behavior may be platform-dependent and may change in +the future. + +=item * C + +This option was introduced to let you easily customize which I class +the parser should use. It defaults to L. + +See also L. + +=item * C + +This option was introduced to let you easily customize which I +factory class the parser should use. It defaults to +L. + +See also L. + +=item * C + +I + +This option was introduced to let you easily customize which I +factory class the parser should use. It defaults to +L. + +=back + +=cut + +# new() implementation supplied by TAP::Base + +# This should make overriding behaviour of the Parser in subclasses easier: +sub _default_grammar_class {'TAP::Parser::Grammar'} +sub _default_result_factory_class {'TAP::Parser::ResultFactory'} +sub _default_iterator_factory_class {'TAP::Parser::IteratorFactory'} + +############################################################################## + +=head2 Instance Methods + +=head3 C + + my $parser = TAP::Parser->new( { source => $file } ); + while ( my $result = $parser->next ) { + print $result->as_string, "\n"; + } + +This method returns the results of the parsing, one result at a time. Note +that it is destructive. You can't rewind and examine previous results. + +If callbacks are used, they will be issued before this call returns. + +Each result returned is a subclass of L. See that +module and related classes for more information on how to use them. + +=cut + +sub next { + my $self = shift; + return ( $self->{_iter} ||= $self->_iter )->(); +} + +############################################################################## + +=head3 C + + $parser->run; + +This method merely runs the parser and parses all of the TAP. + +=cut + +sub run { + my $self = shift; + while ( defined( my $result = $self->next ) ) { + + # do nothing + } +} + +############################################################################## + +=head3 C + +Make a new L object and return it. Passes through any +arguments given. + +The C can be customized, as described in L. + +=head3 C + +Make a new L object using the parser's +L, and return it. Passes through any arguments +given. + +The C can be customized, as described in L. + +=head3 C + +I. + +Make a new L object and return it. Passes through +any arguments given. + +C can be customized, as described in L. + +=cut + +# This should make overriding behaviour of the Parser in subclasses easier: +sub make_iterator_factory { shift->iterator_factory_class->new(@_); } +sub make_grammar { shift->grammar_class->new(@_); } +sub make_result { shift->result_factory_class->make_result(@_); } + +{ + + # of the following, anything beginning with an underscore is strictly + # internal and should not be exposed. + my %initialize = ( + version => $DEFAULT_TAP_VERSION, + plan => '', # the test plan (e.g., 1..3) + tap => '', # the TAP + tests_run => 0, # actual current test numbers + results => [], # TAP parser results + skipped => [], # + todo => [], # + passed => [], # + failed => [], # + actual_failed => [], # how many tests really failed + actual_passed => [], # how many tests really passed + todo_passed => [], # tests which unexpectedly succeed + parse_errors => [], # perfect TAP should have none + ); + + # We seem to have this list hanging around all over the place. We could + # probably get it from somewhere else to avoid the repetition. + my @legal_callback = qw( + test + version + plan + comment + bailout + unknown + yaml + ALL + ELSE + EOF + ); + + my @class_overrides = qw( + grammar_class + result_factory_class + iterator_factory_class + ); + + sub _initialize { + my ( $self, $arg_for ) = @_; + + # everything here is basically designed to convert any TAP source to a + # TAP::Parser::Iterator. + + # Shallow copy + my %args = %{ $arg_for || {} }; + + $self->SUPER::_initialize( \%args, \@legal_callback ); + + # get any class overrides out first: + for my $key (@class_overrides) { + my $default_method = "_default_$key"; + my $val = delete $args{$key} || $self->$default_method(); + $self->$key($val); + } + + my $iterator = delete $args{iterator}; + $iterator ||= delete $args{stream}; # deprecated + my $tap = delete $args{tap}; + my $raw_source = delete $args{source}; + my $sources = delete $args{sources}; + my $exec = delete $args{exec}; + my $merge = delete $args{merge}; + my $spool = delete $args{spool}; + my $switches = delete $args{switches}; + my $ignore_exit = delete $args{ignore_exit}; + my $test_args = delete $args{test_args} || []; + + if ( 1 < grep {defined} $iterator, $tap, $raw_source, $exec ) { + $self->_croak( + "You may only choose one of 'exec', 'tap', 'source' or 'iterator'" + ); + } + + if ( my @excess = sort keys %args ) { + $self->_croak("Unknown options: @excess"); + } + + # convert $tap & $exec to $raw_source equiv. + my $type = ''; + my $source = TAP::Parser::Source->new; + if ($tap) { + $type = 'raw TAP'; + $source->raw( \$tap ); + } + elsif ($exec) { + $type = 'exec ' . $exec->[0]; + $source->raw( { exec => [ @$exec, @$test_args ] } ); + } + elsif ($raw_source) { + $type = 'source ' . ref($raw_source) || $raw_source; + $source->raw( ref($raw_source) ? $raw_source : \$raw_source ); + } + elsif ($iterator) { + $type = 'iterator ' . ref($iterator); + } + + if ( $source->raw ) { + my $src_factory = $self->make_iterator_factory($sources); + $source->merge($merge)->switches($switches) + ->test_args($test_args); + $iterator = $src_factory->make_iterator($source); + } + + unless ($iterator) { + $self->_croak( + "PANIC: could not determine iterator for input $type"); + } + + while ( my ( $k, $v ) = each %initialize ) { + $self->{$k} = 'ARRAY' eq ref $v ? [] : $v; + } + + $self->_iterator($iterator); + $self->_spool($spool); + $self->ignore_exit($ignore_exit); + + return $self; + } +} + +=head1 INDIVIDUAL RESULTS + +If you've read this far in the docs, you've seen this: + + while ( my $result = $parser->next ) { + print $result->as_string; + } + +Each result returned is a L subclass, referred to as +I. + +=head2 Result types + +Basically, you fetch individual results from the TAP. The six types, with +examples of each, are as follows: + +=over 4 + +=item * Version + + TAP version 12 + +=item * Plan + + 1..42 + +=item * Pragma + + pragma +strict + +=item * Test + + ok 3 - We should start with some foobar! + +=item * Comment + + # Hope we don't use up the foobar. + +=item * Bailout + + Bail out! We ran out of foobar! + +=item * Unknown + + ... yo, this ain't TAP! ... + +=back + +Each result fetched is a result object of a different type. There are common +methods to each result object and different types may have methods unique to +their type. Sometimes a type method may be overridden in a subclass, but its +use is guaranteed to be identical. + +=head2 Common type methods + +=head3 C + +Returns the type of result, such as C or C. + +=head3 C + +Prints a string representation of the token. This might not be the exact +output, however. Tests will have test numbers added if not present, TODO and +SKIP directives will be capitalized and, in general, things will be cleaned +up. If you need the original text for the token, see the C method. + +=head3 C + +Returns the original line of text which was parsed. + +=head3 C + +Indicates whether or not this is the test plan line. + +=head3 C + +Indicates whether or not this is a test line. + +=head3 C + +Indicates whether or not this is a comment. Comments will generally only +appear in the TAP stream if STDERR is merged to STDOUT. See the +C option. + +=head3 C + +Indicates whether or not this is bailout line. + +=head3 C + +Indicates whether or not the current item is a YAML block. + +=head3 C + +Indicates whether or not the current line could be parsed. + +=head3 C + + if ( $result->is_ok ) { ... } + +Reports whether or not a given result has passed. Anything which is B a +test result returns true. This is merely provided as a convenient shortcut +which allows you to do this: + + my $parser = TAP::Parser->new( { source => $source } ); + while ( my $result = $parser->next ) { + # only print failing results + print $result->as_string unless $result->is_ok; + } + +=head2 C methods + + if ( $result->is_plan ) { ... } + +If the above evaluates as true, the following methods will be available on the +C<$result> object. + +=head3 C + + if ( $result->is_plan ) { + print $result->plan; + } + +This is merely a synonym for C. + +=head3 C + + my $directive = $result->directive; + +If a SKIP directive is included with the plan, this method will return it. + + 1..0 # SKIP: why bother? + +=head3 C + + my $explanation = $result->explanation; + +If a SKIP directive was included with the plan, this method will return the +explanation, if any. + +=head2 C methods + + if ( $result->is_pragma ) { ... } + +If the above evaluates as true, the following methods will be available on the +C<$result> object. + +=head3 C + +Returns a list of pragmas each of which is a + or - followed by the +pragma name. + +=head2 C methods + + if ( $result->is_comment ) { ... } + +If the above evaluates as true, the following methods will be available on the +C<$result> object. + +=head3 C + + if ( $result->is_comment ) { + my $comment = $result->comment; + print "I have something to say: $comment"; + } + +=head2 C methods + + if ( $result->is_bailout ) { ... } + +If the above evaluates as true, the following methods will be available on the +C<$result> object. + +=head3 C + + if ( $result->is_bailout ) { + my $explanation = $result->explanation; + print "We bailed out because ($explanation)"; + } + +If, and only if, a token is a bailout token, you can get an "explanation" via +this method. The explanation is the text after the mystical "Bail out!" words +which appear in the tap output. + +=head2 C methods + + if ( $result->is_unknown ) { ... } + +There are no unique methods for unknown results. + +=head2 C methods + + if ( $result->is_test ) { ... } + +If the above evaluates as true, the following methods will be available on the +C<$result> object. + +=head3 C + + my $ok = $result->ok; + +Returns the literal text of the C or C status. + +=head3 C + + my $test_number = $result->number; + +Returns the number of the test, even if the original TAP output did not supply +that number. + +=head3 C + + my $description = $result->description; + +Returns the description of the test, if any. This is the portion after the +test number but before the directive. + +=head3 C + + my $directive = $result->directive; + +Returns either C or C if either directive was present for a test +line. + +=head3 C + + my $explanation = $result->explanation; + +If a test had either a C or C directive, this method will return +the accompanying explantion, if present. + + not ok 17 - 'Pigs can fly' # TODO not enough acid + +For the above line, the explanation is I. + +=head3 C + + if ( $result->is_ok ) { ... } + +Returns a boolean value indicating whether or not the test passed. Remember +that for TODO tests, the test always passes. + +B this was formerly C. The latter method is deprecated and +will issue a warning. + +=head3 C + + if ( $result->is_actual_ok ) { ... } + +Returns a boolean value indicating whether or not the test passed, regardless +of its TODO status. + +B this was formerly C. The latter method is deprecated +and will issue a warning. + +=head3 C + + if ( $test->is_unplanned ) { ... } + +If a test number is greater than the number of planned tests, this method will +return true. Unplanned tests will I return false for C, +regardless of whether or not the test C (see +L for more information about this). + +=head3 C + + if ( $result->has_skip ) { ... } + +Returns a boolean value indicating whether or not this test had a SKIP +directive. + +=head3 C + + if ( $result->has_todo ) { ... } + +Returns a boolean value indicating whether or not this test had a TODO +directive. + +Note that TODO tests I pass. If you need to know whether or not +they really passed, check the C method. + +=head3 C + + if ( $parser->in_todo ) { ... } + +True while the most recent result was a TODO. Becomes true before the +TODO result is returned and stays true until just before the next non- +TODO test is returned. + +=head1 TOTAL RESULTS + +After parsing the TAP, there are many methods available to let you dig through +the results and determine what is meaningful to you. + +=head2 Individual Results + +These results refer to individual tests which are run. + +=head3 C + + my @passed = $parser->passed; # the test numbers which passed + my $passed = $parser->passed; # the number of tests which passed + +This method lets you know which (or how many) tests passed. If a test failed +but had a TODO directive, it will be counted as a passed test. + +=cut + +sub passed { @{ shift->{passed} } } + +=head3 C + + my @failed = $parser->failed; # the test numbers which failed + my $failed = $parser->failed; # the number of tests which failed + +This method lets you know which (or how many) tests failed. If a test passed +but had a TODO directive, it will B be counted as a failed test. + +=cut + +sub failed { @{ shift->{failed} } } + +=head3 C + + # the test numbers which actually passed + my @actual_passed = $parser->actual_passed; + + # the number of tests which actually passed + my $actual_passed = $parser->actual_passed; + +This method lets you know which (or how many) tests actually passed, +regardless of whether or not a TODO directive was found. + +=cut + +sub actual_passed { @{ shift->{actual_passed} } } +*actual_ok = \&actual_passed; + +=head3 C + +This method is a synonym for C. + +=head3 C + + # the test numbers which actually failed + my @actual_failed = $parser->actual_failed; + + # the number of tests which actually failed + my $actual_failed = $parser->actual_failed; + +This method lets you know which (or how many) tests actually failed, +regardless of whether or not a TODO directive was found. + +=cut + +sub actual_failed { @{ shift->{actual_failed} } } + +############################################################################## + +=head3 C + + my @todo = $parser->todo; # the test numbers with todo directives + my $todo = $parser->todo; # the number of tests with todo directives + +This method lets you know which (or how many) tests had TODO directives. + +=cut + +sub todo { @{ shift->{todo} } } + +=head3 C + + # the test numbers which unexpectedly succeeded + my @todo_passed = $parser->todo_passed; + + # the number of tests which unexpectedly succeeded + my $todo_passed = $parser->todo_passed; + +This method lets you know which (or how many) tests actually passed but were +declared as "TODO" tests. + +=cut + +sub todo_passed { @{ shift->{todo_passed} } } + +############################################################################## + +=head3 C + + # deprecated in favor of 'todo_passed'. This method was horribly misnamed. + +This was a badly misnamed method. It indicates which TODO tests unexpectedly +succeeded. Will now issue a warning and call C. + +=cut + +sub todo_failed { + warn + '"todo_failed" is deprecated. Please use "todo_passed". See the docs.'; + goto &todo_passed; +} + +=head3 C + + my @skipped = $parser->skipped; # the test numbers with SKIP directives + my $skipped = $parser->skipped; # the number of tests with SKIP directives + +This method lets you know which (or how many) tests had SKIP directives. + +=cut + +sub skipped { @{ shift->{skipped} } } + +=head2 Pragmas + +=head3 C + +Get or set a pragma. To get the state of a pragma: + + if ( $p->pragma('strict') ) { + # be strict + } + +To set the state of a pragma: + + $p->pragma('strict', 1); # enable strict mode + +=cut + +sub pragma { + my ( $self, $pragma ) = splice @_, 0, 2; + + return $self->{pragma}->{$pragma} unless @_; + + if ( my $state = shift ) { + $self->{pragma}->{$pragma} = 1; + } + else { + delete $self->{pragma}->{$pragma}; + } + + return; +} + +=head3 C + +Get a list of all the currently enabled pragmas: + + my @pragmas_enabled = $p->pragmas; + +=cut + +sub pragmas { sort keys %{ shift->{pragma} || {} } } + +=head2 Summary Results + +These results are "meta" information about the total results of an individual +test program. + +=head3 C + + my $plan = $parser->plan; + +Returns the test plan, if found. + +=head3 C + +Deprecated. Use C instead. + +=cut + +sub good_plan { + warn 'good_plan() is deprecated. Please use "is_good_plan()"'; + goto &is_good_plan; +} + +############################################################################## + +=head3 C + + if ( $parser->is_good_plan ) { ... } + +Returns a boolean value indicating whether or not the number of tests planned +matches the number of tests run. + +B this was formerly C. The latter method is deprecated and +will issue a warning. + +And since we're on that subject ... + +=head3 C + + print $parser->tests_planned; + +Returns the number of tests planned, according to the plan. For example, a +plan of '1..17' will mean that 17 tests were planned. + +=head3 C + + print $parser->tests_run; + +Returns the number of tests which actually were run. Hopefully this will +match the number of C<< $parser->tests_planned >>. + +=head3 C + +Returns a true value (actually the reason for skipping) if all tests +were skipped. + +=head3 C + +Returns the time when the Parser was created. + +=head3 C + +Returns the time when the end of TAP input was seen. + +=head3 C + + if ( $parser->has_problems ) { + ... + } + +This is a 'catch-all' method which returns true if any tests have currently +failed, any TODO tests unexpectedly succeeded, or any parse errors occurred. + +=cut + +sub has_problems { + my $self = shift; + return + $self->failed + || $self->parse_errors + || ( !$self->ignore_exit && ( $self->wait || $self->exit ) ); +} + +=head3 C + + $parser->version; + +Once the parser is done, this will return the version number for the +parsed TAP. Version numbers were introduced with TAP version 13 so if no +version number is found version 12 is assumed. + +=head3 C + + $parser->exit; + +Once the parser is done, this will return the exit status. If the parser ran +an executable, it returns the exit status of the executable. + +=head3 C + + $parser->wait; + +Once the parser is done, this will return the wait status. If the parser ran +an executable, it returns the wait status of the executable. Otherwise, this +mererely returns the C status. + +=head2 C + + $parser->ignore_exit(1); + +Tell the parser to ignore the exit status from the test when determining +whether the test passed. Normally tests with non-zero exit status are +considered to have failed even if all individual tests passed. In cases +where it is not possible to control the exit value of the test script +use this option to ignore it. + +=cut + +sub ignore_exit { shift->pragma( 'ignore_exit', @_ ) } + +=head3 C + + my @errors = $parser->parse_errors; # the parser errors + my $errors = $parser->parse_errors; # the number of parser_errors + +Fortunately, all TAP output is perfect. In the event that it is not, this +method will return parser errors. Note that a junk line which the parser does +not recognize is C an error. This allows this parser to handle future +versions of TAP. The following are all TAP errors reported by the parser: + +=over 4 + +=item * Misplaced plan + +The plan (for example, '1..5'), must only come at the beginning or end of the +TAP output. + +=item * No plan + +Gotta have a plan! + +=item * More than one plan + + 1..3 + ok 1 - input file opened + not ok 2 - first line of the input valid # todo some data + ok 3 read the rest of the file + 1..3 + +Right. Very funny. Don't do that. + +=item * Test numbers out of sequence + + 1..3 + ok 1 - input file opened + not ok 2 - first line of the input valid # todo some data + ok 2 read the rest of the file + +That last test line above should have the number '3' instead of '2'. + +Note that it's perfectly acceptable for some lines to have test numbers and +others to not have them. However, when a test number is found, it must be in +sequence. The following is also an error: + + 1..3 + ok 1 - input file opened + not ok - first line of the input valid # todo some data + ok 2 read the rest of the file + +But this is not: + + 1..3 + ok - input file opened + not ok - first line of the input valid # todo some data + ok 3 read the rest of the file + +=back + +=cut + +sub parse_errors { @{ shift->{parse_errors} } } + +sub _add_error { + my ( $self, $error ) = @_; + push @{ $self->{parse_errors} } => $error; + return $self; +} + +sub _make_state_table { + my $self = shift; + my %states; + my %planned_todo = (); + + # These transitions are defaults for all states + my %state_globals = ( + comment => {}, + bailout => {}, + yaml => {}, + version => { + act => sub { + $self->_add_error( + 'If TAP version is present it must be the first line of output' + ); + }, + }, + unknown => { + act => sub { + my $unk = shift; + if ( $self->pragma('strict') ) { + $self->_add_error( + 'Unknown TAP token: "' . $unk->raw . '"' ); + } + }, + }, + pragma => { + act => sub { + my ($pragma) = @_; + for my $pr ( $pragma->pragmas ) { + if ( $pr =~ /^ ([-+])(\w+) $/x ) { + $self->pragma( $2, $1 eq '+' ); + } + } + }, + }, + ); + + # Provides default elements for transitions + my %state_defaults = ( + plan => { + act => sub { + my ($plan) = @_; + $self->tests_planned( $plan->tests_planned ); + $self->plan( $plan->plan ); + if ( $plan->has_skip ) { + $self->skip_all( $plan->explanation + || '(no reason given)' ); + } + + $planned_todo{$_}++ for @{ $plan->todo_list }; + }, + }, + test => { + act => sub { + my ($test) = @_; + + my ( $number, $tests_run ) + = ( $test->number, ++$self->{tests_run} ); + + # Fake TODO state + if ( defined $number && delete $planned_todo{$number} ) { + $test->set_directive('TODO'); + } + + my $has_todo = $test->has_todo; + + $self->in_todo($has_todo); + if ( defined( my $tests_planned = $self->tests_planned ) ) { + if ( $tests_run > $tests_planned ) { + $test->is_unplanned(1); + } + } + + if ( defined $number ) { + if ( $number != $tests_run ) { + my $count = $tests_run; + $self->_add_error( "Tests out of sequence. Found " + . "($number) but expected ($count)" ); + } + } + else { + $test->_number( $number = $tests_run ); + } + + push @{ $self->{todo} } => $number if $has_todo; + push @{ $self->{todo_passed} } => $number + if $test->todo_passed; + push @{ $self->{skipped} } => $number + if $test->has_skip; + + push @{ $self->{ $test->is_ok ? 'passed' : 'failed' } } => + $number; + push @{ + $self->{ + $test->is_actual_ok + ? 'actual_passed' + : 'actual_failed' + } + } => $number; + }, + }, + yaml => { act => sub { }, }, + ); + + # Each state contains a hash the keys of which match a token type. For + # each token + # type there may be: + # act A coderef to run + # goto The new state to move to. Stay in this state if + # missing + # continue Goto the new state and run the new state for the + # current token + %states = ( + INIT => { + version => { + act => sub { + my ($version) = @_; + my $ver_num = $version->version; + if ( $ver_num <= $DEFAULT_TAP_VERSION ) { + my $ver_min = $DEFAULT_TAP_VERSION + 1; + $self->_add_error( + "Explicit TAP version must be at least " + . "$ver_min. Got version $ver_num" ); + $ver_num = $DEFAULT_TAP_VERSION; + } + if ( $ver_num > $MAX_TAP_VERSION ) { + $self->_add_error( + "TAP specified version $ver_num but " + . "we don't know about versions later " + . "than $MAX_TAP_VERSION" ); + $ver_num = $MAX_TAP_VERSION; + } + $self->version($ver_num); + $self->_grammar->set_version($ver_num); + }, + goto => 'PLAN' + }, + plan => { goto => 'PLANNED' }, + test => { goto => 'UNPLANNED' }, + }, + PLAN => { + plan => { goto => 'PLANNED' }, + test => { goto => 'UNPLANNED' }, + }, + PLANNED => { + test => { goto => 'PLANNED_AFTER_TEST' }, + plan => { + act => sub { + my ($version) = @_; + $self->_add_error( + 'More than one plan found in TAP output'); + }, + }, + }, + PLANNED_AFTER_TEST => { + test => { goto => 'PLANNED_AFTER_TEST' }, + plan => { act => sub { }, continue => 'PLANNED' }, + yaml => { goto => 'PLANNED' }, + }, + GOT_PLAN => { + test => { + act => sub { + my ($plan) = @_; + my $line = $self->plan; + $self->_add_error( + "Plan ($line) must be at the beginning " + . "or end of the TAP output" ); + $self->is_good_plan(0); + }, + continue => 'PLANNED' + }, + plan => { continue => 'PLANNED' }, + }, + UNPLANNED => { + test => { goto => 'UNPLANNED_AFTER_TEST' }, + plan => { goto => 'GOT_PLAN' }, + }, + UNPLANNED_AFTER_TEST => { + test => { act => sub { }, continue => 'UNPLANNED' }, + plan => { act => sub { }, continue => 'UNPLANNED' }, + yaml => { goto => 'PLANNED' }, + }, + ); + + # Apply globals and defaults to state table + for my $name ( keys %states ) { + + # Merge with globals + my $st = { %state_globals, %{ $states{$name} } }; + + # Add defaults + for my $next ( sort keys %{$st} ) { + if ( my $default = $state_defaults{$next} ) { + for my $def ( sort keys %{$default} ) { + $st->{$next}->{$def} ||= $default->{$def}; + } + } + } + + # Stuff back in table + $states{$name} = $st; + } + + return \%states; +} + +=head3 C + +Get an a list of file handles which can be passed to C