From c3b46a47f2086481c33c989fe418d7c01d553b72 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Tue, 19 Feb 2008 17:43:33 +0000 Subject: [PATCH] remove unneeded (Perl and Tcl/Tk) files Signed-off-by: Johannes Schindelin --- lib/perl5/5.8.8/CGI.pm | 7623 ------ lib/perl5/5.8.8/CGI/Apache.pm | 26 - lib/perl5/5.8.8/CGI/Carp.pm | 527 - lib/perl5/5.8.8/CGI/Cookie.pm | 478 - lib/perl5/5.8.8/CGI/Fast.pm | 230 - lib/perl5/5.8.8/CGI/Pretty.pm | 276 - lib/perl5/5.8.8/CGI/Push.pm | 325 - lib/perl5/5.8.8/CGI/Switch.pm | 27 - lib/perl5/5.8.8/CGI/Util.pm | 318 - lib/perl5/5.8.8/CGI/eg/RunMeFirst | 36 - lib/perl5/5.8.8/CGI/eg/caution.xbm | 12 - lib/perl5/5.8.8/CGI/eg/clickable_image.cgi | 26 - lib/perl5/5.8.8/CGI/eg/cookie.cgi | 88 - lib/perl5/5.8.8/CGI/eg/crash.cgi | 6 - lib/perl5/5.8.8/CGI/eg/customize.cgi | 92 - lib/perl5/5.8.8/CGI/eg/diff_upload.cgi | 68 - lib/perl5/5.8.8/CGI/eg/dna_small_gif.uu | 63 - lib/perl5/5.8.8/CGI/eg/file_upload.cgi | 71 - lib/perl5/5.8.8/CGI/eg/frameset.cgi | 81 - lib/perl5/5.8.8/CGI/eg/index.html | 119 - lib/perl5/5.8.8/CGI/eg/internal_links.cgi | 33 - lib/perl5/5.8.8/CGI/eg/javascript.cgi | 105 - lib/perl5/5.8.8/CGI/eg/make_links.pl | 8 - lib/perl5/5.8.8/CGI/eg/monty.cgi | 84 - lib/perl5/5.8.8/CGI/eg/multiple_forms.cgi | 54 - lib/perl5/5.8.8/CGI/eg/nph-clock.cgi | 18 - lib/perl5/5.8.8/CGI/eg/nph-multipart.cgi | 10 - lib/perl5/5.8.8/CGI/eg/popup.cgi | 32 - lib/perl5/5.8.8/CGI/eg/save_state.cgi | 67 - lib/perl5/5.8.8/CGI/eg/tryit.cgi | 37 - lib/perl5/5.8.8/CGI/eg/wilogo_gif.uu | 13 - lib/perl5/5.8.8/Encode/PerlIO.pod | 167 - lib/perl5/5.8.8/Encode/Supported.pod | 890 - lib/perl5/5.8.8/Encode/encode.h | 111 - lib/perl5/5.8.8/ExtUtils/Command.pm | 319 - lib/perl5/5.8.8/ExtUtils/Command/MM.pm | 265 - lib/perl5/5.8.8/ExtUtils/Constant.pm | 525 - lib/perl5/5.8.8/ExtUtils/Constant/Base.pm | 973 - lib/perl5/5.8.8/ExtUtils/Constant/Utils.pm | 123 - lib/perl5/5.8.8/ExtUtils/Constant/XS.pm | 252 - lib/perl5/5.8.8/ExtUtils/Embed.pm | 515 - lib/perl5/5.8.8/ExtUtils/Install.pm | 544 - lib/perl5/5.8.8/ExtUtils/Installed.pm | 337 - lib/perl5/5.8.8/ExtUtils/Liblist.pm | 285 - lib/perl5/5.8.8/ExtUtils/Liblist/Kid.pm | 548 - lib/perl5/5.8.8/ExtUtils/MANIFEST.SKIP | 30 - lib/perl5/5.8.8/ExtUtils/MM.pm | 84 - lib/perl5/5.8.8/ExtUtils/MM_AIX.pm | 80 - lib/perl5/5.8.8/ExtUtils/MM_Any.pm | 1683 -- lib/perl5/5.8.8/ExtUtils/MM_BeOS.pm | 60 - lib/perl5/5.8.8/ExtUtils/MM_Cygwin.pm | 106 - lib/perl5/5.8.8/ExtUtils/MM_DOS.pm | 66 - lib/perl5/5.8.8/ExtUtils/MM_MacOS.pm | 38 - lib/perl5/5.8.8/ExtUtils/MM_Msys.pm | 106 - lib/perl5/5.8.8/ExtUtils/MM_NW5.pm | 271 - lib/perl5/5.8.8/ExtUtils/MM_OS2.pm | 153 - lib/perl5/5.8.8/ExtUtils/MM_QNX.pm | 58 - lib/perl5/5.8.8/ExtUtils/MM_UWIN.pm | 65 - lib/perl5/5.8.8/ExtUtils/MM_Unix.pm | 3674 --- lib/perl5/5.8.8/ExtUtils/MM_VMS.pm | 1953 -- lib/perl5/5.8.8/ExtUtils/MM_VOS.pm | 51 - lib/perl5/5.8.8/ExtUtils/MM_Win32.pm | 537 - lib/perl5/5.8.8/ExtUtils/MM_Win95.pm | 123 - lib/perl5/5.8.8/ExtUtils/MY.pm | 42 - lib/perl5/5.8.8/ExtUtils/MakeMaker.pm | 2519 -- lib/perl5/5.8.8/ExtUtils/MakeMaker/Config.pm | 39 - lib/perl5/5.8.8/ExtUtils/MakeMaker/FAQ.pod | 300 - lib/perl5/5.8.8/ExtUtils/MakeMaker/Tutorial.pod | 181 - lib/perl5/5.8.8/ExtUtils/MakeMaker/bytes.pm | 39 - lib/perl5/5.8.8/ExtUtils/MakeMaker/vmsish.pm | 40 - lib/perl5/5.8.8/ExtUtils/Manifest.pm | 708 - lib/perl5/5.8.8/ExtUtils/Miniperl.pm | 235 - lib/perl5/5.8.8/ExtUtils/Mkbootstrap.pm | 102 - lib/perl5/5.8.8/ExtUtils/Mksymlists.pm | 309 - lib/perl5/5.8.8/ExtUtils/NOTES | 96 - lib/perl5/5.8.8/ExtUtils/PATCHING | 199 - lib/perl5/5.8.8/ExtUtils/Packlist.pm | 295 - lib/perl5/5.8.8/ExtUtils/testlib.pm | 37 - lib/perl5/5.8.8/ExtUtils/typemap | 314 - lib/perl5/5.8.8/ExtUtils/xsubpp | 1908 -- lib/perl5/5.8.8/Locale/Constants.pod | 76 - lib/perl5/5.8.8/Locale/Country.pod | 306 - lib/perl5/5.8.8/Locale/Currency.pod | 191 - lib/perl5/5.8.8/Locale/Language.pod | 158 - lib/perl5/5.8.8/Locale/Maketext.pod | 1320 - lib/perl5/5.8.8/Locale/Maketext/TPJ13.pod | 778 - lib/perl5/5.8.8/Locale/Script.pod | 253 - lib/perl5/5.8.8/Math/BigFloat.pm | 3147 --- lib/perl5/5.8.8/Math/BigFloat/Trace.pm | 58 - lib/perl5/5.8.8/Math/BigInt.pm | 4450 --- lib/perl5/5.8.8/Math/BigInt/Calc.pm | 2102 -- lib/perl5/5.8.8/Math/BigInt/CalcEmu.pm | 329 - lib/perl5/5.8.8/Math/BigInt/Trace.pm | 47 - lib/perl5/5.8.8/Math/BigRat.pm | 1688 -- lib/perl5/5.8.8/Math/Complex.pm | 1973 -- lib/perl5/5.8.8/Math/Trig.pm | 622 - lib/perl5/5.8.8/Net/libnetFAQ.pod | 307 - lib/perl5/5.8.8/Pod/Checker.pm | 1270 - lib/perl5/5.8.8/Pod/Find.pm | 523 - lib/perl5/5.8.8/Pod/Functions.pm | 376 - lib/perl5/5.8.8/Pod/Html.pm | 2112 -- lib/perl5/5.8.8/Pod/InputObjects.pm | 941 - lib/perl5/5.8.8/Pod/LaTeX.pm | 1876 -- lib/perl5/5.8.8/Pod/Man.pm | 1410 - lib/perl5/5.8.8/Pod/ParseLink.pm | 184 - lib/perl5/5.8.8/Pod/ParseUtils.pm | 852 - lib/perl5/5.8.8/Pod/Parser.pm | 1799 -- lib/perl5/5.8.8/Pod/Perldoc.pm | 1761 -- lib/perl5/5.8.8/Pod/Perldoc/BaseTo.pm | 28 - lib/perl5/5.8.8/Pod/Perldoc/GetOptsOO.pm | 106 - lib/perl5/5.8.8/Pod/Perldoc/ToChecker.pm | 72 - lib/perl5/5.8.8/Pod/Perldoc/ToMan.pm | 187 - lib/perl5/5.8.8/Pod/Perldoc/ToNroff.pm | 100 - lib/perl5/5.8.8/Pod/Perldoc/ToPod.pm | 90 - lib/perl5/5.8.8/Pod/Perldoc/ToRtf.pm | 85 - lib/perl5/5.8.8/Pod/Perldoc/ToText.pm | 91 - lib/perl5/5.8.8/Pod/Perldoc/ToTk.pm | 129 - lib/perl5/5.8.8/Pod/Perldoc/ToXml.pm | 63 - lib/perl5/5.8.8/Pod/PlainText.pm | 705 - lib/perl5/5.8.8/Pod/Plainer.pm | 69 - lib/perl5/5.8.8/Pod/Select.pm | 754 - lib/perl5/5.8.8/Pod/Text.pm | 848 - lib/perl5/5.8.8/Pod/Text/Color.pm | 145 - lib/perl5/5.8.8/Pod/Text/Overstrike.pm | 208 - lib/perl5/5.8.8/Pod/Text/Termcap.pm | 180 - lib/perl5/5.8.8/Pod/Usage.pm | 659 - lib/perl5/5.8.8/Test.pm | 955 - lib/perl5/5.8.8/Test/Builder.pm | 1749 -- lib/perl5/5.8.8/Test/Builder/Module.pm | 182 - lib/perl5/5.8.8/Test/Builder/Tester.pm | 640 - lib/perl5/5.8.8/Test/Builder/Tester/Color.pm | 50 - lib/perl5/5.8.8/Test/Harness.pm | 1080 - lib/perl5/5.8.8/Test/Harness/Assert.pm | 66 - lib/perl5/5.8.8/Test/Harness/Iterator.pm | 70 - lib/perl5/5.8.8/Test/Harness/Point.pm | 152 - lib/perl5/5.8.8/Test/Harness/Straps.pm | 681 - lib/perl5/5.8.8/Test/Harness/TAP.pod | 366 - lib/perl5/5.8.8/Test/More.pm | 1536 -- lib/perl5/5.8.8/Test/Simple.pm | 230 - lib/perl5/5.8.8/Test/Tutorial.pod | 603 - lib/perl5/5.8.8/Unicode/Collate.pm | 1877 -- lib/perl5/5.8.8/Unicode/Collate/keys.txt | 864 - lib/perl5/5.8.8/Unicode/UCD.pm | 820 - lib/perl5/5.8.8/abbrev.pl | 43 - lib/perl5/5.8.8/assert.pl | 55 - lib/perl5/5.8.8/bigfloat.pl | 254 - lib/perl5/5.8.8/bigint.pl | 320 - lib/perl5/5.8.8/bigrat.pl | 155 - lib/perl5/5.8.8/bytes_heavy.pl | 40 - lib/perl5/5.8.8/cacheout.pl | 55 - lib/perl5/5.8.8/charnames.pm | 544 - lib/perl5/5.8.8/complete.pl | 120 - lib/perl5/5.8.8/ctime.pl | 59 - lib/perl5/5.8.8/dbm_filter_util.pl | 68 - lib/perl5/5.8.8/dotsh.pl | 74 - lib/perl5/5.8.8/dumpvar.pl | 535 - lib/perl5/5.8.8/exceptions.pl | 61 - lib/perl5/5.8.8/fastcwd.pl | 43 - lib/perl5/5.8.8/find.pl | 47 - lib/perl5/5.8.8/finddepth.pl | 46 - lib/perl5/5.8.8/flush.pl | 32 - lib/perl5/5.8.8/getcwd.pl | 71 - lib/perl5/5.8.8/getopt.pl | 49 - lib/perl5/5.8.8/getopts.pl | 66 - lib/perl5/5.8.8/hostname.pl | 31 - lib/perl5/5.8.8/importenv.pl | 16 - lib/perl5/5.8.8/look.pl | 50 - lib/perl5/5.8.8/msys/.packlist | 1470 - lib/perl5/5.8.8/msys/CORE/EXTERN.h | 61 - lib/perl5/5.8.8/msys/CORE/INTERN.h | 54 - lib/perl5/5.8.8/msys/CORE/XSUB.h | 581 - lib/perl5/5.8.8/msys/CORE/av.h | 87 - lib/perl5/5.8.8/msys/CORE/cc_runtime.h | 84 - lib/perl5/5.8.8/msys/CORE/config.h | 4371 --- lib/perl5/5.8.8/msys/CORE/cop.h | 586 - lib/perl5/5.8.8/msys/CORE/cv.h | 210 - lib/perl5/5.8.8/msys/CORE/dosish.h | 194 - lib/perl5/5.8.8/msys/CORE/embed.h | 4225 --- lib/perl5/5.8.8/msys/CORE/embedvar.h | 1513 -- lib/perl5/5.8.8/msys/CORE/fakesdio.h | 125 - lib/perl5/5.8.8/msys/CORE/fakethr.h | 65 - lib/perl5/5.8.8/msys/CORE/form.h | 27 - lib/perl5/5.8.8/msys/CORE/gv.h | 166 - lib/perl5/5.8.8/msys/CORE/handy.h | 709 - lib/perl5/5.8.8/msys/CORE/hv.h | 349 - lib/perl5/5.8.8/msys/CORE/intrpvar.h | 588 - lib/perl5/5.8.8/msys/CORE/iperlsys.h | 1407 - lib/perl5/5.8.8/msys/CORE/keywords.h | 262 - lib/perl5/5.8.8/msys/CORE/libperl.a | Bin 1455840 -> 0 bytes lib/perl5/5.8.8/msys/CORE/libperl.dll.a | Bin 1254532 -> 0 bytes lib/perl5/5.8.8/msys/CORE/malloc_ctl.h | 64 - lib/perl5/5.8.8/msys/CORE/mg.h | 61 - lib/perl5/5.8.8/msys/CORE/nostdio.h | 126 - lib/perl5/5.8.8/msys/CORE/op.h | 511 - lib/perl5/5.8.8/msys/CORE/opcode.h | 1830 -- lib/perl5/5.8.8/msys/CORE/opnames.h | 423 - lib/perl5/5.8.8/msys/CORE/pad.h | 276 - lib/perl5/5.8.8/msys/CORE/patchlevel.h | 137 - lib/perl5/5.8.8/msys/CORE/perl.h | 4914 ---- lib/perl5/5.8.8/msys/CORE/perlapi.h | 1056 - lib/perl5/5.8.8/msys/CORE/perlio.h | 386 - lib/perl5/5.8.8/msys/CORE/perliol.h | 283 - lib/perl5/5.8.8/msys/CORE/perlsdio.h | 154 - lib/perl5/5.8.8/msys/CORE/perlsfio.h | 75 - lib/perl5/5.8.8/msys/CORE/perlvars.h | 74 - lib/perl5/5.8.8/msys/CORE/perly.h | 70 - lib/perl5/5.8.8/msys/CORE/pp.h | 505 - lib/perl5/5.8.8/msys/CORE/pp_proto.h | 396 - lib/perl5/5.8.8/msys/CORE/proto.h | 2316 -- lib/perl5/5.8.8/msys/CORE/reentr.h | 784 - lib/perl5/5.8.8/msys/CORE/regcomp.h | 398 - lib/perl5/5.8.8/msys/CORE/regexp.h | 129 - lib/perl5/5.8.8/msys/CORE/regnodes.h | 342 - lib/perl5/5.8.8/msys/CORE/scope.h | 411 - lib/perl5/5.8.8/msys/CORE/sv.h | 1389 - lib/perl5/5.8.8/msys/CORE/thrdvar.h | 277 - lib/perl5/5.8.8/msys/CORE/thread.h | 526 - lib/perl5/5.8.8/msys/CORE/uconfig.h | 4351 --- lib/perl5/5.8.8/msys/CORE/unixish.h | 142 - lib/perl5/5.8.8/msys/CORE/utf8.h | 335 - lib/perl5/5.8.8/msys/CORE/utfebcdic.h | 420 - lib/perl5/5.8.8/msys/CORE/util.h | 43 - lib/perl5/5.8.8/msys/CORE/warnings.h | 117 - lib/perl5/5.8.8/msys/Config.pod | 8257 ------ lib/perl5/5.8.8/msys/Config_heavy.pl | 1200 - lib/perl5/5.8.8/msys/POSIX.pod | 2127 -- lib/perl5/5.8.8/msys/Unicode/Normalize.pm | 479 - lib/perl5/5.8.8/msys/auto/B/C/libC.dll.a | Bin 13682 -> 0 bytes lib/perl5/5.8.8/msys/auto/B/libB.dll.a | Bin 164578 -> 0 bytes .../5.8.8/msys/auto/ByteLoader/libByteLoader.dll.a | Bin 53826 -> 0 bytes lib/perl5/5.8.8/msys/auto/Cwd/libCwd.dll.a | Bin 14434 -> 0 bytes .../5.8.8/msys/auto/Data/Dumper/libDumper.dll.a | Bin 46406 -> 0 bytes .../5.8.8/msys/auto/Devel/DProf/libDProf.dll.a | Bin 32008 -> 0 bytes .../5.8.8/msys/auto/Devel/PPPort/libPPPort.dll.a | Bin 115640 -> 0 bytes lib/perl5/5.8.8/msys/auto/Devel/Peek/libPeek.dll.a | Bin 33378 -> 0 bytes lib/perl5/5.8.8/msys/auto/Digest/MD5/libMD5.dll.a | Bin 20026 -> 0 bytes lib/perl5/5.8.8/msys/auto/DynaLoader/DynaLoader.a | Bin 6582 -> 0 bytes .../5.8.8/msys/auto/Encode/Byte/libByte.dll.a | Bin 53872 -> 0 bytes lib/perl5/5.8.8/msys/auto/Encode/CN/libCN.dll.a | Bin 17564 -> 0 bytes .../5.8.8/msys/auto/Encode/EBCDIC/libEBCDIC.dll.a | Bin 17612 -> 0 bytes lib/perl5/5.8.8/msys/auto/Encode/JP/libJP.dll.a | Bin 18168 -> 0 bytes lib/perl5/5.8.8/msys/auto/Encode/KR/libKR.dll.a | Bin 16894 -> 0 bytes .../5.8.8/msys/auto/Encode/Symbol/libSymbol.dll.a | Bin 17732 -> 0 bytes lib/perl5/5.8.8/msys/auto/Encode/TW/libTW.dll.a | Bin 16330 -> 0 bytes .../msys/auto/Encode/Unicode/libUnicode.dll.a | Bin 19268 -> 0 bytes lib/perl5/5.8.8/msys/auto/Encode/libEncode.dll.a | Bin 67608 -> 0 bytes lib/perl5/5.8.8/msys/auto/Fcntl/libFcntl.dll.a | Bin 13830 -> 0 bytes lib/perl5/5.8.8/msys/auto/File/Glob/libGlob.dll.a | Bin 21406 -> 0 bytes .../5.8.8/msys/auto/Filter/Util/Call/libCall.dll.a | Bin 31936 -> 0 bytes lib/perl5/5.8.8/msys/auto/IO/libIO.dll.a | Bin 35516 -> 0 bytes lib/perl5/5.8.8/msys/auto/List/Util/libUtil.dll.a | Bin 63956 -> 0 bytes .../5.8.8/msys/auto/MIME/Base64/libBase64.dll.a | Bin 17064 -> 0 bytes lib/perl5/5.8.8/msys/auto/Opcode/libOpcode.dll.a | Bin 46170 -> 0 bytes lib/perl5/5.8.8/msys/auto/POSIX/libPOSIX.dll.a | Bin 122696 -> 0 bytes .../msys/auto/PerlIO/encoding/libencoding.dll.a | Bin 59656 -> 0 bytes .../5.8.8/msys/auto/PerlIO/scalar/libscalar.dll.a | Bin 32378 -> 0 bytes lib/perl5/5.8.8/msys/auto/PerlIO/via/libvia.dll.a | Bin 56596 -> 0 bytes .../5.8.8/msys/auto/SDBM_File/libSDBM_File.dll.a | Bin 49182 -> 0 bytes lib/perl5/5.8.8/msys/auto/Socket/libSocket.dll.a | Bin 24710 -> 0 bytes .../5.8.8/msys/auto/Storable/libStorable.dll.a | Bin 78676 -> 0 bytes .../5.8.8/msys/auto/Sys/Hostname/libHostname.dll.a | Bin 10958 -> 0 bytes .../5.8.8/msys/auto/Sys/Syslog/libSyslog.dll.a | Bin 18890 -> 0 bytes .../5.8.8/msys/auto/Time/HiRes/libHiRes.dll.a | Bin 29704 -> 0 bytes .../msys/auto/Unicode/Normalize/libNormalize.dll.a | Bin 388538 -> 0 bytes .../5.8.8/msys/auto/XS/APItest/libAPItest.dll.a | Bin 57716 -> 0 bytes .../5.8.8/msys/auto/XS/Typemap/libTypemap.dll.a | Bin 61338 -> 0 bytes lib/perl5/5.8.8/msys/auto/attrs/libattrs.dll.a | Bin 13242 -> 0 bytes lib/perl5/5.8.8/msys/auto/re/libre.dll.a | Bin 129386 -> 0 bytes lib/perl5/5.8.8/msys/auto/threads/libthreads.dll.a | Bin 6420 -> 0 bytes .../5.8.8/msys/auto/threads/shared/libshared.dll.a | Bin 6470 -> 0 bytes lib/perl5/5.8.8/msys/perllocal.pod | 44 - lib/perl5/5.8.8/newgetopt.pl | 75 - lib/perl5/5.8.8/open2.pl | 12 - lib/perl5/5.8.8/open3.pl | 12 - lib/perl5/5.8.8/perl5db.pl | 9428 ------- lib/perl5/5.8.8/pods/a2p.pod | 179 - lib/perl5/5.8.8/pods/perl.pod | 444 - lib/perl5/5.8.8/pods/perl5004delta.pod | 1612 -- lib/perl5/5.8.8/pods/perl5005delta.pod | 993 - lib/perl5/5.8.8/pods/perl561delta.pod | 3661 --- lib/perl5/5.8.8/pods/perl56delta.pod | 3022 --- lib/perl5/5.8.8/pods/perl570delta.pod | 899 - lib/perl5/5.8.8/pods/perl571delta.pod | 1075 - lib/perl5/5.8.8/pods/perl572delta.pod | 831 - lib/perl5/5.8.8/pods/perl573delta.pod | 246 - lib/perl5/5.8.8/pods/perl581delta.pod | 1102 - lib/perl5/5.8.8/pods/perl582delta.pod | 162 - lib/perl5/5.8.8/pods/perl583delta.pod | 210 - lib/perl5/5.8.8/pods/perl584delta.pod | 263 - lib/perl5/5.8.8/pods/perl585delta.pod | 257 - lib/perl5/5.8.8/pods/perl586delta.pod | 170 - lib/perl5/5.8.8/pods/perl587delta.pod | 379 - lib/perl5/5.8.8/pods/perl588delta.pod | 1632 -- lib/perl5/5.8.8/pods/perl58delta.pod | 3746 --- lib/perl5/5.8.8/pods/perlaix.pod | 270 - lib/perl5/5.8.8/pods/perlamiga.pod | 278 - lib/perl5/5.8.8/pods/perlapi.pod | 6204 ----- lib/perl5/5.8.8/pods/perlapio.pod | 526 - lib/perl5/5.8.8/pods/perlapollo.pod | 23 - lib/perl5/5.8.8/pods/perlartistic.pod | 217 - lib/perl5/5.8.8/pods/perlbeos.pod | 109 - lib/perl5/5.8.8/pods/perlbook.pod | 17 - lib/perl5/5.8.8/pods/perlboot.pod | 816 - lib/perl5/5.8.8/pods/perlbot.pod | 535 - lib/perl5/5.8.8/pods/perlbs2000.pod | 241 - lib/perl5/5.8.8/pods/perlcall.pod | 1894 -- lib/perl5/5.8.8/pods/perlce.pod | 137 - lib/perl5/5.8.8/pods/perlcheat.pod | 93 - lib/perl5/5.8.8/pods/perlclib.pod | 209 - lib/perl5/5.8.8/pods/perlcn.pod | 148 - lib/perl5/5.8.8/pods/perlcompile.pod | 451 - lib/perl5/5.8.8/pods/perlcygwin.pod | 617 - lib/perl5/5.8.8/pods/perldata.pod | 861 - lib/perl5/5.8.8/pods/perldbmfilter.pod | 168 - lib/perl5/5.8.8/pods/perldebguts.pod | 877 - lib/perl5/5.8.8/pods/perldebtut.pod | 723 - lib/perl5/5.8.8/pods/perldebug.pod | 1145 - lib/perl5/5.8.8/pods/perldelta.pod | 1632 -- lib/perl5/5.8.8/pods/perldgux.pod | 117 - lib/perl5/5.8.8/pods/perldiag.pod | 4614 ---- lib/perl5/5.8.8/pods/perldoc.pod | 220 - lib/perl5/5.8.8/pods/perldos.pod | 332 - lib/perl5/5.8.8/pods/perldsc.pod | 847 - lib/perl5/5.8.8/pods/perlebcdic.pod | 1394 - lib/perl5/5.8.8/pods/perlembed.pod | 1140 - lib/perl5/5.8.8/pods/perlepoc.pod | 159 - lib/perl5/5.8.8/pods/perlfaq.pod | 1410 - lib/perl5/5.8.8/pods/perlfaq1.pod | 408 - lib/perl5/5.8.8/pods/perlfaq2.pod | 529 - lib/perl5/5.8.8/pods/perlfaq3.pod | 990 - lib/perl5/5.8.8/pods/perlfaq4.pod | 2168 -- lib/perl5/5.8.8/pods/perlfaq5.pod | 1119 - lib/perl5/5.8.8/pods/perlfaq6.pod | 902 - lib/perl5/5.8.8/pods/perlfaq7.pod | 976 - lib/perl5/5.8.8/pods/perlfaq8.pod | 1266 - lib/perl5/5.8.8/pods/perlfaq9.pod | 662 - lib/perl5/5.8.8/pods/perlfilter.pod | 588 - lib/perl5/5.8.8/pods/perlfork.pod | 313 - lib/perl5/5.8.8/pods/perlform.pod | 459 - lib/perl5/5.8.8/pods/perlfreebsd.pod | 47 - lib/perl5/5.8.8/pods/perlfunc.pod | 7040 ----- lib/perl5/5.8.8/pods/perlglossary.pod | 3383 --- lib/perl5/5.8.8/pods/perlgpl.pod | 384 - lib/perl5/5.8.8/pods/perlguts.pod | 2571 -- lib/perl5/5.8.8/pods/perlhack.pod | 2760 -- lib/perl5/5.8.8/pods/perlhist.pod | 623 - lib/perl5/5.8.8/pods/perlhpux.pod | 591 - lib/perl5/5.8.8/pods/perlhurd.pod | 54 - lib/perl5/5.8.8/pods/perlintern.pod | 919 - lib/perl5/5.8.8/pods/perlintro.pod | 645 - lib/perl5/5.8.8/pods/perliol.pod | 1039 - lib/perl5/5.8.8/pods/perlipc.pod | 1697 -- lib/perl5/5.8.8/pods/perlirix.pod | 141 - lib/perl5/5.8.8/pods/perljp.pod | 204 - lib/perl5/5.8.8/pods/perlko.pod | 218 - lib/perl5/5.8.8/pods/perllexwarn.pod | 540 - lib/perl5/5.8.8/pods/perllinux.pod | 39 - lib/perl5/5.8.8/pods/perllocale.pod | 1026 - lib/perl5/5.8.8/pods/perllol.pod | 303 - lib/perl5/5.8.8/pods/perlmachten.pod | 116 - lib/perl5/5.8.8/pods/perlmacos.pod | 64 - lib/perl5/5.8.8/pods/perlmacosx.pod | 233 - lib/perl5/5.8.8/pods/perlmint.pod | 229 - lib/perl5/5.8.8/pods/perlmod.pod | 592 - lib/perl5/5.8.8/pods/perlmodinstall.pod | 465 - lib/perl5/5.8.8/pods/perlmodlib.pod | 2778 -- lib/perl5/5.8.8/pods/perlmodstyle.pod | 780 - lib/perl5/5.8.8/pods/perlmpeix.pod | 730 - lib/perl5/5.8.8/pods/perlnetware.pod | 213 - lib/perl5/5.8.8/pods/perlnewmod.pod | 280 - lib/perl5/5.8.8/pods/perlnumber.pod | 209 - lib/perl5/5.8.8/pods/perlobj.pod | 594 - lib/perl5/5.8.8/pods/perlop.pod | 2316 -- lib/perl5/5.8.8/pods/perlopenbsd.pod | 30 - lib/perl5/5.8.8/pods/perlopentut.pod | 954 - lib/perl5/5.8.8/pods/perlos2.pod | 2743 -- lib/perl5/5.8.8/pods/perlos390.pod | 458 - lib/perl5/5.8.8/pods/perlos400.pod | 120 - lib/perl5/5.8.8/pods/perlothrtut.pod | 1068 - lib/perl5/5.8.8/pods/perlpacktut.pod | 1146 - lib/perl5/5.8.8/pods/perlplan9.pod | 146 - lib/perl5/5.8.8/pods/perlpod.pod | 731 - lib/perl5/5.8.8/pods/perlpodspec.pod | 1899 -- lib/perl5/5.8.8/pods/perlport.pod | 2261 -- lib/perl5/5.8.8/pods/perlqnx.pod | 143 - lib/perl5/5.8.8/pods/perlre.pod | 1406 - lib/perl5/5.8.8/pods/perlref.pod | 742 - lib/perl5/5.8.8/pods/perlreftut.pod | 527 - lib/perl5/5.8.8/pods/perlrequick.pod | 516 - lib/perl5/5.8.8/pods/perlreref.pod | 310 - lib/perl5/5.8.8/pods/perlretut.pod | 2523 -- lib/perl5/5.8.8/pods/perlrun.pod | 1320 - lib/perl5/5.8.8/pods/perlsec.pod | 504 - lib/perl5/5.8.8/pods/perlsolaris.pod | 690 - lib/perl5/5.8.8/pods/perlstyle.pod | 303 - lib/perl5/5.8.8/pods/perlsub.pod | 1429 - lib/perl5/5.8.8/pods/perlsyn.pod | 752 - lib/perl5/5.8.8/pods/perlthrtut.pod | 1110 - lib/perl5/5.8.8/pods/perltie.pod | 1189 - lib/perl5/5.8.8/pods/perltoc.pod | 22624 ---------------- lib/perl5/5.8.8/pods/perltodo.pod | 667 - lib/perl5/5.8.8/pods/perltooc.pod | 1342 - lib/perl5/5.8.8/pods/perltoot.pod | 1775 -- lib/perl5/5.8.8/pods/perltrap.pod | 1590 -- lib/perl5/5.8.8/pods/perltru64.pod | 163 - lib/perl5/5.8.8/pods/perltw.pod | 174 - lib/perl5/5.8.8/pods/perlunicode.pod | 1501 - lib/perl5/5.8.8/pods/perluniintro.pod | 895 - lib/perl5/5.8.8/pods/perlutil.pod | 195 - lib/perl5/5.8.8/pods/perluts.pod | 107 - lib/perl5/5.8.8/pods/perlvar.pod | 1532 -- lib/perl5/5.8.8/pods/perlvmesa.pod | 131 - lib/perl5/5.8.8/pods/perlvms.pod | 949 - lib/perl5/5.8.8/pods/perlvos.pod | 369 - lib/perl5/5.8.8/pods/perlwin32.pod | 924 - lib/perl5/5.8.8/pods/perlxs.pod | 2059 -- lib/perl5/5.8.8/pods/perlxstut.pod | 1364 - lib/perl5/5.8.8/pwd.pl | 67 - lib/perl5/5.8.8/shellwords.pl | 14 - lib/perl5/5.8.8/stat.pl | 31 - lib/perl5/5.8.8/syslog.pl | 199 - lib/perl5/5.8.8/tainted.pl | 9 - lib/perl5/5.8.8/termcap.pl | 178 - lib/perl5/5.8.8/timelocal.pl | 18 - lib/perl5/5.8.8/unicore/ArabicShaping.txt | 299 - lib/perl5/5.8.8/unicore/BidiMirroring.txt | 550 - lib/perl5/5.8.8/unicore/Blocks.txt | 172 - lib/perl5/5.8.8/unicore/Canonical.pl | 1042 - lib/perl5/5.8.8/unicore/CaseFolding.txt | 1064 - lib/perl5/5.8.8/unicore/CombiningClass.pl | 203 - lib/perl5/5.8.8/unicore/CompositionExclusions.txt | 179 - lib/perl5/5.8.8/unicore/Decomposition.pl | 5366 ---- lib/perl5/5.8.8/unicore/EastAsianWidth.txt | 16368 ----------- lib/perl5/5.8.8/unicore/Exact.pl | 73 - lib/perl5/5.8.8/unicore/HangulSyllableType.txt | 851 - lib/perl5/5.8.8/unicore/Index.txt | 4307 --- lib/perl5/5.8.8/unicore/Jamo.txt | 92 - lib/perl5/5.8.8/unicore/LineBreak.txt | 17169 ------------ lib/perl5/5.8.8/unicore/Name.pl | 16346 ----------- lib/perl5/5.8.8/unicore/NamedSequences.txt | 95 - lib/perl5/5.8.8/unicore/NamesList.txt | 27024 ------------------- .../5.8.8/unicore/NormalizationCorrections.txt | 48 - lib/perl5/5.8.8/unicore/PVA.pl | 2044 -- lib/perl5/5.8.8/unicore/PropList.txt | 1049 - lib/perl5/5.8.8/unicore/PropValueAliases.txt | 578 - lib/perl5/5.8.8/unicore/Properties | 350 - lib/perl5/5.8.8/unicore/PropertyAliases.txt | 163 - lib/perl5/5.8.8/unicore/ReadMe.txt | 24 - lib/perl5/5.8.8/unicore/Scripts.txt | 1464 - lib/perl5/5.8.8/unicore/SpecialCasing.txt | 260 - lib/perl5/5.8.8/unicore/StandardizedVariants.txt | 122 - lib/perl5/5.8.8/unicore/To/Digit.pl | 276 - lib/perl5/5.8.8/unicore/To/Fold.pl | 993 - lib/perl5/5.8.8/unicore/To/Lower.pl | 905 - lib/perl5/5.8.8/unicore/To/Title.pl | 966 - lib/perl5/5.8.8/unicore/To/Upper.pl | 989 - lib/perl5/5.8.8/unicore/UnicodeData.txt | 16351 ----------- lib/perl5/5.8.8/unicore/lib/bc/AL.pl | 34 - lib/perl5/5.8.8/unicore/lib/bc/AN.pl | 11 - lib/perl5/5.8.8/unicore/lib/bc/B.pl | 14 - lib/perl5/5.8.8/unicore/lib/bc/BN.pl | 22 - lib/perl5/5.8.8/unicore/lib/bc/CS.pl | 22 - lib/perl5/5.8.8/unicore/lib/bc/EN.pl | 19 - lib/perl5/5.8.8/unicore/lib/bc/ES.pl | 18 - lib/perl5/5.8.8/unicore/lib/bc/ET.pl | 27 - lib/perl5/5.8.8/unicore/lib/bc/L.pl | 400 - lib/perl5/5.8.8/unicore/lib/bc/LRE.pl | 10 - lib/perl5/5.8.8/unicore/lib/bc/LRO.pl | 10 - lib/perl5/5.8.8/unicore/lib/bc/NSM.pl | 131 - lib/perl5/5.8.8/unicore/lib/bc/ON.pl | 150 - lib/perl5/5.8.8/unicore/lib/bc/PDF.pl | 10 - lib/perl5/5.8.8/unicore/lib/bc/R.pl | 36 - lib/perl5/5.8.8/unicore/lib/bc/RLE.pl | 10 - lib/perl5/5.8.8/unicore/lib/bc/RLO.pl | 10 - lib/perl5/5.8.8/unicore/lib/bc/S.pl | 12 - lib/perl5/5.8.8/unicore/lib/bc/WS.pl | 17 - lib/perl5/5.8.8/unicore/lib/ccc/A.pl | 10 - lib/perl5/5.8.8/unicore/lib/ccc/AL.pl | 10 - lib/perl5/5.8.8/unicore/lib/ccc/AR.pl | 10 - lib/perl5/5.8.8/unicore/lib/ccc/ATAR.pl | 10 - lib/perl5/5.8.8/unicore/lib/ccc/ATB.pl | 10 - lib/perl5/5.8.8/unicore/lib/ccc/ATBL.pl | 10 - lib/perl5/5.8.8/unicore/lib/ccc/B.pl | 10 - lib/perl5/5.8.8/unicore/lib/ccc/BL.pl | 10 - lib/perl5/5.8.8/unicore/lib/ccc/BR.pl | 10 - lib/perl5/5.8.8/unicore/lib/ccc/DA.pl | 10 - lib/perl5/5.8.8/unicore/lib/ccc/DB.pl | 10 - lib/perl5/5.8.8/unicore/lib/ccc/IS.pl | 10 - lib/perl5/5.8.8/unicore/lib/ccc/KV.pl | 10 - lib/perl5/5.8.8/unicore/lib/ccc/L.pl | 10 - lib/perl5/5.8.8/unicore/lib/ccc/NK.pl | 10 - lib/perl5/5.8.8/unicore/lib/ccc/NR.pl | 10 - lib/perl5/5.8.8/unicore/lib/ccc/OV.pl | 10 - lib/perl5/5.8.8/unicore/lib/ccc/R.pl | 10 - lib/perl5/5.8.8/unicore/lib/ccc/VR.pl | 10 - lib/perl5/5.8.8/unicore/lib/dt/can.pl | 222 - lib/perl5/5.8.8/unicore/lib/dt/com.pl | 820 - lib/perl5/5.8.8/unicore/lib/dt/enc.pl | 14 - lib/perl5/5.8.8/unicore/lib/dt/fin.pl | 122 - lib/perl5/5.8.8/unicore/lib/dt/font.pl | 43 - lib/perl5/5.8.8/unicore/lib/dt/fra.pl | 11 - lib/perl5/5.8.8/unicore/lib/dt/init.pl | 84 - lib/perl5/5.8.8/unicore/lib/dt/iso.pl | 107 - lib/perl5/5.8.8/unicore/lib/dt/med.pl | 63 - lib/perl5/5.8.8/unicore/lib/dt/nar.pl | 15 - lib/perl5/5.8.8/unicore/lib/dt/nb.pl | 14 - lib/perl5/5.8.8/unicore/lib/dt/sml.pl | 12 - lib/perl5/5.8.8/unicore/lib/dt/sqr.pl | 14 - lib/perl5/5.8.8/unicore/lib/dt/sub.pl | 12 - lib/perl5/5.8.8/unicore/lib/dt/sup.pl | 27 - lib/perl5/5.8.8/unicore/lib/dt/vert.pl | 14 - lib/perl5/5.8.8/unicore/lib/dt/wide.pl | 12 - lib/perl5/5.8.8/unicore/lib/ea/A.pl | 168 - lib/perl5/5.8.8/unicore/lib/ea/F.pl | 12 - lib/perl5/5.8.8/unicore/lib/ea/H.pl | 16 - lib/perl5/5.8.8/unicore/lib/ea/N.pl | 540 - lib/perl5/5.8.8/unicore/lib/ea/Na.pl | 16 - lib/perl5/5.8.8/unicore/lib/ea/W.pl | 40 - lib/perl5/5.8.8/unicore/lib/gc_sc/AHex.pl | 12 - lib/perl5/5.8.8/unicore/lib/gc_sc/ASCII.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/Alnum.pl | 448 - lib/perl5/5.8.8/unicore/lib/gc_sc/Alpha.pl | 430 - lib/perl5/5.8.8/unicore/lib/gc_sc/Alphabet.pl | 415 - lib/perl5/5.8.8/unicore/lib/gc_sc/Any.pl | 14 - lib/perl5/5.8.8/unicore/lib/gc_sc/Arab.pl | 29 - lib/perl5/5.8.8/unicore/lib/gc_sc/Armn.pl | 17 - lib/perl5/5.8.8/unicore/lib/gc_sc/AsciiHex.pl | 15 - lib/perl5/5.8.8/unicore/lib/gc_sc/Assigned.pl | 432 - lib/perl5/5.8.8/unicore/lib/gc_sc/Beng.pl | 26 - lib/perl5/5.8.8/unicore/lib/gc_sc/BidiC.pl | 11 - lib/perl5/5.8.8/unicore/lib/gc_sc/BidiCont.pl | 14 - lib/perl5/5.8.8/unicore/lib/gc_sc/Blank.pl | 21 - lib/perl5/5.8.8/unicore/lib/gc_sc/Bopo.pl | 14 - lib/perl5/5.8.8/unicore/lib/gc_sc/Brai.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/Bugi.pl | 14 - lib/perl5/5.8.8/unicore/lib/gc_sc/Buhd.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/C.pl | 435 - lib/perl5/5.8.8/unicore/lib/gc_sc/Canadian.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/Cc.pl | 15 - lib/perl5/5.8.8/unicore/lib/gc_sc/Cf.pl | 27 - lib/perl5/5.8.8/unicore/lib/gc_sc/Cher.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/Cn.pl | 433 - lib/perl5/5.8.8/unicore/lib/gc_sc/Cntrl.pl | 31 - lib/perl5/5.8.8/unicore/lib/gc_sc/Co.pl | 16 - lib/perl5/5.8.8/unicore/lib/gc_sc/Copt.pl | 15 - lib/perl5/5.8.8/unicore/lib/gc_sc/Cprt.pl | 18 - lib/perl5/5.8.8/unicore/lib/gc_sc/Cs.pl | 14 - lib/perl5/5.8.8/unicore/lib/gc_sc/Cyrl.pl | 18 - lib/perl5/5.8.8/unicore/lib/gc_sc/Dash.pl | 25 - lib/perl5/5.8.8/unicore/lib/gc_sc/Dash2.pl | 28 - lib/perl5/5.8.8/unicore/lib/gc_sc/Dep.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/Deprecat.pl | 16 - lib/perl5/5.8.8/unicore/lib/gc_sc/Deva.pl | 18 - lib/perl5/5.8.8/unicore/lib/gc_sc/Dia.pl | 91 - lib/perl5/5.8.8/unicore/lib/gc_sc/Diacriti.pl | 94 - lib/perl5/5.8.8/unicore/lib/gc_sc/Digit.pl | 35 - lib/perl5/5.8.8/unicore/lib/gc_sc/Dsrt.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/Ethi.pl | 39 - lib/perl5/5.8.8/unicore/lib/gc_sc/Ext.pl | 21 - lib/perl5/5.8.8/unicore/lib/gc_sc/Extender.pl | 24 - lib/perl5/5.8.8/unicore/lib/gc_sc/Geor.pl | 16 - lib/perl5/5.8.8/unicore/lib/gc_sc/Glag.pl | 14 - lib/perl5/5.8.8/unicore/lib/gc_sc/Goth.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/GrLink.pl | 25 - lib/perl5/5.8.8/unicore/lib/gc_sc/Graph.pl | 436 - lib/perl5/5.8.8/unicore/lib/gc_sc/Grapheme.pl | 28 - lib/perl5/5.8.8/unicore/lib/gc_sc/Grek.pl | 43 - lib/perl5/5.8.8/unicore/lib/gc_sc/Gujr.pl | 26 - lib/perl5/5.8.8/unicore/lib/gc_sc/Guru.pl | 27 - lib/perl5/5.8.8/unicore/lib/gc_sc/Hang.pl | 24 - lib/perl5/5.8.8/unicore/lib/gc_sc/Hani.pl | 26 - lib/perl5/5.8.8/unicore/lib/gc_sc/Hano.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/Hebr.pl | 22 - lib/perl5/5.8.8/unicore/lib/gc_sc/Hex.pl | 15 - lib/perl5/5.8.8/unicore/lib/gc_sc/HexDigit.pl | 18 - lib/perl5/5.8.8/unicore/lib/gc_sc/Hira.pl | 14 - lib/perl5/5.8.8/unicore/lib/gc_sc/Hyphen.pl | 19 - lib/perl5/5.8.8/unicore/lib/gc_sc/Hyphen2.pl | 22 - lib/perl5/5.8.8/unicore/lib/gc_sc/IDSB.pl | 11 - lib/perl5/5.8.8/unicore/lib/gc_sc/IDST.pl | 10 - lib/perl5/5.8.8/unicore/lib/gc_sc/IdContin.pl | 460 - lib/perl5/5.8.8/unicore/lib/gc_sc/IdStart.pl | 364 - lib/perl5/5.8.8/unicore/lib/gc_sc/Ideo.pl | 18 - lib/perl5/5.8.8/unicore/lib/gc_sc/Ideograp.pl | 21 - lib/perl5/5.8.8/unicore/lib/gc_sc/IdsBinar.pl | 14 - lib/perl5/5.8.8/unicore/lib/gc_sc/IdsTrina.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InAegean.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InAlphab.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InAncie2.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InAncien.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InArabi2.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InArabi3.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InArabi4.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InArabic.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InArmeni.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InArrows.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InBasicL.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InBengal.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InBlockE.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InBopom2.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InBopomo.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InBoxDra.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InBraill.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InBugine.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InBuhid.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InByzant.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InCherok.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InCjkCo2.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InCjkCo3.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InCjkCo4.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InCjkCom.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InCjkRad.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InCjkStr.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InCjkSym.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InCjkUn2.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InCjkUn3.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InCjkUni.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InCombi2.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InCombi3.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InCombi4.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InCombin.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InContro.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InCoptic.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InCurren.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InCyprio.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InCyril2.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InCyrill.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InDesere.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InDevana.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InDingba.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InEnclo2.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InEnclos.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InEthio2.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InEthio3.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InEthiop.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InGenera.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InGeomet.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InGeorg2.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InGeorgi.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InGlagol.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InGothic.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InGreekA.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InGreekE.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InGujara.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InGurmuk.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InHalfwi.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InHangu2.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InHangu3.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InHangul.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InHanuno.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InHebrew.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InHighPr.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InHighSu.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InHiraga.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InIdeogr.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InIpaExt.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InKanbun.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InKangxi.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InKannad.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InKatak2.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InKataka.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InKharos.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InKhmer.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InKhmerS.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InLao.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InLatin1.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InLatin2.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InLatin3.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InLatinE.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InLetter.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InLimbu.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InLinea2.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InLinear.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InLowSur.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InMalaya.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InMathe2.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InMathem.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InMisce2.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InMisce3.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InMisce4.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InMisce5.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InMiscel.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InModifi.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InMongol.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InMusica.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InMyanma.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InNewTai.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InNumber.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InOgham.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InOldIta.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InOldPer.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InOptica.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InOriya.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InOsmany.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InPhone2.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InPhonet.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InPrivat.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InRunic.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InShavia.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InSinhal.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InSmallF.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InSpacin.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InSpecia.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InSupers.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InSuppl2.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InSuppl3.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InSuppl4.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InSuppl5.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InSuppl6.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InSupple.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InSyloti.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InSyriac.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InTagalo.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InTagban.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InTags.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InTaiLe.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InTaiXua.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InTamil.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InTelugu.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InThaana.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InThai.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InTibeta.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InTifina.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InUgarit.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InUnifie.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InVaria2.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InVariat.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InVertic.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InYiRadi.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InYiSyll.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/InYijing.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/JoinC.pl | 10 - lib/perl5/5.8.8/unicore/lib/gc_sc/JoinCont.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/Kana.pl | 17 - lib/perl5/5.8.8/unicore/lib/gc_sc/Khar.pl | 20 - lib/perl5/5.8.8/unicore/lib/gc_sc/Khmr.pl | 16 - lib/perl5/5.8.8/unicore/lib/gc_sc/Knda.pl | 25 - lib/perl5/5.8.8/unicore/lib/gc_sc/L.pl | 360 - lib/perl5/5.8.8/unicore/lib/gc_sc/LC.pl | 116 - lib/perl5/5.8.8/unicore/lib/gc_sc/LOE.pl | 11 - lib/perl5/5.8.8/unicore/lib/gc_sc/Laoo.pl | 30 - lib/perl5/5.8.8/unicore/lib/gc_sc/Latn.pl | 35 - lib/perl5/5.8.8/unicore/lib/gc_sc/Limb.pl | 17 - lib/perl5/5.8.8/unicore/lib/gc_sc/LinearB.pl | 19 - lib/perl5/5.8.8/unicore/lib/gc_sc/Ll.pl | 493 - lib/perl5/5.8.8/unicore/lib/gc_sc/Lm.pl | 39 - lib/perl5/5.8.8/unicore/lib/gc_sc/Lo.pl | 258 - lib/perl5/5.8.8/unicore/lib/gc_sc/LogicalO.pl | 14 - lib/perl5/5.8.8/unicore/lib/gc_sc/Lower.pl | 492 - lib/perl5/5.8.8/unicore/lib/gc_sc/Lowercas.pl | 497 - lib/perl5/5.8.8/unicore/lib/gc_sc/Lt.pl | 23 - lib/perl5/5.8.8/unicore/lib/gc_sc/Lu.pl | 489 - lib/perl5/5.8.8/unicore/lib/gc_sc/M.pl | 146 - lib/perl5/5.8.8/unicore/lib/gc_sc/Math.pl | 103 - lib/perl5/5.8.8/unicore/lib/gc_sc/Mc.pl | 76 - lib/perl5/5.8.8/unicore/lib/gc_sc/Me.pl | 17 - lib/perl5/5.8.8/unicore/lib/gc_sc/Mlym.pl | 23 - lib/perl5/5.8.8/unicore/lib/gc_sc/Mn.pl | 137 - lib/perl5/5.8.8/unicore/lib/gc_sc/Mong.pl | 16 - lib/perl5/5.8.8/unicore/lib/gc_sc/Mymr.pl | 18 - lib/perl5/5.8.8/unicore/lib/gc_sc/N.pl | 66 - lib/perl5/5.8.8/unicore/lib/gc_sc/NChar.pl | 27 - lib/perl5/5.8.8/unicore/lib/gc_sc/Nd.pl | 36 - lib/perl5/5.8.8/unicore/lib/gc_sc/NewTaiLu.pl | 16 - lib/perl5/5.8.8/unicore/lib/gc_sc/Nl.pl | 21 - lib/perl5/5.8.8/unicore/lib/gc_sc/No.pl | 39 - lib/perl5/5.8.8/unicore/lib/gc_sc/Nonchara.pl | 30 - lib/perl5/5.8.8/unicore/lib/gc_sc/OAlpha.pl | 108 - lib/perl5/5.8.8/unicore/lib/gc_sc/ODI.pl | 19 - lib/perl5/5.8.8/unicore/lib/gc_sc/OGrExt.pl | 24 - lib/perl5/5.8.8/unicore/lib/gc_sc/OIDC.pl | 10 - lib/perl5/5.8.8/unicore/lib/gc_sc/OIDS.pl | 12 - lib/perl5/5.8.8/unicore/lib/gc_sc/OLower.pl | 20 - lib/perl5/5.8.8/unicore/lib/gc_sc/OMath.pl | 77 - lib/perl5/5.8.8/unicore/lib/gc_sc/OUpper.pl | 11 - lib/perl5/5.8.8/unicore/lib/gc_sc/Ogam.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/OldItali.pl | 14 - lib/perl5/5.8.8/unicore/lib/gc_sc/OldPersi.pl | 14 - lib/perl5/5.8.8/unicore/lib/gc_sc/Orya.pl | 26 - lib/perl5/5.8.8/unicore/lib/gc_sc/Osma.pl | 14 - lib/perl5/5.8.8/unicore/lib/gc_sc/OtherAlp.pl | 111 - lib/perl5/5.8.8/unicore/lib/gc_sc/OtherDef.pl | 22 - lib/perl5/5.8.8/unicore/lib/gc_sc/OtherGra.pl | 27 - lib/perl5/5.8.8/unicore/lib/gc_sc/OtherIdC.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/OtherIdS.pl | 15 - lib/perl5/5.8.8/unicore/lib/gc_sc/OtherLow.pl | 23 - lib/perl5/5.8.8/unicore/lib/gc_sc/OtherMat.pl | 80 - lib/perl5/5.8.8/unicore/lib/gc_sc/OtherUpp.pl | 14 - lib/perl5/5.8.8/unicore/lib/gc_sc/P.pl | 109 - lib/perl5/5.8.8/unicore/lib/gc_sc/PatSyn.pl | 37 - lib/perl5/5.8.8/unicore/lib/gc_sc/PatWS.pl | 14 - lib/perl5/5.8.8/unicore/lib/gc_sc/PatternS.pl | 40 - lib/perl5/5.8.8/unicore/lib/gc_sc/PatternW.pl | 17 - lib/perl5/5.8.8/unicore/lib/gc_sc/Pc.pl | 19 - lib/perl5/5.8.8/unicore/lib/gc_sc/Pd.pl | 25 - lib/perl5/5.8.8/unicore/lib/gc_sc/Pe.pl | 78 - lib/perl5/5.8.8/unicore/lib/gc_sc/Pf.pl | 22 - lib/perl5/5.8.8/unicore/lib/gc_sc/Pi.pl | 23 - lib/perl5/5.8.8/unicore/lib/gc_sc/Po.pl | 101 - lib/perl5/5.8.8/unicore/lib/gc_sc/Print.pl | 435 - lib/perl5/5.8.8/unicore/lib/gc_sc/Ps.pl | 80 - lib/perl5/5.8.8/unicore/lib/gc_sc/Punct.pl | 108 - lib/perl5/5.8.8/unicore/lib/gc_sc/QMark.pl | 21 - lib/perl5/5.8.8/unicore/lib/gc_sc/Qaai.pl | 27 - lib/perl5/5.8.8/unicore/lib/gc_sc/Quotatio.pl | 24 - lib/perl5/5.8.8/unicore/lib/gc_sc/Radical.pl | 12 - lib/perl5/5.8.8/unicore/lib/gc_sc/Radical2.pl | 15 - lib/perl5/5.8.8/unicore/lib/gc_sc/Runr.pl | 14 - lib/perl5/5.8.8/unicore/lib/gc_sc/S.pl | 175 - lib/perl5/5.8.8/unicore/lib/gc_sc/SD.pl | 38 - lib/perl5/5.8.8/unicore/lib/gc_sc/STerm.pl | 35 - lib/perl5/5.8.8/unicore/lib/gc_sc/Sc.pl | 27 - lib/perl5/5.8.8/unicore/lib/gc_sc/Shaw.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/Sinh.pl | 23 - lib/perl5/5.8.8/unicore/lib/gc_sc/Sk.pl | 36 - lib/perl5/5.8.8/unicore/lib/gc_sc/Sm.pl | 72 - lib/perl5/5.8.8/unicore/lib/gc_sc/So.pl | 133 - lib/perl5/5.8.8/unicore/lib/gc_sc/SoftDott.pl | 41 - lib/perl5/5.8.8/unicore/lib/gc_sc/Space.pl | 23 - lib/perl5/5.8.8/unicore/lib/gc_sc/SpacePer.pl | 24 - lib/perl5/5.8.8/unicore/lib/gc_sc/Sterm2.pl | 38 - lib/perl5/5.8.8/unicore/lib/gc_sc/SylotiNa.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/Syrc.pl | 15 - lib/perl5/5.8.8/unicore/lib/gc_sc/Tagb.pl | 15 - lib/perl5/5.8.8/unicore/lib/gc_sc/TaiLe.pl | 14 - lib/perl5/5.8.8/unicore/lib/gc_sc/Taml.pl | 27 - lib/perl5/5.8.8/unicore/lib/gc_sc/Telu.pl | 24 - lib/perl5/5.8.8/unicore/lib/gc_sc/Term.pl | 49 - lib/perl5/5.8.8/unicore/lib/gc_sc/Terminal.pl | 52 - lib/perl5/5.8.8/unicore/lib/gc_sc/Tfng.pl | 14 - lib/perl5/5.8.8/unicore/lib/gc_sc/Tglg.pl | 14 - lib/perl5/5.8.8/unicore/lib/gc_sc/Thaa.pl | 13 - lib/perl5/5.8.8/unicore/lib/gc_sc/Thai.pl | 14 - lib/perl5/5.8.8/unicore/lib/gc_sc/Tibt.pl | 19 - lib/perl5/5.8.8/unicore/lib/gc_sc/Title.pl | 22 - lib/perl5/5.8.8/unicore/lib/gc_sc/UIdeo.pl | 19 - lib/perl5/5.8.8/unicore/lib/gc_sc/Ugar.pl | 14 - lib/perl5/5.8.8/unicore/lib/gc_sc/UnifiedI.pl | 22 - lib/perl5/5.8.8/unicore/lib/gc_sc/Upper.pl | 488 - lib/perl5/5.8.8/unicore/lib/gc_sc/Uppercas.pl | 490 - lib/perl5/5.8.8/unicore/lib/gc_sc/VS.pl | 12 - lib/perl5/5.8.8/unicore/lib/gc_sc/Variatio.pl | 15 - lib/perl5/5.8.8/unicore/lib/gc_sc/WSpace.pl | 20 - lib/perl5/5.8.8/unicore/lib/gc_sc/WhiteSpa.pl | 23 - lib/perl5/5.8.8/unicore/lib/gc_sc/Word.pl | 476 - lib/perl5/5.8.8/unicore/lib/gc_sc/XDigit.pl | 15 - lib/perl5/5.8.8/unicore/lib/gc_sc/Yiii.pl | 14 - lib/perl5/5.8.8/unicore/lib/gc_sc/Z.pl | 22 - lib/perl5/5.8.8/unicore/lib/gc_sc/Zl.pl | 14 - lib/perl5/5.8.8/unicore/lib/gc_sc/Zp.pl | 14 - lib/perl5/5.8.8/unicore/lib/gc_sc/Zs.pl | 21 - lib/perl5/5.8.8/unicore/lib/gc_sc/Zyyy.pl | 138 - lib/perl5/5.8.8/unicore/lib/gc_sc/_CanonDC.pl | 16 - lib/perl5/5.8.8/unicore/lib/gc_sc/_CaseIgn.pl | 138 - lib/perl5/5.8.8/unicore/lib/gc_sc/_CombAbo.pl | 69 - lib/perl5/5.8.8/unicore/lib/hst/L.pl | 11 - lib/perl5/5.8.8/unicore/lib/hst/LV.pl | 408 - lib/perl5/5.8.8/unicore/lib/hst/LVT.pl | 408 - lib/perl5/5.8.8/unicore/lib/hst/T.pl | 10 - lib/perl5/5.8.8/unicore/lib/hst/V.pl | 10 - lib/perl5/5.8.8/unicore/lib/jt/C.pl | 11 - lib/perl5/5.8.8/unicore/lib/jt/D.pl | 33 - lib/perl5/5.8.8/unicore/lib/jt/R.pl | 34 - lib/perl5/5.8.8/unicore/lib/jt/U.pl | 15 - lib/perl5/5.8.8/unicore/lib/lb/AI.pl | 101 - lib/perl5/5.8.8/unicore/lib/lb/AL.pl | 449 - lib/perl5/5.8.8/unicore/lib/lb/B2.pl | 10 - lib/perl5/5.8.8/unicore/lib/lb/BA.pl | 45 - lib/perl5/5.8.8/unicore/lib/lb/BB.pl | 17 - lib/perl5/5.8.8/unicore/lib/lb/BK.pl | 11 - lib/perl5/5.8.8/unicore/lib/lb/CB.pl | 10 - lib/perl5/5.8.8/unicore/lib/lb/CL.pl | 80 - lib/perl5/5.8.8/unicore/lib/lb/CM.pl | 155 - lib/perl5/5.8.8/unicore/lib/lb/CR.pl | 10 - lib/perl5/5.8.8/unicore/lib/lb/EX.pl | 25 - lib/perl5/5.8.8/unicore/lib/lb/GL.pl | 19 - lib/perl5/5.8.8/unicore/lib/lb/H2.pl | 408 - lib/perl5/5.8.8/unicore/lib/lb/H3.pl | 408 - lib/perl5/5.8.8/unicore/lib/lb/HY.pl | 10 - lib/perl5/5.8.8/unicore/lib/lb/ID.pl | 80 - lib/perl5/5.8.8/unicore/lib/lb/IN.pl | 11 - lib/perl5/5.8.8/unicore/lib/lb/IS.pl | 18 - lib/perl5/5.8.8/unicore/lib/lb/JL.pl | 11 - lib/perl5/5.8.8/unicore/lib/lb/JT.pl | 10 - lib/perl5/5.8.8/unicore/lib/lb/JV.pl | 10 - lib/perl5/5.8.8/unicore/lib/lb/LF.pl | 10 - lib/perl5/5.8.8/unicore/lib/lb/NL.pl | 10 - lib/perl5/5.8.8/unicore/lib/lb/NS.pl | 46 - lib/perl5/5.8.8/unicore/lib/lb/NU.pl | 32 - lib/perl5/5.8.8/unicore/lib/lb/OP.pl | 76 - lib/perl5/5.8.8/unicore/lib/lb/PO.pl | 21 - lib/perl5/5.8.8/unicore/lib/lb/PR.pl | 27 - lib/perl5/5.8.8/unicore/lib/lb/QU.pl | 21 - lib/perl5/5.8.8/unicore/lib/lb/SA.pl | 34 - lib/perl5/5.8.8/unicore/lib/lb/SG.pl | 10 - lib/perl5/5.8.8/unicore/lib/lb/SP.pl | 10 - lib/perl5/5.8.8/unicore/lib/lb/SY.pl | 10 - lib/perl5/5.8.8/unicore/lib/lb/WJ.pl | 11 - lib/perl5/5.8.8/unicore/lib/lb/XX.pl | 12 - lib/perl5/5.8.8/unicore/lib/lb/ZW.pl | 10 - lib/perl5/5.8.8/unicore/lib/nt/De.pl | 32 - lib/perl5/5.8.8/unicore/lib/nt/Di.pl | 25 - lib/perl5/5.8.8/unicore/lib/nt/Nu.pl | 42 - lib/perl5/5.8.8/unicore/mktables | 2197 -- lib/perl5/5.8.8/unicore/mktables.lst | 505 - lib/perl5/5.8.8/unicore/version | 1 - lib/perl5/5.8.8/utf8_heavy.pl | 412 - lib/perl5/5.8.8/validate.pl | 104 - .../5.8.8/msys/auto/SVN/_Client/lib_Client.dll.a | Bin 285472 -> 0 bytes .../site_perl/5.8.8/msys/auto/SVN/_Core/.packlist | 29 - .../5.8.8/msys/auto/SVN/_Core/lib_Core.dll.a | Bin 470964 -> 0 bytes .../5.8.8/msys/auto/SVN/_Delta/lib_Delta.dll.a | Bin 128720 -> 0 bytes .../site_perl/5.8.8/msys/auto/SVN/_Fs/lib_Fs.dll.a | Bin 170430 -> 0 bytes .../site_perl/5.8.8/msys/auto/SVN/_Ra/lib_Ra.dll.a | Bin 201258 -> 0 bytes .../5.8.8/msys/auto/SVN/_Repos/lib_Repos.dll.a | Bin 211894 -> 0 bytes .../site_perl/5.8.8/msys/auto/SVN/_Wc/lib_Wc.dll.a | Bin 355492 -> 0 bytes .../5.8.8/msys/auto/Term/ReadKey/.packlist | 5 - .../5.8.8/msys/auto/Term/ReadKey/libReadKey.dll.a | Bin 46670 -> 0 bytes mingw/lib/tcl8.4/encoding/ascii.enc | 20 - mingw/lib/tcl8.4/encoding/big5.enc | 1516 -- mingw/lib/tcl8.4/encoding/cp1250.enc | 20 - mingw/lib/tcl8.4/encoding/cp1251.enc | 20 - mingw/lib/tcl8.4/encoding/cp1252.enc | 20 - mingw/lib/tcl8.4/encoding/cp1253.enc | 20 - mingw/lib/tcl8.4/encoding/cp1254.enc | 20 - mingw/lib/tcl8.4/encoding/cp1255.enc | 20 - mingw/lib/tcl8.4/encoding/cp1256.enc | 20 - mingw/lib/tcl8.4/encoding/cp1257.enc | 20 - mingw/lib/tcl8.4/encoding/cp1258.enc | 20 - mingw/lib/tcl8.4/encoding/cp437.enc | 20 - mingw/lib/tcl8.4/encoding/cp737.enc | 20 - mingw/lib/tcl8.4/encoding/cp775.enc | 20 - mingw/lib/tcl8.4/encoding/cp850.enc | 20 - mingw/lib/tcl8.4/encoding/cp852.enc | 20 - mingw/lib/tcl8.4/encoding/cp855.enc | 20 - mingw/lib/tcl8.4/encoding/cp857.enc | 20 - mingw/lib/tcl8.4/encoding/cp860.enc | 20 - mingw/lib/tcl8.4/encoding/cp861.enc | 20 - mingw/lib/tcl8.4/encoding/cp862.enc | 20 - mingw/lib/tcl8.4/encoding/cp863.enc | 20 - mingw/lib/tcl8.4/encoding/cp864.enc | 20 - mingw/lib/tcl8.4/encoding/cp865.enc | 20 - mingw/lib/tcl8.4/encoding/cp866.enc | 20 - mingw/lib/tcl8.4/encoding/cp869.enc | 20 - mingw/lib/tcl8.4/encoding/cp874.enc | 20 - mingw/lib/tcl8.4/encoding/cp932.enc | 801 - mingw/lib/tcl8.4/encoding/cp936.enc | 2162 -- mingw/lib/tcl8.4/encoding/cp949.enc | 2128 -- mingw/lib/tcl8.4/encoding/cp950.enc | 1499 - mingw/lib/tcl8.4/encoding/dingbats.enc | 20 - mingw/lib/tcl8.4/encoding/ebcdic.enc | 19 - mingw/lib/tcl8.4/encoding/euc-cn.enc | 1397 - mingw/lib/tcl8.4/encoding/euc-jp.enc | 1353 - mingw/lib/tcl8.4/encoding/euc-kr.enc | 1533 -- mingw/lib/tcl8.4/encoding/gb12345.enc | 1414 - mingw/lib/tcl8.4/encoding/gb1988.enc | 20 - mingw/lib/tcl8.4/encoding/gb2312-raw.enc | 1380 - mingw/lib/tcl8.4/encoding/gb2312.enc | 1397 - mingw/lib/tcl8.4/encoding/iso2022-jp.enc | 12 - mingw/lib/tcl8.4/encoding/iso2022-kr.enc | 7 - mingw/lib/tcl8.4/encoding/iso2022.enc | 14 - mingw/lib/tcl8.4/encoding/iso8859-1.enc | 20 - mingw/lib/tcl8.4/encoding/iso8859-10.enc | 20 - mingw/lib/tcl8.4/encoding/iso8859-13.enc | 20 - mingw/lib/tcl8.4/encoding/iso8859-14.enc | 20 - mingw/lib/tcl8.4/encoding/iso8859-15.enc | 20 - mingw/lib/tcl8.4/encoding/iso8859-16.enc | 20 - mingw/lib/tcl8.4/encoding/iso8859-2.enc | 20 - mingw/lib/tcl8.4/encoding/iso8859-3.enc | 20 - mingw/lib/tcl8.4/encoding/iso8859-4.enc | 20 - mingw/lib/tcl8.4/encoding/iso8859-5.enc | 20 - mingw/lib/tcl8.4/encoding/iso8859-6.enc | 20 - mingw/lib/tcl8.4/encoding/iso8859-7.enc | 20 - mingw/lib/tcl8.4/encoding/iso8859-8.enc | 20 - mingw/lib/tcl8.4/encoding/iso8859-9.enc | 20 - mingw/lib/tcl8.4/encoding/jis0201.enc | 20 - mingw/lib/tcl8.4/encoding/jis0208.enc | 1319 - mingw/lib/tcl8.4/encoding/jis0212.enc | 1159 - mingw/lib/tcl8.4/encoding/koi8-r.enc | 20 - mingw/lib/tcl8.4/encoding/koi8-u.enc | 20 - mingw/lib/tcl8.4/encoding/ksc5601.enc | 1516 -- mingw/lib/tcl8.4/encoding/macCentEuro.enc | 20 - mingw/lib/tcl8.4/encoding/macCroatian.enc | 20 - mingw/lib/tcl8.4/encoding/macCyrillic.enc | 20 - mingw/lib/tcl8.4/encoding/macDingbats.enc | 20 - mingw/lib/tcl8.4/encoding/macGreek.enc | 20 - mingw/lib/tcl8.4/encoding/macIceland.enc | 20 - mingw/lib/tcl8.4/encoding/macJapan.enc | 785 - mingw/lib/tcl8.4/encoding/macRoman.enc | 20 - mingw/lib/tcl8.4/encoding/macRomania.enc | 20 - mingw/lib/tcl8.4/encoding/macThai.enc | 20 - mingw/lib/tcl8.4/encoding/macTurkish.enc | 20 - mingw/lib/tcl8.4/encoding/macUkraine.enc | 20 - mingw/lib/tcl8.4/encoding/shiftjis.enc | 690 - mingw/lib/tcl8.4/encoding/symbol.enc | 20 - mingw/lib/tcl8.4/encoding/tis-620.enc | 20 - mingw/lib/tk8.4/demos/README | 46 - mingw/lib/tk8.4/demos/arrow.tcl | 239 - mingw/lib/tk8.4/demos/bind.tcl | 79 - mingw/lib/tk8.4/demos/bitmap.tcl | 55 - mingw/lib/tk8.4/demos/browse | 66 - mingw/lib/tk8.4/demos/button.tcl | 36 - mingw/lib/tk8.4/demos/check.tcl | 33 - mingw/lib/tk8.4/demos/clrpick.tcl | 56 - mingw/lib/tk8.4/demos/colors.tcl | 101 - mingw/lib/tk8.4/demos/cscroll.tcl | 110 - mingw/lib/tk8.4/demos/ctext.tcl | 147 - mingw/lib/tk8.4/demos/dialog1.tcl | 15 - mingw/lib/tk8.4/demos/dialog2.tcl | 19 - mingw/lib/tk8.4/demos/entry1.tcl | 36 - mingw/lib/tk8.4/demos/entry2.tcl | 48 - mingw/lib/tk8.4/demos/entry3.tcl | 187 - mingw/lib/tk8.4/demos/filebox.tcl | 74 - mingw/lib/tk8.4/demos/floor.tcl | 1370 - mingw/lib/tk8.4/demos/form.tcl | 40 - mingw/lib/tk8.4/demos/hello | 22 - mingw/lib/tk8.4/demos/hscale.tcl | 47 - mingw/lib/tk8.4/demos/icon.tcl | 52 - mingw/lib/tk8.4/demos/image1.tcl | 36 - mingw/lib/tk8.4/demos/image2.tcl | 104 - mingw/lib/tk8.4/demos/images/earth.gif | Bin 51712 -> 0 bytes mingw/lib/tk8.4/demos/images/earthris.gif | Bin 6343 -> 0 bytes mingw/lib/tk8.4/demos/images/face.bmp | 173 - mingw/lib/tk8.4/demos/images/flagdown.bmp | 27 - mingw/lib/tk8.4/demos/images/flagup.bmp | 27 - mingw/lib/tk8.4/demos/images/gray25.bmp | 6 - mingw/lib/tk8.4/demos/images/letters.bmp | 27 - mingw/lib/tk8.4/demos/images/noletter.bmp | 27 - mingw/lib/tk8.4/demos/images/pattern.bmp | 6 - mingw/lib/tk8.4/demos/images/tcllogo.gif | Bin 2341 -> 0 bytes mingw/lib/tk8.4/demos/images/teapot.ppm | 31 - mingw/lib/tk8.4/demos/items.tcl | 285 - mingw/lib/tk8.4/demos/ixset | 335 - mingw/lib/tk8.4/demos/label.tcl | 40 - mingw/lib/tk8.4/demos/labelframe.tcl | 80 - mingw/lib/tk8.4/demos/license.terms | 39 - mingw/lib/tk8.4/demos/menu.tcl | 161 - mingw/lib/tk8.4/demos/menubu.tcl | 94 - mingw/lib/tk8.4/demos/msgbox.tcl | 65 - mingw/lib/tk8.4/demos/paned1.tcl | 34 - mingw/lib/tk8.4/demos/paned2.tcl | 76 - mingw/lib/tk8.4/demos/plot.tcl | 99 - mingw/lib/tk8.4/demos/puzzle.tcl | 84 - mingw/lib/tk8.4/demos/radio.tcl | 59 - mingw/lib/tk8.4/demos/rmt | 210 - mingw/lib/tk8.4/demos/rolodex | 196 - mingw/lib/tk8.4/demos/ruler.tcl | 173 - mingw/lib/tk8.4/demos/sayings.tcl | 46 - mingw/lib/tk8.4/demos/search.tcl | 141 - mingw/lib/tk8.4/demos/spin.tcl | 55 - mingw/lib/tk8.4/demos/square | 55 - mingw/lib/tk8.4/demos/states.tcl | 45 - mingw/lib/tk8.4/demos/style.tcl | 152 - mingw/lib/tk8.4/demos/tclIndex | 67 - mingw/lib/tk8.4/demos/tcolor | 366 - mingw/lib/tk8.4/demos/text.tcl | 88 - mingw/lib/tk8.4/demos/timer | 47 - mingw/lib/tk8.4/demos/twind.tcl | 197 - mingw/lib/tk8.4/demos/unicodeout.tcl | 78 - mingw/lib/tk8.4/demos/vscale.tcl | 48 - mingw/lib/tk8.4/demos/widget | 394 - 1061 files changed, 476951 deletions(-) delete mode 100644 lib/perl5/5.8.8/CGI.pm delete mode 100644 lib/perl5/5.8.8/CGI/Apache.pm delete mode 100644 lib/perl5/5.8.8/CGI/Carp.pm delete mode 100644 lib/perl5/5.8.8/CGI/Cookie.pm delete mode 100644 lib/perl5/5.8.8/CGI/Fast.pm delete mode 100644 lib/perl5/5.8.8/CGI/Pretty.pm delete mode 100644 lib/perl5/5.8.8/CGI/Push.pm delete mode 100644 lib/perl5/5.8.8/CGI/Switch.pm delete mode 100644 lib/perl5/5.8.8/CGI/Util.pm delete mode 100644 lib/perl5/5.8.8/CGI/eg/RunMeFirst delete mode 100644 lib/perl5/5.8.8/CGI/eg/caution.xbm delete mode 100644 lib/perl5/5.8.8/CGI/eg/clickable_image.cgi delete mode 100644 lib/perl5/5.8.8/CGI/eg/cookie.cgi delete mode 100644 lib/perl5/5.8.8/CGI/eg/crash.cgi delete mode 100644 lib/perl5/5.8.8/CGI/eg/customize.cgi delete mode 100644 lib/perl5/5.8.8/CGI/eg/diff_upload.cgi delete mode 100644 lib/perl5/5.8.8/CGI/eg/dna_small_gif.uu delete mode 100644 lib/perl5/5.8.8/CGI/eg/file_upload.cgi delete mode 100644 lib/perl5/5.8.8/CGI/eg/frameset.cgi delete mode 100644 lib/perl5/5.8.8/CGI/eg/index.html delete mode 100644 lib/perl5/5.8.8/CGI/eg/internal_links.cgi delete mode 100644 lib/perl5/5.8.8/CGI/eg/javascript.cgi delete mode 100644 lib/perl5/5.8.8/CGI/eg/make_links.pl delete mode 100644 lib/perl5/5.8.8/CGI/eg/monty.cgi delete mode 100644 lib/perl5/5.8.8/CGI/eg/multiple_forms.cgi delete mode 100644 lib/perl5/5.8.8/CGI/eg/nph-clock.cgi delete mode 100644 lib/perl5/5.8.8/CGI/eg/nph-multipart.cgi delete mode 100644 lib/perl5/5.8.8/CGI/eg/popup.cgi delete mode 100644 lib/perl5/5.8.8/CGI/eg/save_state.cgi delete mode 100644 lib/perl5/5.8.8/CGI/eg/tryit.cgi delete mode 100644 lib/perl5/5.8.8/CGI/eg/wilogo_gif.uu delete mode 100644 lib/perl5/5.8.8/Encode/PerlIO.pod delete mode 100644 lib/perl5/5.8.8/Encode/Supported.pod delete mode 100644 lib/perl5/5.8.8/Encode/encode.h delete mode 100644 lib/perl5/5.8.8/ExtUtils/Command.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/Command/MM.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/Constant.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/Constant/Base.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/Constant/Utils.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/Constant/XS.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/Embed.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/Install.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/Installed.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/Liblist.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/Liblist/Kid.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/MANIFEST.SKIP delete mode 100644 lib/perl5/5.8.8/ExtUtils/MM.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/MM_AIX.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/MM_Any.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/MM_BeOS.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/MM_Cygwin.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/MM_DOS.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/MM_MacOS.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/MM_Msys.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/MM_NW5.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/MM_OS2.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/MM_QNX.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/MM_UWIN.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/MM_Unix.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/MM_VMS.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/MM_VOS.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/MM_Win32.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/MM_Win95.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/MY.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/MakeMaker.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/MakeMaker/Config.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/MakeMaker/FAQ.pod delete mode 100644 lib/perl5/5.8.8/ExtUtils/MakeMaker/Tutorial.pod delete mode 100644 lib/perl5/5.8.8/ExtUtils/MakeMaker/bytes.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/MakeMaker/vmsish.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/Manifest.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/Miniperl.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/Mkbootstrap.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/Mksymlists.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/NOTES delete mode 100644 lib/perl5/5.8.8/ExtUtils/PATCHING delete mode 100644 lib/perl5/5.8.8/ExtUtils/Packlist.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/testlib.pm delete mode 100644 lib/perl5/5.8.8/ExtUtils/typemap delete mode 100644 lib/perl5/5.8.8/ExtUtils/xsubpp delete mode 100644 lib/perl5/5.8.8/Locale/Constants.pod delete mode 100644 lib/perl5/5.8.8/Locale/Country.pod delete mode 100644 lib/perl5/5.8.8/Locale/Currency.pod delete mode 100644 lib/perl5/5.8.8/Locale/Language.pod delete mode 100644 lib/perl5/5.8.8/Locale/Maketext.pod delete mode 100644 lib/perl5/5.8.8/Locale/Maketext/TPJ13.pod delete mode 100644 lib/perl5/5.8.8/Locale/Script.pod delete mode 100644 lib/perl5/5.8.8/Math/BigFloat.pm delete mode 100644 lib/perl5/5.8.8/Math/BigFloat/Trace.pm delete mode 100644 lib/perl5/5.8.8/Math/BigInt.pm delete mode 100644 lib/perl5/5.8.8/Math/BigInt/Calc.pm delete mode 100644 lib/perl5/5.8.8/Math/BigInt/CalcEmu.pm delete mode 100644 lib/perl5/5.8.8/Math/BigInt/Trace.pm delete mode 100644 lib/perl5/5.8.8/Math/BigRat.pm delete mode 100644 lib/perl5/5.8.8/Math/Complex.pm delete mode 100644 lib/perl5/5.8.8/Math/Trig.pm delete mode 100644 lib/perl5/5.8.8/Net/libnetFAQ.pod delete mode 100644 lib/perl5/5.8.8/Pod/Checker.pm delete mode 100644 lib/perl5/5.8.8/Pod/Find.pm delete mode 100644 lib/perl5/5.8.8/Pod/Functions.pm delete mode 100644 lib/perl5/5.8.8/Pod/Html.pm delete mode 100644 lib/perl5/5.8.8/Pod/InputObjects.pm delete mode 100644 lib/perl5/5.8.8/Pod/LaTeX.pm delete mode 100644 lib/perl5/5.8.8/Pod/Man.pm delete mode 100644 lib/perl5/5.8.8/Pod/ParseLink.pm delete mode 100644 lib/perl5/5.8.8/Pod/ParseUtils.pm delete mode 100644 lib/perl5/5.8.8/Pod/Parser.pm delete mode 100644 lib/perl5/5.8.8/Pod/Perldoc.pm delete mode 100644 lib/perl5/5.8.8/Pod/Perldoc/BaseTo.pm delete mode 100644 lib/perl5/5.8.8/Pod/Perldoc/GetOptsOO.pm delete mode 100644 lib/perl5/5.8.8/Pod/Perldoc/ToChecker.pm delete mode 100644 lib/perl5/5.8.8/Pod/Perldoc/ToMan.pm delete mode 100644 lib/perl5/5.8.8/Pod/Perldoc/ToNroff.pm delete mode 100644 lib/perl5/5.8.8/Pod/Perldoc/ToPod.pm delete mode 100644 lib/perl5/5.8.8/Pod/Perldoc/ToRtf.pm delete mode 100644 lib/perl5/5.8.8/Pod/Perldoc/ToText.pm delete mode 100644 lib/perl5/5.8.8/Pod/Perldoc/ToTk.pm delete mode 100644 lib/perl5/5.8.8/Pod/Perldoc/ToXml.pm delete mode 100644 lib/perl5/5.8.8/Pod/PlainText.pm delete mode 100644 lib/perl5/5.8.8/Pod/Plainer.pm delete mode 100644 lib/perl5/5.8.8/Pod/Select.pm delete mode 100644 lib/perl5/5.8.8/Pod/Text.pm delete mode 100644 lib/perl5/5.8.8/Pod/Text/Color.pm delete mode 100644 lib/perl5/5.8.8/Pod/Text/Overstrike.pm delete mode 100644 lib/perl5/5.8.8/Pod/Text/Termcap.pm delete mode 100644 lib/perl5/5.8.8/Pod/Usage.pm delete mode 100644 lib/perl5/5.8.8/Test.pm delete mode 100644 lib/perl5/5.8.8/Test/Builder.pm delete mode 100644 lib/perl5/5.8.8/Test/Builder/Module.pm delete mode 100644 lib/perl5/5.8.8/Test/Builder/Tester.pm delete mode 100644 lib/perl5/5.8.8/Test/Builder/Tester/Color.pm delete mode 100644 lib/perl5/5.8.8/Test/Harness.pm delete mode 100644 lib/perl5/5.8.8/Test/Harness/Assert.pm delete mode 100644 lib/perl5/5.8.8/Test/Harness/Iterator.pm delete mode 100644 lib/perl5/5.8.8/Test/Harness/Point.pm delete mode 100644 lib/perl5/5.8.8/Test/Harness/Straps.pm delete mode 100644 lib/perl5/5.8.8/Test/Harness/TAP.pod delete mode 100644 lib/perl5/5.8.8/Test/More.pm delete mode 100644 lib/perl5/5.8.8/Test/Simple.pm delete mode 100644 lib/perl5/5.8.8/Test/Tutorial.pod delete mode 100644 lib/perl5/5.8.8/Unicode/Collate.pm delete mode 100644 lib/perl5/5.8.8/Unicode/Collate/keys.txt delete mode 100644 lib/perl5/5.8.8/Unicode/UCD.pm delete mode 100644 lib/perl5/5.8.8/abbrev.pl delete mode 100644 lib/perl5/5.8.8/assert.pl delete mode 100644 lib/perl5/5.8.8/bigfloat.pl delete mode 100644 lib/perl5/5.8.8/bigint.pl delete mode 100644 lib/perl5/5.8.8/bigrat.pl delete mode 100644 lib/perl5/5.8.8/bytes_heavy.pl delete mode 100644 lib/perl5/5.8.8/cacheout.pl delete mode 100644 lib/perl5/5.8.8/charnames.pm delete mode 100644 lib/perl5/5.8.8/complete.pl delete mode 100644 lib/perl5/5.8.8/ctime.pl delete mode 100644 lib/perl5/5.8.8/dbm_filter_util.pl delete mode 100644 lib/perl5/5.8.8/dotsh.pl delete mode 100644 lib/perl5/5.8.8/dumpvar.pl delete mode 100644 lib/perl5/5.8.8/exceptions.pl delete mode 100644 lib/perl5/5.8.8/fastcwd.pl delete mode 100644 lib/perl5/5.8.8/find.pl delete mode 100644 lib/perl5/5.8.8/finddepth.pl delete mode 100644 lib/perl5/5.8.8/flush.pl delete mode 100644 lib/perl5/5.8.8/getcwd.pl delete mode 100644 lib/perl5/5.8.8/getopt.pl delete mode 100644 lib/perl5/5.8.8/getopts.pl delete mode 100644 lib/perl5/5.8.8/hostname.pl delete mode 100644 lib/perl5/5.8.8/importenv.pl delete mode 100644 lib/perl5/5.8.8/look.pl delete mode 100644 lib/perl5/5.8.8/msys/.packlist delete mode 100644 lib/perl5/5.8.8/msys/CORE/EXTERN.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/INTERN.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/XSUB.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/av.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/cc_runtime.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/config.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/cop.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/cv.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/dosish.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/embed.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/embedvar.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/fakesdio.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/fakethr.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/form.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/gv.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/handy.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/hv.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/intrpvar.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/iperlsys.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/keywords.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/libperl.a delete mode 100644 lib/perl5/5.8.8/msys/CORE/libperl.dll.a delete mode 100644 lib/perl5/5.8.8/msys/CORE/malloc_ctl.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/mg.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/nostdio.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/op.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/opcode.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/opnames.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/pad.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/patchlevel.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/perl.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/perlapi.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/perlio.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/perliol.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/perlsdio.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/perlsfio.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/perlvars.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/perly.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/pp.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/pp_proto.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/proto.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/reentr.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/regcomp.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/regexp.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/regnodes.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/scope.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/sv.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/thrdvar.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/thread.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/uconfig.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/unixish.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/utf8.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/utfebcdic.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/util.h delete mode 100644 lib/perl5/5.8.8/msys/CORE/warnings.h delete mode 100644 lib/perl5/5.8.8/msys/Config.pod delete mode 100644 lib/perl5/5.8.8/msys/Config_heavy.pl delete mode 100644 lib/perl5/5.8.8/msys/POSIX.pod delete mode 100644 lib/perl5/5.8.8/msys/Unicode/Normalize.pm delete mode 100644 lib/perl5/5.8.8/msys/auto/B/C/libC.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/B/libB.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/ByteLoader/libByteLoader.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/Cwd/libCwd.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/Data/Dumper/libDumper.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/Devel/DProf/libDProf.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/Devel/PPPort/libPPPort.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/Devel/Peek/libPeek.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/Digest/MD5/libMD5.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/DynaLoader/DynaLoader.a delete mode 100644 lib/perl5/5.8.8/msys/auto/Encode/Byte/libByte.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/Encode/CN/libCN.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/Encode/EBCDIC/libEBCDIC.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/Encode/JP/libJP.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/Encode/KR/libKR.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/Encode/Symbol/libSymbol.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/Encode/TW/libTW.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/Encode/Unicode/libUnicode.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/Encode/libEncode.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/Fcntl/libFcntl.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/File/Glob/libGlob.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/Filter/Util/Call/libCall.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/IO/libIO.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/List/Util/libUtil.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/MIME/Base64/libBase64.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/Opcode/libOpcode.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/POSIX/libPOSIX.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/PerlIO/encoding/libencoding.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/PerlIO/scalar/libscalar.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/PerlIO/via/libvia.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/SDBM_File/libSDBM_File.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/Socket/libSocket.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/Storable/libStorable.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/Sys/Hostname/libHostname.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/Sys/Syslog/libSyslog.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/Time/HiRes/libHiRes.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/Unicode/Normalize/libNormalize.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/XS/APItest/libAPItest.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/XS/Typemap/libTypemap.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/attrs/libattrs.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/re/libre.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/threads/libthreads.dll.a delete mode 100644 lib/perl5/5.8.8/msys/auto/threads/shared/libshared.dll.a delete mode 100644 lib/perl5/5.8.8/msys/perllocal.pod delete mode 100644 lib/perl5/5.8.8/newgetopt.pl delete mode 100644 lib/perl5/5.8.8/open2.pl delete mode 100644 lib/perl5/5.8.8/open3.pl delete mode 100644 lib/perl5/5.8.8/perl5db.pl delete mode 100644 lib/perl5/5.8.8/pods/a2p.pod delete mode 100644 lib/perl5/5.8.8/pods/perl.pod delete mode 100644 lib/perl5/5.8.8/pods/perl5004delta.pod delete mode 100644 lib/perl5/5.8.8/pods/perl5005delta.pod delete mode 100644 lib/perl5/5.8.8/pods/perl561delta.pod delete mode 100644 lib/perl5/5.8.8/pods/perl56delta.pod delete mode 100644 lib/perl5/5.8.8/pods/perl570delta.pod delete mode 100644 lib/perl5/5.8.8/pods/perl571delta.pod delete mode 100644 lib/perl5/5.8.8/pods/perl572delta.pod delete mode 100644 lib/perl5/5.8.8/pods/perl573delta.pod delete mode 100644 lib/perl5/5.8.8/pods/perl581delta.pod delete mode 100644 lib/perl5/5.8.8/pods/perl582delta.pod delete mode 100644 lib/perl5/5.8.8/pods/perl583delta.pod delete mode 100644 lib/perl5/5.8.8/pods/perl584delta.pod delete mode 100644 lib/perl5/5.8.8/pods/perl585delta.pod delete mode 100644 lib/perl5/5.8.8/pods/perl586delta.pod delete mode 100644 lib/perl5/5.8.8/pods/perl587delta.pod delete mode 100644 lib/perl5/5.8.8/pods/perl588delta.pod delete mode 100644 lib/perl5/5.8.8/pods/perl58delta.pod delete mode 100644 lib/perl5/5.8.8/pods/perlaix.pod delete mode 100644 lib/perl5/5.8.8/pods/perlamiga.pod delete mode 100644 lib/perl5/5.8.8/pods/perlapi.pod delete mode 100644 lib/perl5/5.8.8/pods/perlapio.pod delete mode 100644 lib/perl5/5.8.8/pods/perlapollo.pod delete mode 100644 lib/perl5/5.8.8/pods/perlartistic.pod delete mode 100644 lib/perl5/5.8.8/pods/perlbeos.pod delete mode 100644 lib/perl5/5.8.8/pods/perlbook.pod delete mode 100644 lib/perl5/5.8.8/pods/perlboot.pod delete mode 100644 lib/perl5/5.8.8/pods/perlbot.pod delete mode 100644 lib/perl5/5.8.8/pods/perlbs2000.pod delete mode 100644 lib/perl5/5.8.8/pods/perlcall.pod delete mode 100644 lib/perl5/5.8.8/pods/perlce.pod delete mode 100644 lib/perl5/5.8.8/pods/perlcheat.pod delete mode 100644 lib/perl5/5.8.8/pods/perlclib.pod delete mode 100644 lib/perl5/5.8.8/pods/perlcn.pod delete mode 100644 lib/perl5/5.8.8/pods/perlcompile.pod delete mode 100644 lib/perl5/5.8.8/pods/perlcygwin.pod delete mode 100644 lib/perl5/5.8.8/pods/perldata.pod delete mode 100644 lib/perl5/5.8.8/pods/perldbmfilter.pod delete mode 100644 lib/perl5/5.8.8/pods/perldebguts.pod delete mode 100644 lib/perl5/5.8.8/pods/perldebtut.pod delete mode 100644 lib/perl5/5.8.8/pods/perldebug.pod delete mode 100644 lib/perl5/5.8.8/pods/perldelta.pod delete mode 100644 lib/perl5/5.8.8/pods/perldgux.pod delete mode 100644 lib/perl5/5.8.8/pods/perldiag.pod delete mode 100644 lib/perl5/5.8.8/pods/perldoc.pod delete mode 100644 lib/perl5/5.8.8/pods/perldos.pod delete mode 100644 lib/perl5/5.8.8/pods/perldsc.pod delete mode 100644 lib/perl5/5.8.8/pods/perlebcdic.pod delete mode 100644 lib/perl5/5.8.8/pods/perlembed.pod delete mode 100644 lib/perl5/5.8.8/pods/perlepoc.pod delete mode 100644 lib/perl5/5.8.8/pods/perlfaq.pod delete mode 100644 lib/perl5/5.8.8/pods/perlfaq1.pod delete mode 100644 lib/perl5/5.8.8/pods/perlfaq2.pod delete mode 100644 lib/perl5/5.8.8/pods/perlfaq3.pod delete mode 100644 lib/perl5/5.8.8/pods/perlfaq4.pod delete mode 100644 lib/perl5/5.8.8/pods/perlfaq5.pod delete mode 100644 lib/perl5/5.8.8/pods/perlfaq6.pod delete mode 100644 lib/perl5/5.8.8/pods/perlfaq7.pod delete mode 100644 lib/perl5/5.8.8/pods/perlfaq8.pod delete mode 100644 lib/perl5/5.8.8/pods/perlfaq9.pod delete mode 100644 lib/perl5/5.8.8/pods/perlfilter.pod delete mode 100644 lib/perl5/5.8.8/pods/perlfork.pod delete mode 100644 lib/perl5/5.8.8/pods/perlform.pod delete mode 100644 lib/perl5/5.8.8/pods/perlfreebsd.pod delete mode 100644 lib/perl5/5.8.8/pods/perlfunc.pod delete mode 100644 lib/perl5/5.8.8/pods/perlglossary.pod delete mode 100644 lib/perl5/5.8.8/pods/perlgpl.pod delete mode 100644 lib/perl5/5.8.8/pods/perlguts.pod delete mode 100644 lib/perl5/5.8.8/pods/perlhack.pod delete mode 100644 lib/perl5/5.8.8/pods/perlhist.pod delete mode 100644 lib/perl5/5.8.8/pods/perlhpux.pod delete mode 100644 lib/perl5/5.8.8/pods/perlhurd.pod delete mode 100644 lib/perl5/5.8.8/pods/perlintern.pod delete mode 100644 lib/perl5/5.8.8/pods/perlintro.pod delete mode 100644 lib/perl5/5.8.8/pods/perliol.pod delete mode 100644 lib/perl5/5.8.8/pods/perlipc.pod delete mode 100644 lib/perl5/5.8.8/pods/perlirix.pod delete mode 100644 lib/perl5/5.8.8/pods/perljp.pod delete mode 100644 lib/perl5/5.8.8/pods/perlko.pod delete mode 100644 lib/perl5/5.8.8/pods/perllexwarn.pod delete mode 100644 lib/perl5/5.8.8/pods/perllinux.pod delete mode 100644 lib/perl5/5.8.8/pods/perllocale.pod delete mode 100644 lib/perl5/5.8.8/pods/perllol.pod delete mode 100644 lib/perl5/5.8.8/pods/perlmachten.pod delete mode 100644 lib/perl5/5.8.8/pods/perlmacos.pod delete mode 100644 lib/perl5/5.8.8/pods/perlmacosx.pod delete mode 100644 lib/perl5/5.8.8/pods/perlmint.pod delete mode 100644 lib/perl5/5.8.8/pods/perlmod.pod delete mode 100644 lib/perl5/5.8.8/pods/perlmodinstall.pod delete mode 100644 lib/perl5/5.8.8/pods/perlmodlib.pod delete mode 100644 lib/perl5/5.8.8/pods/perlmodstyle.pod delete mode 100644 lib/perl5/5.8.8/pods/perlmpeix.pod delete mode 100644 lib/perl5/5.8.8/pods/perlnetware.pod delete mode 100644 lib/perl5/5.8.8/pods/perlnewmod.pod delete mode 100644 lib/perl5/5.8.8/pods/perlnumber.pod delete mode 100644 lib/perl5/5.8.8/pods/perlobj.pod delete mode 100644 lib/perl5/5.8.8/pods/perlop.pod delete mode 100644 lib/perl5/5.8.8/pods/perlopenbsd.pod delete mode 100644 lib/perl5/5.8.8/pods/perlopentut.pod delete mode 100644 lib/perl5/5.8.8/pods/perlos2.pod delete mode 100644 lib/perl5/5.8.8/pods/perlos390.pod delete mode 100644 lib/perl5/5.8.8/pods/perlos400.pod delete mode 100644 lib/perl5/5.8.8/pods/perlothrtut.pod delete mode 100644 lib/perl5/5.8.8/pods/perlpacktut.pod delete mode 100644 lib/perl5/5.8.8/pods/perlplan9.pod delete mode 100644 lib/perl5/5.8.8/pods/perlpod.pod delete mode 100644 lib/perl5/5.8.8/pods/perlpodspec.pod delete mode 100644 lib/perl5/5.8.8/pods/perlport.pod delete mode 100644 lib/perl5/5.8.8/pods/perlqnx.pod delete mode 100644 lib/perl5/5.8.8/pods/perlre.pod delete mode 100644 lib/perl5/5.8.8/pods/perlref.pod delete mode 100644 lib/perl5/5.8.8/pods/perlreftut.pod delete mode 100644 lib/perl5/5.8.8/pods/perlrequick.pod delete mode 100644 lib/perl5/5.8.8/pods/perlreref.pod delete mode 100644 lib/perl5/5.8.8/pods/perlretut.pod delete mode 100644 lib/perl5/5.8.8/pods/perlrun.pod delete mode 100644 lib/perl5/5.8.8/pods/perlsec.pod delete mode 100644 lib/perl5/5.8.8/pods/perlsolaris.pod delete mode 100644 lib/perl5/5.8.8/pods/perlstyle.pod delete mode 100644 lib/perl5/5.8.8/pods/perlsub.pod delete mode 100644 lib/perl5/5.8.8/pods/perlsyn.pod delete mode 100644 lib/perl5/5.8.8/pods/perlthrtut.pod delete mode 100644 lib/perl5/5.8.8/pods/perltie.pod delete mode 100644 lib/perl5/5.8.8/pods/perltoc.pod delete mode 100644 lib/perl5/5.8.8/pods/perltodo.pod delete mode 100644 lib/perl5/5.8.8/pods/perltooc.pod delete mode 100644 lib/perl5/5.8.8/pods/perltoot.pod delete mode 100644 lib/perl5/5.8.8/pods/perltrap.pod delete mode 100644 lib/perl5/5.8.8/pods/perltru64.pod delete mode 100644 lib/perl5/5.8.8/pods/perltw.pod delete mode 100644 lib/perl5/5.8.8/pods/perlunicode.pod delete mode 100644 lib/perl5/5.8.8/pods/perluniintro.pod delete mode 100644 lib/perl5/5.8.8/pods/perlutil.pod delete mode 100644 lib/perl5/5.8.8/pods/perluts.pod delete mode 100644 lib/perl5/5.8.8/pods/perlvar.pod delete mode 100644 lib/perl5/5.8.8/pods/perlvmesa.pod delete mode 100644 lib/perl5/5.8.8/pods/perlvms.pod delete mode 100644 lib/perl5/5.8.8/pods/perlvos.pod delete mode 100644 lib/perl5/5.8.8/pods/perlwin32.pod delete mode 100644 lib/perl5/5.8.8/pods/perlxs.pod delete mode 100644 lib/perl5/5.8.8/pods/perlxstut.pod delete mode 100644 lib/perl5/5.8.8/pwd.pl delete mode 100644 lib/perl5/5.8.8/shellwords.pl delete mode 100644 lib/perl5/5.8.8/stat.pl delete mode 100644 lib/perl5/5.8.8/syslog.pl delete mode 100644 lib/perl5/5.8.8/tainted.pl delete mode 100644 lib/perl5/5.8.8/termcap.pl delete mode 100644 lib/perl5/5.8.8/timelocal.pl delete mode 100644 lib/perl5/5.8.8/unicore/ArabicShaping.txt delete mode 100644 lib/perl5/5.8.8/unicore/BidiMirroring.txt delete mode 100644 lib/perl5/5.8.8/unicore/Blocks.txt delete mode 100644 lib/perl5/5.8.8/unicore/Canonical.pl delete mode 100644 lib/perl5/5.8.8/unicore/CaseFolding.txt delete mode 100644 lib/perl5/5.8.8/unicore/CombiningClass.pl delete mode 100644 lib/perl5/5.8.8/unicore/CompositionExclusions.txt delete mode 100644 lib/perl5/5.8.8/unicore/Decomposition.pl delete mode 100644 lib/perl5/5.8.8/unicore/EastAsianWidth.txt delete mode 100644 lib/perl5/5.8.8/unicore/Exact.pl delete mode 100644 lib/perl5/5.8.8/unicore/HangulSyllableType.txt delete mode 100644 lib/perl5/5.8.8/unicore/Index.txt delete mode 100644 lib/perl5/5.8.8/unicore/Jamo.txt delete mode 100644 lib/perl5/5.8.8/unicore/LineBreak.txt delete mode 100644 lib/perl5/5.8.8/unicore/Name.pl delete mode 100644 lib/perl5/5.8.8/unicore/NamedSequences.txt delete mode 100644 lib/perl5/5.8.8/unicore/NamesList.txt delete mode 100644 lib/perl5/5.8.8/unicore/NormalizationCorrections.txt delete mode 100644 lib/perl5/5.8.8/unicore/PVA.pl delete mode 100644 lib/perl5/5.8.8/unicore/PropList.txt delete mode 100644 lib/perl5/5.8.8/unicore/PropValueAliases.txt delete mode 100644 lib/perl5/5.8.8/unicore/Properties delete mode 100644 lib/perl5/5.8.8/unicore/PropertyAliases.txt delete mode 100644 lib/perl5/5.8.8/unicore/ReadMe.txt delete mode 100644 lib/perl5/5.8.8/unicore/Scripts.txt delete mode 100644 lib/perl5/5.8.8/unicore/SpecialCasing.txt delete mode 100644 lib/perl5/5.8.8/unicore/StandardizedVariants.txt delete mode 100644 lib/perl5/5.8.8/unicore/To/Digit.pl delete mode 100644 lib/perl5/5.8.8/unicore/To/Fold.pl delete mode 100644 lib/perl5/5.8.8/unicore/To/Lower.pl delete mode 100644 lib/perl5/5.8.8/unicore/To/Title.pl delete mode 100644 lib/perl5/5.8.8/unicore/To/Upper.pl delete mode 100644 lib/perl5/5.8.8/unicore/UnicodeData.txt delete mode 100644 lib/perl5/5.8.8/unicore/lib/bc/AL.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/bc/AN.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/bc/B.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/bc/BN.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/bc/CS.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/bc/EN.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/bc/ES.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/bc/ET.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/bc/L.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/bc/LRE.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/bc/LRO.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/bc/NSM.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/bc/ON.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/bc/PDF.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/bc/R.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/bc/RLE.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/bc/RLO.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/bc/S.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/bc/WS.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/ccc/A.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/ccc/AL.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/ccc/AR.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/ccc/ATAR.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/ccc/ATB.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/ccc/ATBL.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/ccc/B.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/ccc/BL.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/ccc/BR.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/ccc/DA.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/ccc/DB.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/ccc/IS.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/ccc/KV.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/ccc/L.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/ccc/NK.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/ccc/NR.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/ccc/OV.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/ccc/R.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/ccc/VR.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/dt/can.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/dt/com.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/dt/enc.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/dt/fin.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/dt/font.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/dt/fra.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/dt/init.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/dt/iso.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/dt/med.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/dt/nar.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/dt/nb.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/dt/sml.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/dt/sqr.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/dt/sub.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/dt/sup.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/dt/vert.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/dt/wide.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/ea/A.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/ea/F.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/ea/H.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/ea/N.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/ea/Na.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/ea/W.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/AHex.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/ASCII.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Alnum.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Alpha.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Alphabet.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Any.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Arab.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Armn.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/AsciiHex.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Assigned.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Beng.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/BidiC.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/BidiCont.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Blank.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Bopo.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Brai.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Bugi.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Buhd.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/C.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Canadian.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Cc.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Cf.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Cher.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Cn.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Cntrl.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Co.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Copt.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Cprt.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Cs.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Cyrl.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Dash.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Dash2.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Dep.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Deprecat.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Deva.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Dia.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Diacriti.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Digit.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Dsrt.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Ethi.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Ext.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Extender.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Geor.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Glag.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Goth.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/GrLink.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Graph.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Grapheme.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Grek.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Gujr.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Guru.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Hang.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Hani.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Hano.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Hebr.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Hex.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/HexDigit.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Hira.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Hyphen.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Hyphen2.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/IDSB.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/IDST.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/IdContin.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/IdStart.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Ideo.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Ideograp.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/IdsBinar.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/IdsTrina.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InAegean.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InAlphab.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InAncie2.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InAncien.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InArabi2.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InArabi3.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InArabi4.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InArabic.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InArmeni.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InArrows.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InBasicL.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InBengal.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InBlockE.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InBopom2.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InBopomo.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InBoxDra.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InBraill.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InBugine.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InBuhid.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InByzant.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InCherok.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InCjkCo2.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InCjkCo3.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InCjkCo4.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InCjkCom.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InCjkRad.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InCjkStr.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InCjkSym.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InCjkUn2.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InCjkUn3.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InCjkUni.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InCombi2.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InCombi3.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InCombi4.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InCombin.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InContro.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InCoptic.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InCurren.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InCyprio.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InCyril2.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InCyrill.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InDesere.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InDevana.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InDingba.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InEnclo2.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InEnclos.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InEthio2.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InEthio3.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InEthiop.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InGenera.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InGeomet.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InGeorg2.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InGeorgi.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InGlagol.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InGothic.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InGreekA.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InGreekE.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InGujara.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InGurmuk.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InHalfwi.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InHangu2.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InHangu3.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InHangul.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InHanuno.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InHebrew.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InHighPr.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InHighSu.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InHiraga.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InIdeogr.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InIpaExt.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InKanbun.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InKangxi.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InKannad.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InKatak2.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InKataka.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InKharos.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InKhmer.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InKhmerS.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InLao.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InLatin1.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InLatin2.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InLatin3.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InLatinE.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InLetter.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InLimbu.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InLinea2.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InLinear.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InLowSur.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InMalaya.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InMathe2.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InMathem.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InMisce2.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InMisce3.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InMisce4.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InMisce5.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InMiscel.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InModifi.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InMongol.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InMusica.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InMyanma.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InNewTai.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InNumber.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InOgham.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InOldIta.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InOldPer.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InOptica.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InOriya.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InOsmany.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InPhone2.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InPhonet.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InPrivat.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InRunic.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InShavia.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InSinhal.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InSmallF.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InSpacin.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InSpecia.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InSupers.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InSuppl2.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InSuppl3.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InSuppl4.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InSuppl5.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InSuppl6.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InSupple.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InSyloti.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InSyriac.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InTagalo.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InTagban.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InTags.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InTaiLe.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InTaiXua.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InTamil.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InTelugu.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InThaana.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InThai.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InTibeta.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InTifina.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InUgarit.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InUnifie.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InVaria2.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InVariat.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InVertic.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InYiRadi.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InYiSyll.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/InYijing.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/JoinC.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/JoinCont.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Kana.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Khar.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Khmr.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Knda.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/L.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/LC.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/LOE.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Laoo.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Latn.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Limb.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/LinearB.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Ll.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Lm.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Lo.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/LogicalO.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Lower.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Lowercas.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Lt.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Lu.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/M.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Math.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Mc.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Me.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Mlym.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Mn.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Mong.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Mymr.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/N.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/NChar.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Nd.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/NewTaiLu.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Nl.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/No.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Nonchara.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/OAlpha.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/ODI.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/OGrExt.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/OIDC.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/OIDS.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/OLower.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/OMath.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/OUpper.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Ogam.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/OldItali.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/OldPersi.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Orya.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Osma.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/OtherAlp.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/OtherDef.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/OtherGra.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/OtherIdC.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/OtherIdS.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/OtherLow.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/OtherMat.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/OtherUpp.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/P.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/PatSyn.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/PatWS.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/PatternS.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/PatternW.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Pc.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Pd.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Pe.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Pf.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Pi.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Po.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Print.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Ps.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Punct.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/QMark.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Qaai.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Quotatio.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Radical.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Radical2.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Runr.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/S.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/SD.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/STerm.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Sc.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Shaw.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Sinh.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Sk.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Sm.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/So.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/SoftDott.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Space.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/SpacePer.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Sterm2.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/SylotiNa.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Syrc.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Tagb.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/TaiLe.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Taml.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Telu.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Term.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Terminal.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Tfng.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Tglg.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Thaa.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Thai.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Tibt.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Title.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/UIdeo.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Ugar.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/UnifiedI.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Upper.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Uppercas.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/VS.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Variatio.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/WSpace.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/WhiteSpa.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Word.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/XDigit.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Yiii.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Z.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Zl.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Zp.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Zs.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/Zyyy.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/_CanonDC.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/_CaseIgn.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/gc_sc/_CombAbo.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/hst/L.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/hst/LV.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/hst/LVT.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/hst/T.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/hst/V.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/jt/C.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/jt/D.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/jt/R.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/jt/U.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/AI.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/AL.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/B2.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/BA.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/BB.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/BK.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/CB.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/CL.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/CM.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/CR.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/EX.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/GL.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/H2.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/H3.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/HY.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/ID.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/IN.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/IS.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/JL.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/JT.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/JV.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/LF.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/NL.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/NS.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/NU.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/OP.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/PO.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/PR.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/QU.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/SA.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/SG.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/SP.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/SY.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/WJ.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/XX.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/lb/ZW.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/nt/De.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/nt/Di.pl delete mode 100644 lib/perl5/5.8.8/unicore/lib/nt/Nu.pl delete mode 100644 lib/perl5/5.8.8/unicore/mktables delete mode 100644 lib/perl5/5.8.8/unicore/mktables.lst delete mode 100644 lib/perl5/5.8.8/unicore/version delete mode 100644 lib/perl5/5.8.8/utf8_heavy.pl delete mode 100644 lib/perl5/5.8.8/validate.pl delete mode 100644 lib/perl5/site_perl/5.8.8/msys/auto/SVN/_Client/lib_Client.dll.a delete mode 100644 lib/perl5/site_perl/5.8.8/msys/auto/SVN/_Core/.packlist delete mode 100644 lib/perl5/site_perl/5.8.8/msys/auto/SVN/_Core/lib_Core.dll.a delete mode 100644 lib/perl5/site_perl/5.8.8/msys/auto/SVN/_Delta/lib_Delta.dll.a delete mode 100644 lib/perl5/site_perl/5.8.8/msys/auto/SVN/_Fs/lib_Fs.dll.a delete mode 100644 lib/perl5/site_perl/5.8.8/msys/auto/SVN/_Ra/lib_Ra.dll.a delete mode 100644 lib/perl5/site_perl/5.8.8/msys/auto/SVN/_Repos/lib_Repos.dll.a delete mode 100644 lib/perl5/site_perl/5.8.8/msys/auto/SVN/_Wc/lib_Wc.dll.a delete mode 100644 lib/perl5/site_perl/5.8.8/msys/auto/Term/ReadKey/.packlist delete mode 100644 lib/perl5/site_perl/5.8.8/msys/auto/Term/ReadKey/libReadKey.dll.a delete mode 100644 mingw/lib/tcl8.4/encoding/ascii.enc delete mode 100644 mingw/lib/tcl8.4/encoding/big5.enc delete mode 100644 mingw/lib/tcl8.4/encoding/cp1250.enc delete mode 100644 mingw/lib/tcl8.4/encoding/cp1251.enc delete mode 100644 mingw/lib/tcl8.4/encoding/cp1252.enc delete mode 100644 mingw/lib/tcl8.4/encoding/cp1253.enc delete mode 100644 mingw/lib/tcl8.4/encoding/cp1254.enc delete mode 100644 mingw/lib/tcl8.4/encoding/cp1255.enc delete mode 100644 mingw/lib/tcl8.4/encoding/cp1256.enc delete mode 100644 mingw/lib/tcl8.4/encoding/cp1257.enc delete mode 100644 mingw/lib/tcl8.4/encoding/cp1258.enc delete mode 100644 mingw/lib/tcl8.4/encoding/cp437.enc delete mode 100644 mingw/lib/tcl8.4/encoding/cp737.enc delete mode 100644 mingw/lib/tcl8.4/encoding/cp775.enc delete mode 100644 mingw/lib/tcl8.4/encoding/cp850.enc delete mode 100644 mingw/lib/tcl8.4/encoding/cp852.enc delete mode 100644 mingw/lib/tcl8.4/encoding/cp855.enc delete mode 100644 mingw/lib/tcl8.4/encoding/cp857.enc delete mode 100644 mingw/lib/tcl8.4/encoding/cp860.enc delete mode 100644 mingw/lib/tcl8.4/encoding/cp861.enc delete mode 100644 mingw/lib/tcl8.4/encoding/cp862.enc delete mode 100644 mingw/lib/tcl8.4/encoding/cp863.enc delete mode 100644 mingw/lib/tcl8.4/encoding/cp864.enc delete mode 100644 mingw/lib/tcl8.4/encoding/cp865.enc delete mode 100644 mingw/lib/tcl8.4/encoding/cp866.enc delete mode 100644 mingw/lib/tcl8.4/encoding/cp869.enc delete mode 100644 mingw/lib/tcl8.4/encoding/cp874.enc delete mode 100644 mingw/lib/tcl8.4/encoding/cp932.enc delete mode 100644 mingw/lib/tcl8.4/encoding/cp936.enc delete mode 100644 mingw/lib/tcl8.4/encoding/cp949.enc delete mode 100644 mingw/lib/tcl8.4/encoding/cp950.enc delete mode 100644 mingw/lib/tcl8.4/encoding/dingbats.enc delete mode 100644 mingw/lib/tcl8.4/encoding/ebcdic.enc delete mode 100644 mingw/lib/tcl8.4/encoding/euc-cn.enc delete mode 100644 mingw/lib/tcl8.4/encoding/euc-jp.enc delete mode 100644 mingw/lib/tcl8.4/encoding/euc-kr.enc delete mode 100644 mingw/lib/tcl8.4/encoding/gb12345.enc delete mode 100644 mingw/lib/tcl8.4/encoding/gb1988.enc delete mode 100644 mingw/lib/tcl8.4/encoding/gb2312-raw.enc delete mode 100644 mingw/lib/tcl8.4/encoding/gb2312.enc delete mode 100644 mingw/lib/tcl8.4/encoding/iso2022-jp.enc delete mode 100644 mingw/lib/tcl8.4/encoding/iso2022-kr.enc delete mode 100644 mingw/lib/tcl8.4/encoding/iso2022.enc delete mode 100644 mingw/lib/tcl8.4/encoding/iso8859-1.enc delete mode 100644 mingw/lib/tcl8.4/encoding/iso8859-10.enc delete mode 100644 mingw/lib/tcl8.4/encoding/iso8859-13.enc delete mode 100644 mingw/lib/tcl8.4/encoding/iso8859-14.enc delete mode 100644 mingw/lib/tcl8.4/encoding/iso8859-15.enc delete mode 100644 mingw/lib/tcl8.4/encoding/iso8859-16.enc delete mode 100644 mingw/lib/tcl8.4/encoding/iso8859-2.enc delete mode 100644 mingw/lib/tcl8.4/encoding/iso8859-3.enc delete mode 100644 mingw/lib/tcl8.4/encoding/iso8859-4.enc delete mode 100644 mingw/lib/tcl8.4/encoding/iso8859-5.enc delete mode 100644 mingw/lib/tcl8.4/encoding/iso8859-6.enc delete mode 100644 mingw/lib/tcl8.4/encoding/iso8859-7.enc delete mode 100644 mingw/lib/tcl8.4/encoding/iso8859-8.enc delete mode 100644 mingw/lib/tcl8.4/encoding/iso8859-9.enc delete mode 100644 mingw/lib/tcl8.4/encoding/jis0201.enc delete mode 100644 mingw/lib/tcl8.4/encoding/jis0208.enc delete mode 100644 mingw/lib/tcl8.4/encoding/jis0212.enc delete mode 100644 mingw/lib/tcl8.4/encoding/koi8-r.enc delete mode 100644 mingw/lib/tcl8.4/encoding/koi8-u.enc delete mode 100644 mingw/lib/tcl8.4/encoding/ksc5601.enc delete mode 100644 mingw/lib/tcl8.4/encoding/macCentEuro.enc delete mode 100644 mingw/lib/tcl8.4/encoding/macCroatian.enc delete mode 100644 mingw/lib/tcl8.4/encoding/macCyrillic.enc delete mode 100644 mingw/lib/tcl8.4/encoding/macDingbats.enc delete mode 100644 mingw/lib/tcl8.4/encoding/macGreek.enc delete mode 100644 mingw/lib/tcl8.4/encoding/macIceland.enc delete mode 100644 mingw/lib/tcl8.4/encoding/macJapan.enc delete mode 100644 mingw/lib/tcl8.4/encoding/macRoman.enc delete mode 100644 mingw/lib/tcl8.4/encoding/macRomania.enc delete mode 100644 mingw/lib/tcl8.4/encoding/macThai.enc delete mode 100644 mingw/lib/tcl8.4/encoding/macTurkish.enc delete mode 100644 mingw/lib/tcl8.4/encoding/macUkraine.enc delete mode 100644 mingw/lib/tcl8.4/encoding/shiftjis.enc delete mode 100644 mingw/lib/tcl8.4/encoding/symbol.enc delete mode 100644 mingw/lib/tcl8.4/encoding/tis-620.enc delete mode 100644 mingw/lib/tk8.4/demos/README delete mode 100644 mingw/lib/tk8.4/demos/arrow.tcl delete mode 100644 mingw/lib/tk8.4/demos/bind.tcl delete mode 100644 mingw/lib/tk8.4/demos/bitmap.tcl delete mode 100644 mingw/lib/tk8.4/demos/browse delete mode 100644 mingw/lib/tk8.4/demos/button.tcl delete mode 100644 mingw/lib/tk8.4/demos/check.tcl delete mode 100644 mingw/lib/tk8.4/demos/clrpick.tcl delete mode 100644 mingw/lib/tk8.4/demos/colors.tcl delete mode 100644 mingw/lib/tk8.4/demos/cscroll.tcl delete mode 100644 mingw/lib/tk8.4/demos/ctext.tcl delete mode 100644 mingw/lib/tk8.4/demos/dialog1.tcl delete mode 100644 mingw/lib/tk8.4/demos/dialog2.tcl delete mode 100644 mingw/lib/tk8.4/demos/entry1.tcl delete mode 100644 mingw/lib/tk8.4/demos/entry2.tcl delete mode 100644 mingw/lib/tk8.4/demos/entry3.tcl delete mode 100644 mingw/lib/tk8.4/demos/filebox.tcl delete mode 100644 mingw/lib/tk8.4/demos/floor.tcl delete mode 100644 mingw/lib/tk8.4/demos/form.tcl delete mode 100644 mingw/lib/tk8.4/demos/hello delete mode 100644 mingw/lib/tk8.4/demos/hscale.tcl delete mode 100644 mingw/lib/tk8.4/demos/icon.tcl delete mode 100644 mingw/lib/tk8.4/demos/image1.tcl delete mode 100644 mingw/lib/tk8.4/demos/image2.tcl delete mode 100644 mingw/lib/tk8.4/demos/images/earth.gif delete mode 100644 mingw/lib/tk8.4/demos/images/earthris.gif delete mode 100644 mingw/lib/tk8.4/demos/images/face.bmp delete mode 100644 mingw/lib/tk8.4/demos/images/flagdown.bmp delete mode 100644 mingw/lib/tk8.4/demos/images/flagup.bmp delete mode 100644 mingw/lib/tk8.4/demos/images/gray25.bmp delete mode 100644 mingw/lib/tk8.4/demos/images/letters.bmp delete mode 100644 mingw/lib/tk8.4/demos/images/noletter.bmp delete mode 100644 mingw/lib/tk8.4/demos/images/pattern.bmp delete mode 100644 mingw/lib/tk8.4/demos/images/tcllogo.gif delete mode 100644 mingw/lib/tk8.4/demos/images/teapot.ppm delete mode 100644 mingw/lib/tk8.4/demos/items.tcl delete mode 100644 mingw/lib/tk8.4/demos/ixset delete mode 100644 mingw/lib/tk8.4/demos/label.tcl delete mode 100644 mingw/lib/tk8.4/demos/labelframe.tcl delete mode 100644 mingw/lib/tk8.4/demos/license.terms delete mode 100644 mingw/lib/tk8.4/demos/menu.tcl delete mode 100644 mingw/lib/tk8.4/demos/menubu.tcl delete mode 100644 mingw/lib/tk8.4/demos/msgbox.tcl delete mode 100644 mingw/lib/tk8.4/demos/paned1.tcl delete mode 100644 mingw/lib/tk8.4/demos/paned2.tcl delete mode 100644 mingw/lib/tk8.4/demos/plot.tcl delete mode 100644 mingw/lib/tk8.4/demos/puzzle.tcl delete mode 100644 mingw/lib/tk8.4/demos/radio.tcl delete mode 100644 mingw/lib/tk8.4/demos/rmt delete mode 100644 mingw/lib/tk8.4/demos/rolodex delete mode 100644 mingw/lib/tk8.4/demos/ruler.tcl delete mode 100644 mingw/lib/tk8.4/demos/sayings.tcl delete mode 100644 mingw/lib/tk8.4/demos/search.tcl delete mode 100644 mingw/lib/tk8.4/demos/spin.tcl delete mode 100644 mingw/lib/tk8.4/demos/square delete mode 100644 mingw/lib/tk8.4/demos/states.tcl delete mode 100644 mingw/lib/tk8.4/demos/style.tcl delete mode 100644 mingw/lib/tk8.4/demos/tclIndex delete mode 100644 mingw/lib/tk8.4/demos/tcolor delete mode 100644 mingw/lib/tk8.4/demos/text.tcl delete mode 100644 mingw/lib/tk8.4/demos/timer delete mode 100644 mingw/lib/tk8.4/demos/twind.tcl delete mode 100644 mingw/lib/tk8.4/demos/unicodeout.tcl delete mode 100644 mingw/lib/tk8.4/demos/vscale.tcl delete mode 100644 mingw/lib/tk8.4/demos/widget diff --git a/lib/perl5/5.8.8/CGI.pm b/lib/perl5/5.8.8/CGI.pm deleted file mode 100644 index 6c9d452a..00000000 --- a/lib/perl5/5.8.8/CGI.pm +++ /dev/null @@ -1,7623 +0,0 @@ -package CGI; -require 5.004; -use Carp 'croak'; - -# 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-1998 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. - -# The most recent version and complete docs are available at: -# http://stein.cshl.org/WWW/software/CGI/ - -$CGI::revision = '$Id: CGI.pm,v 1.194 2005/12/06 22:12:56 lstein Exp $'; -$CGI::VERSION='3.15'; - -# HARD-CODED LOCATION FOR FILE UPLOAD TEMPORARY FILES. -# UNCOMMENT THIS ONLY IF YOU KNOW WHAT YOU'RE DOING. -# $CGITempFile::TMPDIRECTORY = '/usr/tmp'; -use CGI::Util qw(rearrange make_attributes unescape escape expires ebcdic2ascii ascii2ebcdic); - -#use constant XHTML_DTD => ['-//W3C//DTD XHTML Basic 1.0//EN', -# 'http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd']; - -use constant XHTML_DTD => ['-//W3C//DTD XHTML 1.0 Transitional//EN', - 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd']; - -{ - local $^W = 0; - $TAINTED = substr("$0$^X",0,0); -} - -$MOD_PERL = 0; # no mod_perl by default -@SAVED_SYMBOLS = (); - -# >>>>> Here are some globals that you might want to adjust <<<<<< -sub initialize_globals { - # Set this to 1 to enable copious autoloader debugging messages - $AUTOLOAD_DEBUG = 0; - - # Set this to 1 to generate XTML-compatible output - $XHTML = 1; - - # Change this to the preferred DTD to print in start_html() - # or use default_dtd('text of DTD to use'); - $DEFAULT_DTD = [ '-//W3C//DTD HTML 4.01 Transitional//EN', - 'http://www.w3.org/TR/html4/loose.dtd' ] ; - - # Set this to 1 to enable NOSTICKY scripts - # or: - # 1) use CGI qw(-nosticky) - # 2) $CGI::nosticky(1) - $NOSTICKY = 0; - - # Set this to 1 to enable NPH scripts - # or: - # 1) use CGI qw(-nph) - # 2) CGI::nph(1) - # 3) print header(-nph=>1) - $NPH = 0; - - # Set this to 1 to enable debugging from @ARGV - # Set to 2 to enable debugging from STDIN - $DEBUG = 1; - - # Set this to 1 to make the temporary files created - # during file uploads safe from prying eyes - # or do... - # 1) use CGI qw(:private_tempfiles) - # 2) CGI::private_tempfiles(1); - $PRIVATE_TEMPFILES = 0; - - # Set this to 1 to generate automatic tab indexes - $TABINDEX = 0; - - # Set this to 1 to cause files uploaded in multipart documents - # to be closed, instead of caching the file handle - # or: - # 1) use CGI qw(:close_upload_files) - # 2) $CGI::close_upload_files(1); - # Uploads with many files run out of file handles. - # Also, for performance, since the file is already on disk, - # it can just be renamed, instead of read and written. - $CLOSE_UPLOAD_FILES = 0; - - # Set this to a positive value to limit the size of a POSTing - # to a certain number of bytes: - $POST_MAX = -1; - - # Change this to 1 to disable uploads entirely: - $DISABLE_UPLOADS = 0; - - # Automatically determined -- don't change - $EBCDIC = 0; - - # Change this to 1 to suppress redundant HTTP headers - $HEADERS_ONCE = 0; - - # separate the name=value pairs by semicolons rather than ampersands - $USE_PARAM_SEMICOLONS = 1; - - # Do not include undefined params parsed from query string - # use CGI qw(-no_undef_params); - $NO_UNDEF_PARAMS = 0; - - # Other globals that you shouldn't worry about. - undef $Q; - $BEEN_THERE = 0; - $DTD_PUBLIC_IDENTIFIER = ""; - undef @QUERY_PARAM; - undef %EXPORT; - undef $QUERY_CHARSET; - undef %QUERY_FIELDNAMES; - - # prevent complaints by mod_perl - 1; -} - -# ------------------ START OF THE LIBRARY ------------ - -*end_form = \&endform; - -# make mod_perlhappy -initialize_globals(); - -# FIGURE OUT THE OS WE'RE RUNNING UNDER -# Some systems support the $^O variable. If not -# available then require() the Config library -unless ($OS) { - unless ($OS = $^O) { - require Config; - $OS = $Config::Config{'osname'}; - } -} -if ($OS =~ /^MSWin/i) { - $OS = 'WINDOWS'; -} elsif ($OS =~ /^VMS/i) { - $OS = 'VMS'; -} elsif ($OS =~ /^dos/i) { - $OS = 'DOS'; -} elsif ($OS =~ /^MacOS/i) { - $OS = 'MACINTOSH'; -} elsif ($OS =~ /^os2/i) { - $OS = 'OS2'; -} elsif ($OS =~ /^epoc/i) { - $OS = 'EPOC'; -} elsif ($OS =~ /^cygwin/i) { - $OS = 'CYGWIN'; -} else { - $OS = 'UNIX'; -} - -# Some OS logic. Binary mode enabled on DOS, NT and VMS -$needs_binmode = $OS=~/^(WINDOWS|DOS|OS2|MSWin|CYGWIN)/; - -# This is the default class for the CGI object to use when all else fails. -$DefaultClass = 'CGI' unless defined $CGI::DefaultClass; - -# This is where to look for autoloaded routines. -$AutoloadClass = $DefaultClass unless defined $CGI::AutoloadClass; - -# The path separator is a slash, backslash or semicolon, depending -# on the paltform. -$SL = { - UNIX => '/', OS2 => '\\', EPOC => '/', CYGWIN => '/', - WINDOWS => '\\', DOS => '\\', MACINTOSH => ':', VMS => '/' - }->{$OS}; - -# This no longer seems to be necessary -# Turn on NPH scripts by default when running under IIS server! -# $NPH++ if defined($ENV{'SERVER_SOFTWARE'}) && $ENV{'SERVER_SOFTWARE'}=~/IIS/; -$IIS++ if defined($ENV{'SERVER_SOFTWARE'}) && $ENV{'SERVER_SOFTWARE'}=~/IIS/; - -# Turn on special checking for Doug MacEachern's modperl -if (exists $ENV{MOD_PERL}) { - # mod_perl handlers may run system() on scripts using CGI.pm; - # Make sure so we don't get fooled by inherited $ENV{MOD_PERL} - if (exists $ENV{MOD_PERL_API_VERSION} && $ENV{MOD_PERL_API_VERSION} == 2) { - $MOD_PERL = 2; - require Apache2::Response; - require Apache2::RequestRec; - require Apache2::RequestUtil; - require Apache2::RequestIO; - require APR::Pool; - } else { - $MOD_PERL = 1; - require Apache; - } -} - -# Turn on special checking for ActiveState's PerlEx -$PERLEX++ if defined($ENV{'GATEWAY_INTERFACE'}) && $ENV{'GATEWAY_INTERFACE'} =~ /^CGI-PerlEx/; - -# Define the CRLF sequence. I can't use a simple "\r\n" because the meaning -# of "\n" is different on different OS's (sometimes it generates CRLF, sometimes LF -# and sometimes CR). The most popular VMS web server -# doesn't accept CRLF -- instead it wants a LR. EBCDIC machines don't -# use ASCII, so \015\012 means something different. I find this all -# really annoying. -$EBCDIC = "\t" ne "\011"; -if ($OS eq 'VMS') { - $CRLF = "\n"; -} elsif ($EBCDIC) { - $CRLF= "\r\n"; -} else { - $CRLF = "\015\012"; -} - -if ($needs_binmode) { - $CGI::DefaultClass->binmode(\*main::STDOUT); - $CGI::DefaultClass->binmode(\*main::STDIN); - $CGI::DefaultClass->binmode(\*main::STDERR); -} - -%EXPORT_TAGS = ( - ':html2'=>['h1'..'h6',qw/p br hr ol ul li dl dt dd menu code var strong em - tt u i b blockquote pre img a address cite samp dfn html head - base body Link nextid title meta kbd start_html end_html - input Select option comment charset escapeHTML/], - ':html3'=>[qw/div table caption th td TR Tr sup Sub strike applet Param - embed basefont style span layer ilayer font frameset frame script small big Area Map/], - ':html4'=>[qw/abbr acronym bdo col colgroup del fieldset iframe - ins label legend noframes noscript object optgroup Q - thead tbody tfoot/], - ':netscape'=>[qw/blink fontsize center/], - ':form'=>[qw/textfield textarea filefield password_field hidden checkbox checkbox_group - submit reset defaults radio_group popup_menu button autoEscape - scrolling_list image_button start_form end_form startform endform - start_multipart_form end_multipart_form isindex tmpFileName uploadInfo URL_ENCODED MULTIPART/], - ':cgi'=>[qw/param upload path_info path_translated request_uri url self_url script_name - cookie Dump - raw_cookie request_method query_string Accept user_agent remote_host content_type - remote_addr referer server_name server_software server_port server_protocol virtual_port - virtual_host remote_ident auth_type http append - save_parameters restore_parameters param_fetch - remote_user user_name header redirect import_names put - Delete Delete_all url_param cgi_error/], - ':ssl' => [qw/https/], - ':cgi-lib' => [qw/ReadParse PrintHeader HtmlTop HtmlBot SplitParam Vars/], - ':html' => [qw/:html2 :html3 :html4 :netscape/], - ':standard' => [qw/:html2 :html3 :html4 :form :cgi/], - ':push' => [qw/multipart_init multipart_start multipart_end multipart_final/], - ':all' => [qw/:html2 :html3 :netscape :form :cgi :internal :html4/] - ); - -# Custom 'can' method for both autoloaded and non-autoloaded subroutines. -# Author: Cees Hek - -sub can { - my($class, $method) = @_; - - # See if UNIVERSAL::can finds it. - - if (my $func = $class -> SUPER::can($method) ){ - return $func; - } - - # Try to compile the function. - - eval { - # _compile looks at $AUTOLOAD for the function name. - - local $AUTOLOAD = join "::", $class, $method; - &_compile; - }; - - # Now that the function is loaded (if it exists) - # just use UNIVERSAL::can again to do the work. - - return $class -> SUPER::can($method); -} - -# to import symbols into caller -sub import { - my $self = shift; - - # This causes modules to clash. - undef %EXPORT_OK; - undef %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 $sym (keys %EXPORT) { - my $pck; - my $def = ${"$self\:\:AutoloadClass"} || $DefaultClass; - foreach $pck (@packages) { - if (defined(&{"$pck\:\:$sym"})) { - $def = $pck; - last; - } - } - *{"${callpack}::$sym"} = \&{"$def\:\:$sym"}; - } -} - -sub compile { - my $pack = shift; - $pack->_setup_symbols('-compile',@_); -} - -sub expand_tags { - my($tag) = @_; - return ("start_$1","end_$1") if $tag=~/^(?:\*|start_|end_)(.+)/; - my(@r); - return ($tag) unless $EXPORT_TAGS{$tag}; - foreach (@{$EXPORT_TAGS{$tag}}) { - push(@r,&expand_tags($_)); - } - return @r; -} - -#### Method: new -# The new routine. This will check the current environment -# for an existing query string, and initialize itself, if so. -#### -sub new { - my($class,@initializer) = @_; - my $self = {}; - - bless $self,ref $class || $class || $DefaultClass; - if (ref($initializer[0]) - && (UNIVERSAL::isa($initializer[0],'Apache') - || - UNIVERSAL::isa($initializer[0],'Apache2::RequestRec') - )) { - $self->r(shift @initializer); - } - if (ref($initializer[0]) - && (UNIVERSAL::isa($initializer[0],'CODE'))) { - $self->upload_hook(shift @initializer, shift @initializer); - } - if ($MOD_PERL) { - if ($MOD_PERL == 1) { - $self->r(Apache->request) unless $self->r; - my $r = $self->r; - $r->register_cleanup(\&CGI::_reset_globals); - } - else { - # XXX: once we have the new API - # will do a real PerlOptions -SetupEnv check - $self->r(Apache2::RequestUtil->request) unless $self->r; - my $r = $self->r; - $r->subprocess_env unless exists $ENV{REQUEST_METHOD}; - $r->pool->cleanup_register(\&CGI::_reset_globals); - } - undef $NPH; - } - $self->_reset_globals if $PERLEX; - $self->init(@initializer); - return $self; -} - -# We provide a DESTROY method so that we can ensure that -# temporary files are closed (via Fh->DESTROY) before they -# are unlinked (via CGITempFile->DESTROY) because it is not -# possible to unlink an open file on Win32. We explicitly -# call DESTROY on each, rather than just undefing them and -# letting Perl DESTROY them by garbage collection, in case the -# user is still holding any reference to them as well. -sub DESTROY { - my $self = shift; - if ($OS eq 'WINDOWS') { - foreach my $href (values %{$self->{'.tmpfiles'}}) { - $href->{hndl}->DESTROY if defined $href->{hndl}; - $href->{name}->DESTROY if defined $href->{name}; - } - } -} - -sub r { - my $self = shift; - my $r = $self->{'.r'}; - $self->{'.r'} = shift if @_; - $r; -} - -sub upload_hook { - my $self; - if (ref $_[0] eq 'CODE') { - $CGI::Q = $self = $CGI::DefaultClass->new(@_); - } else { - $self = shift; - } - my ($hook,$data) = @_; - $self->{'.upload_hook'} = $hook; - $self->{'.upload_data'} = $data; -} - -#### Method: param -# Returns the value(s)of a named parameter. -# If invoked in a list context, returns the -# entire list. Otherwise returns the first -# member of the list. -# If name is not provided, return a list of all -# the known parameters names available. -# If more than one argument is provided, the -# second and subsequent arguments are used to -# set the value of the parameter. -#### -sub param { - my($self,@p) = self_or_default(@_); - return $self->all_parameters unless @p; - my($name,$value,@other); - - # For compatibility between old calling style and use_named_parameters() style, - # we have to special case for a single parameter present. - if (@p > 1) { - ($name,$value,@other) = rearrange([NAME,[DEFAULT,VALUE,VALUES]],@p); - my(@values); - - if (substr($p[0],0,1) eq '-') { - @values = defined($value) ? (ref($value) && ref($value) eq 'ARRAY' ? @{$value} : $value) : (); - } else { - foreach ($value,@other) { - push(@values,$_) if defined($_); - } - } - # If values is provided, then we set it. - if (@values) { - $self->add_parameter($name); - $self->{$name}=[@values]; - } - } else { - $name = $p[0]; - } - - return unless defined($name) && $self->{$name}; - return wantarray ? @{$self->{$name}} : $self->{$name}->[0]; -} - -sub self_or_default { - return @_ if defined($_[0]) && (!ref($_[0])) &&($_[0] eq 'CGI'); - unless (defined($_[0]) && - (ref($_[0]) eq 'CGI' || UNIVERSAL::isa($_[0],'CGI')) # slightly optimized for common case - ) { - $Q = $CGI::DefaultClass->new unless defined($Q); - unshift(@_,$Q); - } - return wantarray ? @_ : $Q; -} - -sub self_or_CGI { - local $^W=0; # prevent a warning - if (defined($_[0]) && - (substr(ref($_[0]),0,3) eq 'CGI' - || UNIVERSAL::isa($_[0],'CGI'))) { - return @_; - } else { - return ($DefaultClass,@_); - } -} - -######################################## -# THESE METHODS ARE MORE OR LESS PRIVATE -# GO TO THE __DATA__ SECTION TO SEE MORE -# PUBLIC METHODS -######################################## - -# Initialize the query object from the environment. -# If a parameter list is found, this object will be set -# to an associative array in which parameter names are keys -# and the values are stored as lists -# If a keyword list is found, this method creates a bogus -# parameter list with the single parameter 'keywords'. - -sub init { - my $self = shift; - my($query_string,$meth,$content_length,$fh,@lines) = ('','','',''); - - my $initializer = shift; # for backward compatibility - local($/) = "\n"; - - # set autoescaping on by default - $self->{'escape'} = 1; - - # if we get called more than once, we want to initialize - # ourselves from the original query (which may be gone - # if it was read from STDIN originally.) - if (defined(@QUERY_PARAM) && !defined($initializer)) { - foreach (@QUERY_PARAM) { - $self->param('-name'=>$_,'-value'=>$QUERY_PARAM{$_}); - } - $self->charset($QUERY_CHARSET); - $self->{'.fieldnames'} = {%QUERY_FIELDNAMES}; - return; - } - - $meth=$ENV{'REQUEST_METHOD'} if defined($ENV{'REQUEST_METHOD'}); - $content_length = defined($ENV{'CONTENT_LENGTH'}) ? $ENV{'CONTENT_LENGTH'} : 0; - - $fh = to_filehandle($initializer) if $initializer; - - # set charset to the safe ISO-8859-1 - $self->charset('ISO-8859-1'); - - METHOD: { - - # avoid unreasonably large postings - if (($POST_MAX > 0) && ($content_length > $POST_MAX)) { - # quietly read and discard the post - my $buffer; - my $tmplength = $content_length; - while($tmplength > 0) { - my $maxbuffer = ($tmplength < 10000)?$tmplength:10000; - my $bytesread = $MOD_PERL ? $self->r->read($buffer,$maxbuffer) : read(STDIN,$buffer,$maxbuffer); - $tmplength -= $bytesread; - } - $self->cgi_error("413 Request entity too large"); - last METHOD; - } - - # Process multipart postings, but only if the initializer is - # not defined. - if ($meth eq 'POST' - && defined($ENV{'CONTENT_TYPE'}) - && $ENV{'CONTENT_TYPE'}=~m|^multipart/form-data| - && !defined($initializer) - ) { - my($boundary) = $ENV{'CONTENT_TYPE'} =~ /boundary=\"?([^\";,]+)\"?/; - $self->read_multipart($boundary,$content_length); - last METHOD; - } - - # If initializer is defined, then read parameters - # from it. - if (defined($initializer)) { - if (UNIVERSAL::isa($initializer,'CGI')) { - $query_string = $initializer->query_string; - last METHOD; - } - if (ref($initializer) && ref($initializer) eq 'HASH') { - foreach (keys %$initializer) { - $self->param('-name'=>$_,'-value'=>$initializer->{$_}); - } - last METHOD; - } - - if (defined($fh) && ($fh ne '')) { - while (<$fh>) { - chomp; - last if /^=/; - push(@lines,$_); - } - # massage back into standard format - if ("@lines" =~ /=/) { - $query_string=join("&",@lines); - } else { - $query_string=join("+",@lines); - } - last METHOD; - } - - if (defined($fh) && ($fh ne '')) { - while (<$fh>) { - chomp; - last if /^=/; - push(@lines,$_); - } - # massage back into standard format - if ("@lines" =~ /=/) { - $query_string=join("&",@lines); - } else { - $query_string=join("+",@lines); - } - last METHOD; - } - - # last chance -- treat it as a string - $initializer = $$initializer if ref($initializer) eq 'SCALAR'; - $query_string = $initializer; - - last METHOD; - } - - # If method is GET or HEAD, fetch the query from - # the environment. - if ($meth=~/^(GET|HEAD)$/) { - if ($MOD_PERL) { - $query_string = $self->r->args; - } else { - $query_string = $ENV{'QUERY_STRING'} if defined $ENV{'QUERY_STRING'}; - $query_string ||= $ENV{'REDIRECT_QUERY_STRING'} if defined $ENV{'REDIRECT_QUERY_STRING'}; - } - last METHOD; - } - - if ($meth eq 'POST') { - $self->read_from_client(\$query_string,$content_length,0) - if $content_length > 0; - # Some people want to have their cake and eat it too! - # Uncomment this line to have the contents of the query string - # APPENDED to the POST data. - # $query_string .= (length($query_string) ? '&' : '') . $ENV{'QUERY_STRING'} if defined $ENV{'QUERY_STRING'}; - last METHOD; - } - - # If $meth is not of GET, POST or HEAD, assume we're being debugged offline. - # Check the command line and then the standard input for data. - # We use the shellwords package in order to behave the way that - # UN*X programmers expect. - if ($DEBUG) - { - my $cmdline_ret = read_from_cmdline(); - $query_string = $cmdline_ret->{'query_string'}; - if (defined($cmdline_ret->{'subpath'})) - { - $self->path_info($cmdline_ret->{'subpath'}); - } - } - } - -# YL: Begin Change for XML handler 10/19/2001 - if ($meth eq 'POST' - && defined($ENV{'CONTENT_TYPE'}) - && $ENV{'CONTENT_TYPE'} !~ m|^application/x-www-form-urlencoded| - && $ENV{'CONTENT_TYPE'} !~ m|^multipart/form-data| ) { - my($param) = 'POSTDATA' ; - $self->add_parameter($param) ; - push (@{$self->{$param}},$query_string); - undef $query_string ; - } -# YL: End Change for XML handler 10/19/2001 - - # We now have the query string in hand. We do slightly - # different things for keyword lists and parameter lists. - if (defined $query_string && length $query_string) { - if ($query_string =~ /[&=;]/) { - $self->parse_params($query_string); - } else { - $self->add_parameter('keywords'); - $self->{'keywords'} = [$self->parse_keywordlist($query_string)]; - } - } - - # Special case. Erase everything if there is a field named - # .defaults. - if ($self->param('.defaults')) { - $self->delete_all(); - } - - # Associative array containing our defined fieldnames - $self->{'.fieldnames'} = {}; - foreach ($self->param('.cgifields')) { - $self->{'.fieldnames'}->{$_}++; - } - - # Clear out our default submission button flag if present - $self->delete('.submit'); - $self->delete('.cgifields'); - - $self->save_request unless defined $initializer; -} - -# FUNCTIONS TO OVERRIDE: -# Turn a string into a filehandle -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; -} - -# send output to the browser -sub put { - my($self,@p) = self_or_default(@_); - $self->print(@p); -} - -# print to standard output (for overriding in mod_perl) -sub print { - shift; - CORE::print(@_); -} - -# get/set last cgi_error -sub cgi_error { - my ($self,$err) = self_or_default(@_); - $self->{'.cgi_error'} = $err if defined $err; - return $self->{'.cgi_error'}; -} - -sub save_request { - my($self) = @_; - # We're going to play with the package globals now so that if we get called - # again, we initialize ourselves in exactly the same way. This allows - # us to have several of these objects. - @QUERY_PARAM = $self->param; # save list of parameters - foreach (@QUERY_PARAM) { - next unless defined $_; - $QUERY_PARAM{$_}=$self->{$_}; - } - $QUERY_CHARSET = $self->charset; - %QUERY_FIELDNAMES = %{$self->{'.fieldnames'}}; -} - -sub parse_params { - my($self,$tosplit) = @_; - my(@pairs) = split(/[&;]/,$tosplit); - my($param,$value); - foreach (@pairs) { - ($param,$value) = split('=',$_,2); - next unless defined $param; - next if $NO_UNDEF_PARAMS and not defined $value; - $value = '' unless defined $value; - $param = unescape($param); - $value = unescape($value); - $self->add_parameter($param); - push (@{$self->{$param}},$value); - } -} - -sub add_parameter { - my($self,$param)=@_; - return unless defined $param; - push (@{$self->{'.parameters'}},$param) - unless defined($self->{$param}); -} - -sub all_parameters { - my $self = shift; - return () unless defined($self) && $self->{'.parameters'}; - return () unless @{$self->{'.parameters'}}; - return @{$self->{'.parameters'}}; -} - -# put a filehandle into binary mode (DOS) -sub binmode { - return unless defined($_[1]) && defined fileno($_[1]); - CORE::binmode($_[1]); -} - -sub _make_tag_func { - my ($self,$tagname) = @_; - my $func = qq( - sub $tagname { - my (\$q,\$a,\@rest) = self_or_default(\@_); - my(\$attr) = ''; - if (ref(\$a) && ref(\$a) eq 'HASH') { - my(\@attr) = make_attributes(\$a,\$q->{'escape'}); - \$attr = " \@attr" if \@attr; - } else { - unshift \@rest,\$a if defined \$a; - } - ); - if ($tagname=~/start_(\w+)/i) { - $func .= qq! return "<\L$1\E\$attr>";} !; - } elsif ($tagname=~/end_(\w+)/i) { - $func .= qq! return "<\L/$1\E>"; } !; - } else { - $func .= qq# - return \$XHTML ? "\L<$tagname\E\$attr />" : "\L<$tagname\E\$attr>" unless \@rest; - my(\$tag,\$untag) = ("\L<$tagname\E\$attr>","\L\E"); - my \@result = map { "\$tag\$_\$untag" } - (ref(\$rest[0]) eq 'ARRAY') ? \@{\$rest[0]} : "\@rest"; - return "\@result"; - }#; - } -return $func; -} - -sub AUTOLOAD { - print STDERR "CGI::AUTOLOAD for $AUTOLOAD\n" if $CGI::AUTOLOAD_DEBUG; - my $func = &_compile; - goto &$func; -} - -sub _compile { - my($func) = $AUTOLOAD; - my($pack,$func_name); - { - local($1,$2); # this fixes an obscure variable suicide problem. - $func=~/(.+)::([^:]+)$/; - ($pack,$func_name) = ($1,$2); - $pack=~s/::SUPER$//; # fix another obscure problem - $pack = ${"$pack\:\:AutoloadClass"} || $CGI::DefaultClass - unless defined(${"$pack\:\:AUTOLOADED_ROUTINES"}); - - my($sub) = \%{"$pack\:\:SUBS"}; - unless (%$sub) { - my($auto) = \${"$pack\:\:AUTOLOADED_ROUTINES"}; - local ($@,$!); - eval "package $pack; $$auto"; - croak("$AUTOLOAD: $@") if $@; - $$auto = ''; # Free the unneeded storage (but don't undef it!!!) - } - my($code) = $sub->{$func_name}; - - $code = "sub $AUTOLOAD { }" if (!$code and $func_name eq 'DESTROY'); - if (!$code) { - (my $base = $func_name) =~ s/^(start_|end_)//i; - if ($EXPORT{':any'} || - $EXPORT{'-any'} || - $EXPORT{$base} || - (%EXPORT_OK || grep(++$EXPORT_OK{$_},&expand_tags(':html'))) - && $EXPORT_OK{$base}) { - $code = $CGI::DefaultClass->_make_tag_func($func_name); - } - } - croak("Undefined subroutine $AUTOLOAD\n") unless $code; - local ($@,$!); - eval "package $pack; $code"; - if ($@) { - $@ =~ s/ at .*\n//; - croak("$AUTOLOAD: $@"); - } - } - CORE::delete($sub->{$func_name}); #free storage - return "$pack\:\:$func_name"; -} - -sub _selected { - my $self = shift; - my $value = shift; - return '' unless $value; - return $XHTML ? qq(selected="selected" ) : qq(selected ); -} - -sub _checked { - my $self = shift; - my $value = shift; - return '' unless $value; - return $XHTML ? qq(checked="checked" ) : qq(checked ); -} - -sub _reset_globals { initialize_globals(); } - -sub _setup_symbols { - my $self = shift; - my $compile = 0; - - # to avoid reexporting unwanted variables - undef %EXPORT; - - foreach (@_) { - $HEADERS_ONCE++, next if /^[:-]unique_headers$/; - $NPH++, next if /^[:-]nph$/; - $NOSTICKY++, next if /^[:-]nosticky$/; - $DEBUG=0, next if /^[:-]no_?[Dd]ebug$/; - $DEBUG=2, next if /^[:-][Dd]ebug$/; - $USE_PARAM_SEMICOLONS++, next if /^[:-]newstyle_urls$/; - $XHTML++, next if /^[:-]xhtml$/; - $XHTML=0, next if /^[:-]no_?xhtml$/; - $USE_PARAM_SEMICOLONS=0, next if /^[:-]oldstyle_urls$/; - $PRIVATE_TEMPFILES++, next if /^[:-]private_tempfiles$/; - $TABINDEX++, next if /^[:-]tabindex$/; - $CLOSE_UPLOAD_FILES++, next if /^[:-]close_upload_files$/; - $EXPORT{$_}++, next if /^[:-]any$/; - $compile++, next if /^[:-]compile$/; - $NO_UNDEF_PARAMS++, next if /^[:-]no_undef_params$/; - - # This is probably extremely evil code -- to be deleted some day. - if (/^[-]autoload$/) { - my($pkg) = caller(1); - *{"${pkg}::AUTOLOAD"} = sub { - my($routine) = $AUTOLOAD; - $routine =~ s/^.*::/CGI::/; - &$routine; - }; - next; - } - - foreach (&expand_tags($_)) { - tr/a-zA-Z0-9_//cd; # don't allow weird function names - $EXPORT{$_}++; - } - } - _compile_all(keys %EXPORT) if $compile; - @SAVED_SYMBOLS = @_; -} - -sub charset { - my ($self,$charset) = self_or_default(@_); - $self->{'.charset'} = $charset if defined $charset; - $self->{'.charset'}; -} - -sub element_id { - my ($self,$new_value) = self_or_default(@_); - $self->{'.elid'} = $new_value if defined $new_value; - sprintf('%010d',$self->{'.elid'}++); -} - -sub element_tab { - my ($self,$new_value) = self_or_default(@_); - $self->{'.etab'} ||= 1; - $self->{'.etab'} = $new_value if defined $new_value; - my $tab = $self->{'.etab'}++; - return '' unless $TABINDEX or defined $new_value; - return qq(tabindex="$tab" ); -} - -############################################################################### -################# THESE FUNCTIONS ARE AUTOLOADED ON DEMAND #################### -############################################################################### -$AUTOLOADED_ROUTINES = ''; # get rid of -w warning -$AUTOLOADED_ROUTINES=<<'END_OF_AUTOLOAD'; - -%SUBS = ( - -'URL_ENCODED'=> <<'END_OF_FUNC', -sub URL_ENCODED { 'application/x-www-form-urlencoded'; } -END_OF_FUNC - -'MULTIPART' => <<'END_OF_FUNC', -sub MULTIPART { 'multipart/form-data'; } -END_OF_FUNC - -'SERVER_PUSH' => <<'END_OF_FUNC', -sub SERVER_PUSH { 'multipart/x-mixed-replace;boundary="' . shift() . '"'; } -END_OF_FUNC - -'new_MultipartBuffer' => <<'END_OF_FUNC', -# Create a new multipart buffer -sub new_MultipartBuffer { - my($self,$boundary,$length) = @_; - return MultipartBuffer->new($self,$boundary,$length); -} -END_OF_FUNC - -'read_from_client' => <<'END_OF_FUNC', -# Read data from a file handle -sub read_from_client { - my($self, $buff, $len, $offset) = @_; - local $^W=0; # prevent a warning - return $MOD_PERL - ? $self->r->read($$buff, $len, $offset) - : read(\*STDIN, $$buff, $len, $offset); -} -END_OF_FUNC - -'delete' => <<'END_OF_FUNC', -#### Method: delete -# Deletes the named parameter entirely. -#### -sub delete { - my($self,@p) = self_or_default(@_); - my(@names) = rearrange([NAME],@p); - my @to_delete = ref($names[0]) eq 'ARRAY' ? @$names[0] : @names; - my %to_delete; - foreach my $name (@to_delete) - { - CORE::delete $self->{$name}; - CORE::delete $self->{'.fieldnames'}->{$name}; - $to_delete{$name}++; - } - @{$self->{'.parameters'}}=grep { !exists($to_delete{$_}) } $self->param(); - return; -} -END_OF_FUNC - -#### Method: import_names -# Import all parameters into the given namespace. -# Assumes namespace 'Q' if not specified -#### -'import_names' => <<'END_OF_FUNC', -sub import_names { - my($self,$namespace,$delete) = self_or_default(@_); - $namespace = 'Q' unless defined($namespace); - die "Can't import names into \"main\"\n" if \%{"${namespace}::"} == \%::; - if ($delete || $MOD_PERL || exists $ENV{'FCGI_ROLE'}) { - # can anyone find an easier way to do this? - foreach (keys %{"${namespace}::"}) { - local *symbol = "${namespace}::${_}"; - undef $symbol; - undef @symbol; - undef %symbol; - } - } - my($param,@value,$var); - foreach $param ($self->param) { - # protect against silly names - ($var = $param)=~tr/a-zA-Z0-9_/_/c; - $var =~ s/^(?=\d)/_/; - local *symbol = "${namespace}::$var"; - @value = $self->param($param); - @symbol = @value; - $symbol = $value[0]; - } -} -END_OF_FUNC - -#### Method: keywords -# Keywords acts a bit differently. Calling it in a list context -# returns the list of keywords. -# Calling it in a scalar context gives you the size of the list. -#### -'keywords' => <<'END_OF_FUNC', -sub keywords { - my($self,@values) = self_or_default(@_); - # If values is provided, then we set it. - $self->{'keywords'}=[@values] if @values; - my(@result) = defined($self->{'keywords'}) ? @{$self->{'keywords'}} : (); - @result; -} -END_OF_FUNC - -# These are some tie() interfaces for compatibility -# with Steve Brenner's cgi-lib.pl routines -'Vars' => <<'END_OF_FUNC', -sub Vars { - my $q = shift; - my %in; - tie(%in,CGI,$q); - return %in if wantarray; - return \%in; -} -END_OF_FUNC - -# These are some tie() interfaces for compatibility -# with Steve Brenner's cgi-lib.pl routines -'ReadParse' => <<'END_OF_FUNC', -sub ReadParse { - local(*in); - if (@_) { - *in = $_[0]; - } else { - my $pkg = caller(); - *in=*{"${pkg}::in"}; - } - tie(%in,CGI); - return scalar(keys %in); -} -END_OF_FUNC - -'PrintHeader' => <<'END_OF_FUNC', -sub PrintHeader { - my($self) = self_or_default(@_); - return $self->header(); -} -END_OF_FUNC - -'HtmlTop' => <<'END_OF_FUNC', -sub HtmlTop { - my($self,@p) = self_or_default(@_); - return $self->start_html(@p); -} -END_OF_FUNC - -'HtmlBot' => <<'END_OF_FUNC', -sub HtmlBot { - my($self,@p) = self_or_default(@_); - return $self->end_html(@p); -} -END_OF_FUNC - -'SplitParam' => <<'END_OF_FUNC', -sub SplitParam { - my ($param) = @_; - my (@params) = split ("\0", $param); - return (wantarray ? @params : $params[0]); -} -END_OF_FUNC - -'MethGet' => <<'END_OF_FUNC', -sub MethGet { - return request_method() eq 'GET'; -} -END_OF_FUNC - -'MethPost' => <<'END_OF_FUNC', -sub MethPost { - return request_method() eq 'POST'; -} -END_OF_FUNC - -'TIEHASH' => <<'END_OF_FUNC', -sub TIEHASH { - my $class = shift; - my $arg = $_[0]; - if (ref($arg) && UNIVERSAL::isa($arg,'CGI')) { - return $arg; - } - return $Q ||= $class->new(@_); -} -END_OF_FUNC - -'STORE' => <<'END_OF_FUNC', -sub STORE { - my $self = shift; - my $tag = shift; - my $vals = shift; - my @vals = index($vals,"\0")!=-1 ? split("\0",$vals) : $vals; - $self->param(-name=>$tag,-value=>\@vals); -} -END_OF_FUNC - -'FETCH' => <<'END_OF_FUNC', -sub FETCH { - return $_[0] if $_[1] eq 'CGI'; - return undef unless defined $_[0]->param($_[1]); - return join("\0",$_[0]->param($_[1])); -} -END_OF_FUNC - -'FIRSTKEY' => <<'END_OF_FUNC', -sub FIRSTKEY { - $_[0]->{'.iterator'}=0; - $_[0]->{'.parameters'}->[$_[0]->{'.iterator'}++]; -} -END_OF_FUNC - -'NEXTKEY' => <<'END_OF_FUNC', -sub NEXTKEY { - $_[0]->{'.parameters'}->[$_[0]->{'.iterator'}++]; -} -END_OF_FUNC - -'EXISTS' => <<'END_OF_FUNC', -sub EXISTS { - exists $_[0]->{$_[1]}; -} -END_OF_FUNC - -'DELETE' => <<'END_OF_FUNC', -sub DELETE { - $_[0]->delete($_[1]); -} -END_OF_FUNC - -'CLEAR' => <<'END_OF_FUNC', -sub CLEAR { - %{$_[0]}=(); -} -#### -END_OF_FUNC - -#### -# Append a new value to an existing query -#### -'append' => <<'EOF', -sub append { - my($self,@p) = self_or_default(@_); - my($name,$value) = rearrange([NAME,[VALUE,VALUES]],@p); - my(@values) = defined($value) ? (ref($value) ? @{$value} : $value) : (); - if (@values) { - $self->add_parameter($name); - push(@{$self->{$name}},@values); - } - return $self->param($name); -} -EOF - -#### Method: delete_all -# Delete all parameters -#### -'delete_all' => <<'EOF', -sub delete_all { - my($self) = self_or_default(@_); - my @param = $self->param(); - $self->delete(@param); -} -EOF - -'Delete' => <<'EOF', -sub Delete { - my($self,@p) = self_or_default(@_); - $self->delete(@p); -} -EOF - -'Delete_all' => <<'EOF', -sub Delete_all { - my($self,@p) = self_or_default(@_); - $self->delete_all(@p); -} -EOF - -#### Method: autoescape -# If you want to turn off the autoescaping features, -# call this method with undef as the argument -'autoEscape' => <<'END_OF_FUNC', -sub autoEscape { - my($self,$escape) = self_or_default(@_); - my $d = $self->{'escape'}; - $self->{'escape'} = $escape; - $d; -} -END_OF_FUNC - - -#### Method: version -# Return the current version -#### -'version' => <<'END_OF_FUNC', -sub version { - return $VERSION; -} -END_OF_FUNC - -#### Method: url_param -# Return a parameter in the QUERY_STRING, regardless of -# whether this was a POST or a GET -#### -'url_param' => <<'END_OF_FUNC', -sub url_param { - my ($self,@p) = self_or_default(@_); - my $name = shift(@p); - return undef unless exists($ENV{QUERY_STRING}); - unless (exists($self->{'.url_param'})) { - $self->{'.url_param'}={}; # empty hash - if ($ENV{QUERY_STRING} =~ /=/) { - my(@pairs) = split(/[&;]/,$ENV{QUERY_STRING}); - my($param,$value); - foreach (@pairs) { - ($param,$value) = split('=',$_,2); - $param = unescape($param); - $value = unescape($value); - push(@{$self->{'.url_param'}->{$param}},$value); - } - } else { - $self->{'.url_param'}->{'keywords'} = [$self->parse_keywordlist($ENV{QUERY_STRING})]; - } - } - return keys %{$self->{'.url_param'}} unless defined($name); - return () unless $self->{'.url_param'}->{$name}; - return wantarray ? @{$self->{'.url_param'}->{$name}} - : $self->{'.url_param'}->{$name}->[0]; -} -END_OF_FUNC - -#### Method: Dump -# Returns a string in which all the known parameter/value -# pairs are represented as nested lists, mainly for the purposes -# of debugging. -#### -'Dump' => <<'END_OF_FUNC', -sub Dump { - my($self) = self_or_default(@_); - my($param,$value,@result); - return '
    ' unless $self->param; - push(@result,"
      "); - foreach $param ($self->param) { - my($name)=$self->escapeHTML($param); - push(@result,"
    • $param
    • "); - push(@result,"
        "); - foreach $value ($self->param($param)) { - $value = $self->escapeHTML($value); - $value =~ s/\n/
        \n/g; - push(@result,"
      • $value
      • "); - } - push(@result,"
      "); - } - push(@result,"
    "); - return join("\n",@result); -} -END_OF_FUNC - -#### Method as_string -# -# synonym for "dump" -#### -'as_string' => <<'END_OF_FUNC', -sub as_string { - &Dump(@_); -} -END_OF_FUNC - -#### Method: save -# Write values out to a filehandle in such a way that they can -# be reinitialized by the filehandle form of the new() method -#### -'save' => <<'END_OF_FUNC', -sub save { - my($self,$filehandle) = self_or_default(@_); - $filehandle = to_filehandle($filehandle); - my($param); - local($,) = ''; # set print field separator back to a sane value - local($\) = ''; # set output line separator to a sane value - foreach $param ($self->param) { - my($escaped_param) = escape($param); - my($value); - foreach $value ($self->param($param)) { - print $filehandle "$escaped_param=",escape("$value"),"\n"; - } - } - foreach (keys %{$self->{'.fieldnames'}}) { - print $filehandle ".cgifields=",escape("$_"),"\n"; - } - print $filehandle "=\n"; # end of record -} -END_OF_FUNC - - -#### Method: save_parameters -# An alias for save() that is a better name for exportation. -# Only intended to be used with the function (non-OO) interface. -#### -'save_parameters' => <<'END_OF_FUNC', -sub save_parameters { - my $fh = shift; - return save(to_filehandle($fh)); -} -END_OF_FUNC - -#### Method: restore_parameters -# A way to restore CGI parameters from an initializer. -# Only intended to be used with the function (non-OO) interface. -#### -'restore_parameters' => <<'END_OF_FUNC', -sub restore_parameters { - $Q = $CGI::DefaultClass->new(@_); -} -END_OF_FUNC - -#### Method: multipart_init -# Return a Content-Type: style header for server-push -# This has to be NPH on most web servers, and it is advisable to set $| = 1 -# -# Many thanks to Ed Jordan for this -# contribution, updated by Andrew Benham (adsb@bigfoot.com) -#### -'multipart_init' => <<'END_OF_FUNC', -sub multipart_init { - my($self,@p) = self_or_default(@_); - my($boundary,@other) = rearrange([BOUNDARY],@p); - $boundary = $boundary || '------- =_aaaaaaaaaa0'; - $self->{'separator'} = "$CRLF--$boundary$CRLF"; - $self->{'final_separator'} = "$CRLF--$boundary--$CRLF"; - $type = SERVER_PUSH($boundary); - return $self->header( - -nph => 0, - -type => $type, - (map { split "=", $_, 2 } @other), - ) . "WARNING: YOUR BROWSER DOESN'T SUPPORT THIS SERVER-PUSH TECHNOLOGY." . $self->multipart_end; -} -END_OF_FUNC - - -#### Method: multipart_start -# Return a Content-Type: style header for server-push, start of section -# -# Many thanks to Ed Jordan for this -# contribution, updated by Andrew Benham (adsb@bigfoot.com) -#### -'multipart_start' => <<'END_OF_FUNC', -sub multipart_start { - my(@header); - my($self,@p) = self_or_default(@_); - my($type,@other) = rearrange([TYPE],@p); - $type = $type || 'text/html'; - push(@header,"Content-Type: $type"); - - # rearrange() was designed for the HTML portion, so we - # need to fix it up a little. - foreach (@other) { - # Don't use \s because of perl bug 21951 - next unless my($header,$value) = /([^ \r\n\t=]+)=\"?(.+?)\"?$/; - ($_ = $header) =~ s/^(\w)(.*)/$1 . lc ($2) . ': '.$self->unescapeHTML($value)/e; - } - push(@header,@other); - my $header = join($CRLF,@header)."${CRLF}${CRLF}"; - return $header; -} -END_OF_FUNC - - -#### Method: multipart_end -# Return a MIME boundary separator for server-push, end of section -# -# Many thanks to Ed Jordan for this -# contribution -#### -'multipart_end' => <<'END_OF_FUNC', -sub multipart_end { - my($self,@p) = self_or_default(@_); - return $self->{'separator'}; -} -END_OF_FUNC - - -#### Method: multipart_final -# Return a MIME boundary separator for server-push, end of all sections -# -# Contributed by Andrew Benham (adsb@bigfoot.com) -#### -'multipart_final' => <<'END_OF_FUNC', -sub multipart_final { - my($self,@p) = self_or_default(@_); - return $self->{'final_separator'} . "WARNING: YOUR BROWSER DOESN'T SUPPORT THIS SERVER-PUSH TECHNOLOGY." . $CRLF; -} -END_OF_FUNC - - -#### Method: header -# Return a Content-Type: style header -# -#### -'header' => <<'END_OF_FUNC', -sub header { - my($self,@p) = self_or_default(@_); - my(@header); - - return "" if $self->{'.header_printed'}++ and $HEADERS_ONCE; - - my($type,$status,$cookie,$target,$expires,$nph,$charset,$attachment,$p3p,@other) = - rearrange([['TYPE','CONTENT_TYPE','CONTENT-TYPE'], - 'STATUS',['COOKIE','COOKIES'],'TARGET', - 'EXPIRES','NPH','CHARSET', - 'ATTACHMENT','P3P'],@p); - - $nph ||= $NPH; - if (defined $charset) { - $self->charset($charset); - } else { - $charset = $self->charset; - } - - # rearrange() was designed for the HTML portion, so we - # need to fix it up a little. - foreach (@other) { - # Don't use \s because of perl bug 21951 - next unless my($header,$value) = /([^ \r\n\t=]+)=\"?(.+?)\"?$/; - ($_ = $header) =~ s/^(\w)(.*)/"\u$1\L$2" . ': '.$self->unescapeHTML($value)/e; - } - - $type ||= 'text/html' unless defined($type); - $type .= "; charset=$charset" if $type ne '' and $type =~ m!^text/! and $type !~ /\bcharset\b/ and $charset ne ''; - - # Maybe future compatibility. Maybe not. - my $protocol = $ENV{SERVER_PROTOCOL} || 'HTTP/1.0'; - push(@header,$protocol . ' ' . ($status || '200 OK')) if $nph; - push(@header,"Server: " . &server_software()) if $nph; - - push(@header,"Status: $status") if $status; - push(@header,"Window-Target: $target") if $target; - if ($p3p) { - $p3p = join ' ',@$p3p if ref($p3p) eq 'ARRAY'; - push(@header,qq(P3P: policyref="/w3c/p3p.xml", CP="$p3p")); - } - # push all the cookies -- there may be several - if ($cookie) { - my(@cookie) = ref($cookie) && ref($cookie) eq 'ARRAY' ? @{$cookie} : $cookie; - foreach (@cookie) { - my $cs = UNIVERSAL::isa($_,'CGI::Cookie') ? $_->as_string : $_; - push(@header,"Set-Cookie: $cs") if $cs ne ''; - } - } - # if the user indicates an expiration time, then we need - # both an Expires and a Date header (so that the browser is - # uses OUR clock) - push(@header,"Expires: " . expires($expires,'http')) - if $expires; - push(@header,"Date: " . expires(0,'http')) if $expires || $cookie || $nph; - push(@header,"Pragma: no-cache") if $self->cache(); - push(@header,"Content-Disposition: attachment; filename=\"$attachment\"") if $attachment; - push(@header,map {ucfirst $_} @other); - push(@header,"Content-Type: $type") if $type ne ''; - my $header = join($CRLF,@header)."${CRLF}${CRLF}"; - if ($MOD_PERL and not $nph) { - $self->r->send_cgi_header($header); - return ''; - } - return $header; -} -END_OF_FUNC - - -#### Method: cache -# Control whether header() will produce the no-cache -# Pragma directive. -#### -'cache' => <<'END_OF_FUNC', -sub cache { - my($self,$new_value) = self_or_default(@_); - $new_value = '' unless $new_value; - if ($new_value ne '') { - $self->{'cache'} = $new_value; - } - return $self->{'cache'}; -} -END_OF_FUNC - - -#### Method: redirect -# Return a Location: style header -# -#### -'redirect' => <<'END_OF_FUNC', -sub redirect { - my($self,@p) = self_or_default(@_); - my($url,$target,$status,$cookie,$nph,@other) = - rearrange([[LOCATION,URI,URL],TARGET,STATUS,['COOKIE','COOKIES'],NPH],@p); - $status = '302 Moved' unless defined $status; - $url ||= $self->self_url; - my(@o); - foreach (@other) { tr/\"//d; push(@o,split("=",$_,2)); } - unshift(@o, - '-Status' => $status, - '-Location'=> $url, - '-nph' => $nph); - unshift(@o,'-Target'=>$target) if $target; - unshift(@o,'-Type'=>''); - my @unescaped; - unshift(@unescaped,'-Cookie'=>$cookie) if $cookie; - return $self->header((map {$self->unescapeHTML($_)} @o),@unescaped); -} -END_OF_FUNC - - -#### Method: start_html -# Canned HTML header -# -# Parameters: -# $title -> (optional) The title for this HTML document (-title) -# $author -> (optional) e-mail address of the author (-author) -# $base -> (optional) if set to true, will enter the BASE address of this document -# for resolving relative references (-base) -# $xbase -> (optional) alternative base at some remote location (-xbase) -# $target -> (optional) target window to load all links into (-target) -# $script -> (option) Javascript code (-script) -# $no_script -> (option) Javascript -END - ; - my($other) = @other ? " @other" : ''; - push(@result,"\n\n"); - return join("\n",@result); -} -END_OF_FUNC - -### Method: _style -# internal method for generating a CSS style section -#### -'_style' => <<'END_OF_FUNC', -sub _style { - my ($self,$style) = @_; - my (@result); - my $type = 'text/css'; - - my $cdata_start = $XHTML ? "\n\n" : " -->\n"; - - my @s = ref($style) eq 'ARRAY' ? @$style : $style; - - for my $s (@s) { - if (ref($s)) { - my($src,$code,$verbatim,$stype,$foo,@other) = - rearrange([qw(SRC CODE VERBATIM TYPE FOO)], - ('-foo'=>'bar', - ref($s) eq 'ARRAY' ? @$s : %$s)); - $type = $stype if $stype; - my $other = @other ? join ' ',@other : ''; - - if (ref($src) eq "ARRAY") # Check to see if the $src variable is an array reference - { # If it is, push a LINK tag for each one - foreach $src (@$src) - { - push(@result,$XHTML ? qq() - : qq()) if $src; - } - } - else - { # Otherwise, push the single -src, if it exists. - push(@result,$XHTML ? qq() - : qq() - ) if $src; - } - if ($verbatim) { - my @v = ref($verbatim) eq 'ARRAY' ? @$verbatim : $verbatim; - push(@result, "") foreach @v; - } - my @c = ref($code) eq 'ARRAY' ? @$code : $code if $code; - push(@result,style({'type'=>$type},"$cdata_start\n$_\n$cdata_end")) foreach @c; - - } else { - my $src = $s; - push(@result,$XHTML ? qq() - : qq()); - } - } - @result; -} -END_OF_FUNC - -'_script' => <<'END_OF_FUNC', -sub _script { - my ($self,$script) = @_; - my (@result); - - my (@scripts) = ref($script) eq 'ARRAY' ? @$script : ($script); - foreach $script (@scripts) { - my($src,$code,$language); - if (ref($script)) { # script is a hash - ($src,$code,$language, $type) = - rearrange([SRC,CODE,LANGUAGE,TYPE], - '-foo'=>'bar', # a trick to allow the '-' to be omitted - ref($script) eq 'ARRAY' ? @$script : %$script); - # User may not have specified language - $language ||= 'JavaScript'; - unless (defined $type) { - $type = lc $language; - # strip '1.2' from 'javascript1.2' - $type =~ s/^(\D+).*$/text\/$1/; - } - } else { - ($src,$code,$language, $type) = ('',$script,'JavaScript', 'text/javascript'); - } - - my $comment = '//'; # javascript by default - $comment = '#' if $type=~/perl|tcl/i; - $comment = "'" if $type=~/vbscript/i; - - my ($cdata_start,$cdata_end); - if ($XHTML) { - $cdata_start = "$comment"; - } else { - $cdata_start = "\n\n"; - } - my(@satts); - push(@satts,'src'=>$src) if $src; - push(@satts,'language'=>$language) unless defined $type; - push(@satts,'type'=>$type); - $code = $cdata_start . $code . $cdata_end if defined $code; - push(@result,$self->script({@satts},$code || '')); - } - @result; -} -END_OF_FUNC - -#### Method: end_html -# End an HTML document. -# Trivial method for completeness. Just returns "" -#### -'end_html' => <<'END_OF_FUNC', -sub end_html { - return "\n\n"; -} -END_OF_FUNC - - -################################ -# METHODS USED IN BUILDING FORMS -################################ - -#### Method: isindex -# Just prints out the isindex tag. -# Parameters: -# $action -> optional URL of script to run -# Returns: -# A string containing a tag -'isindex' => <<'END_OF_FUNC', -sub isindex { - my($self,@p) = self_or_default(@_); - my($action,@other) = rearrange([ACTION],@p); - $action = qq/ action="$action"/ if $action; - my($other) = @other ? " @other" : ''; - return $XHTML ? "" : ""; -} -END_OF_FUNC - - -#### Method: startform -# Start a form -# Parameters: -# $method -> optional submission method to use (GET or POST) -# $action -> optional URL of script to run -# $enctype ->encoding to use (URL_ENCODED or MULTIPART) -'startform' => <<'END_OF_FUNC', -sub startform { - my($self,@p) = self_or_default(@_); - - my($method,$action,$enctype,@other) = - rearrange([METHOD,ACTION,ENCTYPE],@p); - - $method = $self->escapeHTML(lc($method) || 'post'); - $enctype = $self->escapeHTML($enctype || &URL_ENCODED); - if (defined $action) { - $action = $self->escapeHTML($action); - } - else { - $action = $self->escapeHTML($self->request_uri); - } - $action = qq(action="$action"); - my($other) = @other ? " @other" : ''; - $self->{'.parametersToAdd'}={}; - return qq/
    \n/; -} -END_OF_FUNC - - -#### Method: start_form -# synonym for startform -'start_form' => <<'END_OF_FUNC', -sub start_form { - $XHTML ? &start_multipart_form : &startform; -} -END_OF_FUNC - -'end_multipart_form' => <<'END_OF_FUNC', -sub end_multipart_form { - &endform; -} -END_OF_FUNC - -#### Method: start_multipart_form -# synonym for startform -'start_multipart_form' => <<'END_OF_FUNC', -sub start_multipart_form { - my($self,@p) = self_or_default(@_); - if (defined($p[0]) && substr($p[0],0,1) eq '-') { - my(%p) = @p; - $p{'-enctype'}=&MULTIPART; - return $self->startform(%p); - } else { - my($method,$action,@other) = - rearrange([METHOD,ACTION],@p); - return $self->startform($method,$action,&MULTIPART,@other); - } -} -END_OF_FUNC - - -#### Method: endform -# End a form -'endform' => <<'END_OF_FUNC', -sub endform { - my($self,@p) = self_or_default(@_); - if ( $NOSTICKY ) { - return wantarray ? ("
    ") : "\n"; - } else { - if (my @fields = $self->get_fields) { - return wantarray ? ("
    ",@fields,"
    ","") - : "
    ".(join '',@fields)."
    \n"; - } else { - return ""; - } - } -} -END_OF_FUNC - - -'_textfield' => <<'END_OF_FUNC', -sub _textfield { - my($self,$tag,@p) = self_or_default(@_); - my($name,$default,$size,$maxlength,$override,$tabindex,@other) = - rearrange([NAME,[DEFAULT,VALUE,VALUES],SIZE,MAXLENGTH,[OVERRIDE,FORCE],TABINDEX],@p); - - my $current = $override ? $default : - (defined($self->param($name)) ? $self->param($name) : $default); - - $current = defined($current) ? $self->escapeHTML($current,1) : ''; - $name = defined($name) ? $self->escapeHTML($name) : ''; - my($s) = defined($size) ? qq/ size="$size"/ : ''; - my($m) = defined($maxlength) ? qq/ maxlength="$maxlength"/ : ''; - my($other) = @other ? " @other" : ''; - # this entered at cristy's request to fix problems with file upload fields - # and WebTV -- not sure it won't break stuff - my($value) = $current ne '' ? qq(value="$current") : ''; - $tabindex = $self->element_tab($tabindex); - return $XHTML ? qq() - : qq(); -} -END_OF_FUNC - -#### Method: textfield -# Parameters: -# $name -> Name of the text field -# $default -> Optional default value of the field if not -# already defined. -# $size -> Optional width of field in characaters. -# $maxlength -> Optional maximum number of characters. -# Returns: -# A string containing a field -# -'textfield' => <<'END_OF_FUNC', -sub textfield { - my($self,@p) = self_or_default(@_); - $self->_textfield('text',@p); -} -END_OF_FUNC - - -#### Method: filefield -# Parameters: -# $name -> Name of the file upload field -# $size -> Optional width of field in characaters. -# $maxlength -> Optional maximum number of characters. -# Returns: -# A string containing a field -# -'filefield' => <<'END_OF_FUNC', -sub filefield { - my($self,@p) = self_or_default(@_); - $self->_textfield('file',@p); -} -END_OF_FUNC - - -#### Method: password -# Create a "secret password" entry field -# Parameters: -# $name -> Name of the field -# $default -> Optional default value of the field if not -# already defined. -# $size -> Optional width of field in characters. -# $maxlength -> Optional maximum characters that can be entered. -# Returns: -# A string containing a field -# -'password_field' => <<'END_OF_FUNC', -sub password_field { - my ($self,@p) = self_or_default(@_); - $self->_textfield('password',@p); -} -END_OF_FUNC - -#### Method: textarea -# Parameters: -# $name -> Name of the text field -# $default -> Optional default value of the field if not -# already defined. -# $rows -> Optional number of rows in text area -# $columns -> Optional number of columns in text area -# Returns: -# A string containing a tag -# -'textarea' => <<'END_OF_FUNC', -sub textarea { - my($self,@p) = self_or_default(@_); - my($name,$default,$rows,$cols,$override,$tabindex,@other) = - rearrange([NAME,[DEFAULT,VALUE],ROWS,[COLS,COLUMNS],[OVERRIDE,FORCE],TABINDEX],@p); - - my($current)= $override ? $default : - (defined($self->param($name)) ? $self->param($name) : $default); - - $name = defined($name) ? $self->escapeHTML($name) : ''; - $current = defined($current) ? $self->escapeHTML($current) : ''; - my($r) = $rows ? qq/ rows="$rows"/ : ''; - my($c) = $cols ? qq/ cols="$cols"/ : ''; - my($other) = @other ? " @other" : ''; - $tabindex = $self->element_tab($tabindex); - return qq{}; -} -END_OF_FUNC - - -#### Method: button -# Create a javascript button. -# Parameters: -# $name -> (optional) Name for the button. (-name) -# $value -> (optional) Value of the button when selected (and visible name) (-value) -# $onclick -> (optional) Text of the JavaScript to run when the button is -# clicked. -# Returns: -# A string containing a tag -#### -'button' => <<'END_OF_FUNC', -sub button { - my($self,@p) = self_or_default(@_); - - my($label,$value,$script,$tabindex,@other) = rearrange([NAME,[VALUE,LABEL], - [ONCLICK,SCRIPT],TABINDEX],@p); - - $label=$self->escapeHTML($label); - $value=$self->escapeHTML($value,1); - $script=$self->escapeHTML($script); - - my($name) = ''; - $name = qq/ name="$label"/ if $label; - $value = $value || $label; - my($val) = ''; - $val = qq/ value="$value"/ if $value; - $script = qq/ onclick="$script"/ if $script; - my($other) = @other ? " @other" : ''; - $tabindex = $self->element_tab($tabindex); - return $XHTML ? qq() - : qq(); -} -END_OF_FUNC - - -#### Method: submit -# Create a "submit query" button. -# Parameters: -# $name -> (optional) Name for the button. -# $value -> (optional) Value of the button when selected (also doubles as label). -# $label -> (optional) Label printed on the button(also doubles as the value). -# Returns: -# A string containing a tag -#### -'submit' => <<'END_OF_FUNC', -sub submit { - my($self,@p) = self_or_default(@_); - - my($label,$value,$tabindex,@other) = rearrange([NAME,[VALUE,LABEL],TABINDEX],@p); - - $label=$self->escapeHTML($label); - $value=$self->escapeHTML($value,1); - - my $name = $NOSTICKY ? '' : 'name=".submit" '; - $name = qq/name="$label" / if defined($label); - $value = defined($value) ? $value : $label; - my $val = ''; - $val = qq/value="$value" / if defined($value); - $tabindex = $self->element_tab($tabindex); - my($other) = @other ? "@other " : ''; - return $XHTML ? qq() - : qq(); -} -END_OF_FUNC - - -#### Method: reset -# Create a "reset" button. -# Parameters: -# $name -> (optional) Name for the button. -# Returns: -# A string containing a tag -#### -'reset' => <<'END_OF_FUNC', -sub reset { - my($self,@p) = self_or_default(@_); - my($label,$value,$tabindex,@other) = rearrange(['NAME',['VALUE','LABEL'],TABINDEX],@p); - $label=$self->escapeHTML($label); - $value=$self->escapeHTML($value,1); - my ($name) = ' name=".reset"'; - $name = qq/ name="$label"/ if defined($label); - $value = defined($value) ? $value : $label; - my($val) = ''; - $val = qq/ value="$value"/ if defined($value); - my($other) = @other ? " @other" : ''; - $tabindex = $self->element_tab($tabindex); - return $XHTML ? qq() - : qq(); -} -END_OF_FUNC - - -#### Method: defaults -# Create a "defaults" button. -# Parameters: -# $name -> (optional) Name for the button. -# Returns: -# A string containing a tag -# -# Note: this button has a special meaning to the initialization script, -# and tells it to ERASE the current query string so that your defaults -# are used again! -#### -'defaults' => <<'END_OF_FUNC', -sub defaults { - my($self,@p) = self_or_default(@_); - - my($label,$tabindex,@other) = rearrange([[NAME,VALUE],TABINDEX],@p); - - $label=$self->escapeHTML($label,1); - $label = $label || "Defaults"; - my($value) = qq/ value="$label"/; - my($other) = @other ? " @other" : ''; - $tabindex = $self->element_tab($tabindex); - return $XHTML ? qq() - : qq//; -} -END_OF_FUNC - - -#### Method: comment -# Create an HTML -# Parameters: a string -'comment' => <<'END_OF_FUNC', -sub comment { - my($self,@p) = self_or_CGI(@_); - return ""; -} -END_OF_FUNC - -#### Method: checkbox -# Create a checkbox that is not logically linked to any others. -# The field value is "on" when the button is checked. -# Parameters: -# $name -> Name of the checkbox -# $checked -> (optional) turned on by default if true -# $value -> (optional) value of the checkbox, 'on' by default -# $label -> (optional) a user-readable label printed next to the box. -# Otherwise the checkbox name is used. -# Returns: -# A string containing a field -#### -'checkbox' => <<'END_OF_FUNC', -sub checkbox { - my($self,@p) = self_or_default(@_); - - my($name,$checked,$value,$label,$override,$tabindex,@other) = - rearrange([NAME,[CHECKED,SELECTED,ON],VALUE,LABEL,[OVERRIDE,FORCE],TABINDEX],@p); - - $value = defined $value ? $value : 'on'; - - if (!$override && ($self->{'.fieldnames'}->{$name} || - defined $self->param($name))) { - $checked = grep($_ eq $value,$self->param($name)) ? $self->_checked(1) : ''; - } else { - $checked = $self->_checked($checked); - } - my($the_label) = defined $label ? $label : $name; - $name = $self->escapeHTML($name); - $value = $self->escapeHTML($value,1); - $the_label = $self->escapeHTML($the_label); - my($other) = @other ? "@other " : ''; - $tabindex = $self->element_tab($tabindex); - $self->register_parameter($name); - return $XHTML ? CGI::label(qq{$the_label}) - : qq{$the_label}; -} -END_OF_FUNC - - - -# Escape HTML -- used internally -'escapeHTML' => <<'END_OF_FUNC', -sub escapeHTML { - # hack to work around earlier hacks - push @_,$_[0] if @_==1 && $_[0] eq 'CGI'; - my ($self,$toencode,$newlinestoo) = CGI::self_or_default(@_); - return undef unless defined($toencode); - return $toencode if ref($self) && !$self->{'escape'}; - $toencode =~ s{&}{&}gso; - $toencode =~ s{<}{<}gso; - $toencode =~ s{>}{>}gso; - if ($DTD_PUBLIC_IDENTIFIER =~ /[^X]HTML 3\.2/i) { - # $quot; was accidentally omitted from the HTML 3.2 DTD -- see - # / - # . - $toencode =~ s{"}{"}gso; - } - else { - $toencode =~ s{"}{"}gso; - } - my $latin = uc $self->{'.charset'} eq 'ISO-8859-1' || - uc $self->{'.charset'} eq 'WINDOWS-1252'; - if ($latin) { # bug in some browsers - $toencode =~ s{'}{'}gso; - $toencode =~ s{\x8b}{‹}gso; - $toencode =~ s{\x9b}{›}gso; - if (defined $newlinestoo && $newlinestoo) { - $toencode =~ s{\012}{ }gso; - $toencode =~ s{\015}{ }gso; - } - } - return $toencode; -} -END_OF_FUNC - -# unescape HTML -- used internally -'unescapeHTML' => <<'END_OF_FUNC', -sub unescapeHTML { - # hack to work around earlier hacks - push @_,$_[0] if @_==1 && $_[0] eq 'CGI'; - my ($self,$string) = CGI::self_or_default(@_); - return undef unless defined($string); - my $latin = defined $self->{'.charset'} ? $self->{'.charset'} =~ /^(ISO-8859-1|WINDOWS-1252)$/i - : 1; - # thanks to Randal Schwartz for the correct solution to this one - $string=~ s[&(.*?);]{ - local $_ = $1; - /^amp$/i ? "&" : - /^quot$/i ? '"' : - /^gt$/i ? ">" : - /^lt$/i ? "<" : - /^#(\d+)$/ && $latin ? chr($1) : - /^#x([0-9a-f]+)$/i && $latin ? chr(hex($1)) : - $_ - }gex; - return $string; -} -END_OF_FUNC - -# Internal procedure - don't use -'_tableize' => <<'END_OF_FUNC', -sub _tableize { - my($rows,$columns,$rowheaders,$colheaders,@elements) = @_; - my @rowheaders = $rowheaders ? @$rowheaders : (); - my @colheaders = $colheaders ? @$colheaders : (); - my($result); - - if (defined($columns)) { - $rows = int(0.99 + @elements/$columns) unless defined($rows); - } - if (defined($rows)) { - $columns = int(0.99 + @elements/$rows) unless defined($columns); - } - - # rearrange into a pretty table - $result = ""; - my($row,$column); - unshift(@colheaders,'') if @colheaders && @rowheaders; - $result .= "" if @colheaders; - foreach (@colheaders) { - $result .= ""; - } - for ($row=0;$row<$rows;$row++) { - $result .= ""; - $result .= "" if @rowheaders; - for ($column=0;$column<$columns;$column++) { - $result .= "" - if defined($elements[$column*$rows + $row]); - } - $result .= ""; - } - $result .= "
    $_
    $rowheaders[$row]" . $elements[$column*$rows + $row] . "
    "; - return $result; -} -END_OF_FUNC - - -#### Method: radio_group -# Create a list of logically-linked radio buttons. -# Parameters: -# $name -> Common name for all the buttons. -# $values -> A pointer to a regular array containing the -# values for each button in the group. -# $default -> (optional) Value of the button to turn on by default. Pass '-' -# to turn _nothing_ on. -# $linebreak -> (optional) Set to true to place linebreaks -# between the buttons. -# $labels -> (optional) -# A pointer to an associative array of labels to print next to each checkbox -# in the form $label{'value'}="Long explanatory label". -# Otherwise the provided values are used as the labels. -# Returns: -# An ARRAY containing a series of fields -#### -'radio_group' => <<'END_OF_FUNC', -sub radio_group { - my($self,@p) = self_or_default(@_); - $self->_box_group('radio',@p); -} -END_OF_FUNC - -#### Method: checkbox_group -# Create a list of logically-linked checkboxes. -# Parameters: -# $name -> Common name for all the check boxes -# $values -> A pointer to a regular array containing the -# values for each checkbox in the group. -# $defaults -> (optional) -# 1. If a pointer to a regular array of checkbox values, -# then this will be used to decide which -# checkboxes to turn on by default. -# 2. If a scalar, will be assumed to hold the -# value of a single checkbox in the group to turn on. -# $linebreak -> (optional) Set to true to place linebreaks -# between the buttons. -# $labels -> (optional) -# A pointer to an associative array of labels to print next to each checkbox -# in the form $label{'value'}="Long explanatory label". -# Otherwise the provided values are used as the labels. -# Returns: -# An ARRAY containing a series of fields -#### - -'checkbox_group' => <<'END_OF_FUNC', -sub checkbox_group { - my($self,@p) = self_or_default(@_); - $self->_box_group('checkbox',@p); -} -END_OF_FUNC - -'_box_group' => <<'END_OF_FUNC', -sub _box_group { - my $self = shift; - my $box_type = shift; - - my($name,$values,$defaults,$linebreak,$labels,$attributes, - $rows,$columns,$rowheaders,$colheaders, - $override,$nolabels,$tabindex,@other) = - rearrange([ NAME,[VALUES,VALUE],[DEFAULT,DEFAULTS],LINEBREAK,LABELS,ATTRIBUTES, - ROWS,[COLUMNS,COLS],ROWHEADERS,COLHEADERS, - [OVERRIDE,FORCE],NOLABELS,TABINDEX - ],@_); - my($result,$checked); - - - my(@elements,@values); - @values = $self->_set_values_and_labels($values,\$labels,$name); - my %checked = $self->previous_or_default($name,$defaults,$override); - - # If no check array is specified, check the first by default - $checked{$values[0]}++ if $box_type eq 'radio' && !%checked; - - $name=$self->escapeHTML($name); - - my %tabs = (); - if ($TABINDEX && $tabindex) { - if (!ref $tabindex) { - $self->element_tab($tabindex); - } elsif (ref $tabindex eq 'ARRAY') { - %tabs = map {$_=>$self->element_tab} @$tabindex; - } elsif (ref $tabindex eq 'HASH') { - %tabs = %$tabindex; - } - } - %tabs = map {$_=>$self->element_tab} @values unless %tabs; - - my $other = @other ? "@other " : ''; - my $radio_checked; - foreach (@values) { - my $checkit = $self->_checked($box_type eq 'radio' ? ($checked{$_} && !$radio_checked++) - : $checked{$_}); - my($break); - if ($linebreak) { - $break = $XHTML ? "
    " : "
    "; - } - else { - $break = ''; - } - my($label)=''; - unless (defined($nolabels) && $nolabels) { - $label = $_; - $label = $labels->{$_} if defined($labels) && defined($labels->{$_}); - $label = $self->escapeHTML($label,1); - } - my $attribs = $self->_set_attributes($_, $attributes); - my $tab = $tabs{$_}; - $_=$self->escapeHTML($_); - if ($XHTML) { - push @elements, - CGI::label( - qq($label)).${break}; - } else { - push(@elements,qq/${label}${break}/); - } - } - $self->register_parameter($name); - return wantarray ? @elements : "@elements" - unless defined($columns) || defined($rows); - return _tableize($rows,$columns,$rowheaders,$colheaders,@elements); -} -END_OF_FUNC - - -#### Method: popup_menu -# Create a popup menu. -# Parameters: -# $name -> Name for all the menu -# $values -> A pointer to a regular array containing the -# text of each menu item. -# $default -> (optional) Default item to display -# $labels -> (optional) -# A pointer to an associative array of labels to print next to each checkbox -# in the form $label{'value'}="Long explanatory label". -# Otherwise the provided values are used as the labels. -# Returns: -# A string containing the definition of a popup menu. -#### -'popup_menu' => <<'END_OF_FUNC', -sub popup_menu { - my($self,@p) = self_or_default(@_); - - my($name,$values,$default,$labels,$attributes,$override,$tabindex,@other) = - rearrange([NAME,[VALUES,VALUE],[DEFAULT,DEFAULTS],LABELS, - ATTRIBUTES,[OVERRIDE,FORCE],TABINDEX],@p); - my($result,$selected); - - if (!$override && defined($self->param($name))) { - $selected = $self->param($name); - } else { - $selected = $default; - } - $name=$self->escapeHTML($name); - my($other) = @other ? " @other" : ''; - - my(@values); - @values = $self->_set_values_and_labels($values,\$labels,$name); - $tabindex = $self->element_tab($tabindex); - $result = qq/"; - return $result; -} -END_OF_FUNC - - -#### Method: optgroup -# Create a optgroup. -# Parameters: -# $name -> Label for the group -# $values -> A pointer to a regular array containing the -# values for each option line in the group. -# $labels -> (optional) -# A pointer to an associative array of labels to print next to each item -# in the form $label{'value'}="Long explanatory label". -# Otherwise the provided values are used as the labels. -# $labeled -> (optional) -# A true value indicates the value should be used as the label attribute -# in the option elements. -# The label attribute specifies the option label presented to the user. -# This defaults to the content of the \n/; - foreach (@values) { - if (/_set_attributes($_, $attributes); - my($label) = $_; - $label = $labels->{$_} if defined($labels) && defined($labels->{$_}); - $label=$self->escapeHTML($label); - my($value)=$self->escapeHTML($_,1); - $result .= $labeled ? $novals ? "$label\n" - : "$label\n" - : $novals ? "$label\n" - : "$label\n"; - } - } - $result .= ""; - return $result; -} -END_OF_FUNC - - -#### Method: scrolling_list -# Create a scrolling list. -# Parameters: -# $name -> name for the list -# $values -> A pointer to a regular array containing the -# values for each option line in the list. -# $defaults -> (optional) -# 1. If a pointer to a regular array of options, -# then this will be used to decide which -# lines to turn on by default. -# 2. Otherwise holds the value of the single line to turn on. -# $size -> (optional) Size of the list. -# $multiple -> (optional) If set, allow multiple selections. -# $labels -> (optional) -# A pointer to an associative array of labels to print next to each checkbox -# in the form $label{'value'}="Long explanatory label". -# Otherwise the provided values are used as the labels. -# Returns: -# A string containing the definition of a scrolling list. -#### -'scrolling_list' => <<'END_OF_FUNC', -sub scrolling_list { - my($self,@p) = self_or_default(@_); - my($name,$values,$defaults,$size,$multiple,$labels,$attributes,$override,$tabindex,@other) - = rearrange([NAME,[VALUES,VALUE],[DEFAULTS,DEFAULT], - SIZE,MULTIPLE,LABELS,ATTRIBUTES,[OVERRIDE,FORCE],TABINDEX],@p); - - my($result,@values); - @values = $self->_set_values_and_labels($values,\$labels,$name); - - $size = $size || scalar(@values); - - my(%selected) = $self->previous_or_default($name,$defaults,$override); - my($is_multiple) = $multiple ? qq/ multiple="multiple"/ : ''; - my($has_size) = $size ? qq/ size="$size"/: ''; - my($other) = @other ? " @other" : ''; - - $name=$self->escapeHTML($name); - $tabindex = $self->element_tab($tabindex); - $result = qq/"; - $self->register_parameter($name); - return $result; -} -END_OF_FUNC - - -#### Method: hidden -# Parameters: -# $name -> Name of the hidden field -# @default -> (optional) Initial values of field (may be an array) -# or -# $default->[initial values of field] -# Returns: -# A string containing a -#### -'hidden' => <<'END_OF_FUNC', -sub hidden { - my($self,@p) = self_or_default(@_); - - # this is the one place where we departed from our standard - # calling scheme, so we have to special-case (darn) - my(@result,@value); - my($name,$default,$override,@other) = - rearrange([NAME,[DEFAULT,VALUE,VALUES],[OVERRIDE,FORCE]],@p); - - my $do_override = 0; - if ( ref($p[0]) || substr($p[0],0,1) eq '-') { - @value = ref($default) ? @{$default} : $default; - $do_override = $override; - } else { - foreach ($default,$override,@other) { - push(@value,$_) if defined($_); - } - } - - # use previous values if override is not set - my @prev = $self->param($name); - @value = @prev if !$do_override && @prev; - - $name=$self->escapeHTML($name); - foreach (@value) { - $_ = defined($_) ? $self->escapeHTML($_,1) : ''; - push @result,$XHTML ? qq() - : qq(); - } - return wantarray ? @result : join('',@result); -} -END_OF_FUNC - - -#### Method: image_button -# Parameters: -# $name -> Name of the button -# $src -> URL of the image source -# $align -> Alignment style (TOP, BOTTOM or MIDDLE) -# Returns: -# A string containing a -#### -'image_button' => <<'END_OF_FUNC', -sub image_button { - my($self,@p) = self_or_default(@_); - - my($name,$src,$alignment,@other) = - rearrange([NAME,SRC,ALIGN],@p); - - my($align) = $alignment ? " align=\U\"$alignment\"" : ''; - my($other) = @other ? " @other" : ''; - $name=$self->escapeHTML($name); - return $XHTML ? qq() - : qq//; -} -END_OF_FUNC - - -#### Method: self_url -# Returns a URL containing the current script and all its -# param/value pairs arranged as a query. You can use this -# to create a link that, when selected, will reinvoke the -# script with all its state information preserved. -#### -'self_url' => <<'END_OF_FUNC', -sub self_url { - my($self,@p) = self_or_default(@_); - return $self->url('-path_info'=>1,'-query'=>1,'-full'=>1,@p); -} -END_OF_FUNC - - -# This is provided as a synonym to self_url() for people unfortunate -# enough to have incorporated it into their programs already! -'state' => <<'END_OF_FUNC', -sub state { - &self_url; -} -END_OF_FUNC - - -#### Method: url -# Like self_url, but doesn't return the query string part of -# the URL. -#### -'url' => <<'END_OF_FUNC', -sub url { - my($self,@p) = self_or_default(@_); - my ($relative,$absolute,$full,$path_info,$query,$base,$rewrite) = - rearrange(['RELATIVE','ABSOLUTE','FULL',['PATH','PATH_INFO'],['QUERY','QUERY_STRING'],'BASE','REWRITE'],@p); - my $url = ''; - $full++ if $base || !($relative || $absolute); - $rewrite++ unless defined $rewrite; - - my $path = $self->path_info; - my $script_name = $self->script_name; - my $request_uri = $self->request_uri || ''; - my $query_str = $self->query_string; - - my $rewrite_in_use = $request_uri && $request_uri !~ /^$script_name/; - undef $path if $rewrite_in_use && $rewrite; # path not valid when rewriting active - - my $uri = $rewrite && $request_uri ? $request_uri : $script_name; - $uri =~ s/\?.*$//; # remove query string - $uri =~ s/$path$// if defined $path; # remove path - - if ($full) { - my $protocol = $self->protocol(); - $url = "$protocol://"; - my $vh = http('x_forwarded_host') || http('host'); - if ($vh) { - $url .= $vh; - } else { - $url .= server_name(); - my $port = $self->server_port; - $url .= ":" . $port - unless (lc($protocol) eq 'http' && $port == 80) - || (lc($protocol) eq 'https' && $port == 443); - } - return $url if $base; - $url .= $uri; - } elsif ($relative) { - ($url) = $script_name =~ m!([^/]+)$!; - } elsif ($absolute) { - $url = $uri; - } - - $url .= $path if $path_info and defined $path; - $url .= "?$query_str" if $query and $query_str ne ''; - $url =~ s/([^a-zA-Z0-9_.%;&?\/\\:+=~-])/sprintf("%%%02X",ord($1))/eg; - return $url; -} - -END_OF_FUNC - -#### Method: cookie -# Set or read a cookie from the specified name. -# Cookie can then be passed to header(). -# Usual rules apply to the stickiness of -value. -# Parameters: -# -name -> name for this cookie (optional) -# -value -> value of this cookie (scalar, array or hash) -# -path -> paths for which this cookie is valid (optional) -# -domain -> internet domain in which this cookie is valid (optional) -# -secure -> if true, cookie only passed through secure channel (optional) -# -expires -> expiry date in format Wdy, DD-Mon-YYYY HH:MM:SS GMT (optional) -#### -'cookie' => <<'END_OF_FUNC', -sub cookie { - my($self,@p) = self_or_default(@_); - my($name,$value,$path,$domain,$secure,$expires) = - rearrange([NAME,[VALUE,VALUES],PATH,DOMAIN,SECURE,EXPIRES],@p); - - require CGI::Cookie; - - # if no value is supplied, then we retrieve the - # value of the cookie, if any. For efficiency, we cache the parsed - # cookies in our state variables. - unless ( defined($value) ) { - $self->{'.cookies'} = CGI::Cookie->fetch - unless $self->{'.cookies'}; - - # If no name is supplied, then retrieve the names of all our cookies. - return () unless $self->{'.cookies'}; - return keys %{$self->{'.cookies'}} unless $name; - return () unless $self->{'.cookies'}->{$name}; - return $self->{'.cookies'}->{$name}->value if defined($name) && $name ne ''; - } - - # If we get here, we're creating a new cookie - return undef unless defined($name) && $name ne ''; # this is an error - - my @param; - push(@param,'-name'=>$name); - push(@param,'-value'=>$value); - push(@param,'-domain'=>$domain) if $domain; - push(@param,'-path'=>$path) if $path; - push(@param,'-expires'=>$expires) if $expires; - push(@param,'-secure'=>$secure) if $secure; - - return new CGI::Cookie(@param); -} -END_OF_FUNC - -'parse_keywordlist' => <<'END_OF_FUNC', -sub parse_keywordlist { - my($self,$tosplit) = @_; - $tosplit = unescape($tosplit); # unescape the keywords - $tosplit=~tr/+/ /; # pluses to spaces - my(@keywords) = split(/\s+/,$tosplit); - return @keywords; -} -END_OF_FUNC - -'param_fetch' => <<'END_OF_FUNC', -sub param_fetch { - my($self,@p) = self_or_default(@_); - my($name) = rearrange([NAME],@p); - unless (exists($self->{$name})) { - $self->add_parameter($name); - $self->{$name} = []; - } - - return $self->{$name}; -} -END_OF_FUNC - -############################################### -# OTHER INFORMATION PROVIDED BY THE ENVIRONMENT -############################################### - -#### Method: path_info -# Return the extra virtual path information provided -# after the URL (if any) -#### -'path_info' => <<'END_OF_FUNC', -sub path_info { - my ($self,$info) = self_or_default(@_); - if (defined($info)) { - $info = "/$info" if $info ne '' && substr($info,0,1) ne '/'; - $self->{'.path_info'} = $info; - } elsif (! defined($self->{'.path_info'}) ) { - my (undef,$path_info) = $self->_name_and_path_from_env; - $self->{'.path_info'} = $path_info || ''; - # hack to fix broken path info in IIS - $self->{'.path_info'} =~ s/^\Q$ENV{'SCRIPT_NAME'}\E// if $IIS; - - } - return $self->{'.path_info'}; -} -END_OF_FUNC - -# WE USE THIS TO COMPENSATE FOR A BUG IN APACHE 2 PRESENT AT LEAST UP THROUGH 2.0.54 -'_name_and_path_from_env' => <<'END_OF_FUNC', -sub _name_and_path_from_env { - my $self = shift; - my $raw_script_name = $ENV{SCRIPT_NAME} || ''; - my $raw_path_info = $ENV{PATH_INFO} || ''; - my $uri = $ENV{REQUEST_URI} || ''; - - if ($raw_script_name =~ m/$raw_path_info$/) { - $raw_script_name =~ s/$raw_path_info$//; - } - - my @uri_double_slashes = $uri =~ m^(/{2,}?)^g; - my @path_double_slashes = "$raw_script_name $raw_path_info" =~ m^(/{2,}?)^g; - - my $apache_bug = @uri_double_slashes != @path_double_slashes; - return ($raw_script_name,$raw_path_info) unless $apache_bug; - - my $path_info_search = $raw_path_info; - # these characters will not (necessarily) be escaped - $path_info_search =~ s/([^a-zA-Z0-9$()':_.,+*\/;?=&-])/uc sprintf("%%%02x",ord($1))/eg; - $path_info_search = quotemeta($path_info_search); - $path_info_search =~ s!/!/+!g; - if ($uri =~ m/^(.+)($path_info_search)/) { - return ($1,$2); - } else { - return ($raw_script_name,$raw_path_info); - } -} -END_OF_FUNC - - -#### Method: request_method -# Returns 'POST', 'GET', 'PUT' or 'HEAD' -#### -'request_method' => <<'END_OF_FUNC', -sub request_method { - return $ENV{'REQUEST_METHOD'}; -} -END_OF_FUNC - -#### Method: content_type -# Returns the content_type string -#### -'content_type' => <<'END_OF_FUNC', -sub content_type { - return $ENV{'CONTENT_TYPE'}; -} -END_OF_FUNC - -#### Method: path_translated -# Return the physical path information provided -# by the URL (if any) -#### -'path_translated' => <<'END_OF_FUNC', -sub path_translated { - return $ENV{'PATH_TRANSLATED'}; -} -END_OF_FUNC - - -#### Method: request_uri -# Return the literal request URI -#### -'request_uri' => <<'END_OF_FUNC', -sub request_uri { - return $ENV{'REQUEST_URI'}; -} -END_OF_FUNC - - -#### Method: query_string -# Synthesize a query string from our current -# parameters -#### -'query_string' => <<'END_OF_FUNC', -sub query_string { - my($self) = self_or_default(@_); - my($param,$value,@pairs); - foreach $param ($self->param) { - my($eparam) = escape($param); - foreach $value ($self->param($param)) { - $value = escape($value); - next unless defined $value; - push(@pairs,"$eparam=$value"); - } - } - foreach (keys %{$self->{'.fieldnames'}}) { - push(@pairs,".cgifields=".escape("$_")); - } - return join($USE_PARAM_SEMICOLONS ? ';' : '&',@pairs); -} -END_OF_FUNC - - -#### Method: accept -# Without parameters, returns an array of the -# MIME types the browser accepts. -# With a single parameter equal to a MIME -# type, will return undef if the browser won't -# accept it, 1 if the browser accepts it but -# doesn't give a preference, or a floating point -# value between 0.0 and 1.0 if the browser -# declares a quantitative score for it. -# This handles MIME type globs correctly. -#### -'Accept' => <<'END_OF_FUNC', -sub Accept { - my($self,$search) = self_or_CGI(@_); - my(%prefs,$type,$pref,$pat); - - my(@accept) = split(',',$self->http('accept')); - - foreach (@accept) { - ($pref) = /q=(\d\.\d+|\d+)/; - ($type) = m#(\S+/[^;]+)#; - next unless $type; - $prefs{$type}=$pref || 1; - } - - return keys %prefs unless $search; - - # if a search type is provided, we may need to - # perform a pattern matching operation. - # The MIME types use a glob mechanism, which - # is easily translated into a perl pattern match - - # First return the preference for directly supported - # types: - return $prefs{$search} if $prefs{$search}; - - # Didn't get it, so try pattern matching. - foreach (keys %prefs) { - next unless /\*/; # not a pattern match - ($pat = $_) =~ s/([^\w*])/\\$1/g; # escape meta characters - $pat =~ s/\*/.*/g; # turn it into a pattern - return $prefs{$_} if $search=~/$pat/; - } -} -END_OF_FUNC - - -#### Method: user_agent -# If called with no parameters, returns the user agent. -# If called with one parameter, does a pattern match (case -# insensitive) on the user agent. -#### -'user_agent' => <<'END_OF_FUNC', -sub user_agent { - my($self,$match)=self_or_CGI(@_); - return $self->http('user_agent') unless $match; - return $self->http('user_agent') =~ /$match/i; -} -END_OF_FUNC - - -#### Method: raw_cookie -# Returns the magic cookies for the session. -# The cookies are not parsed or altered in any way, i.e. -# cookies are returned exactly as given in the HTTP -# headers. If a cookie name is given, only that cookie's -# value is returned, otherwise the entire raw cookie -# is returned. -#### -'raw_cookie' => <<'END_OF_FUNC', -sub raw_cookie { - my($self,$key) = self_or_CGI(@_); - - require CGI::Cookie; - - if (defined($key)) { - $self->{'.raw_cookies'} = CGI::Cookie->raw_fetch - unless $self->{'.raw_cookies'}; - - return () unless $self->{'.raw_cookies'}; - return () unless $self->{'.raw_cookies'}->{$key}; - return $self->{'.raw_cookies'}->{$key}; - } - return $self->http('cookie') || $ENV{'COOKIE'} || ''; -} -END_OF_FUNC - -#### Method: virtual_host -# Return the name of the virtual_host, which -# is not always the same as the server -###### -'virtual_host' => <<'END_OF_FUNC', -sub virtual_host { - my $vh = http('x_forwarded_host') || http('host') || server_name(); - $vh =~ s/:\d+$//; # get rid of port number - return $vh; -} -END_OF_FUNC - -#### Method: remote_host -# Return the name of the remote host, or its IP -# address if unavailable. If this variable isn't -# defined, it returns "localhost" for debugging -# purposes. -#### -'remote_host' => <<'END_OF_FUNC', -sub remote_host { - return $ENV{'REMOTE_HOST'} || $ENV{'REMOTE_ADDR'} - || 'localhost'; -} -END_OF_FUNC - - -#### Method: remote_addr -# Return the IP addr of the remote host. -#### -'remote_addr' => <<'END_OF_FUNC', -sub remote_addr { - return $ENV{'REMOTE_ADDR'} || '127.0.0.1'; -} -END_OF_FUNC - - -#### Method: script_name -# Return the partial URL to this script for -# self-referencing scripts. Also see -# self_url(), which returns a URL with all state information -# preserved. -#### -'script_name' => <<'END_OF_FUNC', -sub script_name { - my ($self,@p) = self_or_default(@_); - if (@p) { - $self->{'.script_name'} = shift; - } elsif (!exists $self->{'.script_name'}) { - my ($script_name,$path_info) = $self->_name_and_path_from_env(); - $self->{'.script_name'} = $script_name; - } - return $self->{'.script_name'}; -} -END_OF_FUNC - - -#### Method: referer -# Return the HTTP_REFERER: useful for generating -# a GO BACK button. -#### -'referer' => <<'END_OF_FUNC', -sub referer { - my($self) = self_or_CGI(@_); - return $self->http('referer'); -} -END_OF_FUNC - - -#### Method: server_name -# Return the name of the server -#### -'server_name' => <<'END_OF_FUNC', -sub server_name { - return $ENV{'SERVER_NAME'} || 'localhost'; -} -END_OF_FUNC - -#### Method: server_software -# Return the name of the server software -#### -'server_software' => <<'END_OF_FUNC', -sub server_software { - return $ENV{'SERVER_SOFTWARE'} || 'cmdline'; -} -END_OF_FUNC - -#### Method: virtual_port -# Return the server port, taking virtual hosts into account -#### -'virtual_port' => <<'END_OF_FUNC', -sub virtual_port { - my($self) = self_or_default(@_); - my $vh = $self->http('x_forwarded_host') || $self->http('host'); - my $protocol = $self->protocol; - if ($vh) { - return ($vh =~ /:(\d+)$/)[0] || ($protocol eq 'https' ? 443 : 80); - } else { - return $self->server_port(); - } -} -END_OF_FUNC - -#### Method: server_port -# Return the tcp/ip port the server is running on -#### -'server_port' => <<'END_OF_FUNC', -sub server_port { - return $ENV{'SERVER_PORT'} || 80; # for debugging -} -END_OF_FUNC - -#### Method: server_protocol -# Return the protocol (usually HTTP/1.0) -#### -'server_protocol' => <<'END_OF_FUNC', -sub server_protocol { - return $ENV{'SERVER_PROTOCOL'} || 'HTTP/1.0'; # for debugging -} -END_OF_FUNC - -#### Method: http -# Return the value of an HTTP variable, or -# the list of variables if none provided -#### -'http' => <<'END_OF_FUNC', -sub http { - my ($self,$parameter) = self_or_CGI(@_); - return $ENV{$parameter} if $parameter=~/^HTTP/; - $parameter =~ tr/-/_/; - return $ENV{"HTTP_\U$parameter\E"} if $parameter; - my(@p); - foreach (keys %ENV) { - push(@p,$_) if /^HTTP/; - } - return @p; -} -END_OF_FUNC - -#### Method: https -# Return the value of HTTPS -#### -'https' => <<'END_OF_FUNC', -sub https { - local($^W)=0; - my ($self,$parameter) = self_or_CGI(@_); - return $ENV{HTTPS} unless $parameter; - return $ENV{$parameter} if $parameter=~/^HTTPS/; - $parameter =~ tr/-/_/; - return $ENV{"HTTPS_\U$parameter\E"} if $parameter; - my(@p); - foreach (keys %ENV) { - push(@p,$_) if /^HTTPS/; - } - return @p; -} -END_OF_FUNC - -#### Method: protocol -# Return the protocol (http or https currently) -#### -'protocol' => <<'END_OF_FUNC', -sub protocol { - local($^W)=0; - my $self = shift; - return 'https' if uc($self->https()) eq 'ON'; - return 'https' if $self->server_port == 443; - my $prot = $self->server_protocol; - my($protocol,$version) = split('/',$prot); - return "\L$protocol\E"; -} -END_OF_FUNC - -#### Method: remote_ident -# Return the identity of the remote user -# (but only if his host is running identd) -#### -'remote_ident' => <<'END_OF_FUNC', -sub remote_ident { - return $ENV{'REMOTE_IDENT'}; -} -END_OF_FUNC - - -#### Method: auth_type -# Return the type of use verification/authorization in use, if any. -#### -'auth_type' => <<'END_OF_FUNC', -sub auth_type { - return $ENV{'AUTH_TYPE'}; -} -END_OF_FUNC - - -#### Method: remote_user -# Return the authorization name used for user -# verification. -#### -'remote_user' => <<'END_OF_FUNC', -sub remote_user { - return $ENV{'REMOTE_USER'}; -} -END_OF_FUNC - - -#### Method: user_name -# Try to return the remote user's name by hook or by -# crook -#### -'user_name' => <<'END_OF_FUNC', -sub user_name { - my ($self) = self_or_CGI(@_); - return $self->http('from') || $ENV{'REMOTE_IDENT'} || $ENV{'REMOTE_USER'}; -} -END_OF_FUNC - -#### Method: nosticky -# Set or return the NOSTICKY global flag -#### -'nosticky' => <<'END_OF_FUNC', -sub nosticky { - my ($self,$param) = self_or_CGI(@_); - $CGI::NOSTICKY = $param if defined($param); - return $CGI::NOSTICKY; -} -END_OF_FUNC - -#### Method: nph -# Set or return the NPH global flag -#### -'nph' => <<'END_OF_FUNC', -sub nph { - my ($self,$param) = self_or_CGI(@_); - $CGI::NPH = $param if defined($param); - return $CGI::NPH; -} -END_OF_FUNC - -#### Method: private_tempfiles -# Set or return the private_tempfiles global flag -#### -'private_tempfiles' => <<'END_OF_FUNC', -sub private_tempfiles { - my ($self,$param) = self_or_CGI(@_); - $CGI::PRIVATE_TEMPFILES = $param if defined($param); - return $CGI::PRIVATE_TEMPFILES; -} -END_OF_FUNC -#### Method: close_upload_files -# Set or return the close_upload_files global flag -#### -'close_upload_files' => <<'END_OF_FUNC', -sub close_upload_files { - my ($self,$param) = self_or_CGI(@_); - $CGI::CLOSE_UPLOAD_FILES = $param if defined($param); - return $CGI::CLOSE_UPLOAD_FILES; -} -END_OF_FUNC - - -#### Method: default_dtd -# Set or return the default_dtd global -#### -'default_dtd' => <<'END_OF_FUNC', -sub default_dtd { - my ($self,$param,$param2) = self_or_CGI(@_); - if (defined $param2 && defined $param) { - $CGI::DEFAULT_DTD = [ $param, $param2 ]; - } elsif (defined $param) { - $CGI::DEFAULT_DTD = $param; - } - return $CGI::DEFAULT_DTD; -} -END_OF_FUNC - -# -------------- really private subroutines ----------------- -'previous_or_default' => <<'END_OF_FUNC', -sub previous_or_default { - my($self,$name,$defaults,$override) = @_; - my(%selected); - - if (!$override && ($self->{'.fieldnames'}->{$name} || - defined($self->param($name)) ) ) { - grep($selected{$_}++,$self->param($name)); - } elsif (defined($defaults) && ref($defaults) && - (ref($defaults) eq 'ARRAY')) { - grep($selected{$_}++,@{$defaults}); - } else { - $selected{$defaults}++ if defined($defaults); - } - - return %selected; -} -END_OF_FUNC - -'register_parameter' => <<'END_OF_FUNC', -sub register_parameter { - my($self,$param) = @_; - $self->{'.parametersToAdd'}->{$param}++; -} -END_OF_FUNC - -'get_fields' => <<'END_OF_FUNC', -sub get_fields { - my($self) = @_; - return $self->CGI::hidden('-name'=>'.cgifields', - '-values'=>[keys %{$self->{'.parametersToAdd'}}], - '-override'=>1); -} -END_OF_FUNC - -'read_from_cmdline' => <<'END_OF_FUNC', -sub read_from_cmdline { - my($input,@words); - my($query_string); - my($subpath); - if ($DEBUG && @ARGV) { - @words = @ARGV; - } elsif ($DEBUG > 1) { - require "shellwords.pl"; - print STDERR "(offline mode: enter name=value pairs on standard input; press ^D or ^Z when done)\n"; - chomp(@lines = ); # remove newlines - $input = join(" ",@lines); - @words = &shellwords($input); - } - foreach (@words) { - s/\\=/%3D/g; - s/\\&/%26/g; - } - - if ("@words"=~/=/) { - $query_string = join('&',@words); - } else { - $query_string = join('+',@words); - } - if ($query_string =~ /^(.*?)\?(.*)$/) - { - $query_string = $2; - $subpath = $1; - } - return { 'query_string' => $query_string, 'subpath' => $subpath }; -} -END_OF_FUNC - -##### -# subroutine: read_multipart -# -# Read multipart data and store it into our parameters. -# An interesting feature is that if any of the parts is a file, we -# create a temporary file and open up a filehandle on it so that the -# caller can read from it if necessary. -##### -'read_multipart' => <<'END_OF_FUNC', -sub read_multipart { - my($self,$boundary,$length) = @_; - my($buffer) = $self->new_MultipartBuffer($boundary,$length); - return unless $buffer; - my(%header,$body); - my $filenumber = 0; - while (!$buffer->eof) { - %header = $buffer->readHeader; - - unless (%header) { - $self->cgi_error("400 Bad request (malformed multipart POST)"); - return; - } - - my($param)= $header{'Content-Disposition'}=~/ name="([^;]*)"/; - $param .= $TAINTED; - - # Bug: Netscape doesn't escape quotation marks in file names!!! - my($filename) = $header{'Content-Disposition'}=~/ filename="([^;]*)"/; - # Test for Opera's multiple upload feature - my($multipart) = ( defined( $header{'Content-Type'} ) && - $header{'Content-Type'} =~ /multipart\/mixed/ ) ? - 1 : 0; - - # add this parameter to our list - $self->add_parameter($param); - - # If no filename specified, then just read the data and assign it - # to our parameter list. - if ( ( !defined($filename) || $filename eq '' ) && !$multipart ) { - my($value) = $buffer->readBody; - $value .= $TAINTED; - push(@{$self->{$param}},$value); - next; - } - - my ($tmpfile,$tmp,$filehandle); - UPLOADS: { - # If we get here, then we are dealing with a potentially large - # uploaded form. Save the data to a temporary file, then open - # the file for reading. - - # skip the file if uploads disabled - if ($DISABLE_UPLOADS) { - while (defined($data = $buffer->read)) { } - last UPLOADS; - } - - # set the filename to some recognizable value - if ( ( !defined($filename) || $filename eq '' ) && $multipart ) { - $filename = "multipart/mixed"; - } - - # choose a relatively unpredictable tmpfile sequence number - my $seqno = unpack("%16C*",join('',localtime,grep {defined $_} values %ENV)); - for (my $cnt=10;$cnt>0;$cnt--) { - next unless $tmpfile = new CGITempFile($seqno); - $tmp = $tmpfile->as_string; - last if defined($filehandle = Fh->new($filename,$tmp,$PRIVATE_TEMPFILES)); - $seqno += int rand(100); - } - die "CGI open of tmpfile: $!\n" unless defined $filehandle; - $CGI::DefaultClass->binmode($filehandle) if $CGI::needs_binmode - && defined fileno($filehandle); - - # if this is an multipart/mixed attachment, save the header - # together with the body for later parsing with an external - # MIME parser module - if ( $multipart ) { - foreach ( keys %header ) { - print $filehandle "$_: $header{$_}${CRLF}"; - } - print $filehandle "${CRLF}"; - } - - my ($data); - local($\) = ''; - my $totalbytes; - while (defined($data = $buffer->read)) { - if (defined $self->{'.upload_hook'}) - { - $totalbytes += length($data); - &{$self->{'.upload_hook'}}($filename ,$data, $totalbytes, $self->{'.upload_data'}); - } - print $filehandle $data; - } - - # back up to beginning of file - seek($filehandle,0,0); - - ## Close the filehandle if requested this allows a multipart MIME - ## upload to contain many files, and we won't die due to too many - ## open file handles. The user can access the files using the hash - ## below. - close $filehandle if $CLOSE_UPLOAD_FILES; - $CGI::DefaultClass->binmode($filehandle) if $CGI::needs_binmode; - - # Save some information about the uploaded file where we can get - # at it later. - # Use the typeglob as the key, as this is guaranteed to be - # unique for each filehandle. Don't use the file descriptor as - # this will be re-used for each filehandle if the - # close_upload_files feature is used. - $self->{'.tmpfiles'}->{$$filehandle}= { - hndl => $filehandle, - name => $tmpfile, - info => {%header}, - }; - push(@{$self->{$param}},$filehandle); - } - } -} -END_OF_FUNC - -'upload' =><<'END_OF_FUNC', -sub upload { - my($self,$param_name) = self_or_default(@_); - my @param = grep(ref && fileno($_), $self->param($param_name)); - return unless @param; - return wantarray ? @param : $param[0]; -} -END_OF_FUNC - -'tmpFileName' => <<'END_OF_FUNC', -sub tmpFileName { - my($self,$filename) = self_or_default(@_); - return $self->{'.tmpfiles'}->{$$filename}->{name} ? - $self->{'.tmpfiles'}->{$$filename}->{name}->as_string - : ''; -} -END_OF_FUNC - -'uploadInfo' => <<'END_OF_FUNC', -sub uploadInfo { - my($self,$filename) = self_or_default(@_); - return $self->{'.tmpfiles'}->{$$filename}->{info}; -} -END_OF_FUNC - -# internal routine, don't use -'_set_values_and_labels' => <<'END_OF_FUNC', -sub _set_values_and_labels { - my $self = shift; - my ($v,$l,$n) = @_; - $$l = $v if ref($v) eq 'HASH' && !ref($$l); - return $self->param($n) if !defined($v); - return $v if !ref($v); - return ref($v) eq 'HASH' ? keys %$v : @$v; -} -END_OF_FUNC - -# internal routine, don't use -'_set_attributes' => <<'END_OF_FUNC', -sub _set_attributes { - my $self = shift; - my($element, $attributes) = @_; - return '' unless defined($attributes->{$element}); - $attribs = ' '; - foreach my $attrib (keys %{$attributes->{$element}}) { - (my $clean_attrib = $attrib) =~ s/^-//; - $attribs .= "@{[lc($clean_attrib)]}=\"$attributes->{$element}{$attrib}\" "; - } - $attribs =~ s/ $//; - return $attribs; -} -END_OF_FUNC - -'_compile_all' => <<'END_OF_FUNC', -sub _compile_all { - foreach (@_) { - next if defined(&$_); - $AUTOLOAD = "CGI::$_"; - _compile(); - } -} -END_OF_FUNC - -); -END_OF_AUTOLOAD -; - -######################################################### -# Globals and stubs for other packages that we use. -######################################################### - -################### Fh -- lightweight filehandle ############### -package Fh; -use overload - '""' => \&asString, - 'cmp' => \&compare, - 'fallback'=>1; - -$FH='fh00000'; - -*Fh::AUTOLOAD = \&CGI::AUTOLOAD; - -sub DESTROY { - my $self = shift; - close $self; -} - -$AUTOLOADED_ROUTINES = ''; # prevent -w error -$AUTOLOADED_ROUTINES=<<'END_OF_AUTOLOAD'; -%SUBS = ( -'asString' => <<'END_OF_FUNC', -sub asString { - my $self = shift; - # get rid of package name - (my $i = $$self) =~ s/^\*(\w+::fh\d{5})+//; - $i =~ s/%(..)/ chr(hex($1)) /eg; - return $i.$CGI::TAINTED; -# BEGIN DEAD CODE -# This was an extremely clever patch that allowed "use strict refs". -# Unfortunately it relied on another bug that caused leaky file descriptors. -# The underlying bug has been fixed, so this no longer works. However -# "strict refs" still works for some reason. -# my $self = shift; -# return ${*{$self}{SCALAR}}; -# END DEAD CODE -} -END_OF_FUNC - -'compare' => <<'END_OF_FUNC', -sub compare { - my $self = shift; - my $value = shift; - return "$self" cmp $value; -} -END_OF_FUNC - -'new' => <<'END_OF_FUNC', -sub new { - my($pack,$name,$file,$delete) = @_; - _setup_symbols(@SAVED_SYMBOLS) if @SAVED_SYMBOLS; - require Fcntl unless defined &Fcntl::O_RDWR; - (my $safename = $name) =~ s/([':%])/ sprintf '%%%02X', ord $1 /eg; - my $fv = ++$FH . $safename; - my $ref = \*{"Fh::$fv"}; - $file =~ m!^([a-zA-Z0-9_ \'\":/.\$\\-]+)$! || return; - my $safe = $1; - sysopen($ref,$safe,Fcntl::O_RDWR()|Fcntl::O_CREAT()|Fcntl::O_EXCL(),0600) || return; - unlink($safe) if $delete; - CORE::delete $Fh::{$fv}; - return bless $ref,$pack; -} -END_OF_FUNC - -); -END_OF_AUTOLOAD - -######################## MultipartBuffer #################### -package MultipartBuffer; - -use constant DEBUG => 0; - -# how many bytes to read at a time. We use -# a 4K buffer by default. -$INITIAL_FILLUNIT = 1024 * 4; -$TIMEOUT = 240*60; # 4 hour timeout for big files -$SPIN_LOOP_MAX = 2000; # bug fix for some Netscape servers -$CRLF=$CGI::CRLF; - -#reuse the autoload function -*MultipartBuffer::AUTOLOAD = \&CGI::AUTOLOAD; - -# avoid autoloader warnings -sub DESTROY {} - -############################################################################### -################# THESE FUNCTIONS ARE AUTOLOADED ON DEMAND #################### -############################################################################### -$AUTOLOADED_ROUTINES = ''; # prevent -w error -$AUTOLOADED_ROUTINES=<<'END_OF_AUTOLOAD'; -%SUBS = ( - -'new' => <<'END_OF_FUNC', -sub new { - my($package,$interface,$boundary,$length) = @_; - $FILLUNIT = $INITIAL_FILLUNIT; - $CGI::DefaultClass->binmode($IN); # if $CGI::needs_binmode; # just do it always - - # If the user types garbage into the file upload field, - # then Netscape passes NOTHING to the server (not good). - # We may hang on this read in that case. So we implement - # a read timeout. If nothing is ready to read - # by then, we return. - - # Netscape seems to be a little bit unreliable - # about providing boundary strings. - my $boundary_read = 0; - if ($boundary) { - - # Under the MIME spec, the boundary consists of the - # characters "--" PLUS the Boundary string - - # BUG: IE 3.01 on the Macintosh uses just the boundary -- not - # the two extra hyphens. We do a special case here on the user-agent!!!! - $boundary = "--$boundary" unless CGI::user_agent('MSIE\s+3\.0[12];\s*Mac|DreamPassport'); - - } else { # otherwise we find it ourselves - my($old); - ($old,$/) = ($/,$CRLF); # read a CRLF-delimited line - $boundary = ; # BUG: This won't work correctly under mod_perl - $length -= length($boundary); - chomp($boundary); # remove the CRLF - $/ = $old; # restore old line separator - $boundary_read++; - } - - my $self = {LENGTH=>$length, - CHUNKED=>!defined $length, - BOUNDARY=>$boundary, - INTERFACE=>$interface, - BUFFER=>'', - }; - - $FILLUNIT = length($boundary) - if length($boundary) > $FILLUNIT; - - my $retval = bless $self,ref $package || $package; - - # Read the preamble and the topmost (boundary) line plus the CRLF. - unless ($boundary_read) { - while ($self->read(0)) { } - } - die "Malformed multipart POST: data truncated\n" if $self->eof; - - return $retval; -} -END_OF_FUNC - -'readHeader' => <<'END_OF_FUNC', -sub readHeader { - my($self) = @_; - my($end); - my($ok) = 0; - my($bad) = 0; - - local($CRLF) = "\015\012" if $CGI::OS eq 'VMS' || $CGI::EBCDIC; - - do { - $self->fillBuffer($FILLUNIT); - $ok++ if ($end = index($self->{BUFFER},"${CRLF}${CRLF}")) >= 0; - $ok++ if $self->{BUFFER} eq ''; - $bad++ if !$ok && $self->{LENGTH} <= 0; - # this was a bad idea - # $FILLUNIT *= 2 if length($self->{BUFFER}) >= $FILLUNIT; - } until $ok || $bad; - return () if $bad; - - #EBCDIC NOTE: translate header into EBCDIC, but watch out for continuation lines! - - my($header) = substr($self->{BUFFER},0,$end+2); - substr($self->{BUFFER},0,$end+4) = ''; - my %return; - - if ($CGI::EBCDIC) { - warn "untranslated header=$header\n" if DEBUG; - $header = CGI::Util::ascii2ebcdic($header); - warn "translated header=$header\n" if DEBUG; - } - - # See RFC 2045 Appendix A and RFC 822 sections 3.4.8 - # (Folding Long Header Fields), 3.4.3 (Comments) - # and 3.4.5 (Quoted-Strings). - - my $token = '[-\w!\#$%&\'*+.^_\`|{}~]'; - $header=~s/$CRLF\s+/ /og; # merge continuation lines - - while ($header=~/($token+):\s+([^$CRLF]*)/mgox) { - my ($field_name,$field_value) = ($1,$2); - $field_name =~ s/\b(\w)/uc($1)/eg; #canonicalize - $return{$field_name}=$field_value; - } - return %return; -} -END_OF_FUNC - -# This reads and returns the body as a single scalar value. -'readBody' => <<'END_OF_FUNC', -sub readBody { - my($self) = @_; - my($data); - my($returnval)=''; - - #EBCDIC NOTE: want to translate returnval into EBCDIC HERE - - while (defined($data = $self->read)) { - $returnval .= $data; - } - - if ($CGI::EBCDIC) { - warn "untranslated body=$returnval\n" if DEBUG; - $returnval = CGI::Util::ascii2ebcdic($returnval); - warn "translated body=$returnval\n" if DEBUG; - } - return $returnval; -} -END_OF_FUNC - -# This will read $bytes or until the boundary is hit, whichever happens -# first. After the boundary is hit, we return undef. The next read will -# skip over the boundary and begin reading again; -'read' => <<'END_OF_FUNC', -sub read { - my($self,$bytes) = @_; - - # default number of bytes to read - $bytes = $bytes || $FILLUNIT; - - # Fill up our internal buffer in such a way that the boundary - # is never split between reads. - $self->fillBuffer($bytes); - - my $boundary_start = $CGI::EBCDIC ? CGI::Util::ebcdic2ascii($self->{BOUNDARY}) : $self->{BOUNDARY}; - my $boundary_end = $CGI::EBCDIC ? CGI::Util::ebcdic2ascii($self->{BOUNDARY}.'--') : $self->{BOUNDARY}.'--'; - - # Find the boundary in the buffer (it may not be there). - my $start = index($self->{BUFFER},$boundary_start); - - warn "boundary=$self->{BOUNDARY} length=$self->{LENGTH} start=$start\n" if DEBUG; - - # protect against malformed multipart POST operations - die "Malformed multipart POST\n" unless $self->{CHUNKED} || ($start >= 0 || $self->{LENGTH} > 0); - - #EBCDIC NOTE: want to translate boundary search into ASCII here. - - # If the boundary begins the data, then skip past it - # and return undef. - if ($start == 0) { - - # clear us out completely if we've hit the last boundary. - if (index($self->{BUFFER},$boundary_end)==0) { - $self->{BUFFER}=''; - $self->{LENGTH}=0; - return undef; - } - - # just remove the boundary. - substr($self->{BUFFER},0,length($boundary_start))=''; - $self->{BUFFER} =~ s/^\012\015?//; - return undef; - } - - my $bytesToReturn; - if ($start > 0) { # read up to the boundary - $bytesToReturn = $start-2 > $bytes ? $bytes : $start; - } else { # read the requested number of bytes - # leave enough bytes in the buffer to allow us to read - # the boundary. Thanks to Kevin Hendrick for finding - # this one. - $bytesToReturn = $bytes - (length($boundary_start)+1); - } - - my $returnval=substr($self->{BUFFER},0,$bytesToReturn); - substr($self->{BUFFER},0,$bytesToReturn)=''; - - # If we hit the boundary, remove the CRLF from the end. - return ($bytesToReturn==$start) - ? substr($returnval,0,-2) : $returnval; -} -END_OF_FUNC - - -# This fills up our internal buffer in such a way that the -# boundary is never split between reads -'fillBuffer' => <<'END_OF_FUNC', -sub fillBuffer { - my($self,$bytes) = @_; - return unless $self->{CHUNKED} || $self->{LENGTH}; - - my($boundaryLength) = length($self->{BOUNDARY}); - my($bufferLength) = length($self->{BUFFER}); - my($bytesToRead) = $bytes - $bufferLength + $boundaryLength + 2; - $bytesToRead = $self->{LENGTH} if !$self->{CHUNKED} && $self->{LENGTH} < $bytesToRead; - - # Try to read some data. We may hang here if the browser is screwed up. - my $bytesRead = $self->{INTERFACE}->read_from_client(\$self->{BUFFER}, - $bytesToRead, - $bufferLength); - warn "bytesToRead=$bytesToRead, bufferLength=$bufferLength, buffer=$self->{BUFFER}\n" if DEBUG; - $self->{BUFFER} = '' unless defined $self->{BUFFER}; - - # An apparent bug in the Apache server causes the read() - # to return zero bytes repeatedly without blocking if the - # remote user aborts during a file transfer. I don't know how - # they manage this, but the workaround is to abort if we get - # more than SPIN_LOOP_MAX consecutive zero reads. - if ($bytesRead <= 0) { - die "CGI.pm: Server closed socket during multipart read (client aborted?).\n" - if ($self->{ZERO_LOOP_COUNTER}++ >= $SPIN_LOOP_MAX); - } else { - $self->{ZERO_LOOP_COUNTER}=0; - } - - $self->{LENGTH} -= $bytesRead if !$self->{CHUNKED} && $bytesRead; -} -END_OF_FUNC - - -# Return true when we've finished reading -'eof' => <<'END_OF_FUNC' -sub eof { - my($self) = @_; - return 1 if (length($self->{BUFFER}) == 0) - && ($self->{LENGTH} <= 0); - undef; -} -END_OF_FUNC - -); -END_OF_AUTOLOAD - -#################################################################################### -################################## TEMPORARY FILES ################################# -#################################################################################### -package CGITempFile; - -sub find_tempdir { - $SL = $CGI::SL; - $MAC = $CGI::OS eq 'MACINTOSH'; - my ($vol) = $MAC ? MacPerl::Volumes() =~ /:(.*)/ : ""; - unless (defined $TMPDIRECTORY) { - @TEMP=("${SL}usr${SL}tmp","${SL}var${SL}tmp", - "C:${SL}temp","${SL}tmp","${SL}temp", - "${vol}${SL}Temporary Items", - "${SL}WWW_ROOT", "${SL}SYS\$SCRATCH", - "C:${SL}system${SL}temp"); - unshift(@TEMP,$ENV{'TMPDIR'}) if defined $ENV{'TMPDIR'}; - - # this feature was supposed to provide per-user tmpfiles, but - # it is problematic. - # unshift(@TEMP,(getpwuid($<))[7].'/tmp') if $CGI::OS eq 'UNIX'; - # Rob: getpwuid() is unfortunately UNIX specific. On brain dead OS'es this - # : can generate a 'getpwuid() not implemented' exception, even though - # : it's never called. Found under DOS/Win with the DJGPP perl port. - # : Refer to getpwuid() only at run-time if we're fortunate and have UNIX. - # unshift(@TEMP,(eval {(getpwuid($>))[7]}).'/tmp') if $CGI::OS eq 'UNIX' and $> != 0; - - foreach (@TEMP) { - do {$TMPDIRECTORY = $_; last} if -d $_ && -w _; - } - } - $TMPDIRECTORY = $MAC ? "" : "." unless $TMPDIRECTORY; -} - -find_tempdir(); - -$MAXTRIES = 5000; - -# cute feature, but overload implementation broke it -# %OVERLOAD = ('""'=>'as_string'); -*CGITempFile::AUTOLOAD = \&CGI::AUTOLOAD; - -sub DESTROY { - my($self) = @_; - $$self =~ m!^([a-zA-Z0-9_ \'\":/.\$\\-]+)$! || return; - my $safe = $1; # untaint operation - unlink $safe; # get rid of the file -} - -############################################################################### -################# THESE FUNCTIONS ARE AUTOLOADED ON DEMAND #################### -############################################################################### -$AUTOLOADED_ROUTINES = ''; # prevent -w error -$AUTOLOADED_ROUTINES=<<'END_OF_AUTOLOAD'; -%SUBS = ( - -'new' => <<'END_OF_FUNC', -sub new { - my($package,$sequence) = @_; - my $filename; - find_tempdir() unless -w $TMPDIRECTORY; - for (my $i = 0; $i < $MAXTRIES; $i++) { - last if ! -f ($filename = sprintf("${TMPDIRECTORY}${SL}CGItemp%d",$sequence++)); - } - # check that it is a more-or-less valid filename - return unless $filename =~ m!^([a-zA-Z0-9_ \'\":/.\$\\-]+)$!; - # this used to untaint, now it doesn't - # $filename = $1; - return bless \$filename; -} -END_OF_FUNC - -'as_string' => <<'END_OF_FUNC' -sub as_string { - my($self) = @_; - return $$self; -} -END_OF_FUNC - -); -END_OF_AUTOLOAD - -package CGI; - -# We get a whole bunch of warnings about "possibly uninitialized variables" -# when running with the -w switch. Touch them all once to get rid of the -# warnings. This is ugly and I hate it. -if ($^W) { - $CGI::CGI = ''; - $CGI::CGI=<'words', - -values=>['eenie','meenie','minie','moe'], - -defaults=>['eenie','minie']), p, - "What's your favorite color? ", - popup_menu(-name=>'color', - -values=>['red','green','blue','chartreuse']),p, - submit, - end_form, - hr; - - if (param()) { - my $name = param('name'); - my $keywords = join ', ',param('words'); - my $color = param('color'); - print "Your name is",em(escapeHTML($name)),p, - "The keywords are: ",em(escapeHTML($keywords)),p, - "Your favorite color is ",em(escapeHTML($color)), - hr; - } - -=head1 ABSTRACT - -This perl library uses perl5 objects to make it easy to create Web -fill-out forms and parse their contents. This package defines CGI -objects, entities that contain the values of the current query string -and other state variables. Using a CGI object's methods, you can -examine keywords and parameters passed to your script, and create -forms whose initial values are taken from the current query (thereby -preserving state information). The module provides shortcut functions -that produce boilerplate HTML, reducing typing and coding errors. It -also provides functionality for some of the more advanced features of -CGI scripting, including support for file uploads, cookies, cascading -style sheets, server push, and frames. - -CGI.pm also provides a simple function-oriented programming style for -those who don't need its object-oriented features. - -The current version of CGI.pm is available at - - http://www.genome.wi.mit.edu/ftp/pub/software/WWW/cgi_docs.html - ftp://ftp-genome.wi.mit.edu/pub/software/WWW/ - -=head1 DESCRIPTION - -=head2 PROGRAMMING STYLE - -There are two styles of programming with CGI.pm, an object-oriented -style and a function-oriented style. In the object-oriented style you -create one or more CGI objects and then use object methods to create -the various elements of the page. Each CGI object starts out with the -list of named parameters that were passed to your CGI script by the -server. You can modify the objects, save them to a file or database -and recreate them. Because each object corresponds to the "state" of -the CGI script, and because each object's parameter list is -independent of the others, this allows you to save the state of the -script and restore it later. - -For example, using the object oriented style, here is how you create -a simple "Hello World" HTML page: - - #!/usr/local/bin/perl -w - use CGI; # load CGI routines - $q = new CGI; # create new CGI object - print $q->header, # create the HTTP header - $q->start_html('hello world'), # start the HTML - $q->h1('hello world'), # level 1 header - $q->end_html; # end the HTML - -In the function-oriented style, there is one default CGI object that -you rarely deal with directly. Instead you just call functions to -retrieve CGI parameters, create HTML tags, manage cookies, and so -on. This provides you with a cleaner programming interface, but -limits you to using one CGI object at a time. The following example -prints the same page, but uses the function-oriented interface. -The main differences are that we now need to import a set of functions -into our name space (usually the "standard" functions), and we don't -need to create the CGI object. - - #!/usr/local/bin/perl - use CGI qw/:standard/; # load standard CGI routines - print header, # create the HTTP header - start_html('hello world'), # start the HTML - h1('hello world'), # level 1 header - end_html; # end the HTML - -The examples in this document mainly use the object-oriented style. -See HOW TO IMPORT FUNCTIONS for important information on -function-oriented programming in CGI.pm - -=head2 CALLING CGI.PM ROUTINES - -Most CGI.pm routines accept several arguments, sometimes as many as 20 -optional ones! To simplify this interface, all routines use a named -argument calling style that looks like this: - - print $q->header(-type=>'image/gif',-expires=>'+3d'); - -Each argument name is preceded by a dash. Neither case nor order -matters in the argument list. -type, -Type, and -TYPE are all -acceptable. In fact, only the first argument needs to begin with a -dash. If a dash is present in the first argument, CGI.pm assumes -dashes for the subsequent ones. - -Several routines are commonly called with just one argument. In the -case of these routines you can provide the single argument without an -argument name. header() happens to be one of these routines. In this -case, the single argument is the document type. - - print $q->header('text/html'); - -Other such routines are documented below. - -Sometimes named arguments expect a scalar, sometimes a reference to an -array, and sometimes a reference to a hash. Often, you can pass any -type of argument and the routine will do whatever is most appropriate. -For example, the param() routine is used to set a CGI parameter to a -single or a multi-valued value. The two cases are shown below: - - $q->param(-name=>'veggie',-value=>'tomato'); - $q->param(-name=>'veggie',-value=>['tomato','tomahto','potato','potahto']); - -A large number of routines in CGI.pm actually aren't specifically -defined in the module, but are generated automatically as needed. -These are the "HTML shortcuts," routines that generate HTML tags for -use in dynamically-generated pages. HTML tags have both attributes -(the attribute="value" pairs within the tag itself) and contents (the -part between the opening and closing pairs.) To distinguish between -attributes and contents, CGI.pm uses the convention of passing HTML -attributes as a hash reference as the first argument, and the -contents, if any, as any subsequent arguments. It works out like -this: - - Code Generated HTML - ---- -------------- - h1()

    - h1('some','contents');

    some contents

    - h1({-align=>left});

    - h1({-align=>left},'contents');

    contents

    - -HTML tags are described in more detail later. - -Many newcomers to CGI.pm are puzzled by the difference between the -calling conventions for the HTML shortcuts, which require curly braces -around the HTML tag attributes, and the calling conventions for other -routines, which manage to generate attributes without the curly -brackets. Don't be confused. As a convenience the curly braces are -optional in all but the HTML shortcuts. If you like, you can use -curly braces when calling any routine that takes named arguments. For -example: - - print $q->header( {-type=>'image/gif',-expires=>'+3d'} ); - -If you use the B<-w> switch, you will be warned that some CGI.pm argument -names conflict with built-in Perl functions. The most frequent of -these is the -values argument, used to create multi-valued menus, -radio button clusters and the like. To get around this warning, you -have several choices: - -=over 4 - -=item 1. - -Use another name for the argument, if one is available. -For example, -value is an alias for -values. - -=item 2. - -Change the capitalization, e.g. -Values - -=item 3. - -Put quotes around the argument name, e.g. '-values' - -=back - -Many routines will do something useful with a named argument that it -doesn't recognize. For example, you can produce non-standard HTTP -header fields by providing them as named arguments: - - print $q->header(-type => 'text/html', - -cost => 'Three smackers', - -annoyance_level => 'high', - -complaints_to => 'bit bucket'); - -This will produce the following nonstandard HTTP header: - - HTTP/1.0 200 OK - Cost: Three smackers - Annoyance-level: high - Complaints-to: bit bucket - Content-type: text/html - -Notice the way that underscores are translated automatically into -hyphens. HTML-generating routines perform a different type of -translation. - -This feature allows you to keep up with the rapidly changing HTTP and -HTML "standards". - -=head2 CREATING A NEW QUERY OBJECT (OBJECT-ORIENTED STYLE): - - $query = new CGI; - -This will parse the input (from both POST and GET methods) and store -it into a perl5 object called $query. - -=head2 CREATING A NEW QUERY OBJECT FROM AN INPUT FILE - - $query = new CGI(INPUTFILE); - -If you provide a file handle to the new() method, it will read -parameters from the file (or STDIN, or whatever). The file can be in -any of the forms describing below under debugging (i.e. a series of -newline delimited TAG=VALUE pairs will work). Conveniently, this type -of file is created by the save() method (see below). Multiple records -can be saved and restored. - -Perl purists will be pleased to know that this syntax accepts -references to file handles, or even references to filehandle globs, -which is the "official" way to pass a filehandle: - - $query = new CGI(\*STDIN); - -You can also initialize the CGI object with a FileHandle or IO::File -object. - -If you are using the function-oriented interface and want to -initialize CGI state from a file handle, the way to do this is with -B. This will (re)initialize the -default CGI object from the indicated file handle. - - open (IN,"test.in") || die; - restore_parameters(IN); - close IN; - -You can also initialize the query object from an associative array -reference: - - $query = new CGI( {'dinosaur'=>'barney', - 'song'=>'I love you', - 'friends'=>[qw/Jessica George Nancy/]} - ); - -or from a properly formatted, URL-escaped query string: - - $query = new CGI('dinosaur=barney&color=purple'); - -or from a previously existing CGI object (currently this clones the -parameter list, but none of the other object-specific fields, such as -autoescaping): - - $old_query = new CGI; - $new_query = new CGI($old_query); - -To create an empty query, initialize it from an empty string or hash: - - $empty_query = new CGI(""); - - -or- - - $empty_query = new CGI({}); - -=head2 FETCHING A LIST OF KEYWORDS FROM THE QUERY: - - @keywords = $query->keywords - -If the script was invoked as the result of an search, the -parsed keywords can be obtained as an array using the keywords() method. - -=head2 FETCHING THE NAMES OF ALL THE PARAMETERS PASSED TO YOUR SCRIPT: - - @names = $query->param - -If the script was invoked with a parameter list -(e.g. "name1=value1&name2=value2&name3=value3"), the param() method -will return the parameter names as a list. If the script was invoked -as an script and contains a string without ampersands -(e.g. "value1+value2+value3") , there will be a single parameter named -"keywords" containing the "+"-delimited keywords. - -NOTE: As of version 1.5, the array of parameter names returned will -be in the same order as they were submitted by the browser. -Usually this order is the same as the order in which the -parameters are defined in the form (however, this isn't part -of the spec, and so isn't guaranteed). - -=head2 FETCHING THE VALUE OR VALUES OF A SINGLE NAMED PARAMETER: - - @values = $query->param('foo'); - - -or- - - $value = $query->param('foo'); - -Pass the param() method a single argument to fetch the value of the -named parameter. If the parameter is multivalued (e.g. from multiple -selections in a scrolling list), you can ask to receive an array. Otherwise -the method will return a single value. - -If a value is not given in the query string, as in the queries -"name1=&name2=" or "name1&name2", it will be returned as an empty -string. This feature is new in 2.63. - - -If the parameter does not exist at all, then param() will return undef -in a scalar context, and the empty list in a list context. - - -=head2 SETTING THE VALUE(S) OF A NAMED PARAMETER: - - $query->param('foo','an','array','of','values'); - -This sets the value for the named parameter 'foo' to an array of -values. This is one way to change the value of a field AFTER -the script has been invoked once before. (Another way is with -the -override parameter accepted by all methods that generate -form elements.) - -param() also recognizes a named parameter style of calling described -in more detail later: - - $query->param(-name=>'foo',-values=>['an','array','of','values']); - - -or- - - $query->param(-name=>'foo',-value=>'the value'); - -=head2 APPENDING ADDITIONAL VALUES TO A NAMED PARAMETER: - - $query->append(-name=>'foo',-values=>['yet','more','values']); - -This adds a value or list of values to the named parameter. The -values are appended to the end of the parameter if it already exists. -Otherwise the parameter is created. Note that this method only -recognizes the named argument calling syntax. - -=head2 IMPORTING ALL PARAMETERS INTO A NAMESPACE: - - $query->import_names('R'); - -This creates a series of variables in the 'R' namespace. For example, -$R::foo, @R:foo. For keyword lists, a variable @R::keywords will appear. -If no namespace is given, this method will assume 'Q'. -WARNING: don't import anything into 'main'; this is a major security -risk!!!! - -NOTE 1: Variable names are transformed as necessary into legal Perl -variable names. All non-legal characters are transformed into -underscores. If you need to keep the original names, you should use -the param() method instead to access CGI variables by name. - -NOTE 2: In older versions, this method was called B. As of version 2.20, -this name has been removed completely to avoid conflict with the built-in -Perl module B operator. - -=head2 DELETING A PARAMETER COMPLETELY: - - $query->delete('foo','bar','baz'); - -This completely clears a list of parameters. It sometimes useful for -resetting parameters that you don't want passed down between script -invocations. - -If you are using the function call interface, use "Delete()" instead -to avoid conflicts with Perl's built-in delete operator. - -=head2 DELETING ALL PARAMETERS: - - $query->delete_all(); - -This clears the CGI object completely. It might be useful to ensure -that all the defaults are taken when you create a fill-out form. - -Use Delete_all() instead if you are using the function call interface. - -=head2 HANDLING NON-URLENCODED ARGUMENTS - - -If POSTed data is not of type application/x-www-form-urlencoded or -multipart/form-data, then the POSTed data will not be processed, but -instead be returned as-is in a parameter named POSTDATA. To retrieve -it, use code like this: - - my $data = $query->param('POSTDATA'); - -(If you don't know what the preceding means, don't worry about it. It -only affects people trying to use CGI for XML processing and other -specialized tasks.) - - -=head2 DIRECT ACCESS TO THE PARAMETER LIST: - - $q->param_fetch('address')->[1] = '1313 Mockingbird Lane'; - unshift @{$q->param_fetch(-name=>'address')},'George Munster'; - -If you need access to the parameter list in a way that isn't covered -by the methods above, you can obtain a direct reference to it by -calling the B method with the name of the . This -will return an array reference to the named parameters, which you then -can manipulate in any way you like. - -You can also use a named argument style using the B<-name> argument. - -=head2 FETCHING THE PARAMETER LIST AS A HASH: - - $params = $q->Vars; - print $params->{'address'}; - @foo = split("\0",$params->{'foo'}); - %params = $q->Vars; - - use CGI ':cgi-lib'; - $params = Vars; - -Many people want to fetch the entire parameter list as a hash in which -the keys are the names of the CGI parameters, and the values are the -parameters' values. The Vars() method does this. Called in a scalar -context, it returns the parameter list as a tied hash reference. -Changing a key changes the value of the parameter in the underlying -CGI parameter list. Called in a list context, it returns the -parameter list as an ordinary hash. This allows you to read the -contents of the parameter list, but not to change it. - -When using this, the thing you must watch out for are multivalued CGI -parameters. Because a hash cannot distinguish between scalar and -list context, multivalued parameters will be returned as a packed -string, separated by the "\0" (null) character. You must split this -packed string in order to get at the individual values. This is the -convention introduced long ago by Steve Brenner in his cgi-lib.pl -module for Perl version 4. - -If you wish to use Vars() as a function, import the I<:cgi-lib> set of -function calls (also see the section on CGI-LIB compatibility). - -=head2 SAVING THE STATE OF THE SCRIPT TO A FILE: - - $query->save(\*FILEHANDLE) - -This will write the current state of the form to the provided -filehandle. You can read it back in by providing a filehandle -to the new() method. Note that the filehandle can be a file, a pipe, -or whatever! - -The format of the saved file is: - - NAME1=VALUE1 - NAME1=VALUE1' - NAME2=VALUE2 - NAME3=VALUE3 - = - -Both name and value are URL escaped. Multi-valued CGI parameters are -represented as repeated names. A session record is delimited by a -single = symbol. You can write out multiple records and read them -back in with several calls to B. You can do this across several -sessions by opening the file in append mode, allowing you to create -primitive guest books, or to keep a history of users' queries. Here's -a short example of creating multiple session records: - - use CGI; - - open (OUT,">>test.out") || die; - $records = 5; - foreach (0..$records) { - my $q = new CGI; - $q->param(-name=>'counter',-value=>$_); - $q->save(\*OUT); - } - close OUT; - - # reopen for reading - open (IN,"test.out") || die; - while (!eof(IN)) { - my $q = new CGI(\*IN); - print $q->param('counter'),"\n"; - } - -The file format used for save/restore is identical to that used by the -Whitehead Genome Center's data exchange format "Boulderio", and can be -manipulated and even databased using Boulderio utilities. See - - http://stein.cshl.org/boulder/ - -for further details. - -If you wish to use this method from the function-oriented (non-OO) -interface, the exported name for this method is B. - -=head2 RETRIEVING CGI ERRORS - -Errors can occur while processing user input, particularly when -processing uploaded files. When these errors occur, CGI will stop -processing and return an empty parameter list. You can test for -the existence and nature of errors using the I function. -The error messages are formatted as HTTP status codes. You can either -incorporate the error text into an HTML page, or use it as the value -of the HTTP status: - - my $error = $q->cgi_error; - if ($error) { - print $q->header(-status=>$error), - $q->start_html('Problems'), - $q->h2('Request not processed'), - $q->strong($error); - exit 0; - } - -When using the function-oriented interface (see the next section), -errors may only occur the first time you call I. Be ready -for this! - -=head2 USING THE FUNCTION-ORIENTED INTERFACE - -To use the function-oriented interface, you must specify which CGI.pm -routines or sets of routines to import into your script's namespace. -There is a small overhead associated with this importation, but it -isn't much. - - use CGI ; - -The listed methods will be imported into the current package; you can -call them directly without creating a CGI object first. This example -shows how to import the B and B -methods, and then use them directly: - - use CGI 'param','header'; - print header('text/plain'); - $zipcode = param('zipcode'); - -More frequently, you'll import common sets of functions by referring -to the groups by name. All function sets are preceded with a ":" -character as in ":html3" (for tags defined in the HTML 3 standard). - -Here is a list of the function sets you can import: - -=over 4 - -=item B<:cgi> - -Import all CGI-handling methods, such as B, B -and the like. - -=item B<:form> - -Import all fill-out form generating methods, such as B. - -=item B<:html2> - -Import all methods that generate HTML 2.0 standard elements. - -=item B<:html3> - -Import all methods that generate HTML 3.0 elements (such as -, and ). - -=item B<:html4> - -Import all methods that generate HTML 4 elements (such as -, and ). - -=item B<:netscape> - -Import all methods that generate Netscape-specific HTML extensions. - -=item B<:html> - -Import all HTML-generating shortcuts (i.e. 'html2' + 'html3' + -'netscape')... - -=item B<:standard> - -Import "standard" features, 'html2', 'html3', 'html4', 'form' and 'cgi'. - -=item B<:all> - -Import all the available methods. For the full list, see the CGI.pm -code, where the variable %EXPORT_TAGS is defined. - -=back - -If you import a function name that is not part of CGI.pm, the module -will treat it as a new HTML tag and generate the appropriate -subroutine. You can then use it like any other HTML tag. This is to -provide for the rapidly-evolving HTML "standard." For example, say -Microsoft comes out with a new tag called (which causes the -user's desktop to be flooded with a rotating gradient fill until his -machine reboots). You don't need to wait for a new version of CGI.pm -to start using it immediately: - - use CGI qw/:standard :html3 gradient/; - print gradient({-start=>'red',-end=>'blue'}); - -Note that in the interests of execution speed CGI.pm does B use -the standard L syntax for specifying load symbols. This may -change in the future. - -If you import any of the state-maintaining CGI or form-generating -methods, a default CGI object will be created and initialized -automatically the first time you use any of the methods that require -one to be present. This includes B, B, -B and the like. (If you need direct access to the CGI -object, you can find it in the global variable B<$CGI::Q>). By -importing CGI.pm methods, you can create visually elegant scripts: - - use CGI qw/:standard/; - print - header, - start_html('Simple Script'), - h1('Simple Script'), - start_form, - "What's your name? ",textfield('name'),p, - "What's the combination?", - checkbox_group(-name=>'words', - -values=>['eenie','meenie','minie','moe'], - -defaults=>['eenie','moe']),p, - "What's your favorite color?", - popup_menu(-name=>'color', - -values=>['red','green','blue','chartreuse']),p, - submit, - end_form, - hr,"\n"; - - if (param) { - print - "Your name is ",em(param('name')),p, - "The keywords are: ",em(join(", ",param('words'))),p, - "Your favorite color is ",em(param('color')),".\n"; - } - print end_html; - -=head2 PRAGMAS - -In addition to the function sets, there are a number of pragmas that -you can import. Pragmas, which are always preceded by a hyphen, -change the way that CGI.pm functions in various ways. Pragmas, -function sets, and individual functions can all be imported in the -same use() line. For example, the following use statement imports the -standard set of functions and enables debugging mode (pragma --debug): - - use CGI qw/:standard -debug/; - -The current list of pragmas is as follows: - -=over 4 - -=item -any - -When you I, then any method that the query object -doesn't recognize will be interpreted as a new HTML tag. This allows -you to support the next I Netscape or Microsoft HTML -extension. This lets you go wild with new and unsupported tags: - - use CGI qw(-any); - $q=new CGI; - print $q->gradient({speed=>'fast',start=>'red',end=>'blue'}); - -Since using any causes any mistyped method name -to be interpreted as an HTML tag, use it with care or not at -all. - -=item -compile - -This causes the indicated autoloaded methods to be compiled up front, -rather than deferred to later. This is useful for scripts that run -for an extended period of time under FastCGI or mod_perl, and for -those destined to be crunched by Malcom Beattie's Perl compiler. Use -it in conjunction with the methods or method families you plan to use. - - use CGI qw(-compile :standard :html3); - -or even - - use CGI qw(-compile :all); - -Note that using the -compile pragma in this way will always have -the effect of importing the compiled functions into the current -namespace. If you want to compile without importing use the -compile() method instead: - - use CGI(); - CGI->compile(); - -This is particularly useful in a mod_perl environment, in which you -might want to precompile all CGI routines in a startup script, and -then import the functions individually in each mod_perl script. - -=item -nosticky - -By default the CGI module implements a state-preserving behavior -called "sticky" fields. The way this works is that if you are -regenerating a form, the methods that generate the form field values -will interrogate param() to see if similarly-named parameters are -present in the query string. If they find a like-named parameter, they -will use it to set their default values. - -Sometimes this isn't what you want. The B<-nosticky> pragma prevents -this behavior. You can also selectively change the sticky behavior in -each element that you generate. - -=item -tabindex - -Automatically add tab index attributes to each form field. With this -option turned off, you can still add tab indexes manually by passing a --tabindex option to each field-generating method. - -=item -no_undef_params - -This keeps CGI.pm from including undef params in the parameter list. - -=item -no_xhtml - -By default, CGI.pm versions 2.69 and higher emit XHTML -(http://www.w3.org/TR/xhtml1/). The -no_xhtml pragma disables this -feature. Thanks to Michalis Kabrianis for this -feature. - -If start_html()'s -dtd parameter specifies an HTML 2.0 or 3.2 DTD, -XHTML will automatically be disabled without needing to use this -pragma. - -=item -nph - -This makes CGI.pm produce a header appropriate for an NPH (no -parsed header) script. You may need to do other things as well -to tell the server that the script is NPH. See the discussion -of NPH scripts below. - -=item -newstyle_urls - -Separate the name=value pairs in CGI parameter query strings with -semicolons rather than ampersands. For example: - - ?name=fred;age=24;favorite_color=3 - -Semicolon-delimited query strings are always accepted, but will not be -emitted by self_url() and query_string() unless the -newstyle_urls -pragma is specified. - -This became the default in version 2.64. - -=item -oldstyle_urls - -Separate the name=value pairs in CGI parameter query strings with -ampersands rather than semicolons. This is no longer the default. - -=item -autoload - -This overrides the autoloader so that any function in your program -that is not recognized is referred to CGI.pm for possible evaluation. -This allows you to use all the CGI.pm functions without adding them to -your symbol table, which is of concern for mod_perl users who are -worried about memory consumption. I when -I<-autoload> is in effect, you cannot use "poetry mode" -(functions without the parenthesis). Use I rather -than I
    , or add something like I -to the top of your script. - -=item -no_debug - -This turns off the command-line processing features. If you want to -run a CGI.pm script from the command line to produce HTML, and you -don't want it to read CGI parameters from the command line or STDIN, -then use this pragma: - - use CGI qw(-no_debug :standard); - -=item -debug - -This turns on full debugging. In addition to reading CGI arguments -from the command-line processing, CGI.pm will pause and try to read -arguments from STDIN, producing the message "(offline mode: enter -name=value pairs on standard input)" features. - -See the section on debugging for more details. - -=item -private_tempfiles - -CGI.pm can process uploaded file. Ordinarily it spools the uploaded -file to a temporary directory, then deletes the file when done. -However, this opens the risk of eavesdropping as described in the file -upload section. Another CGI script author could peek at this data -during the upload, even if it is confidential information. On Unix -systems, the -private_tempfiles pragma will cause the temporary file -to be unlinked as soon as it is opened and before any data is written -into it, reducing, but not eliminating the risk of eavesdropping -(there is still a potential race condition). To make life harder for -the attacker, the program chooses tempfile names by calculating a 32 -bit checksum of the incoming HTTP headers. - -To ensure that the temporary file cannot be read by other CGI scripts, -use suEXEC or a CGI wrapper program to run your script. The temporary -file is created with mode 0600 (neither world nor group readable). - -The temporary directory is selected using the following algorithm: - - 1. if the current user (e.g. "nobody") has a directory named - "tmp" in its home directory, use that (Unix systems only). - - 2. if the environment variable TMPDIR exists, use the location - indicated. - - 3. Otherwise try the locations /usr/tmp, /var/tmp, C:\temp, - /tmp, /temp, ::Temporary Items, and \WWW_ROOT. - -Each of these locations is checked that it is a directory and is -writable. If not, the algorithm tries the next choice. - -=back - -=head2 SPECIAL FORMS FOR IMPORTING HTML-TAG FUNCTIONS - -Many of the methods generate HTML tags. As described below, tag -functions automatically generate both the opening and closing tags. -For example: - - print h1('Level 1 Header'); - -produces - -

    Level 1 Header

    - -There will be some times when you want to produce the start and end -tags yourself. In this case, you can use the form start_I -and end_I, as in: - - print start_h1,'Level 1 Header',end_h1; - -With a few exceptions (described below), start_I and -end_I functions are not generated automatically when you -I. However, you can specify the tags you want to generate -I functions for by putting an asterisk in front of their -name, or, alternatively, requesting either "start_I" or -"end_I" in the import list. - -Example: - - use CGI qw/:standard *table start_ul/; - -In this example, the following functions are generated in addition to -the standard ones: - -=over 4 - -=item 1. start_table() (generates a
    tag) - -=item 2. end_table() (generates a
    tag) - -=item 3. start_ul() (generates a
      tag) - -=item 4. end_ul() (generates a
    tag) - -=back - -=head1 GENERATING DYNAMIC DOCUMENTS - -Most of CGI.pm's functions deal with creating documents on the fly. -Generally you will produce the HTTP header first, followed by the -document itself. CGI.pm provides functions for generating HTTP -headers of various types as well as for generating HTML. For creating -GIF images, see the GD.pm module. - -Each of these functions produces a fragment of HTML or HTTP which you -can print out directly so that it displays in the browser window, -append to a string, or save to a file for later use. - -=head2 CREATING A STANDARD HTTP HEADER: - -Normally the first thing you will do in any CGI script is print out an -HTTP header. This tells the browser what type of document to expect, -and gives other optional information, such as the language, expiration -date, and whether to cache the document. The header can also be -manipulated for special purposes, such as server push and pay per view -pages. - - print header; - - -or- - - print header('image/gif'); - - -or- - - print header('text/html','204 No response'); - - -or- - - print header(-type=>'image/gif', - -nph=>1, - -status=>'402 Payment required', - -expires=>'+3d', - -cookie=>$cookie, - -charset=>'utf-7', - -attachment=>'foo.gif', - -Cost=>'$2.00'); - -header() returns the Content-type: header. You can provide your own -MIME type if you choose, otherwise it defaults to text/html. An -optional second parameter specifies the status code and a human-readable -message. For example, you can specify 204, "No response" to create a -script that tells the browser to do nothing at all. - -The last example shows the named argument style for passing arguments -to the CGI methods using named parameters. Recognized parameters are -B<-type>, B<-status>, B<-expires>, and B<-cookie>. Any other named -parameters will be stripped of their initial hyphens and turned into -header fields, allowing you to specify any HTTP header you desire. -Internal underscores will be turned into hyphens: - - print header(-Content_length=>3002); - -Most browsers will not cache the output from CGI scripts. Every time -the browser reloads the page, the script is invoked anew. You can -change this behavior with the B<-expires> parameter. When you specify -an absolute or relative expiration interval with this parameter, some -browsers and proxy servers will cache the script's output until the -indicated expiration date. The following forms are all valid for the --expires field: - - +30s 30 seconds from now - +10m ten minutes from now - +1h one hour from now - -1d yesterday (i.e. "ASAP!") - now immediately - +3M in three months - +10y in ten years time - Thursday, 25-Apr-1999 00:40:33 GMT at the indicated time & date - -The B<-cookie> parameter generates a header that tells the browser to provide -a "magic cookie" during all subsequent transactions with your script. -Netscape cookies have a special format that includes interesting attributes -such as expiration time. Use the cookie() method to create and retrieve -session cookies. - -The B<-nph> parameter, if set to a true value, will issue the correct -headers to work with a NPH (no-parse-header) script. This is important -to use with certain servers that expect all their scripts to be NPH. - -The B<-charset> parameter can be used to control the character set -sent to the browser. If not provided, defaults to ISO-8859-1. As a -side effect, this sets the charset() method as well. - -The B<-attachment> parameter can be used to turn the page into an -attachment. Instead of displaying the page, some browsers will prompt -the user to save it to disk. The value of the argument is the -suggested name for the saved file. In order for this to work, you may -have to set the B<-type> to "application/octet-stream". - -The B<-p3p> parameter will add a P3P tag to the outgoing header. The -parameter can be an arrayref or a space-delimited string of P3P tags. -For example: - - print header(-p3p=>[qw(CAO DSP LAW CURa)]); - print header(-p3p=>'CAO DSP LAW CURa'); - -In either case, the outgoing header will be formatted as: - - P3P: policyref="/w3c/p3p.xml" cp="CAO DSP LAW CURa" - -=head2 GENERATING A REDIRECTION HEADER - - print redirect('http://somewhere.else/in/movie/land'); - -Sometimes you don't want to produce a document yourself, but simply -redirect the browser elsewhere, perhaps choosing a URL based on the -time of day or the identity of the user. - -The redirect() function redirects the browser to a different URL. If -you use redirection like this, you should B print out a header as -well. - -You should always use full URLs (including the http: or ftp: part) in -redirection requests. Relative URLs will not work correctly. - -You can also use named arguments: - - print redirect(-uri=>'http://somewhere.else/in/movie/land', - -nph=>1, - -status=>301); - -The B<-nph> parameter, if set to a true value, will issue the correct -headers to work with a NPH (no-parse-header) script. This is important -to use with certain servers, such as Microsoft IIS, which -expect all their scripts to be NPH. - -The B<-status> parameter will set the status of the redirect. HTTP -defines three different possible redirection status codes: - - 301 Moved Permanently - 302 Found - 303 See Other - -The default if not specified is 302, which means "moved temporarily." -You may change the status to another status code if you wish. Be -advised that changing the status to anything other than 301, 302 or -303 will probably break redirection. - -=head2 CREATING THE HTML DOCUMENT HEADER - - print start_html(-title=>'Secrets of the Pyramids', - -author=>'fred@capricorn.org', - -base=>'true', - -target=>'_blank', - -meta=>{'keywords'=>'pharaoh secret mummy', - 'copyright'=>'copyright 1996 King Tut'}, - -style=>{'src'=>'/styles/style1.css'}, - -BGCOLOR=>'blue'); - -After creating the HTTP header, most CGI scripts will start writing -out an HTML document. The start_html() routine creates the top of the -page, along with a lot of optional information that controls the -page's appearance and behavior. - -This method returns a canned HTML header and the opening tag. -All parameters are optional. In the named parameter form, recognized -parameters are -title, -author, -base, -xbase, -dtd, -lang and -target -(see below for the explanation). Any additional parameters you -provide, such as the Netscape unofficial BGCOLOR attribute, are added -to the tag. Additional parameters must be proceeded by a -hyphen. - -The argument B<-xbase> allows you to provide an HREF for the tag -different from the current location, as in - - -xbase=>"http://home.mcom.com/" - -All relative links will be interpreted relative to this tag. - -The argument B<-target> allows you to provide a default target frame -for all the links and fill-out forms on the page. B -See the Netscape documentation on frames for details of how to -manipulate this. - - -target=>"answer_window" - -All relative links will be interpreted relative to this tag. -You add arbitrary meta information to the header with the B<-meta> -argument. This argument expects a reference to an associative array -containing name/value pairs of meta information. These will be turned -into a series of header tags that look something like this: - - - - -To create an HTTP-EQUIV type of tag, use B<-head>, described -below. - -The B<-style> argument is used to incorporate cascading stylesheets -into your code. See the section on CASCADING STYLESHEETS for more -information. - -The B<-lang> argument is used to incorporate a language attribute into -the tag. For example: - - print $q->start_html(-lang=>'fr-CA'); - -The default if not specified is "en-US" for US English, unless the --dtd parameter specifies an HTML 2.0 or 3.2 DTD, in which case the -lang attribute is left off. You can force the lang attribute to left -off in other cases by passing an empty string (-lang=>''). - -The B<-encoding> argument can be used to specify the character set for -XHTML. It defaults to iso-8859-1 if not specified. - -The B<-declare_xml> argument, when used in conjunction with XHTML, -will put a declaration at the top of the HTML header. The sole -purpose of this declaration is to declare the character set -encoding. In the absence of -declare_xml, the output HTML will contain -a tag that specifies the encoding, allowing the HTML to pass -most validators. The default for -declare_xml is false. - -You can place other arbitrary HTML elements to the section with the -B<-head> tag. For example, to place the rarely-used element in the -head section, use this: - - print start_html(-head=>Link({-rel=>'next', - -href=>'http://www.capricorn.com/s2.html'})); - -To incorporate multiple HTML elements into the section, just pass an -array reference: - - print start_html(-head=>[ - Link({-rel=>'next', - -href=>'http://www.capricorn.com/s2.html'}), - Link({-rel=>'previous', - -href=>'http://www.capricorn.com/s1.html'}) - ] - ); - -And here's how to create an HTTP-EQUIV tag: - - print start_html(-head=>meta({-http_equiv => 'Content-Type', - -content => 'text/html'})) - - -JAVASCRIPTING: The B<-script>, B<-noScript>, B<-onLoad>, -B<-onMouseOver>, B<-onMouseOut> and B<-onUnload> parameters are used -to add Netscape JavaScript calls to your pages. B<-script> should -point to a block of text containing JavaScript function definitions. -This block will be placed within a \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.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 accomodate 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
    -    if (defined($CGI::Carp::PROGNAME)) 
    -    {
    -      $file = $CGI::Carp::PROGNAME;
    -    }
    -
    -=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_progname cluck ^name= die);
    -
    -$main::SIG{__WARN__}=\&CGI::Carp::warn;
    -
    -$CGI::Carp::VERSION    = '1.29';
    -$CGI::Carp::CUSTOM_MSG = 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) = @_;
    -  realdie ($arg,@rest) if ineval();
    -
    -  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 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 "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/lib/perl5/5.8.8/CGI/Cookie.pm b/lib/perl5/5.8.8/CGI/Cookie.pm deleted file mode 100644 index 789aa25d..00000000 --- a/lib/perl5/5.8.8/CGI/Cookie.pm +++ /dev/null @@ -1,478 +0,0 @@ -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.26'; - -use CGI::Util qw(rearrange unescape escape); -use overload '""' => \&as_string, - 'cmp' => \&compare, - 'fallback'=>1; - -# Turn on special checking for Doug MacEachern's modperl -my $MOD_PERL = 0; -if (exists $ENV{MOD_PERL}) { - 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); - my($name,$value,$path,$domain,$secure,$expires) = - rearrange([NAME,[VALUE,VALUES],PATH,DOMAIN,SECURE,EXPIRES],@_); - - # 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->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); - - 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; - - my($key) = escape($self->name); - my($cookie) = join("=",($key||''),join("&",map escape($_||''),$self->value)); - return join("; ",$cookie,@constant_values); -} - -sub compare { - my $self = shift; - my $value = shift; - return "$self" cmp $value; -} - -# 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'}; -} - -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. - -=back - -=head2 Creating New Cookies - - $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. - -=head2 Sending the Cookie to the Browser - -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/lib/perl5/5.8.8/CGI/Fast.pm b/lib/perl5/5.8.8/CGI/Fast.pm deleted file mode 100644 index 43b8709a..00000000 --- a/lib/perl5/5.8.8/CGI/Fast.pm +++ /dev/null @@ -1,230 +0,0 @@ -package CGI::Fast; - -# 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. - -# The most recent version and complete docs are available at: -# http://www.genome.wi.mit.edu/ftp/pub/software/WWW/cgi_docs.html -# ftp://ftp-genome.wi.mit.edu/pub/software/WWW/ -$CGI::Fast::VERSION='1.05'; - -use CGI; -use FCGI; -@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; - } - } - 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 with the Open Market -FastCGI standard, 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 a FastCGI-enabled Web -server. Open Market's server is FastCGI-savvy. There are also -freely redistributable FastCGI modules for NCSA httpd 1.5 and Apache. -FastCGI-enabling modules for Microsoft Internet Information Server and -Netscape Communications Server have been announced. - -In addition, you'll need a version of the Perl interpreter that has -been linked with the FastCGI I/O library. Precompiled binaries are -available for several platforms, including DEC Alpha, HP-UX and -SPARC/Solaris, or you can rebuild Perl from source with patches -provided in the FastCGI developer's kit. The FastCGI Perl interpreter -can be used in place of your normal Perl without ill consequences. - -You can find FastCGI modules for Apache and NCSA httpd, precompiled -Perl interpreters, and the FastCGI developer's kit all at URL: - - http://www.fastcgi.com/ - -=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/local/bin/perl # must be a FastCGI version of 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/lib/perl5/5.8.8/CGI/Pretty.pm b/lib/perl5/5.8.8/CGI/Pretty.pm deleted file mode 100644 index 2147143e..00000000 --- a/lib/perl5/5.8.8/CGI/Pretty.pm +++ /dev/null @@ -1,276 +0,0 @@ -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 = '1.08'; -$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]; - } - } - else { - \@args = ref(\$_[0]) eq 'ARRAY' ? \@{\$_[0]} : "\@_"; - } - - my \@result; - if ( exists \$ASIS{ "\L$tagname\E" } ) { - \@result = map { "\$tag\$_\$untag\$CGI::Pretty::LINEBREAK" } - \@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; - } - local \$" = "" if \$CGI::Pretty::LINEBREAK || \$CGI::Pretty::INDENT; - 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. - @CGI::Pretty::AS_IS = qw( a pre code script textarea td ); - - 1; -} -sub _reset_globals { initialize_globals(); } - -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 Tags that won't be formatted - -The and
     tags are not formatted.  If these tags were formatted, the
    -user would see the extra indentation on the web browser causing the page to
    -look different than what would be expected.  If you wish to add more tags to
    -the list of tags that are not to be touched, push them onto the C<@AS_IS> array:
    -
    -    push @CGI::Pretty::AS_IS,qw(CODE XMP);
    -
    -=head2 Customizing the Indenting
    -
    -If you wish to have your own personal style of indenting, you can change the
    -C<$INDENT> variable:
    -
    -    $CGI::Pretty::INDENT = "\t\t";
    -
    -would cause the indents to be two tabs.
    -
    -Similarly, if you wish to have more space between lines, you may change the
    -C<$LINEBREAK> variable:
    -
    -    $CGI::Pretty::LINEBREAK = "\n\n";
    -
    -would create two carriage returns between lines.
    -
    -If you decide you want to use the regular CGI indenting, you can easily do 
    -the following:
    -
    -    $CGI::Pretty::INDENT = $CGI::Pretty::LINEBREAK = "";
    -
    -=head1 BUGS
    -
    -This section intentionally left blank.
    -
    -=head1 AUTHOR
    -
    -Brian Paulsen , with minor modifications by
    -Lincoln Stein  for incorporation into the CGI.pm
    -distribution.
    -
    -Copyright 1999, Brian Paulsen.  All rights reserved.
    -
    -This library is free software; you can redistribute it and/or modify
    -it under the same terms as Perl itself.
    -
    -Bug reports and comments to Brian@ThePaulsens.com.  You can also write
    -to lstein@cshl.org, but this code looks pretty hairy to me and I'm not
    -sure I understand it!
    -
    -=head1 SEE ALSO
    -
    -L
    -
    -=cut
    diff --git a/lib/perl5/5.8.8/CGI/Push.pm b/lib/perl5/5.8.8/CGI/Push.pm
    deleted file mode 100644
    index 9e72abda..00000000
    --- a/lib/perl5/5.8.8/CGI/Push.pm
    +++ /dev/null
    @@ -1,325 +0,0 @@
    -package CGI::Push;
    -
    -# 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-2000, 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.
    -
    -# The most recent version and complete docs are available at:
    -#   http://stein.cshl.org/WWW/software/CGI/
    -
    -$CGI::Push::VERSION='1.04';
    -use CGI;
    -use CGI::Util 'rearrange';
    -@ISA = ('CGI');
    -
    -$CGI::DefaultClass = 'CGI::Push';
    -$CGI::Push::AutoloadClass = 'CGI';
    -
    -# add do_push() and push_delay() to exported tags
    -push(@{$CGI::EXPORT_TAGS{':standard'}},'do_push','push_delay');
    -
    -sub do_push {
    -    my ($self,@p) = CGI::self_or_default(@_);
    -
    -    # unbuffer output
    -    $| = 1;
    -    srand;
    -    my ($random) = sprintf("%08.0f",rand()*1E8);
    -    my ($boundary) = "----=_NeXtPaRt$random";
    -
    -    my (@header);
    -    my ($type,$callback,$delay,$last_page,$cookie,$target,$expires,$nph,@other) = rearrange([TYPE,NEXT_PAGE,DELAY,LAST_PAGE,[COOKIE,COOKIES],TARGET,EXPIRES,NPH],@p);
    -    $type = 'text/html' unless $type;
    -    $callback = \&simple_counter unless $callback && ref($callback) eq 'CODE';
    -    $delay = 1 unless defined($delay);
    -    $self->push_delay($delay);
    -    $nph = 1 unless defined($nph);
    -
    -    my(@o);
    -    foreach (@other) { push(@o,split("=")); }
    -    push(@o,'-Target'=>$target) if defined($target);
    -    push(@o,'-Cookie'=>$cookie) if defined($cookie);
    -    push(@o,'-Type'=>"multipart/x-mixed-replace;boundary=\"$boundary\"");
    -    push(@o,'-Server'=>"CGI.pm Push Module") if $nph;
    -    push(@o,'-Status'=>'200 OK');
    -    push(@o,'-nph'=>1) if $nph;
    -    print $self->header(@o);
    -
    -    $boundary = "$CGI::CRLF--$boundary";
    -
    -    print "WARNING: YOUR BROWSER DOESN'T SUPPORT THIS SERVER-PUSH TECHNOLOGY.${boundary}$CGI::CRLF";
    -
    -    my (@contents) = &$callback($self,++$COUNTER);
    -
    -    # now we enter a little loop
    -    while (1) {
    -        print "Content-type: ${type}$CGI::CRLF$CGI::CRLF" unless $type =~ /^dynamic|heterogeneous$/i;
    -        print @contents;
    -        @contents = &$callback($self,++$COUNTER);
    -        if ((@contents) && defined($contents[0])) {
    -            print "${boundary}$CGI::CRLF";
    -            do_sleep($self->push_delay()) if $self->push_delay();
    -        } else {
    -            if ($last_page && ref($last_page) eq 'CODE') {
    -                print "${boundary}$CGI::CRLF";
    -                do_sleep($self->push_delay()) if $self->push_delay();
    -                print "Content-type: ${type}$CGI::CRLF$CGI::CRLF" unless $type =~ /^dynamic|heterogeneous$/i;
    -                print  &$last_page($self,$COUNTER);
    -            }
    -            print "${boundary}--$CGI::CRLF";
    -            last;
    -        }
    -    }
    -    print "WARNING: YOUR BROWSER DOESN'T SUPPORT THIS SERVER-PUSH TECHNOLOGY.$CGI::CRLF";
    -}
    -
    -sub simple_counter {
    -    my ($self,$count) = @_;
    -    return $self->start_html("CGI::Push Default Counter"),
    -           $self->h1("CGI::Push Default Counter"),
    -           "This page has been updated ",$self->strong($count)," times.",
    -           $self->hr(),
    -           $self->a({'-href'=>'http://www.genome.wi.mit.edu/ftp/pub/software/WWW/cgi_docs.html'},'CGI.pm home page'),
    -           $self->end_html;
    -}
    -
    -sub do_sleep {
    -    my $delay = shift;
    -    if ( ($delay >= 1) && ($delay!~/\./) ){
    -        sleep($delay);
    -    } else {
    -        select(undef,undef,undef,$delay);
    -    }
    -}
    -
    -sub push_delay {
    -    my ($self,$delay) = CGI::self_or_default(@_);
    -    return defined($delay) ? $self->{'.delay'} = 
    -        $delay : $self->{'.delay'};
    -}
    -
    -1;
    -
    -=head1 NAME
    -
    -CGI::Push - Simple Interface to Server Push
    -
    -=head1 SYNOPSIS
    -
    -    use CGI::Push qw(:standard);
    -
    -    do_push(-next_page=>\&next_page,
    -            -last_page=>\&last_page,
    -            -delay=>0.5);
    -
    -    sub next_page {
    -        my($q,$counter) = @_;
    -        return undef if $counter >= 10;
    -        return start_html('Test'),
    -               h1('Visible'),"\n",
    -               "This page has been called ", strong($counter)," times",
    -               end_html();
    -    }
    -
    -    sub last_page {
    -        my($q,$counter) = @_;
    -        return start_html('Done'),
    -               h1('Finished'),
    -               strong($counter - 1),' iterations.',
    -               end_html;
    -    }
    -
    -=head1 DESCRIPTION
    -
    -CGI::Push is a subclass of the CGI object created by CGI.pm.  It is
    -specialized for server push operations, which allow you to create
    -animated pages whose content changes at regular intervals.
    -
    -You provide CGI::Push with a pointer to a subroutine that will draw
    -one page.  Every time your subroutine is called, it generates a new
    -page.  The contents of the page will be transmitted to the browser
    -in such a way that it will replace what was there beforehand.  The
    -technique will work with HTML pages as well as with graphics files, 
    -allowing you to create animated GIFs.
    -
    -Only Netscape Navigator supports server push.  Internet Explorer
    -browsers do not.
    -
    -=head1 USING CGI::Push
    -
    -CGI::Push adds one new method to the standard CGI suite, do_push().
    -When you call this method, you pass it a reference to a subroutine
    -that is responsible for drawing each new page, an interval delay, and
    -an optional subroutine for drawing the last page.  Other optional
    -parameters include most of those recognized by the CGI header()
    -method.
    -
    -You may call do_push() in the object oriented manner or not, as you
    -prefer:
    -
    -    use CGI::Push;
    -    $q = new CGI::Push;
    -    $q->do_push(-next_page=>\&draw_a_page);
    -
    -        -or-
    -
    -    use CGI::Push qw(:standard);
    -    do_push(-next_page=>\&draw_a_page);
    -
    -Parameters are as follows:
    -
    -=over 4
    -
    -=item -next_page
    -
    -    do_push(-next_page=>\&my_draw_routine);
    -
    -This required parameter points to a reference to a subroutine responsible for
    -drawing each new page.  The subroutine should expect two parameters
    -consisting of the CGI object and a counter indicating the number
    -of times the subroutine has been called.  It should return the
    -contents of the page as an B of one or more items to print.  
    -It can return a false value (or an empty array) in order to abort the
    -redrawing loop and print out the final page (if any)
    -
    -    sub my_draw_routine {
    -        my($q,$counter) = @_;
    -        return undef if $counter > 100;
    -        return start_html('testing'),
    -               h1('testing'),
    -               "This page called $counter times";
    -    }
    -
    -You are of course free to refer to create and use global variables
    -within your draw routine in order to achieve special effects.
    -
    -=item -last_page
    -
    -This optional parameter points to a reference to the subroutine
    -responsible for drawing the last page of the series.  It is called
    -after the -next_page routine returns a false value.  The subroutine
    -itself should have exactly the same calling conventions as the
    --next_page routine.
    -
    -=item -type
    -
    -This optional parameter indicates the content type of each page.  It
    -defaults to "text/html".  Normally the module assumes that each page
    -is of a homogenous MIME type.  However if you provide either of the
    -magic values "heterogeneous" or "dynamic" (the latter provided for the
    -convenience of those who hate long parameter names), you can specify
    -the MIME type -- and other header fields -- on a per-page basis.  See 
    -"heterogeneous pages" for more details.
    -
    -=item -delay
    -
    -This indicates the delay, in seconds, between frames.  Smaller delays
    -refresh the page faster.  Fractional values are allowed.
    -
    -B
    -
    -=item -cookie, -target, -expires, -nph
    -
    -These have the same meaning as the like-named parameters in
    -CGI::header().
    -
    -If not specified, -nph will default to 1 (as needed for many servers, see below).
    -
    -=back
    -
    -=head2 Heterogeneous Pages
    -
    -Ordinarily all pages displayed by CGI::Push share a common MIME type.
    -However by providing a value of "heterogeneous" or "dynamic" in the
    -do_push() -type parameter, you can specify the MIME type of each page
    -on a case-by-case basis.  
    -
    -If you use this option, you will be responsible for producing the
    -HTTP header for each page.  Simply modify your draw routine to
    -look like this:
    -
    -    sub my_draw_routine {
    -        my($q,$counter) = @_;
    -        return header('text/html'),   # note we're producing the header here
    -               start_html('testing'),
    -               h1('testing'),
    -               "This page called $counter times";
    -    }
    -
    -You can add any header fields that you like, but some (cookies and
    -status fields included) may not be interpreted by the browser.  One
    -interesting effect is to display a series of pages, then, after the
    -last page, to redirect the browser to a new URL.  Because redirect() 
    -does b work, the easiest way is with a -refresh header field,
    -as shown below:
    -
    -    sub my_draw_routine {
    -        my($q,$counter) = @_;
    -        return undef if $counter > 10;
    -        return header('text/html'),   # note we're producing the header here
    -               start_html('testing'),
    -               h1('testing'),
    -               "This page called $counter times";
    -    }
    -
    -    sub my_last_page {
    -        return header(-refresh=>'5; URL=http://somewhere.else/finished.html',
    -                      -type=>'text/html'),
    -               start_html('Moved'),
    -               h1('This is the last page'),
    -               'Goodbye!'
    -               hr,
    -               end_html; 
    -    }
    -
    -=head2 Changing the Page Delay on the Fly
    -
    -If you would like to control the delay between pages on a page-by-page
    -basis, call push_delay() from within your draw routine.  push_delay()
    -takes a single numeric argument representing the number of seconds you
    -wish to delay after the current page is displayed and before
    -displaying the next one.  The delay may be fractional.  Without
    -parameters, push_delay() just returns the current delay.
    -
    -=head1 INSTALLING CGI::Push SCRIPTS
    -
    -Server push scripts must be installed as no-parsed-header (NPH)
    -scripts in order to work correctly on many servers.  On Unix systems,
    -this is most often accomplished by prefixing the script's name with "nph-".  
    -Recognition of NPH scripts happens automatically with WebSTAR and 
    -Microsoft IIS.  Users of other servers should see their documentation
    -for help.
    -
    -Apache web server from version 1.3b2 on does not need server
    -push scripts installed as NPH scripts: the -nph parameter to do_push()
    -may be set to a false value to disable the extra headers needed by an
    -NPH script.
    -
    -=head1 AUTHOR INFORMATION
    -
    -Copyright 1995-1998, Lincoln D. Stein.  All rights reserved.  
    -
    -This library is free software; you can redistribute it and/or modify
    -it under the same terms as Perl itself.
    -
    -Address bug reports and comments to: lstein@cshl.org
    -
    -=head1 BUGS
    -
    -This section intentionally left blank.
    -
    -=head1 SEE ALSO
    -
    -L, L
    -
    -=cut
    -
    diff --git a/lib/perl5/5.8.8/CGI/Switch.pm b/lib/perl5/5.8.8/CGI/Switch.pm
    deleted file mode 100644
    index b8cc9ef4..00000000
    --- a/lib/perl5/5.8.8/CGI/Switch.pm
    +++ /dev/null
    @@ -1,27 +0,0 @@
    -use CGI;
    -
    -$VERSION = '1.00';
    -
    -1;
    -
    -__END__
    -
    -=head1 NAME
    -
    -CGI::Switch - Backward compatibility module for defunct CGI::Switch
    -
    -=head1 SYNOPSIS
    -
    -Do not use this module.  It is deprecated.
    -
    -=head1 ABSTRACT
    -
    -=head1 DESCRIPTION
    -
    -=head1 AUTHOR INFORMATION
    -
    -=head1 BUGS
    -
    -=head1 SEE ALSO
    -
    -=cut
    diff --git a/lib/perl5/5.8.8/CGI/Util.pm b/lib/perl5/5.8.8/CGI/Util.pm
    deleted file mode 100644
    index 523007c5..00000000
    --- a/lib/perl5/5.8.8/CGI/Util.pm
    +++ /dev/null
    @@ -1,318 +0,0 @@
    -package CGI::Util;
    -
    -use strict;
    -use vars qw($VERSION @EXPORT_OK @ISA $EBCDIC @A2E @E2A);
    -require Exporter;
    -@ISA = qw(Exporter);
    -@EXPORT_OK = qw(rearrange make_attributes unescape escape 
    -		expires ebcdic2ascii ascii2ebcdic);
    -
    -$VERSION = '1.5';
    -
    -$EBCDIC = "\t" ne "\011";
    -# (ord('^') == 95) for codepage 1047 as on os390, vmesa
    -@A2E = (
    -   0,  1,  2,  3, 55, 45, 46, 47, 22,  5, 21, 11, 12, 13, 14, 15,
    -  16, 17, 18, 19, 60, 61, 50, 38, 24, 25, 63, 39, 28, 29, 30, 31,
    -  64, 90,127,123, 91,108, 80,125, 77, 93, 92, 78,107, 96, 75, 97,
    - 240,241,242,243,244,245,246,247,248,249,122, 94, 76,126,110,111,
    - 124,193,194,195,196,197,198,199,200,201,209,210,211,212,213,214,
    - 215,216,217,226,227,228,229,230,231,232,233,173,224,189, 95,109,
    - 121,129,130,131,132,133,134,135,136,137,145,146,147,148,149,150,
    - 151,152,153,162,163,164,165,166,167,168,169,192, 79,208,161,  7,
    -  32, 33, 34, 35, 36, 37,  6, 23, 40, 41, 42, 43, 44,  9, 10, 27,
    -  48, 49, 26, 51, 52, 53, 54,  8, 56, 57, 58, 59,  4, 20, 62,255,
    -  65,170, 74,177,159,178,106,181,187,180,154,138,176,202,175,188,
    - 144,143,234,250,190,160,182,179,157,218,155,139,183,184,185,171,
    - 100,101, 98,102, 99,103,158,104,116,113,114,115,120,117,118,119,
    - 172,105,237,238,235,239,236,191,128,253,254,251,252,186,174, 89,
    -  68, 69, 66, 70, 67, 71,156, 72, 84, 81, 82, 83, 88, 85, 86, 87,
    - 140, 73,205,206,203,207,204,225,112,221,222,219,220,141,142,223
    -	 );
    -@E2A = (
    -   0,  1,  2,  3,156,  9,134,127,151,141,142, 11, 12, 13, 14, 15,
    -  16, 17, 18, 19,157, 10,  8,135, 24, 25,146,143, 28, 29, 30, 31,
    - 128,129,130,131,132,133, 23, 27,136,137,138,139,140,  5,  6,  7,
    - 144,145, 22,147,148,149,150,  4,152,153,154,155, 20, 21,158, 26,
    -  32,160,226,228,224,225,227,229,231,241,162, 46, 60, 40, 43,124,
    -  38,233,234,235,232,237,238,239,236,223, 33, 36, 42, 41, 59, 94,
    -  45, 47,194,196,192,193,195,197,199,209,166, 44, 37, 95, 62, 63,
    - 248,201,202,203,200,205,206,207,204, 96, 58, 35, 64, 39, 61, 34,
    - 216, 97, 98, 99,100,101,102,103,104,105,171,187,240,253,254,177,
    - 176,106,107,108,109,110,111,112,113,114,170,186,230,184,198,164,
    - 181,126,115,116,117,118,119,120,121,122,161,191,208, 91,222,174,
    - 172,163,165,183,169,167,182,188,189,190,221,168,175, 93,180,215,
    - 123, 65, 66, 67, 68, 69, 70, 71, 72, 73,173,244,246,242,243,245,
    - 125, 74, 75, 76, 77, 78, 79, 80, 81, 82,185,251,252,249,250,255,
    -  92,247, 83, 84, 85, 86, 87, 88, 89, 90,178,212,214,210,211,213,
    -  48, 49, 50, 51, 52, 53, 54, 55, 56, 57,179,219,220,217,218,159
    -	 );
    -
    -if ($EBCDIC && ord('^') == 106) { # as in the BS2000 posix-bc coded character set
    -     $A2E[91] = 187;   $A2E[92] = 188;  $A2E[94] = 106;  $A2E[96] = 74;
    -     $A2E[123] = 251;  $A2E[125] = 253; $A2E[126] = 255; $A2E[159] = 95;
    -     $A2E[162] = 176;  $A2E[166] = 208; $A2E[168] = 121; $A2E[172] = 186;
    -     $A2E[175] = 161;  $A2E[217] = 224; $A2E[219] = 221; $A2E[221] = 173;
    -     $A2E[249] = 192;
    -
    -     $E2A[74] = 96;   $E2A[95] = 159;  $E2A[106] = 94;  $E2A[121] = 168;
    -     $E2A[161] = 175; $E2A[173] = 221; $E2A[176] = 162; $E2A[186] = 172;
    -     $E2A[187] = 91;  $E2A[188] = 92;  $E2A[192] = 249; $E2A[208] = 166;
    -     $E2A[221] = 219; $E2A[224] = 217; $E2A[251] = 123; $E2A[253] = 125;
    -     $E2A[255] = 126;
    -   }
    -elsif ($EBCDIC && ord('^') == 176) { # as in codepage 037 on os400
    -  $A2E[10] = 37;  $A2E[91] = 186;  $A2E[93] = 187; $A2E[94] = 176;
    -  $A2E[133] = 21; $A2E[168] = 189; $A2E[172] = 95; $A2E[221] = 173;
    -
    -  $E2A[21] = 133; $E2A[37] = 10;  $E2A[95] = 172; $E2A[173] = 221;
    -  $E2A[176] = 94; $E2A[186] = 91; $E2A[187] = 93; $E2A[189] = 168;
    -}
    -
    -# Smart rearrangement of parameters to allow named parameter
    -# calling.  We do the rearangement if:
    -# the first parameter begins with a -
    -sub rearrange {
    -    my($order,@param) = @_;
    -    return () unless @param;
    -
    -    if (ref($param[0]) eq 'HASH') {
    -	@param = %{$param[0]};
    -    } else {
    -	return @param 
    -	    unless (defined($param[0]) && substr($param[0],0,1) eq '-');
    -    }
    -
    -    # map parameters into positional indices
    -    my ($i,%pos);
    -    $i = 0;
    -    foreach (@$order) {
    -	foreach (ref($_) eq 'ARRAY' ? @$_ : $_) { $pos{lc($_)} = $i; }
    -	$i++;
    -    }
    -
    -    my (@result,%leftover);
    -    $#result = $#$order;  # preextend
    -    while (@param) {
    -	my $key = lc(shift(@param));
    -	$key =~ s/^\-//;
    -	if (exists $pos{$key}) {
    -	    $result[$pos{$key}] = shift(@param);
    -	} else {
    -	    $leftover{$key} = shift(@param);
    -	}
    -    }
    -
    -    push (@result,make_attributes(\%leftover,defined $CGI::Q ? $CGI::Q->{escape} : 1)) if %leftover;
    -    @result;
    -}
    -
    -sub make_attributes {
    -    my $attr = shift;
    -    return () unless $attr && ref($attr) && ref($attr) eq 'HASH';
    -    my $escape =  shift || 0;
    -    my(@att);
    -    foreach (keys %{$attr}) {
    -	my($key) = $_;
    -	$key=~s/^\-//;     # get rid of initial - if present
    -
    -	# old way: breaks EBCDIC!
    -	# $key=~tr/A-Z_/a-z-/; # parameters are lower case, use dashes
    -
    -	($key="\L$key") =~ tr/_/-/; # parameters are lower case, use dashes
    -
    -	my $value = $escape ? simple_escape($attr->{$_}) : $attr->{$_};
    -	push(@att,defined($attr->{$_}) ? qq/$key="$value"/ : qq/$key/);
    -    }
    -    return @att;
    -}
    -
    -sub simple_escape {
    -  return unless defined(my $toencode = shift);
    -  $toencode =~ s{&}{&}gso;
    -  $toencode =~ s{<}{<}gso;
    -  $toencode =~ s{>}{>}gso;
    -  $toencode =~ s{\"}{"}gso;
    -# Doesn't work.  Can't work.  forget it.
    -#  $toencode =~ s{\x8b}{‹}gso;
    -#  $toencode =~ s{\x9b}{›}gso;
    -  $toencode;
    -}
    -
    -sub utf8_chr {
    -        my $c = shift(@_);
    -	return chr($c) if $] >= 5.006;
    -
    -        if ($c < 0x80) {
    -                return sprintf("%c", $c);
    -        } elsif ($c < 0x800) {
    -                return sprintf("%c%c", 0xc0 | ($c >> 6), 0x80 | ($c & 0x3f));
    -        } elsif ($c < 0x10000) {
    -                return sprintf("%c%c%c",
    -                                           0xe0 |  ($c >> 12),
    -                                           0x80 | (($c >>  6) & 0x3f),
    -                                           0x80 | ( $c          & 0x3f));
    -        } elsif ($c < 0x200000) {
    -                return sprintf("%c%c%c%c",
    -                                           0xf0 |  ($c >> 18),
    -                                           0x80 | (($c >> 12) & 0x3f),
    -                                           0x80 | (($c >>  6) & 0x3f),
    -                                           0x80 | ( $c          & 0x3f));
    -        } elsif ($c < 0x4000000) {
    -                return sprintf("%c%c%c%c%c",
    -                                           0xf8 |  ($c >> 24),
    -                                           0x80 | (($c >> 18) & 0x3f),
    -                                           0x80 | (($c >> 12) & 0x3f),
    -                                           0x80 | (($c >>  6) & 0x3f),
    -                                           0x80 | ( $c          & 0x3f));
    -
    -        } elsif ($c < 0x80000000) {
    -                return sprintf("%c%c%c%c%c%c",
    -                                           0xfc |  ($c >> 30),
    -                                           0x80 | (($c >> 24) & 0x3f),
    -                                           0x80 | (($c >> 18) & 0x3f),
    -                                           0x80 | (($c >> 12) & 0x3f),
    -                                           0x80 | (($c >> 6)  & 0x3f),
    -                                           0x80 | ( $c          & 0x3f));
    -        } else {
    -                return utf8_chr(0xfffd);
    -        }
    -}
    -
    -# unescape URL-encoded data
    -sub unescape {
    -  shift() if @_ > 0 and (ref($_[0]) || (defined $_[1] && $_[0] eq $CGI::DefaultClass));
    -  my $todecode = shift;
    -  return undef unless defined($todecode);
    -  $todecode =~ tr/+/ /;       # pluses become spaces
    -    $EBCDIC = "\t" ne "\011";
    -    if ($EBCDIC) {
    -      $todecode =~ s/%([0-9a-fA-F]{2})/chr $A2E[hex($1)]/ge;
    -    } else {
    -      $todecode =~ s/%(?:([0-9a-fA-F]{2})|u([0-9a-fA-F]{4}))/
    -	defined($1)? chr hex($1) : utf8_chr(hex($2))/ge;
    -    }
    -  return $todecode;
    -}
    -
    -# URL-encode data
    -sub escape {
    -  shift() if @_ > 1 and ( ref($_[0]) || (defined $_[1] && $_[0] eq $CGI::DefaultClass));
    -  my $toencode = shift;
    -  return undef unless defined($toencode);
    -  # force bytes while preserving backward compatibility -- dankogai
    -  $toencode = pack("C*", unpack("C*", $toencode));
    -    if ($EBCDIC) {
    -      $toencode=~s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",$E2A[ord($1)])/eg;
    -    } else {
    -      $toencode=~s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",ord($1))/eg;
    -    }
    -  return $toencode;
    -}
    -
    -# This internal routine creates date strings suitable for use in
    -# cookies and HTTP headers.  (They differ, unfortunately.)
    -# Thanks to Mark Fisher for this.
    -sub expires {
    -    my($time,$format) = @_;
    -    $format ||= 'http';
    -
    -    my(@MON)=qw/Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec/;
    -    my(@WDAY) = qw/Sun Mon Tue Wed Thu Fri Sat/;
    -
    -    # pass through preformatted dates for the sake of expire_calc()
    -    $time = expire_calc($time);
    -    return $time unless $time =~ /^\d+$/;
    -
    -    # make HTTP/cookie date string from GMT'ed time
    -    # (cookies use '-' as date separator, HTTP uses ' ')
    -    my($sc) = ' ';
    -    $sc = '-' if $format eq "cookie";
    -    my($sec,$min,$hour,$mday,$mon,$year,$wday) = gmtime($time);
    -    $year += 1900;
    -    return sprintf("%s, %02d$sc%s$sc%04d %02d:%02d:%02d GMT",
    -                   $WDAY[$wday],$mday,$MON[$mon],$year,$hour,$min,$sec);
    -}
    -
    -# This internal routine creates an expires time exactly some number of
    -# hours from the current time.  It incorporates modifications from 
    -# Mark Fisher.
    -sub expire_calc {
    -    my($time) = @_;
    -    my(%mult) = ('s'=>1,
    -                 'm'=>60,
    -                 'h'=>60*60,
    -                 'd'=>60*60*24,
    -                 'M'=>60*60*24*30,
    -                 'y'=>60*60*24*365);
    -    # format for time can be in any of the forms...
    -    # "now" -- expire immediately
    -    # "+180s" -- in 180 seconds
    -    # "+2m" -- in 2 minutes
    -    # "+12h" -- in 12 hours
    -    # "+1d"  -- in 1 day
    -    # "+3M"  -- in 3 months
    -    # "+2y"  -- in 2 years
    -    # "-3m"  -- 3 minutes ago(!)
    -    # If you don't supply one of these forms, we assume you are
    -    # specifying the date yourself
    -    my($offset);
    -    if (!$time || (lc($time) eq 'now')) {
    -        $offset = 0;
    -    } elsif ($time=~/^\d+/) {
    -        return $time;
    -    } elsif ($time=~/^([+-]?(?:\d+|\d*\.\d*))([mhdMy]?)/) {
    -        $offset = ($mult{$2} || 1)*$1;
    -    } else {
    -        return $time;
    -    }
    -    return (time+$offset);
    -}
    -
    -sub ebcdic2ascii {
    -  my $data = shift;
    -  $data =~ s/(.)/chr $E2A[ord($1)]/ge;
    -  $data;
    -}
    -
    -sub ascii2ebcdic {
    -  my $data = shift;
    -  $data =~ s/(.)/chr $A2E[ord($1)]/ge;
    -  $data;
    -}
    -
    -1;
    -
    -__END__
    -
    -=head1 NAME
    -
    -CGI::Util - Internal utilities used by CGI module
    -
    -=head1 SYNOPSIS
    -
    -none
    -
    -=head1 DESCRIPTION
    -
    -no public subroutines
    -
    -=head1 AUTHOR INFORMATION
    -
    -Copyright 1995-1998, Lincoln D. Stein.  All rights reserved.  
    -
    -This library is free software; you can redistribute it and/or modify
    -it under the same terms as Perl itself.
    -
    -Address bug reports and comments to: lstein@cshl.org.  When sending
    -bug reports, please provide the version of CGI.pm, the version of
    -Perl, the name and version of your Web server, and the name and
    -version of the operating system you are using.  If the problem is even
    -remotely browser dependent, please provide information about the
    -affected browers as well.
    -
    -=head1 SEE ALSO
    -
    -L
    -
    -=cut
    diff --git a/lib/perl5/5.8.8/CGI/eg/RunMeFirst b/lib/perl5/5.8.8/CGI/eg/RunMeFirst
    deleted file mode 100644
    index 018b11b7..00000000
    --- a/lib/perl5/5.8.8/CGI/eg/RunMeFirst
    +++ /dev/null
    @@ -1,36 +0,0 @@
    -#!/usr/local/bin/perl
    -
    -# Make a world-writeable directory for saving state.
    -$ww = 'WORLD_WRITABLE';
    -unless (-w $ww) {
    -    $u = umask 0;
    -    mkdir $ww, 0777;
    -    umask $u;
    -}
    -
    -# Decode the sample image.
    -for $uu (<*.uu>) {
    -    unless (open UU, "<$uu") { warn "Can't open $uu: $!\n"; next }
    -    while () {
    -        chomp;
    -	if (/^begin\s+\d+\s+(.+)$/) {
    -	    $bin = $1;
    -	    last;
    -	}
    -    }
    -    unless (open BIN, "> $bin") { warn "Can't create $bin: $!\n"; next }
    -    binmode BIN;
    -    while () {
    -	chomp;
    -	last if /^end/;
    -	print BIN unpack "u", $_;
    -    }
    -    close BIN;
    -    close UU;
    -}
    -
    -# Create symlinks from *.txt to *.cgi for documentation purposes.
    -foreach (<*.cgi>) {
    -    ($target = $_) =~ s/cgi$/txt/i;
    -    symlink $_, $target unless -e $target;
    -}
    diff --git a/lib/perl5/5.8.8/CGI/eg/caution.xbm b/lib/perl5/5.8.8/CGI/eg/caution.xbm
    deleted file mode 100644
    index 87fcdbef..00000000
    --- a/lib/perl5/5.8.8/CGI/eg/caution.xbm
    +++ /dev/null
    @@ -1,12 +0,0 @@
    -#define caution_width 32
    -#define caution_height 32
    -static char caution_bits[] = {
    - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x10,0x01,
    - 0x00,0x00,0x08,0x07,0x00,0x00,0x08,0x0e,0x00,0x00,0x04,0x0e,0x00,0x00,0x04,
    - 0x1c,0x00,0x00,0x02,0x1c,0x00,0x00,0xe2,0x38,0x00,0x00,0xf1,0x39,0x00,0x00,
    - 0xf1,0x71,0x00,0x80,0xf0,0x71,0x00,0x80,0xf0,0xe1,0x00,0x40,0xf0,0xe1,0x00,
    - 0x40,0xf0,0xc1,0x01,0x20,0xf0,0xc1,0x01,0x20,0xf0,0x81,0x03,0x10,0xe0,0x80,
    - 0x03,0x10,0xe0,0x00,0x07,0x08,0xe0,0x00,0x07,0x08,0xe0,0x00,0x0e,0x04,0x00,
    - 0x00,0x0e,0x04,0xe0,0x00,0x1c,0x02,0xf0,0x01,0x1c,0x02,0xf0,0x01,0x38,0x01,
    - 0xe0,0x00,0x38,0x01,0x00,0x00,0x70,0x01,0x00,0x00,0x70,0xff,0xff,0xff,0x7f,
    - 0xf8,0xff,0xff,0x3f,0x00,0x00,0x00,0x00};
    diff --git a/lib/perl5/5.8.8/CGI/eg/clickable_image.cgi b/lib/perl5/5.8.8/CGI/eg/clickable_image.cgi
    deleted file mode 100644
    index 81daf096..00000000
    --- a/lib/perl5/5.8.8/CGI/eg/clickable_image.cgi
    +++ /dev/null
    @@ -1,26 +0,0 @@
    -#!/usr/local/bin/perl
    -
    -use CGI;
    -$query = new CGI;
    -print $query->header;
    -print $query->start_html("A Clickable Image");
    -print <A Clickable Image
    -
    -END
    -print "Sorry, this isn't very exciting!\n";
    -
    -print $query->startform;
    -print $query->image_button('picture',"./wilogo.gif");
    -print "Give me a: ",$query->popup_menu('letter',['A','B','C','D','E','W']),"\n"; # 
    -print "

    Magnification: ",$query->radio_group('magnification',['1X','2X','4X','20X']),"\n"; -print "


    \n"; - -if ($query->param) { - print "

    Magnification, ",$query->param('magnification'),"\n"; - print "

    Selected Letter, ",$query->param('letter'),"\n"; - ($x,$y) = ($query->param('picture.x'),$query->param('picture.y')); - print "

    Selected Position ($x,$y)\n"; -} - -print $query->end_html; diff --git a/lib/perl5/5.8.8/CGI/eg/cookie.cgi b/lib/perl5/5.8.8/CGI/eg/cookie.cgi deleted file mode 100644 index 98adda19..00000000 --- a/lib/perl5/5.8.8/CGI/eg/cookie.cgi +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/local/bin/perl - -use CGI qw(:standard); - -@ANIMALS=sort qw/lion tiger bear pig porcupine ferret zebra gnu ostrich - emu moa goat weasel yak chicken sheep hyena dodo lounge-lizard - squirrel rat mouse hedgehog racoon baboon kangaroo hippopotamus - giraffe/; - -# Recover the previous animals from the magic cookie. -# The cookie has been formatted as an associative array -# mapping animal name to the number of animals. -%zoo = cookie('animals'); - -# Recover the new animal(s) from the parameter 'new_animal' -@new = param('new_animals'); - -# If the action is 'add', then add new animals to the zoo. Otherwise -# delete them. -foreach (@new) { - if (param('action') eq 'Add') { - $zoo{$_}++; - } elsif (param('action') eq 'Delete') { - $zoo{$_}-- if $zoo{$_}; - delete $zoo{$_} unless $zoo{$_}; - } -} - -# Add new animals to old, and put them in a cookie -$the_cookie = cookie(-name=>'animals', - -value=>\%zoo, - -expires=>'+1h'); - -# Print the header, incorporating the cookie and the expiration date... -print header(-cookie=>$the_cookie); - -# Now we're ready to create our HTML page. -print start_html('Animal crackers'); - -print <Animal Crackers -Choose the animals you want to add to the zoo, and click "add". -Come back to this page any time within the next hour and the list of -animals in the zoo will be resurrected. You can even quit Netscape -completely! -

    -Try adding the same animal several times to the list. Does this -remind you vaguely of a shopping cart? -

    -This script only works with Netscape browsers -

    -

    - -
    Add/DeleteCurrent Contents -EOF - ; - -print "
    ",start_form; -print scrolling_list(-name=>'new_animals', - -values=>[@ANIMALS], - -multiple=>1, - -override=>1, - -size=>10),"
    "; -print submit(-name=>'action',-value=>'Delete'), - submit(-name=>'action',-value=>'Add'); -print end_form; - -print "
    "; -if (%zoo) { # make a table - print "
      \n"; - foreach (sort keys %zoo) { - print "
    • $zoo{$_} $_\n"; - } - print "
    \n"; -} else { - print "The zoo is empty.\n"; -} -print "
    "; - -print < -
    Lincoln D. Stein

    -More Examples -EOF - ; -print end_html; - - diff --git a/lib/perl5/5.8.8/CGI/eg/crash.cgi b/lib/perl5/5.8.8/CGI/eg/crash.cgi deleted file mode 100644 index 64f03c7b..00000000 --- a/lib/perl5/5.8.8/CGI/eg/crash.cgi +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/local/bin/perl - -use CGI::Carp qw(fatalsToBrowser); - -# This line invokes a fatal error message at compile time. -foo bar baz; diff --git a/lib/perl5/5.8.8/CGI/eg/customize.cgi b/lib/perl5/5.8.8/CGI/eg/customize.cgi deleted file mode 100644 index c1c81875..00000000 --- a/lib/perl5/5.8.8/CGI/eg/customize.cgi +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/local/bin/perl - -use CGI qw(:standard :html3); - -# Some constants to use in our form. -@colors=qw/aqua black blue fuschia gray green lime maroon navy olive - purple red silver teal white yellow/; -@sizes=("",1..7); - -# recover the "preferences" cookie. -%preferences = cookie('preferences'); - -# If the user wants to change the background color or her -# name, they will appear among our CGI parameters. -foreach ('text','background','name','size') { - $preferences{$_} = param($_) || $preferences{$_}; -} - -# Set some defaults -$preferences{'background'} = $preferences{'background'} || 'silver'; -$preferences{'text'} = $preferences{'text'} || 'black'; - -# Refresh the cookie so that it doesn't expire. This also -# makes any changes the user made permanent. -$the_cookie = cookie(-name=>'preferences', - -value=>\%preferences, - -expires=>'+30d'); -print header(-cookie=>$the_cookie); - -# Adjust the title to incorporate the user's name, if provided. -$title = $preferences{'name'} ? - "Welcome back, $preferences{name}!" : "Customizable Page"; - -# Create the HTML page. We use several of Netscape's -# extended tags to control the background color and the -# font size. It's safe to use Netscape features here because -# cookies don't work anywhere else anyway. -print start_html(-title=>$title, - -bgcolor=>$preferences{'background'}, - -text=>$preferences{'text'} - ); - -print basefont({SIZE=>$preferences{size}}) if $preferences{'size'} > 0; - -print h1($title),<'name', - -default=>$preferences{'name'}, - -size=>30),br, - - table( - TR( - td("Preferred"), - td("Page color:"), - td(popup_menu(-name=>'background', - -values=>\@colors, - -default=>$preferences{'background'}) - ), - ), - TR( - td(''), - td("Text color:"), - td(popup_menu(-name=>'text', - -values=>\@colors, - -default=>$preferences{'text'}) - ) - ), - TR( - td(''), - td("Font size:"), - td(popup_menu(-name=>'size', - -values=>\@sizes, - -default=>$preferences{'size'}) - ) - ) - ), - - submit(-label=>'Set preferences'), - hr; - -print a({HREF=>"/"},'Go to the home page'); -print end_html; diff --git a/lib/perl5/5.8.8/CGI/eg/diff_upload.cgi b/lib/perl5/5.8.8/CGI/eg/diff_upload.cgi deleted file mode 100644 index 913f9ca1..00000000 --- a/lib/perl5/5.8.8/CGI/eg/diff_upload.cgi +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/local/bin/perl - -$DIFF = "/usr/bin/diff"; -$PERL = "/usr/bin/perl"; - -use CGI qw(:standard); -use CGI::Carp; - -print header; -print start_html("File Diff Example"); -print "Version $CGI::VERSION

    "; - -print <File Diff Example -Enter two files. When you press "submit" their diff will be -produced. -EOF - ; - -# Start a multipart form. -print start_multipart_form; -print "File #1:",filefield(-name=>'file1',-size=>45),"
    \n"; -print "File #2:",filefield(-name=>'file2',-size=>45),"
    \n"; -print "Diff type: ",radio_group(-name=>'type', - -value=>['context','normal']),"
    \n"; -print reset,submit(-name=>'submit',-value=>'Do Diff'); -print endform; - -# Process the form if there is a file name entered -$file1 = param('file1'); -$file2 = param('file2'); - -$|=1; # for buffering -if ($file1 && $file2) { - $realfile1 = tmpFileName($file1); - $realfile2 = tmpFileName($file2); - print "


    \n"; - print "

    $file1 vs $file2

    \n"; - - print "
    \n";
    -    $options = "-c" if param('type') eq 'context';
    -    system "$DIFF $options $realfile1 $realfile2 | $PERL -pe 's/>/>/g; s/\n";
    -}
    -
    -print <
    -CGI documentation
    -
    -
    -Lincoln D. Stein -

    -Last modified 17 July 1996 -EOF - ; -print end_html; - -sub sanitize { - my $name = shift; - my($safe) = $name=~/([a-zA-Z0-9._~#,]+)/; - unless ($safe) { - print "$name is not a valid Unix filename -- sorry"; - exit 0; - } - return $safe; -} diff --git a/lib/perl5/5.8.8/CGI/eg/dna_small_gif.uu b/lib/perl5/5.8.8/CGI/eg/dna_small_gif.uu deleted file mode 100644 index 1745c737..00000000 --- a/lib/perl5/5.8.8/CGI/eg/dna_small_gif.uu +++ /dev/null @@ -1,63 +0,0 @@ -begin 444 dna_small.gif -M1TE&.#=A)0`J`.<``+9%&Y@_&A$_5`Y#3$=2"=#59M((H88,GP\/]X^&+$R -M$"(79"DF33(93"$86=%;&"T4/=Y"&\\A$Q4Z4!`62*T4-Q4B9+X1*BH96SP? -M1<0D/3(F<-TM$!`=5:H.(!<64C$W?#8J3*`S(S<@3=8V%K$](QT.6Q`43AL4 -M1:$D,;<0,\X9&,8])\@=$A(U244S5U,D6Q=/#YH> -M08$I1B,09S$35R(:4C0?<19$75!()-;4702M`=;56)A`25,0K%"X< -M83`N>K`H'HDS*1`40,M&%!<@7M,_$AE+#%0>0S0/:4PJ9I,F-6DG420Y<"@09R,0 -M-V$R/R4M<:\H0!(H410Z:AT27&4Q9"L@;=1%(MA-$M5+#RL4+M8Z&AT<7[<: -M(-QA&2,36R$++B(84!0:5ALO:K$A.]X?&!$84V@;/SX<6Q`;2$(B2QD21W4J -M1=TW&@```````````````"P`````)0`J```(_@!]:(N'18\W%15T$1N'C)V? -M0_HH,<$G9YBX!C6<3;+T@AZ-)K@\O*"!KP^$>"KVA`L3*8P3)^5ZA)@B:AH+ -M9];F7.$Q+!`!0=*.%",&P7J"9XB82L5,48F5K,:" -M'94FU='6;!*R3T->E"%&95DR"`/6P,I0PDF)0SG8($$RJN0R`FI(H7$A2]VD -M*^^L_6(T3U*V%XH"_AB:HDS8H$AO5@R:P,8.I%^.:*AC(>Z!'":6RC`1L@W- -M%1Q/,%(.'5+1``/"*]=90`PD.F'3SR@-AG)`&_A=3'"**#[J(P<0^C0&S/#1""(ZI)'&*6,,$842N%Q!@3NK -M"R'%%4KP0D(Q?"`S!3)BVE(/$+)#-80 -M<+,`-[QH$LP+0_P!1C>=S("!,N>8XP<8H6131!B;3`#&#)"DTH(L5#P0S#W+ -MQ)*`$K1HHD4^;E!2QP%:B``&4H$,/Y2C$Y*(1%0(00A)@```77B"*$0@#3>P -MP&PU4`,^H!","P!!$')0P^H6((I5L"$'.;``';[Q!@-\PP"$0?)M$`<92!%OG8Q3#@(`U2C*)%9-!`&`K`!!EP0@80 -M2,0M;I$.:"C#"D.@P#UJ``]GT"*,K%B&*0+!@TFH8VV*0$(:_/`)?7@#'.'0 -M@R[H8``\:&`,=NC"*"B@!2TTHP5]N((TEH&`<)B"!PU`0RQ(P8MNS``9K6@% -M'W31AG%$(BZ2&((PA-&#'I"A&`F8!DD\\`H6-,.,X'B'%,+R#FX4`PS&_L!$ -M.4R0#7W<0@%O2,07$($#9@C3"%C8P!5H88\]J$,"-E!;(.X@C5T<`!65V,40 -M,'&(0C!"`1JP@"3TH`T9=&,5JRC$-]+1`U%TP@@[^,$>Z$&*0%1A%XFK`BFD -MX0L6Y"(#A_A$#[JPC@%\@1@02`(SJ#&&.`A@'\&$!AALX(4Y="`/TA"",UA! -M@%W<8!*\$`$@C%""+G1A"9AP!"<>9@ME*)$0F\C!$I8`B3\TP@%'@$(QH$`" -M)8@#'(B0ACB`P`,@%&,'9"##)S`1!&)\`0)^&,,^+$`("QC"#D\X!":HX0!< -ML(`&-O!%,&H@BS#F0AI'`!LO^"`,/OS!%KJ0_H0HEA`E27Q#%T%X0"%"@`1E -M2,`!:F!%+Q#A!G)40A!HP`4OFK`#-13#`?I(QCW38(Q/9&``%0#!);01BE>$ -M@!TZNL81$G`!-]2!&&5@A1N&T0Q<,$$$%*!``BR1A5$PPPH<74$%]*`#$.RA -M`(VP@#`X$(`7``(%T=@`.5Q`C@:0`P[)D$4'$H`."MB#"908Q=X@,01B9$(7 -MG'A%`#8!"QSL@PUAL,0==M"")CQCP4)0QQUDP806H&,!T]A!`EH@AC2P`P,^ -MT`,*NN%-&&T!&L@X!!Y^<(4.D(,%E>A`,T20C#IXL`6-:,`5F+"#!W"@'%OH -MA`IJ$5(#;`(;AV/'FA103(EV+(,>GHB&&ZJ`!D'P!57`X1F9D`4<0!]FB({'Content-Type'} || ''; - print hr(), - h2($file), - h3($tmpfile), - h4("MIME Type:",em($mimetype)); - - my($lines,$words,$characters,@words) = (0,0,0,0); - while (<$file>) { - $lines++; - $words += @words=split(/\s+/); - $characters += length($_); - } - close $file; - grep($stats{$_}++,param('count')); - if (%stats) { - print strong("Lines: "),$lines,br if $stats{'count lines'}; - print strong("Words: "),$words,br if $stats{'count words'}; - print strong("Characters: "),$characters,br if $stats{'count characters'}; - } else { - print strong("No statistics selected."); - } -} - -# print cite("URL parameters: "),url_param(); - -print hr(), - a({href=>"../cgi_docs.html"},"CGI documentation"), - hr, - address( - a({href=>'/~lstein'},"Lincoln D. Stein")), - br, - 'Last modified July 17, 1996', - end_html; - diff --git a/lib/perl5/5.8.8/CGI/eg/frameset.cgi b/lib/perl5/5.8.8/CGI/eg/frameset.cgi deleted file mode 100644 index fc86e92e..00000000 --- a/lib/perl5/5.8.8/CGI/eg/frameset.cgi +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/local/bin/perl - -use CGI; -$query = new CGI; -print $query->header; -$TITLE="Frameset Example"; - -# We use the path information to distinguish between calls -# to the script to: -# (1) create the frameset -# (2) create the query form -# (3) create the query response - -$path_info = $query->path_info; - -# If no path information is provided, then we create -# a side-by-side frame set -if (!$path_info) { - &print_frameset; - exit 0; -} - -# If we get here, then we either create the query form -# or we create the response. -&print_html_header; -&print_query if $path_info=~/query/; -&print_response if $path_info=~/response/; -&print_end; - - -# Create the frameset -sub print_frameset { - $script_name = $query->script_name; - print <$TITLE - - - - -EOF - ; - exit 0; -} - -sub print_html_header { - print $query->start_html($TITLE); -} - -sub print_end { - print qq{


    More Examples}; - print $query->end_html; -} - -sub print_query { - $script_name = $query->script_name; - print "

    Frameset Query

    \n"; - print $query->startform(-action=>"$script_name/response",-TARGET=>"response"); - print "What's your name? ",$query->textfield('name'); - print "

    What's the combination?

    ", - $query->checkbox_group(-name=>'words', - -values=>['eenie','meenie','minie','moe']); - - print "

    What's your favorite color? ", - $query->popup_menu(-name=>'color', - -values=>['red','green','blue','chartreuse']), - "

    "; - print $query->submit; - print $query->endform; -} - -sub print_response { - print "

    Frameset Result

    \n"; - unless ($query->param) { - print "No query submitted yet."; - return; - } - print "Your name is ",$query->param(name),"\n"; - print "

    The keywords are: ",join(", ",$query->param(words)),"\n"; - print "

    Your favorite color is ",$query->param(color),"\n"; -} - diff --git a/lib/perl5/5.8.8/CGI/eg/index.html b/lib/perl5/5.8.8/CGI/eg/index.html deleted file mode 100644 index 133ecc4a..00000000 --- a/lib/perl5/5.8.8/CGI/eg/index.html +++ /dev/null @@ -1,119 +0,0 @@ - -More Examples of Scripts Created with CGI.pm - - - -

    More Examples of Scripts Created with CGI.pm

    - -

    Basic Non Sequitur Questionnaire

    - - -

    Advanced Non Sequitur Questionnaire

    - - -

    Save and restore the state of a form to a file

    - - -

    Server Push

    - - -

    Read the coordinates from a clickable image map

    - - -

    Multiple independent forms on the same page

    - - -

    How to maintain state on a page with internal links

    - - -

    Echo fatal script errors to the browser

    -This script deliberately generates a compile-time error. - - -The Following Scripts Work with Netscape Navigator 2.0 and higher, -or Internet Explorer 3.0 and higher - -

    Prompt for a file to upload and process it

    - - -

    A Continuously-Updated Page using Server Push

    - - -

    Compute the "diff" between two uploaded files

    - - -

    Maintain state over a long period with a cookie

    - - -

    Permanently customize the appearance of a page with a cookie

    - - -

    Popup the response in a new window

    - - -

    Side-by-side form and response using frames

    - - -

    Verify the Contents of a fill-out form with JavaScript

    - - -
    - -
  • CGI.pm documentation -
  • Download the CGI.pm distribution -
  • -
    -
    Lincoln D. Stein, lstein@genome.wi.mit.edu
    -Whitehead Institute/MIT Center for Genome Research
    - -Last modified: Wed Jun 23 15:31:47 EDT 1999 - - diff --git a/lib/perl5/5.8.8/CGI/eg/internal_links.cgi b/lib/perl5/5.8.8/CGI/eg/internal_links.cgi deleted file mode 100644 index 48069668..00000000 --- a/lib/perl5/5.8.8/CGI/eg/internal_links.cgi +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/local/bin/perl - -use CGI; -$query = new CGI; - -# We generate a regular HTML file containing a very long list -# and a popup menu that does nothing except to show that we -# don't lose the state information. -print $query->header; -print $query->start_html("Internal Links Example"); -print "

    Internal Links Example

    \n"; -print "Click Submit Query to create a state. Then scroll down and", - " click on any of the Jump to top links. This is not very exciting."; - -print "\n"; # an anchor point at the top - -# pick a default starting value; -$query->param('amenu','FOO1') unless $query->param('amenu'); - -print $query->startform; -print $query->popup_menu('amenu',[('FOO1'..'FOO9')]); -print $query->submit,$query->endform; - -# We create a long boring list for the purposes of illustration. -$myself = $query->self_url; -print "
      \n"; -for (1..100) { - print qq{
    1. List item #$_ Jump to top\n}; -} -print "
    \n"; - -print $query->end_html; - diff --git a/lib/perl5/5.8.8/CGI/eg/javascript.cgi b/lib/perl5/5.8.8/CGI/eg/javascript.cgi deleted file mode 100644 index 91c2b9e6..00000000 --- a/lib/perl5/5.8.8/CGI/eg/javascript.cgi +++ /dev/null @@ -1,105 +0,0 @@ -#!/usr/local/bin/perl - -# This script illustrates how to use JavaScript to validate fill-out -# forms. -use CGI qw(:standard); - -# Here's the javascript code that we include in the document. -$JSCRIPT=< 20) || (years < 5)) { - alert("You must be between the ages of 5 and 20 to submit this form"); - document.form1.birthdate.focus(); - document.form1.birthdate.select(); - return false; - } - // Since we've calculated the age in years already, - // we might as well send it up to our CGI script. - document.form1.age.value=Math.floor(years); - return true; - } - - // make sure that the contents of the supplied - // field contain a valid date. - function validateDate(element) { - var date = Date.parse(element.value); - if (0 == date) { - alert("Please enter date in format MMM DD, YY"); - element.focus(); - element.select(); - } - return date; - } - - // Compliments, compliments - function doPraise(element) { - if (element.checked) { - self.status=element.value + " is an excellent choice!"; - return true; - } else { - return false; - } - } - - function checkColor(element) { - var color = element.options[element.selectedIndex].text; - if (color == "blonde") { - if (confirm("Is it true that blondes have more fun?")) - alert("Darn. That leaves me out."); - } else - alert(color + " is a fine choice!"); - } -EOF - ; - -# here's where the execution begins -print header; -print start_html(-title=>'Personal Profile',-script=>$JSCRIPT); - -print h1("Big Brother Wants to Know All About You"), - strong("Note: "),"This page uses JavaScript and requires ", - "Netscape 2.0 or higher to do anything special."; - -&print_prompt(); -print hr; -&print_response() if param; -print end_html; - -sub print_prompt { - print start_form(-name=>'form1', - -onSubmit=>"return validateForm()"),"\n"; - print "Birthdate (e.g. Jan 3, 1972): ", - textfield(-name=>'birthdate', - -onBlur=>"validateDate(this)"),"

    \n"; - print "Sex: ",radio_group(-name=>'gender', - -value=>[qw/male female/], - -onClick=>"doPraise(this)"),"

    \n"; - print "Hair color: ",popup_menu(-name=>'color', - -value=>[qw/brunette blonde red gray/], - -default=>'red', - -onChange=>"checkColor(this)"),"

    \n"; - print hidden(-name=>'age',-value=>0); - print submit(); - print end_form; -} - -sub print_response { - import_names('Q'); - print h2("Your profile"), - "You claim to be a ",b($Q::age)," year old ",b($Q::color,$Q::gender),".", - "You should be ashamed of yourself for lying so ", - "blatantly to big brother!", - hr; -} - diff --git a/lib/perl5/5.8.8/CGI/eg/make_links.pl b/lib/perl5/5.8.8/CGI/eg/make_links.pl deleted file mode 100644 index a0aa8245..00000000 --- a/lib/perl5/5.8.8/CGI/eg/make_links.pl +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/local/bin/perl - -# this is just a utility for creating symlinks from *.txt to *.cgi -# for documentation purposes. -foreach (<*.cgi>) { - ($target=$_)=~s/cgi$/txt/; - symlink $_,$target -} diff --git a/lib/perl5/5.8.8/CGI/eg/monty.cgi b/lib/perl5/5.8.8/CGI/eg/monty.cgi deleted file mode 100644 index 693c2586..00000000 --- a/lib/perl5/5.8.8/CGI/eg/monty.cgi +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/local/bin/perl - -use CGI; -use CGI::Carp qw/fatalsToBrowser/; - -$query = new CGI; - -print $query->header; -print $query->start_html("Example CGI.pm Form"); -print "

    Example CGI.pm Form

    \n"; -&print_prompt($query); -&do_work($query); -&print_tail; -print $query->end_html; - -sub print_prompt { - my($query) = @_; - - print $query->start_form; - print "What's your name?
    "; - print $query->textfield('name'); - print $query->checkbox('Not my real name'); - - print "

    Where can you find English Sparrows?
    "; - print $query->checkbox_group( - -name=>'Sparrow locations', - -Values=>[England,France,Spain,Asia,Hoboken], - -linebreak=>'yes', - -defaults=>[England,Asia]); - - print "

    How far can they fly?
    ", - $query->radio_group( - -name=>'how far', - -Values=>['10 ft','1 mile','10 miles','real far'], - -default=>'1 mile'); - - print "

    What's your favorite color? "; - print $query->popup_menu(-name=>'Color', - -Values=>['black','brown','red','yellow'], - -default=>'red'); - - print $query->hidden('Reference','Monty Python and the Holy Grail'); - - print "

    What have you got there?
    "; - print $query->scrolling_list( - -name=>'possessions', - -Values=>['A Coconut','A Grail','An Icon', - 'A Sword','A Ticket'], - -size=>5, - -multiple=>'true'); - - print "

    Any parting comments?
    "; - print $query->textarea(-name=>'Comments', - -rows=>10, - -columns=>50); - - print "

    ",$query->reset; - print $query->submit('Action','Shout'); - print $query->submit('Action','Scream'); - print $query->endform; - print "


    \n"; - } - -sub do_work { - my($query) = @_; - my(@values,$key); - - print "

    Here are the current settings in this form

    "; - - foreach $key ($query->param) { - print "$key -> "; - @values = $query->param($key); - print join(", ",@values),"
    \n"; - } -} - -sub print_tail { - print < -
    Lincoln D. Stein

    -Home Page -END - ; -} diff --git a/lib/perl5/5.8.8/CGI/eg/multiple_forms.cgi b/lib/perl5/5.8.8/CGI/eg/multiple_forms.cgi deleted file mode 100644 index b38bf93e..00000000 --- a/lib/perl5/5.8.8/CGI/eg/multiple_forms.cgi +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/local/bin/perl - -use CGI; - -$query = new CGI; -print $query->header; -print $query->start_html('Multiple Forms'); -print "

    Multiple Forms

    \n"; - -# Print the first form -print $query->startform; -$name = $query->remote_user || 'anonymous@' . $query->remote_host; - -print "What's your name? ",$query->textfield('name',$name,50); -print "

    What's the combination?

    ", - $query->checkbox_group('words',['eenie','meenie','minie','moe']); -print "

    What's your favorite color? ", - $query->popup_menu('color',['red','green','blue','chartreuse']), - "

    "; -print $query->submit('form_1','Send Form 1'); -print $query->endform; - -# Print the second form -print "


    \n"; -print $query->startform; -print "Some radio buttons: ",$query->radio_group('radio buttons', - [qw{one two three four five}],'three'),"\n"; -print "

    What's the password? ",$query->password_field('pass','secret'); -print $query->defaults,$query->submit('form_2','Send Form 2'),"\n"; -print $query->endform; - -print "


    \n"; - -$query->import_names('Q'); -if ($Q::form_1) { - print "

    Form 1 Submitted

    \n"; - print "Your name is $Q::name\n"; - print "

    The combination is: {",join(",",@Q::words),"}\n"; - print "

    Your favorite color is $Q::color\n"; -} elsif ($Q::form_2) { - print <Form 2 Submitted -

    The value of the radio buttons is $Q::radio_buttons -

    The secret password is $Q::pass -EOF - ; -} -print qq{

    Other examples}; -print qq{

    Go to the documentation}; - -print $query->end_html; - - - diff --git a/lib/perl5/5.8.8/CGI/eg/nph-clock.cgi b/lib/perl5/5.8.8/CGI/eg/nph-clock.cgi deleted file mode 100644 index 55a2fbe5..00000000 --- a/lib/perl5/5.8.8/CGI/eg/nph-clock.cgi +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/local/bin/perl -w - -use CGI::Push qw(:standard :html3); - -do_push(-next_page=>\&draw_time,-delay=>1); - -sub draw_time { - my $time = `/bin/date`; - return start_html('Tick Tock'), - div({-align=>CENTER}, - h1('Virtual Clock'), - h2($time) - ), - hr, - a({-href=>'index.html'},'More examples'), - end_html(); -} - diff --git a/lib/perl5/5.8.8/CGI/eg/nph-multipart.cgi b/lib/perl5/5.8.8/CGI/eg/nph-multipart.cgi deleted file mode 100644 index f8cea59a..00000000 --- a/lib/perl5/5.8.8/CGI/eg/nph-multipart.cgi +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/local/bin/perl -use CGI qw/:push -nph/; -$| = 1; -print multipart_init(-boundary=>'----------------here we go!'); -while (1) { - print multipart_start(-type=>'text/plain'), - "The current time is ",scalar(localtime),"\n", - multipart_end; - sleep 1; -} diff --git a/lib/perl5/5.8.8/CGI/eg/popup.cgi b/lib/perl5/5.8.8/CGI/eg/popup.cgi deleted file mode 100644 index 88cea1da..00000000 --- a/lib/perl5/5.8.8/CGI/eg/popup.cgi +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/local/bin/perl - -use CGI; -$query = new CGI; -print $query->header; -print $query->start_html('Popup Window'); - - -if (!$query->param) { - print "

    Ask your Question

    \n"; - print $query->startform(-target=>'_new'); - print "What's your name? ",$query->textfield('name'); - print "

    What's the combination?

    ", - $query->checkbox_group(-name=>'words', - -values=>['eenie','meenie','minie','moe'], - -defaults=>['eenie','moe']); - - print "

    What's your favorite color? ", - $query->popup_menu(-name=>'color', - -values=>['red','green','blue','chartreuse']), - "

    "; - print $query->submit; - print $query->endform; - -} else { - print "

    And the Answer is...

    \n"; - print "Your name is ",$query->param(name),"\n"; - print "

    The keywords are: ",join(", ",$query->param(words)),"\n"; - print "

    Your favorite color is ",$query->param(color),"\n"; -} -print qq{

    Go to the documentation}; -print $query->end_html; diff --git a/lib/perl5/5.8.8/CGI/eg/save_state.cgi b/lib/perl5/5.8.8/CGI/eg/save_state.cgi deleted file mode 100644 index 85bacaf5..00000000 --- a/lib/perl5/5.8.8/CGI/eg/save_state.cgi +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/local/bin/perl - -use CGI; -$query = new CGI; - -print $query->header; -print $query->start_html("Save and Restore Example"); -print "

    Save and Restore Example

    \n"; - -# Here's where we take action on the previous request -&save_parameters($query) if $query->param('action') eq 'SAVE'; -$query = &restore_parameters($query) if $query->param('action') eq 'RESTORE'; - -# Here's where we create the form -print $query->start_multipart_form; -print "Popup 1: ",$query->popup_menu('popup1',[qw{red green purple magenta orange chartreuse brown}]),"\n"; -print "Popup 2: ",$query->popup_menu('popup2',[qw{lion tiger bear zebra potto wildebeest frog emu gazelle}]),"\n"; -print "

    "; -$default_name = $query->remote_addr . '.sav'; -print "Save/restore state from file: ",$query->textfield('savefile',$default_name),"\n"; -print "

    "; -print $query->submit('action','SAVE'),$query->submit('action','RESTORE'); -print "

    ",$query->defaults; -print $query->endform; - -# Here we print out a bit at the end -print $query->end_html; - -sub save_parameters { - local($query) = @_; - local($filename) = &clean_name($query->param('savefile')); - if (open(FILE,">$filename")) { - $query->save(FILE); - close FILE; - print "State has been saved to file $filename\n"; - print "

    If you remember this name you can restore the state later.\n"; - } else { - print "Error: couldn't write to file $filename: $!\n"; - } -} - -sub restore_parameters { - local($query) = @_; - local($filename) = &clean_name($query->param('savefile')); - if (open(FILE,$filename)) { - $query = new CGI(FILE); # Throw out the old query, replace it with a new one - close FILE; - print "State has been restored from file $filename\n"; - } else { - print "Error: couldn't restore file $filename: $!\n"; - } - return $query; -} - - -# Very important subroutine -- get rid of all the naughty -# metacharacters from the file name. If there are, we -# complain bitterly and die. -sub clean_name { - local($name) = @_; - unless ($name=~/^[\w\._\-]+$/) { - print "$name has naughty characters. Only "; - print "alphanumerics are allowed. You can't use absolute names."; - die "Attempt to use naughty characters"; - } - return "WORLD_WRITABLE/$name"; -} diff --git a/lib/perl5/5.8.8/CGI/eg/tryit.cgi b/lib/perl5/5.8.8/CGI/eg/tryit.cgi deleted file mode 100644 index 83c620c3..00000000 --- a/lib/perl5/5.8.8/CGI/eg/tryit.cgi +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/local/bin/perl - -use CGI ':standard'; - -print header; -print start_html('A Simple Example'), - h1('A Simple Example'), - start_form, - "What's your name? ",textfield('name'), - p, - "What's the combination?", - p, - checkbox_group(-name=>'words', - -values=>['eenie','meenie','minie','moe'], - -defaults=>['eenie','minie']), - p, - "What's your favorite color? ", - popup_menu(-name=>'color', - -values=>['red','green','blue','chartreuse']), - p, - submit, - end_form, - hr; - -if (param()) { - print - "Your name is: ",em(param('name')), - p, - "The keywords are: ",em(join(", ",param('words'))), - p, - "Your favorite color is: ",em(param('color')), - hr; -} -print a({href=>'../cgi_docs.html'},'Go to the documentation'); -print end_html; - - diff --git a/lib/perl5/5.8.8/CGI/eg/wilogo_gif.uu b/lib/perl5/5.8.8/CGI/eg/wilogo_gif.uu deleted file mode 100644 index c5d10423..00000000 --- a/lib/perl5/5.8.8/CGI/eg/wilogo_gif.uu +++ /dev/null @@ -1,13 +0,0 @@ -begin 444 wilogo.gif -M1TE&.#=A7@!$`(```'X2F?___RP`````7@!$```"_D2.J<#MKF)ZU,A3,[OO -M(IUY']A%9"6AW$F)+#2]Y:BNLF6_\;WMHF*(A55\BX%UEI^;OJ8N%(*Z^4G -M.OJJ>8HZ.(>;JRMD>X" -M%A1XSM]!A?T8/C0T$1XMJG\B&G+,"-&C/(VS0(842;`)M'S>_OE8F#"=2S#* -M8LHLAS'D1Y,42UGY9O,F-T:X@@JEE@D1RW>/D@8R.DZ-+*E0CQ:9JJ5JU!SQ -MR&BU2D.;E*4'ER0TNY%G2A/Y.G[=VG%81+5K_UG$21-GQW55;$8L\RW6J8-9>QM7<^A/SMZK!ESY$,+ -(KPA.EJ```#L` -end diff --git a/lib/perl5/5.8.8/Encode/PerlIO.pod b/lib/perl5/5.8.8/Encode/PerlIO.pod deleted file mode 100644 index abd1f2d1..00000000 --- a/lib/perl5/5.8.8/Encode/PerlIO.pod +++ /dev/null @@ -1,167 +0,0 @@ -=head1 NAME - -Encode::PerlIO -- a detailed document on Encode and PerlIO - -=head1 Overview - -It is very common to want to do encoding transformations when -reading or writing files, network connections, pipes etc. -If Perl is configured to use the new 'perlio' IO system then -C provides a "layer" (see L) which can transform -data as it is read or written. - -Here is how the blind poet would modernise the encoding: - - use Encode; - open(my $iliad,'<:encoding(iso-8859-7)','iliad.greek'); - open(my $utf8,'>:utf8','iliad.utf8'); - my @epic = <$iliad>; - print $utf8 @epic; - close($utf8); - close($illiad); - -In addition, the new IO system can also be configured to read/write -UTF-8 encoded characters (as noted above, this is efficient): - - open(my $fh,'>:utf8','anything'); - print $fh "Any \x{0021} string \N{SMILEY FACE}\n"; - -Either of the above forms of "layer" specifications can be made the default -for a lexical scope with the C pragma. See L. - -Once a handle is open, its layers can be altered using C. - -Without any such configuration, or if Perl itself is built using the -system's own IO, then write operations assume that the file handle -accepts only I and will C if a character larger than 255 is -written to the handle. When reading, each octet from the handle becomes -a byte-in-a-character. Note that this default is the same behaviour -as bytes-only languages (including Perl before v5.6) would have, -and is sufficient to handle native 8-bit encodings e.g. iso-8859-1, -EBCDIC etc. and any legacy mechanisms for handling other encodings -and binary data. - -In other cases, it is the program's responsibility to transform -characters into bytes using the API above before doing writes, and to -transform the bytes read from a handle into characters before doing -"character operations" (e.g. C, C, ...). - -You can also use PerlIO to convert larger amounts of data you don't -want to bring into memory. For example, to convert between ISO-8859-1 -(Latin 1) and UTF-8 (or UTF-EBCDIC in EBCDIC machines): - - open(F, "<:encoding(iso-8859-1)", "data.txt") or die $!; - open(G, ">:utf8", "data.utf") or die $!; - while () { print G } - - # Could also do "print G " but that would pull - # the whole file into memory just to write it out again. - -More examples: - - open(my $f, "<:encoding(cp1252)") - open(my $g, ">:encoding(iso-8859-2)") - open(my $h, ">:encoding(latin9)") # iso-8859-15 - -See also L for how to change the default encoding of the -data in your script. - -=head1 How does it work? - -Here is a crude diagram of how filehandle, PerlIO, and Encode -interact. - - filehandle <-> PerlIO PerlIO <-> scalar (read/printed) - \ / - Encode - -When PerlIO receives data from either direction, it fills a buffer -(currently with 1024 bytes) and passes the buffer to Encode. -Encode tries to convert the valid part and passes it back to PerlIO, -leaving invalid parts (usually a partial character) in the buffer. -PerlIO then appends more data to the buffer, calls Encode again, -and so on until the data stream ends. - -To do so, PerlIO always calls (de|en)code methods with CHECK set to 1. -This ensures that the method stops at the right place when it -encounters partial character. The following is what happens when -PerlIO and Encode tries to encode (from utf8) more than 1024 bytes -and the buffer boundary happens to be in the middle of a character. - - A B C .... ~ \x{3000} .... - 41 42 43 .... 7E e3 80 80 .... - <- buffer ---------------> - << encoded >>>>>>>>>> - <- next buffer ------ - -Encode converts from the beginning to \x7E, leaving \xe3 in the buffer -because it is invalid (partial character). - -Unfortunately, this scheme does not work well with escape-based -encodings such as ISO-2022-JP. - -=head1 Line Buffering - -Now let's see what happens when you try to decode from ISO-2022-JP and -the buffer ends in the middle of a character. - - JIS208-ESC \x{5f3e} - A B C .... ~ \e $ B |DAN | .... - 41 42 43 .... 7E 1b 24 41 43 46 .... - <- buffer ---------------------------> - << encoded >>>>>>>>>>>>>>>>>>>>>>> - -As you see, the next buffer begins with \x43. But \x43 is 'C' in -ASCII, which is wrong in this case because we are now in JISX 0208 -area so it has to convert \x43\x46, not \x43. Unlike utf8 and EUC, -in escape-based encodings you can't tell if a given octet is a whole -character or just part of it. - -Fortunately PerlIO also supports line buffer if you tell PerlIO to use -one instead of fixed buffer. Since ISO-2022-JP is guaranteed to revert to ASCII at the end of the line, partial -character will never happen when line buffer is used. - -To tell PerlIO to use line buffer, implement -Eneeds_lines method -for your encoding object. See L for details. - -Thanks to these efforts most encodings that come with Encode support -PerlIO but that still leaves following encodings. - - iso-2022-kr - MIME-B - MIME-Header - MIME-Q - -Fortunately iso-2022-kr is hardly used (according to Jungshik) and -MIME-* are very unlikely to be fed to PerlIO because they are for mail -headers. See L for details. - -=head2 How can I tell whether my encoding fully supports PerlIO ? - -As of this writing, any encoding whose class belongs to Encode::XS and -Encode::Unicode works. The Encode module has a C method -which you can use before applying PerlIO encoding to the filehandle. -Here is an example: - - my $use_perlio = perlio_ok($enc); - my $layer = $use_perlio ? "<:raw" : "<:encoding($enc)"; - open my $fh, $layer, $file or die "$file : $!"; - while(<$fh>){ - $_ = decode($enc, $_) unless $use_perlio; - # .... - } - -=head1 SEE ALSO - -L, -L, -L, -L, -L, -L, -L, -L, -the Perl Unicode Mailing List Eperl-unicode@perl.orgE - -=cut - diff --git a/lib/perl5/5.8.8/Encode/Supported.pod b/lib/perl5/5.8.8/Encode/Supported.pod deleted file mode 100644 index 651f7e6e..00000000 --- a/lib/perl5/5.8.8/Encode/Supported.pod +++ /dev/null @@ -1,890 +0,0 @@ -=head1 NAME - -Encode::Supported -- Encodings supported by Encode - -=head1 DESCRIPTION - -=head2 Encoding Names - -Encoding names are case insensitive. White space in names -is ignored. In addition, an encoding may have aliases. -Each encoding has one "canonical" name. The "canonical" -name is chosen from the names of the encoding by picking -the first in the following sequence (with a few exceptions). - -=over 4 - -=item * - -The name used by the Perl community. That includes 'utf8' and 'ascii'. -Unlike aliases, canonical names directly reach the method so such -frequently used words like 'utf8' don't need to do alias lookups. - -=item * - -The MIME name as defined in IETF RFCs. This includes all "iso-"s. - -=item * - -The name in the IANA registry. - -=item * - -The name used by the organization that defined it. - -=back - -In case I canonical names differ from that of the Encode -module, they are always aliased if it ever be implemented. So you can -safely tell if a given encoding is implemented or not just by passing -the canonical name. - -Because of all the alias issues, and because in the general case -encodings have state, "Encode" uses an encoding object internally -once an operation is in progress. - -=head1 Supported Encodings - -As of Perl 5.8.0, at least the following encodings are recognized. -Note that unless otherwise specified, they are all case insensitive -(via alias) and all occurrence of spaces are replaced with '-'. -In other words, "ISO 8859 1" and "iso-8859-1" are identical. - -Encodings are categorized and implemented in several different modules -but you don't have to C to make them available for -most cases. Encode.pm will automatically load those modules on demand. - -=head2 Built-in Encodings - -The following encodings are always available. - - Canonical Aliases Comments & References - ---------------------------------------------------------------- - ascii US-ascii ISO-646-US [ECMA] - ascii-ctrl Special Encoding - iso-8859-1 latin1 [ISO] - null Special Encoding - utf8 UTF-8 [RFC2279] - ---------------------------------------------------------------- - -I and I are special. "null" fails for all character -so when you set fallback mode to PERLQQ, HTMLCREF or XMLCREF, ALL -CHARACTERS will fall back to character references. Ditto for -"ascii-ctrl" except for control characters. For fallback modes, see -L. - -=head2 Encode::Unicode -- other Unicode encodings - -Unicode coding schemes other than native utf8 are supported by -Encode::Unicode, which will be autoloaded on demand. - - ---------------------------------------------------------------- - UCS-2BE UCS-2, iso-10646-1 [IANA, UC] - UCS-2LE [UC] - UTF-16 [UC] - UTF-16BE [UC] - UTF-16LE [UC] - UTF-32 [UC] - UTF-32BE UCS-4 [UC] - UTF-32LE [UC] - UTF-7 [RFC2152] - ---------------------------------------------------------------- - -To find how (UCS-2|UTF-(16|32))(LE|BE)? differ from one another, -see L. - -UTF-7 is a special encoding which "re-encodes" UTF-16BE into a 7-bit -encoding. It is implemented seperately by Encode::Unicode::UTF7. - -=head2 Encode::Byte -- Extended ASCII - -Encode::Byte implements most single-byte encodings except for -Symbols and EBCDIC. The following encodings are based on single-byte -encodings implemented as extended ASCII. Most of them map -\x80-\xff (upper half) to non-ASCII characters. - -=over 4 - -=item ISO-8859 and corresponding vendor mappings - -Since there are so many, they are presented in table format with -languages and corresponding encoding names by vendors. Note that -the table is sorted in order of ISO-8859 and the corresponding vendor -mappings are slightly different from that of ISO. See -L for details. - - Lang/Regions ISO/Other Std. DOS Windows Macintosh Others - ---------------------------------------------------------------- - N. America (ASCII) cp437 AdobeStandardEncoding - cp863 (DOSCanadaF) - W. Europe iso-8859-1 cp850 cp1252 MacRoman nextstep - hp-roman8 - cp860 (DOSPortuguese) - Cntrl. Europe iso-8859-2 cp852 cp1250 MacCentralEurRoman - MacCroatian - MacRomanian - MacRumanian - Latin3[1] iso-8859-3 - Latin4[2] iso-8859-4 - Cyrillics iso-8859-5 cp855 cp1251 MacCyrillic - (See also next section) cp866 MacUkrainian - Arabic iso-8859-6 cp864 cp1256 MacArabic - cp1006 MacFarsi - Greek iso-8859-7 cp737 cp1253 MacGreek - cp869 (DOSGreek2) - Hebrew iso-8859-8 cp862 cp1255 MacHebrew - Turkish iso-8859-9 cp857 cp1254 MacTurkish - Nordics iso-8859-10 cp865 - cp861 MacIcelandic - MacSami - Thai iso-8859-11[3] cp874 MacThai - (iso-8859-12 is nonexistent. Reserved for Indics?) - Baltics iso-8859-13 cp775 cp1257 - Celtics iso-8859-14 - Latin9 [4] iso-8859-15 - Latin10 iso-8859-16 - Vietnamese viscii cp1258 MacVietnamese - ---------------------------------------------------------------- - - [1] Esperanto, Maltese, and Turkish. Turkish is now on 8859-9. - [2] Baltics. Now on 8859-10, except for Latvian. - [3] TIS 620 + Non-Breaking Space (0xA0 / U+00A0) - [4] Nicknamed Latin0; the Euro sign as well as French and Finnish - letters that are missing from 8859-1 were added. - -All cp* are also available as ibm-*, ms-*, and windows-* . See also -L. - -Macintosh encodings don't seem to be registered in such entities as -IANA. "Canonical" names in Encode are based upon Apple's Tech Note -1150. See L -for details. - -=item KOI8 - De Facto Standard for the Cyrillic world - -Though ISO-8859 does have ISO-8859-5, the KOI8 series is far more -popular in the Net. L comes with the following KOI charsets. -For gory details, see L - - ---------------------------------------------------------------- - koi8-f - koi8-r cp878 [RFC1489] - koi8-u [RFC2319] - ---------------------------------------------------------------- - -=item gsm0338 - Hentai Latin 1 - -GSM0338 is for GSM handsets. Though it shares alphanumerals with -ASCII, control character ranges and other parts are mapped very -differently, mainly to store Greek characters. There are also escape -sequences (starting with 0x1B) to cover e.g. the Euro sign. Some -special cases like a trailing 0x00 byte or a lone 0x1B byte are not -well-defined and decode() will return an empty string for them. -One possible workaround is - - $gsm =~ s/\x00\z/\x00\x00/; - $uni = decode("gsm0338", $gsm); - $uni .= "\xA0" if $gsm =~ /\x1B\z/; - -Note that the Encode implementation of GSM0338 does not implement the -reuse of Latin capital letters as Greek capital letters (for example, -the 0x5A is U+005A (LATIN CAPITAL LETTER Z), not U+0396 (GREEK CAPITAL -LETTER ZETA). - -The GSM0338 is also covered in Encode::Byte even though it is not -an "extended ASCII" encoding. - -=back - -=head2 CJK: Chinese, Japanese, Korean (Multibyte) - -Note that Vietnamese is listed above. Also read "Encoding vs Charset" -below. Also note that these are implemented in distinct modules by -countries, due to the size concerns (simplified Chinese is mapped -to 'CN', continental China, while traditional Chinese is mapped to -'TW', Taiwan). Please refer to their respective documentation pages. - -=over 4 - -=item Encode::CN -- Continental China - - Standard DOS/Win Macintosh Comment/Reference - ---------------------------------------------------------------- - euc-cn [1] MacChineseSimp - (gbk) cp936 [2] - gb12345-raw { GB12345 without CES } - gb2312-raw { GB2312 without CES } - hz - iso-ir-165 - ---------------------------------------------------------------- - - [1] GB2312 is aliased to this. See L - [2] gbk is aliased to this. See L - -=item Encode::JP -- Japan - - Standard DOS/Win Macintosh Comment/Reference - ---------------------------------------------------------------- - euc-jp - shiftjis cp932 macJapanese - 7bit-jis - iso-2022-jp [RFC1468] - iso-2022-jp-1 [RFC2237] - jis0201-raw { JIS X 0201 (roman + halfwidth kana) without CES } - jis0208-raw { JIS X 0208 (Kanji + fullwidth kana) without CES } - jis0212-raw { JIS X 0212 (Extended Kanji) without CES } - ---------------------------------------------------------------- - -=item Encode::KR -- Korea - - Standard DOS/Win Macintosh Comment/Reference - ---------------------------------------------------------------- - euc-kr MacKorean [RFC1557] - cp949 [1] - iso-2022-kr [RFC1557] - johab [KS X 1001:1998, Annex 3] - ksc5601-raw { KSC5601 without CES } - ---------------------------------------------------------------- - - [1] ks_c_5601-1987, (x-)?windows-949, and uhc are aliased to this. - See below. - -=item Encode::TW -- Taiwan - - Standard DOS/Win Macintosh Comment/Reference - ---------------------------------------------------------------- - big5-eten cp950 MacChineseTrad {big5 aliased to big5-eten} - big5-hkscs - ---------------------------------------------------------------- - -=item Encode::HanExtra -- More Chinese via CPAN - -Due to the size concerns, additional Chinese encodings below are -distributed separately on CPAN, under the name Encode::HanExtra. - - Standard DOS/Win Macintosh Comment/Reference - ---------------------------------------------------------------- - big5ext CMEX's Big5e Extension - big5plus CMEX's Big5+ Extension - cccii Chinese Character Code for Information Interchange - euc-tw EUC (Extended Unix Character) - gb18030 GBK with Traditional Characters - ---------------------------------------------------------------- - -=item Encode::JIS2K -- JIS X 0213 encodings via CPAN - -Due to size concerns, additional Japanese encodings below are -distributed separately on CPAN, under the name Encode::JIS2K. - - Standard DOS/Win Macintosh Comment/Reference - ---------------------------------------------------------------- - euc-jisx0213 - shiftjisx0123 - iso-2022-jp-3 - jis0213-1-raw - jis0213-2-raw - ---------------------------------------------------------------- - -=back - -=head2 Miscellaneous encodings - -=over 4 - -=item Encode::EBCDIC - -See L for details. - - ---------------------------------------------------------------- - cp37 - cp500 - cp875 - cp1026 - cp1047 - posix-bc - ---------------------------------------------------------------- - -=item Encode::Symbols - -For symbols and dingbats. - - ---------------------------------------------------------------- - symbol - dingbats - MacDingbats - AdobeZdingbat - AdobeSymbol - ---------------------------------------------------------------- - -=item Encode::MIME::Header - -Strictly speaking, MIME header encoding documented in RFC 2047 is more -of encapsulation than encoding. However, their support in modern -world is imperative so they are supported. - - ---------------------------------------------------------------- - MIME-Header [RFC2047] - MIME-B [RFC2047] - MIME-Q [RFC2047] - ---------------------------------------------------------------- - -=item Encode::Guess - -This one is not a name of encoding but a utility that lets you pick up -the most appropriate encoding for a data out of given I. See -L for details. - -=back - -=head1 Unsupported encodings - -The following encodings are not supported as yet; some because they -are rarely used, some because of technical difficulties. They may -be supported by external modules via CPAN in the future, however. - -=over 4 - -=item ISO-2022-JP-2 [RFC1554] - -Not very popular yet. Needs Unicode Database or equivalent to -implement encode() (because it includes JIS X 0208/0212, KSC5601, and -GB2312 simultaneously, whose code points in Unicode overlap. So you -need to lookup the database to determine to what character set a given -Unicode character should belong). - -=item ISO-2022-CN [RFC1922] - -Not very popular. Needs CNS 11643-1 and -2 which are not available in -this module. CNS 11643 is supported (via euc-tw) in Encode::HanExtra. -Autrijus Tang may add support for this encoding in his module in future. - -=item Various HP-UX encodings - -The following are unsupported due to the lack of mapping data. - - '8' - arabic8, greek8, hebrew8, kana8, thai8, and turkish8 - '15' - japanese15, korean15, and roi15 - -=item Cyrillic encoding ISO-IR-111 - -Anton Tagunov doubts its usefulness. - -=item ISO-8859-8-1 [Hebrew] - -None of the Encode team knows Hebrew enough (ISO-8859-8, cp1255 and -MacHebrew are supported because and just because there were mappings -available at L). Contributions welcome. - -=item ISIRI 3342, Iran System, ISIRI 2900 [Farsi] - -Ditto. - -=item Thai encoding TCVN - -Ditto. - -=item Vietnamese encodings VPS - -Though Jungshik Shin has reported that Mozilla supports this encoding, -it was too late before 5.8.0 for us to add it. In the future, it -may be available via a separate module. See -L -and -L -if you are interested in helping us. - -=item Various Mac encodings - -The following are unsupported due to the lack of mapping data. - - MacArmenian, MacBengali, MacBurmese, MacEthiopic - MacExtArabic, MacGeorgian, MacKannada, MacKhmer - MacLaotian, MacMalayalam, MacMongolian, MacOriya - MacSinhalese, MacTamil, MacTelugu, MacTibetan - MacVietnamese - -The rest which are already available are based upon the vendor mappings -at L . - -=item (Mac) Indic encodings - -The maps for the following are available at L -but remain unsupport because those encodings need algorithmical -approach, currently unsupported by F: - - MacDevanagari - MacGurmukhi - MacGujarati - -For details, please see C at -L . - -I believe this issue is prevalent not only for Mac Indics but also in -other Indic encodings, but the above were the only Indic encodings -maps that I could find at L . - -=back - -=head1 Encoding vs. Charset -- terminology - -We are used to using the term (character) I and I interchangeably. But just as confusing the terms byte and -character is dangerous and the terms should be differentiated when -needed, we need to differentiate I and I. - -To understand that, here is a description of how we make computers -grok our characters. - -=over 4 - -=item * - -First we start with which characters to include. We call this -collection of characters I. - -=item * - -Then we have to give each character a unique ID so your computer can -tell the difference between 'a' and 'A'. This itemized character -repertoire is now a I. - -=item * - -If your computer can grow the character set without further -processing, you can go ahead and use it. This is called a I (CCS) or I. ASCII is used this -way for most cases. - -=item * - -But in many cases, especially multi-byte CJK encodings, you have to -tweak a little more. Your network connection may not accept any data -with the Most Significant Bit set, and your computer may not be able to -tell if a given byte is a whole character or just half of it. So you -have to I the character set to use it. - -A I (CES) determines how to encode a given -character set, or a set of multiple character sets. 7bit ISO-2022 is -an example of a CES. You switch between character sets via I. - -=back - -Technically, or mathematically, speaking, a character set encoded in -such a CES that maps character by character may form a CCS. EUC is such -an example. The CES of EUC is as follows: - -=over 4 - -=item * - -Map ASCII unchanged. - -=item * - -Map such a character set that consists of 94 or 96 powered by N -members by adding 0x80 to each byte. - -=item * - -You can also use 0x8e and 0x8f to indicate that the following sequence of -characters belongs to yet another character set. To each following byte -is added the value 0x80. - -=back - -By carefully looking at the encoded byte sequence, you can find that the -byte sequence conforms a unique number. In that sense, EUC is a CCS -generated by a CES above from up to four CCS (complicated?). UTF-8 -falls into this category. See L to find out how -UTF-8 maps Unicode to a byte sequence. - -You may also have found out by now why 7bit ISO-2022 cannot comprise -a CCS. If you look at a byte sequence \x21\x21, you can't tell if -it is two !'s or IDEOGRAPHIC SPACE. EUC maps the latter to \xA1\xA1 -so you have no trouble differentiating between "!!". and S<" ">. - -=head1 Encoding Classification (by Anton Tagunov and Dan Kogai) - -This section tries to classify the supported encodings by their -applicability for information exchange over the Internet and to -choose the most suitable aliases to name them in the context of -such communication. - -=over 4 - -=item * - -To (en|de)code encodings marked by C<(**)>, you need -C, available from CPAN. - -=back - -Encoding names - - US-ASCII UTF-8 ISO-8859-* KOI8-R - Shift_JIS EUC-JP ISO-2022-JP ISO-2022-JP-1 - EUC-KR Big5 GB2312 - -are registered with IANA as preferred MIME names and may -be used over the Internet. - -C has been officialized by JIS X 0208:1997. -L gives details. - -C is the IANA name for C. -See L for details. - -C I encoding is available as C -with Encode. See L for details. - - EUC-CN - KOI8-U [RFC2319] - -have not been registered with IANA (as of March 2002) but -seem to be supported by major web browsers. -The IANA name for C is C. - - KS_C_5601-1987 - -is heavily misused. -See L for details. - -C I encoding is available as C -with Encode. See L for details. - - UTF-16 UTF-16BE UTF-16LE - -are IANA-registered Cs. See [RFC 2781] for details. -Jungshik Shin reports that UTF-16 with a BOM is well accepted -by MS IE 5/6 and NS 4/6. Beware however that - -=over 4 - -=item * - -C support in any software you're going to be -using/interoperating with has probably been less tested -then C support - -=item * - -C coded data seamlessly passes traditional -command piping (C, C, etc.) while C coded -data is likely to cause confusion (with its zero bytes, -for example) - -=item * - -it is beyond the power of words to describe the way HTML browsers -encode non-C form data. To get a general impression, visit -L. -While encoding of form data has stabilized for C encoded pages -(at least IE 5/6, NS 6, and Opera 6 behave consistently), be sure to -expect fun (and cross-browser discrepancies) with C encoded -pages! - -=back - -The rule of thumb is to use C unless you know what -you're doing and unless you really benefit from using C. - - ISO-IR-165 [RFC1345] - VISCII - GB 12345 - GB 18030 (**) (see links bellow) - EUC-TW (**) - -are totally valid encodings but not registered at IANA. -The names under which they are listed here are probably the -most widely-known names for these encodings and are recommended -names. - - BIG5PLUS (**) - -is a proprietary name. - -=head2 Microsoft-related naming mess - -Microsoft products misuse the following names: - -=over 4 - -=item KS_C_5601-1987 - -Microsoft extension to C. - -Proper names: C, C, C (as used by Mozilla). - -See L -for details. - -Encode aliases C to C to reflect this common -misusage. I C encoding is available as -C. - -See L for details. - -=item GB2312 - -Microsoft extension to C. - -Proper names: C, C. - -C has been registered in the C meaning at -IANA. This has partially repaired the situation: Microsoft's -C has become a superset of the official C. - -Encode aliases C to C in full agreement with -IANA registration. C is supported separately. -I C encoding is available as C. - -See L for details. - -=item Big5 - -Microsoft extension to C. - -Proper name: C. - -Encode separately supports C and C. - -=item Shift_JIS - -Microsoft's understanding of C. - -JIS has not endorsed the full Microsoft standard however. -The official C includes only JIS X 0201 and JIS X 0208 -character sets, while Microsoft has always used C -to encode a wider character repertoire. See C registration for -C. - -As a historical predecessor, Microsoft's variant -probably has more rights for the name, though it may be objected -that Microsoft shouldn't have used JIS as part of the name -in the first place. - -Unambiguous name: C. C name (also used by Mozilla, and -provided as an alias by Encode): C. - -Encode separately supports C and C. - -=back - -=head1 Glossary - -=over 4 - -=item character repertoire - -A collection of unique characters. A I set in the strictest -sense. At this stage, characters are not numbered. - -=item coded character set (CCS) - -A character set that is mapped in a way computers can use directly. -Many character encodings, including EUC, fall in this category. - -=item character encoding scheme (CES) - -An algorithm to map a character set to a byte sequence. You don't -have to be able to tell which character set a given byte sequence -belongs. 7-bit ISO-2022 is a CES but it cannot be a CCS. EUC is an -example of being both a CCS and CES. - -=item charset (in MIME context) - -has long been used in the meaning of C, CES. - -While the word combination C has lost this meaning -in MIME context since [RFC 2130], the C abbreviation has -retained it. This is how [RFC 2277] and [RFC 2278] bless C: - - This document uses the term "charset" to mean a set of rules for - mapping from a sequence of octets to a sequence of characters, such - as the combination of a coded character set and a character encoding - scheme; this is also what is used as an identifier in MIME "charset=" - parameters, and registered in the IANA charset registry ... (Note - that this is NOT a term used by other standards bodies, such as ISO). - [RFC 2277] - -=item EUC - -Extended Unix Character. See ISO-2022. - -=item ISO-2022 - -A CES that was carefully designed to coexist with ASCII. There are a 7 -bit version and an 8 bit version. - -The 7 bit version switches character set via escape sequence so it -cannot form a CCS. Since this is more difficult to handle in programs -than the 8 bit version, the 7 bit version is not very popular except for -iso-2022-jp, the I standard CES for e-mails. - -The 8 bit version can form a CCS. EUC and ISO-8859 are two examples -thereof. Pre-5.6 perl could use them as string literals. - -=item UCS - -Short for I. When you say just UCS, it means -I. - -=item UCS-2 - -ISO/IEC 10646 encoding form: Universal Character Set coded in two -octets. - -=item Unicode - -A character set that aims to include all character repertoires of the -world. Many character sets in various national as well as industrial -standards have become, in a way, just subsets of Unicode. - -=item UTF - -Short for I. Determines how to map a -Unicode character into a byte sequence. - -=item UTF-16 - -A UTF in 16-bit encoding. Can either be in big endian or little -endian. The big endian version is called UTF-16BE (equal to UCS-2 + -surrogate support) and the little endian version is called UTF-16LE. - -=back - -=head1 See Also - -L, -L, -L, L, L, L, -L, L -L, L - -=head1 References - -=over 4 - -=item ECMA - -European Computer Manufacturers Association -L - -=over 4 - -=item ECMA-035 (eq C) - -L - -The specification of ISO-2022 is available from the link above. - -=back - -=item IANA - -Internet Assigned Numbers Authority -L - -=over 4 - -=item Assigned Charset Names by IANA - -L - -Most of the C in Encode derive from this list -so you can directly apply the string you have extracted from MIME -header of mails and web pages. - -=back - -=item ISO - -International Organization for Standardization -L - -=item RFC - -Request For Comments -- need I say more? -L, L, -L - -=item UC - -Unicode Consortium -L - -=over 4 - -=item Unicode Glossary - -L - -The glossary of this document is based upon this site. - -=back - -=back - -=head2 Other Notable Sites - -=over 4 - -=item czyborra.com - -L - -Contains a lot of useful information, especially gory details of ISO -vs. vendor mappings. - -=item CJK.inf - -L - -Somewhat obsolete (last update in 1996), but still useful. Also try - -L - -You will find brief info on C, C and mostly on C. - -=item Jungshik Shin's Hangul FAQ - -L - -And especially its subject 8. - -L - -A comprehensive overview of the Korean (C) standards. - -=item debian.org: "Introduction to i18n" - -A brief description for most of the mentioned CJK encodings is -contained in -L - -=back - -=head2 Offline sources - -=over 4 - -=item C by Ken Lunde - -CJKV Information Processing -1999 O'Reilly & Associates, ISBN : 1-56592-224-7 - -The modern successor of C. - -Features a comprehensive coverage of CJKV character sets and -encodings along with many other issues faced by anyone trying -to better support CJKV languages/scripts in all the areas of -information processing. - -To purchase this book, visit -L -or your favourite bookstore. - -=back - -=cut diff --git a/lib/perl5/5.8.8/Encode/encode.h b/lib/perl5/5.8.8/Encode/encode.h deleted file mode 100644 index 94764a6a..00000000 --- a/lib/perl5/5.8.8/Encode/encode.h +++ /dev/null @@ -1,111 +0,0 @@ -#ifndef ENCODE_H -#define ENCODE_H - -#ifndef U8 -/* - A tad devious this: - perl normally has a #define for U8 - if that isn't present then we - typedef it - leaving it #ifndef so we can do data parts without - getting extern references to the code parts -*/ -typedef unsigned char U8; -#endif - -typedef struct encpage_s encpage_t; - -struct encpage_s -{ - /* fields ordered to pack nicely on 32-bit machines */ - const U8 *seq; /* Packed output sequences we generate - if we match */ - encpage_t *next; /* Page to go to if we match */ - U8 min; /* Min value of octet to match this entry */ - U8 max; /* Max value of octet to match this entry */ - U8 dlen; /* destination length - - size of entries in seq */ - U8 slen; /* source length - - number of source octets needed */ -}; - -/* - At any point in a translation there is a page pointer which points - at an array of the above structures. - - Basic operation : - get octet from source stream. - if (octet >= min && octet < max) { - if slen is 0 then we cannot represent this character. - if we have less than slen octets (including this one) then - we have a partial character. - otherwise - copy dlen octets from seq + dlen*(octet-min) to output - (dlen may be zero if we don't know yet.) - load page pointer with next to continue. - (is slen is one this is end of a character) - get next octet. - } - else { - increment the page pointer to look at next slot in the array - } - - arrays SHALL be constructed so there is an entry which matches - ..0xFF at the end, and either maps it or indicates no - representation. - - if MSB of slen is set then mapping is an approximate "FALLBACK" entry. - -*/ - - -typedef struct encode_s encode_t; -struct encode_s -{ - encpage_t *t_utf8; /* Starting table for translation from - the encoding to UTF-8 form */ - encpage_t *f_utf8; /* Starting table for translation - from UTF-8 to the encoding */ - const U8 *rep; /* Replacement character in this encoding - e.g. "?" */ - int replen; /* Number of octets in rep */ - U8 min_el; /* Minimum octets to represent a character */ - U8 max_el; /* Maximum octets to represent a character */ - const char *name[2]; /* name(s) of this encoding */ -}; - -#ifdef U8 -/* See comment at top of file for deviousness */ - -extern int do_encode(encpage_t *enc, const U8 *src, STRLEN *slen, - U8 *dst, STRLEN dlen, STRLEN *dout, int approx, - const U8 *term, STRLEN tlen); - -extern void Encode_DefineEncoding(encode_t *enc); - -#endif /* U8 */ - -#define ENCODE_NOSPACE 1 -#define ENCODE_PARTIAL 2 -#define ENCODE_NOREP 3 -#define ENCODE_FALLBACK 4 -#define ENCODE_FOUND_TERM 5 - -#define FBCHAR_UTF8 "\xEF\xBF\xBD" - -#define ENCODE_DIE_ON_ERR 0x0001 /* croaks immediately */ -#define ENCODE_WARN_ON_ERR 0x0002 /* warn on error; may proceed */ -#define ENCODE_RETURN_ON_ERR 0x0004 /* immediately returns on NOREP */ -#define ENCODE_LEAVE_SRC 0x0008 /* $src updated unless set */ -#define ENCODE_PERLQQ 0x0100 /* perlqq fallback string */ -#define ENCODE_HTMLCREF 0x0200 /* HTML character ref. fb mode */ -#define ENCODE_XMLCREF 0x0400 /* XML character ref. fb mode */ -#define ENCODE_STOP_AT_PARTIAL 0x0800 /* stop at partial explicitly */ - -#define ENCODE_FB_DEFAULT 0x0000 -#define ENCODE_FB_CROAK 0x0001 -#define ENCODE_FB_QUIET ENCODE_RETURN_ON_ERR -#define ENCODE_FB_WARN (ENCODE_RETURN_ON_ERR|ENCODE_WARN_ON_ERR) -#define ENCODE_FB_PERLQQ (ENCODE_PERLQQ|ENCODE_LEAVE_SRC) -#define ENCODE_FB_HTMLCREF (ENCODE_HTMLCREF|ENCODE_LEAVE_SRC) -#define ENCODE_FB_XMLCREF (ENCODE_XMLCREF|ENCODE_LEAVE_SRC) - -#endif /* ENCODE_H */ diff --git a/lib/perl5/5.8.8/ExtUtils/Command.pm b/lib/perl5/5.8.8/ExtUtils/Command.pm deleted file mode 100644 index ecd7813b..00000000 --- a/lib/perl5/5.8.8/ExtUtils/Command.pm +++ /dev/null @@ -1,319 +0,0 @@ -package ExtUtils::Command; - -use 5.00503; -use strict; -use Carp; -use File::Copy; -use File::Compare; -use File::Basename; -use File::Path qw(rmtree); -require Exporter; -use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION); -@ISA = qw(Exporter); -@EXPORT = qw(cp rm_f rm_rf mv cat eqtime mkpath touch test_f chmod - dos2unix); -$VERSION = '1.09'; - -my $Is_VMS = $^O eq 'VMS'; - -=head1 NAME - -ExtUtils::Command - utilities to replace common UNIX commands in Makefiles etc. - -=head1 SYNOPSIS - - perl -MExtUtils::Command -e cat files... > destination - perl -MExtUtils::Command -e mv source... destination - perl -MExtUtils::Command -e cp source... destination - perl -MExtUtils::Command -e touch files... - perl -MExtUtils::Command -e rm_f files... - perl -MExtUtils::Command -e rm_rf directories... - perl -MExtUtils::Command -e mkpath directories... - perl -MExtUtils::Command -e eqtime source destination - perl -MExtUtils::Command -e test_f file - perl -MExtUtils::Command -e chmod mode files... - ... - -=head1 DESCRIPTION - -The module is used to replace common UNIX commands. In all cases the -functions work from @ARGV rather than taking arguments. This makes -them easier to deal with in Makefiles. - - perl -MExtUtils::Command -e some_command some files to work on - -I - - perl -MExtUtils::Command -e 'some_command qw(some files to work on)' - -For that use L. - -Filenames with * and ? will be glob expanded. - -=over 4 - -=cut - -# VMS uses % instead of ? to mean "one character" -my $wild_regex = $Is_VMS ? '*%' : '*?'; -sub expand_wildcards -{ - @ARGV = map(/[$wild_regex]/o ? glob($_) : $_,@ARGV); -} - - -=item cat - - cat file ... - -Concatenates all files mentioned on command line to STDOUT. - -=cut - -sub cat () -{ - expand_wildcards(); - print while (<>); -} - -=item eqtime - - eqtime source destination - -Sets modified time of destination to that of source. - -=cut - -sub eqtime -{ - my ($src,$dst) = @ARGV; - local @ARGV = ($dst); touch(); # in case $dst doesn't exist - utime((stat($src))[8,9],$dst); -} - -=item rm_rf - - rm_rf files or directories ... - -Removes files and directories - recursively (even if readonly) - -=cut - -sub rm_rf -{ - expand_wildcards(); - rmtree([grep -e $_,@ARGV],0,0); -} - -=item rm_f - - rm_f file ... - -Removes files (even if readonly) - -=cut - -sub rm_f { - expand_wildcards(); - - foreach my $file (@ARGV) { - next unless -f $file; - - next if _unlink($file); - - chmod(0777, $file); - - next if _unlink($file); - - carp "Cannot delete $file: $!"; - } -} - -sub _unlink { - my $files_unlinked = 0; - foreach my $file (@_) { - my $delete_count = 0; - $delete_count++ while unlink $file; - $files_unlinked++ if $delete_count; - } - return $files_unlinked; -} - - -=item touch - - touch file ... - -Makes files exist, with current timestamp - -=cut - -sub touch { - my $t = time; - expand_wildcards(); - foreach my $file (@ARGV) { - open(FILE,">>$file") || die "Cannot write $file:$!"; - close(FILE); - utime($t,$t,$file); - } -} - -=item mv - - mv source_file destination_file - mv source_file source_file destination_dir - -Moves source to destination. Multiple sources are allowed if -destination is an existing directory. - -Returns true if all moves succeeded, false otherwise. - -=cut - -sub mv { - expand_wildcards(); - my @src = @ARGV; - my $dst = pop @src; - - croak("Too many arguments") if (@src > 1 && ! -d $dst); - - my $nok = 0; - foreach my $src (@src) { - $nok ||= !move($src,$dst); - } - return !$nok; -} - -=item cp - - cp source_file destination_file - cp source_file source_file destination_dir - -Copies sources to the destination. Multiple sources are allowed if -destination is an existing directory. - -Returns true if all copies succeeded, false otherwise. - -=cut - -sub cp { - expand_wildcards(); - my @src = @ARGV; - my $dst = pop @src; - - croak("Too many arguments") if (@src > 1 && ! -d $dst); - - my $nok = 0; - foreach my $src (@src) { - $nok ||= !copy($src,$dst); - } - return $nok; -} - -=item chmod - - chmod mode files ... - -Sets UNIX like permissions 'mode' on all the files. e.g. 0666 - -=cut - -sub chmod { - local @ARGV = @ARGV; - my $mode = shift(@ARGV); - expand_wildcards(); - - if( $Is_VMS ) { - foreach my $idx (0..$#ARGV) { - my $path = $ARGV[$idx]; - next unless -d $path; - - # chmod 0777, [.foo.bar] doesn't work on VMS, you have to do - # chmod 0777, [.foo]bar.dir - my @dirs = File::Spec->splitdir( $path ); - $dirs[-1] .= '.dir'; - $path = File::Spec->catfile(@dirs); - - $ARGV[$idx] = $path; - } - } - - chmod(oct $mode,@ARGV) || die "Cannot chmod ".join(' ',$mode,@ARGV).":$!"; -} - -=item mkpath - - mkpath directory ... - -Creates directories, including any parent directories. - -=cut - -sub mkpath -{ - expand_wildcards(); - File::Path::mkpath([@ARGV],0,0777); -} - -=item test_f - - test_f file - -Tests if a file exists - -=cut - -sub test_f -{ - exit !-f $ARGV[0]; -} - -=item dos2unix - - dos2unix files or dirs ... - -Converts DOS and OS/2 linefeeds to Unix style recursively. - -=cut - -sub dos2unix { - require File::Find; - File::Find::find(sub { - return if -d; - return unless -w _; - return unless -r _; - return if -B _; - - local $\; - - my $orig = $_; - my $temp = '.dos2unix_tmp'; - open ORIG, $_ or do { warn "dos2unix can't open $_: $!"; return }; - open TEMP, ">$temp" or - do { warn "dos2unix can't create .dos2unix_tmp: $!"; return }; - while (my $line = ) { - $line =~ s/\015\012/\012/g; - print TEMP $line; - } - close ORIG; - close TEMP; - rename $temp, $orig; - - }, @ARGV); -} - -=back - -=head1 SEE ALSO - -Shell::Command which is these same functions but take arguments normally. - - -=head1 AUTHOR - -Nick Ing-Simmons C - -Currently maintained by Michael G Schwern C. - -=cut - diff --git a/lib/perl5/5.8.8/ExtUtils/Command/MM.pm b/lib/perl5/5.8.8/ExtUtils/Command/MM.pm deleted file mode 100644 index 046fb8b5..00000000 --- a/lib/perl5/5.8.8/ExtUtils/Command/MM.pm +++ /dev/null @@ -1,265 +0,0 @@ -package ExtUtils::Command::MM; - -use strict; - -require 5.005_03; -require Exporter; -use vars qw($VERSION @ISA @EXPORT); -@ISA = qw(Exporter); - -@EXPORT = qw(test_harness pod2man perllocal_install uninstall - warn_if_old_packlist); -$VERSION = '0.05'; - -my $Is_VMS = $^O eq 'VMS'; - - -=head1 NAME - -ExtUtils::Command::MM - Commands for the MM's to use in Makefiles - -=head1 SYNOPSIS - - perl "-MExtUtils::Command::MM" -e "function" "--" arguments... - - -=head1 DESCRIPTION - -B The interface is not stable. - -ExtUtils::Command::MM encapsulates code which would otherwise have to -be done with large "one" liners. - -Any $(FOO) used in the examples are make variables, not Perl. - -=over 4 - -=item B - - test_harness($verbose, @test_libs); - -Runs the tests on @ARGV via Test::Harness passing through the $verbose -flag. Any @test_libs will be unshifted onto the test's @INC. - -@test_libs are run in alphabetical order. - -=cut - -sub test_harness { - require Test::Harness; - require File::Spec; - - $Test::Harness::verbose = shift; - - # Because Windows doesn't do this for us and listing all the *.t files - # out on the command line can blow over its exec limit. - require ExtUtils::Command; - my @argv = ExtUtils::Command::expand_wildcards(@ARGV); - - local @INC = @INC; - unshift @INC, map { File::Spec->rel2abs($_) } @_; - Test::Harness::runtests(sort { lc $a cmp lc $b } @argv); -} - - - -=item B - - pod2man( '--option=value', - $podfile1 => $manpage1, - $podfile2 => $manpage2, - ... - ); - - # or args on @ARGV - -pod2man() is a function performing most of the duties of the pod2man -program. Its arguments are exactly the same as pod2man as of 5.8.0 -with the addition of: - - --perm_rw octal permission to set the resulting manpage to - -And the removal of: - - --verbose/-v - --help/-h - -If no arguments are given to pod2man it will read from @ARGV. - -=cut - -sub pod2man { - require Pod::Man; - require Getopt::Long; - - my %options = (); - - # We will cheat and just use Getopt::Long. We fool it by putting - # our arguments into @ARGV. Should be safe. - local @ARGV = @_ ? @_ : @ARGV; - Getopt::Long::config ('bundling_override'); - Getopt::Long::GetOptions (\%options, - 'section|s=s', 'release|r=s', 'center|c=s', - 'date|d=s', 'fixed=s', 'fixedbold=s', 'fixeditalic=s', - 'fixedbolditalic=s', 'official|o', 'quotes|q=s', 'lax|l', - 'name|n=s', 'perm_rw:i' - ); - - # If there's no files, don't bother going further. - return 0 unless @ARGV; - - # Official sets --center, but don't override things explicitly set. - if ($options{official} && !defined $options{center}) { - $options{center} = q[Perl Programmer's Reference Guide]; - } - - # This isn't a valid Pod::Man option and is only accepted for backwards - # compatibility. - delete $options{lax}; - - my $parser = Pod::Man->new(%options); - - do {{ # so 'next' works - my ($pod, $man) = splice(@ARGV, 0, 2); - - next if ((-e $man) && - (-M $man < -M $pod) && - (-M $man < -M "Makefile")); - - print "Manifying $man\n"; - - $parser->parse_from_file($pod, $man) - or do { warn("Could not install $man\n"); next }; - - if (length $options{perm_rw}) { - chmod(oct($options{perm_rw}), $man) - or do { warn("chmod $options{perm_rw} $man: $!\n"); next }; - } - }} while @ARGV; - - return 1; -} - - -=item B - - perl "-MExtUtils::Command::MM" -e warn_if_old_packlist - -Displays a warning that an old packlist file was found. Reads the -filename from @ARGV. - -=cut - -sub warn_if_old_packlist { - my $packlist = $ARGV[0]; - - return unless -f $packlist; - print <<"PACKLIST_WARNING"; -WARNING: I have found an old package in - $packlist. -Please make sure the two installations are not conflicting -PACKLIST_WARNING - -} - - -=item B - - perl "-MExtUtils::Command::MM" -e perllocal_install - ... - - # VMS only, key|value pairs come on STDIN - perl "-MExtUtils::Command::MM" -e perllocal_install - < | ... - -Prints a fragment of POD suitable for appending to perllocal.pod. -Arguments are read from @ARGV. - -'type' is the type of what you're installing. Usually 'Module'. - -'module name' is simply the name of your module. (Foo::Bar) - -Key/value pairs are extra information about the module. Fields include: - - installed into which directory your module was out into - LINKTYPE dynamic or static linking - VERSION module version number - EXE_FILES any executables installed in a space seperated - list - -=cut - -sub perllocal_install { - my($type, $name) = splice(@ARGV, 0, 2); - - # VMS feeds args as a piped file on STDIN since it usually can't - # fit all the args on a single command line. - @ARGV = split /\|/, if $Is_VMS; - - my $pod; - $pod = sprintf < L<$name|$name> - - =over 4 - -POD - - do { - my($key, $val) = splice(@ARGV, 0, 2); - - $pod .= < - -POD - - } while(@ARGV); - - $pod .= "=back\n\n"; - $pod =~ s/^ //mg; - print $pod; - - return 1; -} - -=item B - - perl "-MExtUtils::Command::MM" -e uninstall - -A wrapper around ExtUtils::Install::uninstall(). Warns that -uninstallation is deprecated and doesn't actually perform the -uninstallation. - -=cut - -sub uninstall { - my($packlist) = shift @ARGV; - - require ExtUtils::Install; - - print <<'WARNING'; - -Uninstall is unsafe and deprecated, the uninstallation was not performed. -We will show what would have been done. - -WARNING - - ExtUtils::Install::uninstall($packlist, 1, 1); - - print <<'WARNING'; - -Uninstall is unsafe and deprecated, the uninstallation was not performed. -Please check the list above carefully, there may be errors. -Remove the appropriate files manually. -Sorry for the inconvenience. - -WARNING - -} - -=back - -=cut - -1; diff --git a/lib/perl5/5.8.8/ExtUtils/Constant.pm b/lib/perl5/5.8.8/ExtUtils/Constant.pm deleted file mode 100644 index 9e2b6b83..00000000 --- a/lib/perl5/5.8.8/ExtUtils/Constant.pm +++ /dev/null @@ -1,525 +0,0 @@ -package ExtUtils::Constant; -use vars qw (@ISA $VERSION @EXPORT_OK %EXPORT_TAGS); -$VERSION = 0.17; - -=head1 NAME - -ExtUtils::Constant - generate XS code to import C header constants - -=head1 SYNOPSIS - - use ExtUtils::Constant qw (WriteConstants); - WriteConstants( - NAME => 'Foo', - NAMES => [qw(FOO BAR BAZ)], - ); - # Generates wrapper code to make the values of the constants FOO BAR BAZ - # available to perl - -=head1 DESCRIPTION - -ExtUtils::Constant facilitates generating C and XS wrapper code to allow -perl modules to AUTOLOAD constants defined in C library header files. -It is principally used by the C utility, on which this code is based. -It doesn't contain the routines to scan header files to extract these -constants. - -=head1 USAGE - -Generally one only needs to call the C function, and then - - #include "const-c.inc" - -in the C section of C - - INCLUDE: const-xs.inc - -in the XS section of C. - -For greater flexibility use C, C and -C, with which C is implemented. - -Currently this module understands the following types. h2xs may only know -a subset. The sizes of the numeric types are chosen by the C -script at compile time. - -=over 4 - -=item IV - -signed integer, at least 32 bits. - -=item UV - -unsigned integer, the same size as I - -=item NV - -floating point type, probably C, possibly C - -=item PV - -NUL terminated string, length will be determined with C - -=item PVN - -A fixed length thing, given as a [pointer, length] pair. If you know the -length of a string at compile time you may use this instead of I - -=item SV - -A B SV. - -=item YES - -Truth. (C) The value is not needed (and ignored). - -=item NO - -Defined Falsehood. (C) The value is not needed (and ignored). - -=item UNDEF - -C. The value of the macro is not needed. - -=back - -=head1 FUNCTIONS - -=over 4 - -=cut - -if ($] >= 5.006) { - eval "use warnings; 1" or die $@; -} -use strict; -use Carp qw(croak cluck); - -use Exporter; -use ExtUtils::Constant::Utils qw(C_stringify); -use ExtUtils::Constant::XS qw(%XS_Constant %XS_TypeSet); - -@ISA = 'Exporter'; - -%EXPORT_TAGS = ( 'all' => [ qw( - XS_constant constant_types return_clause memEQ_clause C_stringify - C_constant autoload WriteConstants WriteMakefileSnippet -) ] ); - -@EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); - -=item constant_types - -A function returning a single scalar with C<#define> definitions for the -constants used internally between the generated C and XS functions. - -=cut - -sub constant_types { - ExtUtils::Constant::XS->header(); -} - -sub memEQ_clause { - cluck "ExtUtils::Constant::memEQ_clause is deprecated"; - ExtUtils::Constant::XS->memEQ_clause({name=>$_[0], checked_at=>$_[1], - indent=>$_[2]}); -} - -sub return_clause ($$) { - cluck "ExtUtils::Constant::return_clause is deprecated"; - my $indent = shift; - ExtUtils::Constant::XS->return_clause({indent=>$indent}, @_); -} - -sub switch_clause { - cluck "ExtUtils::Constant::switch_clause is deprecated"; - my $indent = shift; - my $comment = shift; - ExtUtils::Constant::XS->switch_clause({indent=>$indent, comment=>$comment}, - @_); -} - -sub C_constant { - my ($package, $subname, $default_type, $what, $indent, $breakout, @items) - = @_; - ExtUtils::Constant::XS->C_constant({package => $package, subname => $subname, - default_type => $default_type, - types => $what, indent => $indent, - breakout => $breakout}, @items); -} - -=item XS_constant PACKAGE, TYPES, SUBNAME, C_SUBNAME - -A function to generate the XS code to implement the perl subroutine -I::constant used by I::AUTOLOAD to load constants. -This XS code is a wrapper around a C subroutine usually generated by -C, and usually named C. - -I should be given either as a comma separated list of types that the -C subroutine C will generate or as a reference to a hash. It should -be the same list of types as C was given. -[Otherwise C and C may have different ideas about -the number of parameters passed to the C function C] - -You can call the perl visible subroutine something other than C if -you give the parameter I. The C subroutine it calls defaults to -the name of the perl visible subroutine, unless you give the parameter -I. - -=cut - -sub XS_constant { - my $package = shift; - my $what = shift; - my $subname = shift; - my $C_subname = shift; - $subname ||= 'constant'; - $C_subname ||= $subname; - - if (!ref $what) { - # Convert line of the form IV,UV,NV to hash - $what = {map {$_ => 1} split /,\s*/, ($what)}; - } - my $params = ExtUtils::Constant::XS->params ($what); - my $type; - - my $xs = <<"EOT"; -void -$subname(sv) - PREINIT: -#ifdef dXSTARG - dXSTARG; /* Faster if we have it. */ -#else - dTARGET; -#endif - STRLEN len; - int type; -EOT - - if ($params->{IV}) { - $xs .= " IV iv;\n"; - } else { - $xs .= " /* IV\t\tiv;\tUncomment this if you need to return IVs */\n"; - } - if ($params->{NV}) { - $xs .= " NV nv;\n"; - } else { - $xs .= " /* NV\t\tnv;\tUncomment this if you need to return NVs */\n"; - } - if ($params->{PV}) { - $xs .= " const char *pv;\n"; - } else { - $xs .= - " /* const char\t*pv;\tUncomment this if you need to return PVs */\n"; - } - - $xs .= << 'EOT'; - INPUT: - SV * sv; - const char * s = SvPV(sv, len); -EOT - if ($params->{''}) { - $xs .= << 'EOT'; - INPUT: - int utf8 = SvUTF8(sv); -EOT - } - $xs .= << 'EOT'; - PPCODE: -EOT - - if ($params->{IV} xor $params->{NV}) { - $xs .= << "EOT"; - /* Change this to $C_subname(aTHX_ s, len, &iv, &nv); - if you need to return both NVs and IVs */ -EOT - } - $xs .= " type = $C_subname(aTHX_ s, len"; - $xs .= ', utf8' if $params->{''}; - $xs .= ', &iv' if $params->{IV}; - $xs .= ', &nv' if $params->{NV}; - $xs .= ', &pv' if $params->{PV}; - $xs .= ', &sv' if $params->{SV}; - $xs .= ");\n"; - - $xs .= << "EOT"; - /* Return 1 or 2 items. First is error message, or undef if no error. - Second, if present, is found value */ - switch (type) { - case PERL_constant_NOTFOUND: - sv = sv_2mortal(newSVpvf("%s is not a valid $package macro", s)); - PUSHs(sv); - break; - case PERL_constant_NOTDEF: - sv = sv_2mortal(newSVpvf( - "Your vendor has not defined $package macro %s, used", s)); - PUSHs(sv); - break; -EOT - - foreach $type (sort keys %XS_Constant) { - # '' marks utf8 flag needed. - next if $type eq ''; - $xs .= "\t/* Uncomment this if you need to return ${type}s\n" - unless $what->{$type}; - $xs .= " case PERL_constant_IS$type:\n"; - if (length $XS_Constant{$type}) { - $xs .= << "EOT"; - EXTEND(SP, 1); - PUSHs(&PL_sv_undef); - $XS_Constant{$type}; -EOT - } else { - # Do nothing. return (), which will be correctly interpreted as - # (undef, undef) - } - $xs .= " break;\n"; - unless ($what->{$type}) { - chop $xs; # Yes, another need for chop not chomp. - $xs .= " */\n"; - } - } - $xs .= << "EOT"; - default: - sv = sv_2mortal(newSVpvf( - "Unexpected return type %d while processing $package macro %s, used", - type, s)); - PUSHs(sv); - } -EOT - - return $xs; -} - - -=item autoload PACKAGE, VERSION, AUTOLOADER - -A function to generate the AUTOLOAD subroutine for the module I -I is the perl version the code should be backwards compatible with. -It defaults to the version of perl running the subroutine. If I -is true, the AUTOLOAD subroutine falls back on AutoLoader::AUTOLOAD for all -names that the constant() routine doesn't recognise. - -=cut - -# ' # Grr. syntax highlighters that don't grok pod. - -sub autoload { - my ($module, $compat_version, $autoloader) = @_; - $compat_version ||= $]; - croak "Can't maintain compatibility back as far as version $compat_version" - if $compat_version < 5; - my $func = "sub AUTOLOAD {\n" - . " # This AUTOLOAD is used to 'autoload' constants from the constant()\n" - . " # XS function."; - $func .= " If a constant is not found then control is passed\n" - . " # to the AUTOLOAD in AutoLoader." if $autoloader; - - - $func .= "\n\n" - . " my \$constname;\n"; - $func .= - " our \$AUTOLOAD;\n" if ($compat_version >= 5.006); - - $func .= <<"EOT"; - (\$constname = \$AUTOLOAD) =~ s/.*:://; - croak "&${module}::constant not defined" if \$constname eq 'constant'; - my (\$error, \$val) = constant(\$constname); -EOT - - if ($autoloader) { - $func .= <<'EOT'; - if ($error) { - if ($error =~ /is not a valid/) { - $AutoLoader::AUTOLOAD = $AUTOLOAD; - goto &AutoLoader::AUTOLOAD; - } else { - croak $error; - } - } -EOT - } else { - $func .= - " if (\$error) { croak \$error; }\n"; - } - - $func .= <<'END'; - { - no strict 'refs'; - # Fixed between 5.005_53 and 5.005_61 -#XXX if ($] >= 5.00561) { -#XXX *$AUTOLOAD = sub () { $val }; -#XXX } -#XXX else { - *$AUTOLOAD = sub { $val }; -#XXX } - } - goto &$AUTOLOAD; -} - -END - - return $func; -} - - -=item WriteMakefileSnippet - -WriteMakefileSnippet ATTRIBUTE =E VALUE [, ...] - -A function to generate perl code for Makefile.PL that will regenerate -the constant subroutines. Parameters are named as passed to C, -with the addition of C to specify the number of leading spaces -(default 2). - -Currently only C, C, C, C, C and -C are recognised. - -=cut - -sub WriteMakefileSnippet { - my %args = @_; - my $indent = $args{INDENT} || 2; - - my $result = <<"EOT"; -ExtUtils::Constant::WriteConstants( - NAME => '$args{NAME}', - NAMES => \\\@names, - DEFAULT_TYPE => '$args{DEFAULT_TYPE}', -EOT - foreach (qw (C_FILE XS_FILE)) { - next unless exists $args{$_}; - $result .= sprintf " %-12s => '%s',\n", - $_, $args{$_}; - } - $result .= <<'EOT'; - ); -EOT - - $result =~ s/^/' 'x$indent/gem; - return ExtUtils::Constant::XS->dump_names({default_type=>$args{DEFAULT_TYPE}, - indent=>$indent,}, - @{$args{NAMES}}) - . $result; -} - -=item WriteConstants ATTRIBUTE =E VALUE [, ...] - -Writes a file of C code and a file of XS code which you should C<#include> -and C in the C and XS sections respectively of your module's XS -code. You probably want to do this in your C, so that you can -easily edit the list of constants without touching the rest of your module. -The attributes supported are - -=over 4 - -=item NAME - -Name of the module. This must be specified - -=item DEFAULT_TYPE - -The default type for the constants. If not specified C is assumed. - -=item BREAKOUT_AT - -The names of the constants are grouped by length. Generate child subroutines -for each group with this number or more names in. - -=item NAMES - -An array of constants' names, either scalars containing names, or hashrefs -as detailed in L<"C_constant">. - -=item C_FILE - -The name of the file to write containing the C code. The default is -C. The C<-> in the name ensures that the file can't be -mistaken for anything related to a legitimate perl package name, and -not naming the file C<.c> avoids having to override Makefile.PL's -C<.xs> to C<.c> rules. - -=item XS_FILE - -The name of the file to write containing the XS code. The default is -C. - -=item SUBNAME - -The perl visible name of the XS subroutine generated which will return the -constants. The default is C. - -=item C_SUBNAME - -The name of the C subroutine generated which will return the constants. -The default is I. Child subroutines have C<_> and the name -length appended, so constants with 10 character names would be in -C with the default I. - -=back - -=cut - -sub WriteConstants { - my %ARGS = - ( # defaults - C_FILE => 'const-c.inc', - XS_FILE => 'const-xs.inc', - SUBNAME => 'constant', - DEFAULT_TYPE => 'IV', - @_); - - $ARGS{C_SUBNAME} ||= $ARGS{SUBNAME}; # No-one sane will have C_SUBNAME eq '0' - - croak "Module name not specified" unless length $ARGS{NAME}; - - my ($c_fh, $xs_fh); - if ($] <= 5.008) { - # We need these little games, rather than doing things unconditionally, - # because we're used in core Makefile.PLs before IO is available (needed - # by filehandle), but also we want to work on older perls where undefined - # scalars do not automatically turn into anonymous file handles. - require FileHandle; - $c_fh = FileHandle->new(); - $xs_fh = FileHandle->new(); - } - open $c_fh, ">$ARGS{C_FILE}" or die "Can't open $ARGS{C_FILE}: $!"; - open $xs_fh, ">$ARGS{XS_FILE}" or die "Can't open $ARGS{XS_FILE}: $!"; - - # As this subroutine is intended to make code that isn't edited, there's no - # need for the user to specify any types that aren't found in the list of - # names. - my $types = {}; - - print $c_fh constant_types(); # macro defs - print $c_fh "\n"; - - # indent is still undef. Until anyone implements indent style rules with it. - foreach (ExtUtils::Constant::XS->C_constant({package => $ARGS{NAME}, - subname => $ARGS{C_SUBNAME}, - default_type => - $ARGS{DEFAULT_TYPE}, - types => $types, - breakout => $ARGS{BREAKOUT_AT}}, - @{$ARGS{NAMES}})) { - print $c_fh $_, "\n"; # C constant subs - } - print $xs_fh XS_constant ($ARGS{NAME}, $types, $ARGS{XS_SUBNAME}, - $ARGS{C_SUBNAME}); - - close $c_fh or warn "Error closing $ARGS{C_FILE}: $!"; - close $xs_fh or warn "Error closing $ARGS{XS_FILE}: $!"; -} - -1; -__END__ - -=back - -=head1 AUTHOR - -Nicholas Clark based on the code in C by Larry Wall and -others - -=cut diff --git a/lib/perl5/5.8.8/ExtUtils/Constant/Base.pm b/lib/perl5/5.8.8/ExtUtils/Constant/Base.pm deleted file mode 100644 index 8a6fc6fa..00000000 --- a/lib/perl5/5.8.8/ExtUtils/Constant/Base.pm +++ /dev/null @@ -1,973 +0,0 @@ -package ExtUtils::Constant::Base; - -use strict; -use vars qw($VERSION $is_perl56); -use Carp; -use Text::Wrap; -use ExtUtils::Constant::Utils qw(C_stringify perl_stringify); - -$VERSION = '0.01'; - -$is_perl56 = ($] < 5.007 && $] > 5.005_50); - - -=head1 NAME - -ExtUtils::Constant::Base - base class for ExtUtils::Constant objects - -=head1 SYNOPSIS - - require ExtUtils::Constant::Base; - @ISA = 'ExtUtils::Constant::Base'; - -=head1 DESCRIPTION - -ExtUtils::Constant::Base provides a base implementation of methods to -generate C code to give fast constant value lookup by named string. Currently -it's mostly used ExtUtils::Constant::XS, which generates the lookup code -for the constant() subroutine found in many XS modules. - -=head1 USAGE - -ExtUtils::Constant::Base exports no subroutines. The following methods are -available - -=over 4 - -=cut - -sub valid_type { - # Default to assuming that you don't need different types of return data. - 1; -} -sub default_type { - ''; -} - -=item header - -A method returning a scalar containing definitions needed, typically for a -C header file. - -=cut - -sub header { - '' -} - -# This might actually be a return statement. Note that you are responsible -# for any space you might need before your value, as it lets to perform -# "tricks" such as "return KEY_" and have strings appended. -sub assignment_clause_for_type; -# In which case this might be an empty string -sub return_statement_for_type {undef}; -sub return_statement_for_notdef; -sub return_statement_for_notfound; - -# "#if 1" is true to a C pre-processor -sub macro_from_name { - 1; -} - -sub name_param { - 'name'; -} - -# This is possibly buggy, in that it's not mandatory (below, in the main -# C_constant parameters, but is expected to exist here, if it's needed) -# Buggy because if you're definitely pure 8 bit only, and will never be -# presented with your constants in utf8, the default form of C_constant can't -# be told not to do the utf8 version. - -sub is_utf8_param { - 'utf8'; -} - -sub memEQ { - "!memcmp"; -} - -=item memEQ_clause args_hashref - -A method to return a suitable C C statement to check whether I -is equal to the C variable C. If I is defined, then it -is used to avoid C for short names, or to generate a comment to -highlight the position of the character in the C statement. - -If i is a reference to a scalar, then instead it gives -the characters pre-checked at the beginning, (and the number of chars by -which the C variable name has been advanced. These need to be chopped from -the front of I). - -=cut - -sub memEQ_clause { -# if (memEQ(name, "thingy", 6)) { - # Which could actually be a character comparison or even "" - my ($self, $args) = @_; - my ($name, $checked_at, $indent) = @{$args}{qw(name checked_at indent)}; - $indent = ' ' x ($indent || 4); - my $front_chop; - if (ref $checked_at) { - # regexp won't work on 5.6.1 without use utf8; in turn that won't work - # on 5.005_03. - substr ($name, 0, length $$checked_at,) = ''; - $front_chop = C_stringify ($$checked_at); - undef $checked_at; - } - my $len = length $name; - - if ($len < 2) { - return $indent . "{\n" - if (defined $checked_at and $checked_at == 0) or $len == 0; - # We didn't switch, drop through to the code for the 2 character string - $checked_at = 1; - } - - my $name_param = $self->name_param; - - if ($len < 3 and defined $checked_at) { - my $check; - if ($checked_at == 1) { - $check = 0; - } elsif ($checked_at == 0) { - $check = 1; - } - if (defined $check) { - my $char = C_stringify (substr $name, $check, 1); - # Placate 5.005 with a break in the string. I can't see a good way of - # getting it to not take [ as introducing an array lookup, even with - # ${name_param}[$check] - return $indent . "if ($name_param" . "[$check] == '$char') {\n"; - } - } - if (($len == 2 and !defined $checked_at) - or ($len == 3 and defined ($checked_at) and $checked_at == 2)) { - my $char1 = C_stringify (substr $name, 0, 1); - my $char2 = C_stringify (substr $name, 1, 1); - return $indent . - "if ($name_param" . "[0] == '$char1' && $name_param" . "[1] == '$char2') {\n"; - } - if (($len == 3 and defined ($checked_at) and $checked_at == 1)) { - my $char1 = C_stringify (substr $name, 0, 1); - my $char2 = C_stringify (substr $name, 2, 1); - return $indent . - "if ($name_param" . "[0] == '$char1' && $name_param" . "[2] == '$char2') {\n"; - } - - my $pointer = '^'; - my $have_checked_last = defined ($checked_at) && $len == $checked_at + 1; - if ($have_checked_last) { - # Checked at the last character, so no need to memEQ it. - $pointer = C_stringify (chop $name); - $len--; - } - - $name = C_stringify ($name); - my $memEQ = $self->memEQ(); - my $body = $indent . "if ($memEQ($name_param, \"$name\", $len)) {\n"; - # Put a little ^ under the letter we checked at - # Screws up for non printable and non-7 bit stuff, but that's too hard to - # get right. - if (defined $checked_at) { - $body .= $indent . "/* " . (' ' x length $memEQ) - . (' ' x length $name_param) - . (' ' x $checked_at) . $pointer - . (' ' x ($len - $checked_at + length $len)) . " */\n"; - } elsif (defined $front_chop) { - $body .= $indent . "/* $front_chop" - . (' ' x ($len + 1 + length $len)) . " */\n"; - } - return $body; -} - -=item dump_names arg_hashref, ITEM... - -An internal function to generate the embedded perl code that will regenerate -the constant subroutines. I, I and Is are the -same as for C_constant. I is treated as number of spaces to indent -by. If C is true a C<$types> is always declared in the perl -code generated, if defined and false never declared, and if undefined C<$types> -is only declared if the values in I as passed in cannot be inferred from -I and the Is. - -=cut - -sub dump_names { - my ($self, $args, @items) = @_; - my ($default_type, $what, $indent, $declare_types) - = @{$args}{qw(default_type what indent declare_types)}; - $indent = ' ' x ($indent || 0); - - my $result; - my (@simple, @complex, %used_types); - foreach (@items) { - my $type; - if (ref $_) { - $type = $_->{type} || $default_type; - if ($_->{utf8}) { - # For simplicity always skip the bytes case, and reconstitute this entry - # from its utf8 twin. - next if $_->{utf8} eq 'no'; - # Copy the hashref, as we don't want to mess with the caller's hashref. - $_ = {%$_}; - unless ($is_perl56) { - utf8::decode ($_->{name}); - } else { - $_->{name} = pack 'U*', unpack 'U0U*', $_->{name}; - } - delete $_->{utf8}; - } - } else { - $_ = {name=>$_}; - $type = $default_type; - } - $used_types{$type}++; - if ($type eq $default_type - # grr 5.6.1 - and length $_->{name} - and length $_->{name} == ($_->{name} =~ tr/A-Za-z0-9_//) - and !defined ($_->{macro}) and !defined ($_->{value}) - and !defined ($_->{default}) and !defined ($_->{pre}) - and !defined ($_->{post}) and !defined ($_->{def_pre}) - and !defined ($_->{def_post}) and !defined ($_->{weight})) { - # It's the default type, and the name consists only of A-Za-z0-9_ - push @simple, $_->{name}; - } else { - push @complex, $_; - } - } - - if (!defined $declare_types) { - # Do they pass in any types we weren't already using? - foreach (keys %$what) { - next if $used_types{$_}; - $declare_types++; # Found one in $what that wasn't used. - last; # And one is enough to terminate this loop - } - } - if ($declare_types) { - $result = $indent . 'my $types = {map {($_, 1)} qw(' - . join (" ", sort keys %$what) . ")};\n"; - } - local $Text::Wrap::huge = 'overflow'; - local $Text::Wrap::columns = 80; - $result .= wrap ($indent . "my \@names = (qw(", - $indent . " ", join (" ", sort @simple) . ")"); - if (@complex) { - foreach my $item (sort {$a->{name} cmp $b->{name}} @complex) { - my $name = perl_stringify $item->{name}; - my $line = ",\n$indent {name=>\"$name\""; - $line .= ", type=>\"$item->{type}\"" if defined $item->{type}; - foreach my $thing (qw (macro value default pre post def_pre def_post)) { - my $value = $item->{$thing}; - if (defined $value) { - if (ref $value) { - $line .= ", $thing=>[\"" - . join ('", "', map {perl_stringify $_} @$value) . '"]'; - } else { - $line .= ", $thing=>\"" . perl_stringify($value) . "\""; - } - } - } - $line .= "}"; - # Ensure that the enclosing C comment doesn't end - # by turning */ into *" . "/ - $line =~ s!\*\/!\*" . "/!gs; - # gcc -Wall doesn't like finding /* inside a comment - $line =~ s!\/\*!/" . "\*!gs; - $result .= $line; - } - } - $result .= ");\n"; - - $result; -} - -=item assign arg_hashref, VALUE... - -A method to return a suitable assignment clause. If I is aggregate -(eg I expects both pointer and length) then there should be multiple -Is for the components. I

     and I if defined give snippets
    -of C code to proceed and follow the assignment. I
     will be at the start
    -of a block, so variables may be defined in it.
    -
    -=cut
    -# Hmm. value undef to to NOTDEF? value () to do NOTFOUND?
    -
    -sub assign {
    -  my $self = shift;
    -  my $args = shift;
    -  my ($indent, $type, $pre, $post, $item)
    -      = @{$args}{qw(indent type pre post item)};
    -  $post ||= '';
    -  my $clause;
    -  my $close;
    -  if ($pre) {
    -    chomp $pre;
    -    $close = "$indent}\n";
    -    $clause = $indent . "{\n";
    -    $indent .= "  ";
    -    $clause .= "$indent$pre";
    -    $clause .= ";" unless $pre =~ /;$/;
    -    $clause .= "\n";
    -  }
    -  confess "undef \$type" unless defined $type;
    -  confess "Can't generate code for type $type"
    -    unless $self->valid_type($type);
    -
    -  $clause .= join '', map {"$indent$_\n"}
    -    $self->assignment_clause_for_type({type=>$type,item=>$item}, @_);
    -  chomp $post;
    -  if (length $post) {
    -    $clause .= "$post";
    -    $clause .= ";" unless $post =~ /;$/;
    -    $clause .= "\n";
    -  }
    -  my $return = $self->return_statement_for_type($type);
    -  $clause .= "$indent$return\n" if defined $return;
    -  $clause .= $close if $close;
    -  return $clause;
    -}
    -
    -=item return_clause arg_hashref, ITEM
    -
    -A method to return a suitable C<#ifdef> clause. I is a hashref
    -(as passed to C and C. I is the number
    -of spaces to indent, defaulting to 6.
    -
    -=cut
    -
    -sub return_clause {
    -
    -##ifdef thingy
    -#      *iv_return = thingy;
    -#      return PERL_constant_ISIV;
    -##else
    -#      return PERL_constant_NOTDEF;
    -##endif
    -  my ($self, $args, $item) = @_;
    -  my $indent = $args->{indent};
    -
    -  my ($name, $value, $macro, $default, $pre, $post, $def_pre, $def_post, $type)
    -    = @$item{qw (name value macro default pre post def_pre def_post type)};
    -  $value = $name unless defined $value;
    -  $macro = $self->macro_from_name($item) unless defined $macro;
    -  # "#if 1" is true to a C pre-processor
    -  $macro = 1 if !defined $macro or $macro eq '';
    -  $indent = ' ' x ($indent || 6);
    -  unless (defined $type) {
    -    # use Data::Dumper; print STDERR Dumper ($item);
    -    confess "undef \$type";
    -  }
    -
    -  my $clause;
    -
    -  ##ifdef thingy
    -  if (ref $macro) {
    -    $clause = $macro->[0];
    -  } elsif ($macro ne "1") {
    -    $clause = "#ifdef $macro\n";
    -  }
    -
    -  #      *iv_return = thingy;
    -  #      return PERL_constant_ISIV;
    -  $clause
    -    .= $self->assign ({indent=>$indent, type=>$type, pre=>$pre, post=>$post,
    -		       item=>$item}, ref $value ? @$value : $value);
    -
    -  if (ref $macro or $macro ne "1") {
    -    ##else
    -    $clause .= "#else\n";
    -
    -    #      return PERL_constant_NOTDEF;
    -    if (!defined $default) {
    -      my $notdef = $self->return_statement_for_notdef();
    -      $clause .= "$indent$notdef\n" if defined $notdef;
    -    } else {
    -      my @default = ref $default ? @$default : $default;
    -      $type = shift @default;
    -      $clause .= $self->assign ({indent=>$indent, type=>$type, pre=>$pre,
    -				 post=>$post, item=>$item}, @default);
    -    }
    -
    -    ##endif
    -    if (ref $macro) {
    -      $clause .= $macro->[1];
    -    } else {
    -      $clause .= "#endif\n";
    -    }
    -  }
    -  return $clause;
    -}
    -
    -sub match_clause {
    -  # $offset defined if we have checked an offset.
    -  my ($self, $args, $item) = @_;
    -  my ($offset, $indent) = @{$args}{qw(checked_at indent)};
    -  $indent = ' ' x ($indent || 4);
    -  my $body = '';
    -  my ($no, $yes, $either, $name, $inner_indent);
    -  if (ref $item eq 'ARRAY') {
    -    ($yes, $no) = @$item;
    -    $either = $yes || $no;
    -    confess "$item is $either expecting hashref in [0] || [1]"
    -      unless ref $either eq 'HASH';
    -    $name = $either->{name};
    -  } else {
    -    confess "$item->{name} has utf8 flag '$item->{utf8}', should be false"
    -      if $item->{utf8};
    -    $name = $item->{name};
    -    $inner_indent = $indent;
    -  }
    -
    -  $body .= $self->memEQ_clause ({name => $name, checked_at => $offset,
    -				 indent => length $indent});
    -  # If we've been presented with an arrayref for $item, then the user string
    -  # contains in the range 128-255, and we need to check whether it was utf8
    -  # (or not).
    -  # In the worst case we have two named constants, where one's name happens
    -  # encoded in UTF8 happens to be the same byte sequence as the second's
    -  # encoded in (say) ISO-8859-1.
    -  # In this case, $yes and $no both have item hashrefs.
    -  if ($yes) {
    -    $body .= $indent . "  if (" . $self->is_utf8_param . ") {\n";
    -  } elsif ($no) {
    -    $body .= $indent . "  if (!" . $self->is_utf8_param . ") {\n";
    -  }
    -  if ($either) {
    -    $body .= $self->return_clause ({indent=>4 + length $indent}, $either);
    -    if ($yes and $no) {
    -      $body .= $indent . "  } else {\n";
    -      $body .= $self->return_clause ({indent=>4 + length $indent}, $no);
    -    }
    -    $body .= $indent . "  }\n";
    -  } else {
    -    $body .= $self->return_clause ({indent=>2 + length $indent}, $item);
    -  }
    -  $body .= $indent . "}\n";
    -}
    -
    -
    -=item switch_clause arg_hashref, NAMELEN, ITEMHASH, ITEM...
    -
    -An internal method to generate a suitable C clause, called by
    -C Is are in the hash ref format as given in the description
    -of C, and must all have the names of the same length, given by
    -I.  I is a reference to a hash, keyed by name, values being
    -the hashrefs in the I list.  (No parameters are modified, and there can
    -be keys in the I that are not in the list of Is without
    -causing problems - the hash is passed in to save generating it afresh for
    -each call).
    -
    -=cut
    -
    -sub switch_clause {
    -  my ($self, $args, $namelen, $items, @items) = @_;
    -  my ($indent, $comment) = @{$args}{qw(indent comment)};
    -  $indent = ' ' x ($indent || 2);
    -
    -  local $Text::Wrap::huge = 'overflow';
    -  local $Text::Wrap::columns = 80;
    -
    -  my @names = sort map {$_->{name}} @items;
    -  my $leader = $indent . '/* ';
    -  my $follower = ' ' x length $leader;
    -  my $body = $indent . "/* Names all of length $namelen.  */\n";
    -  if (defined $comment) {
    -    $body = wrap ($leader, $follower, $comment) . "\n";
    -    $leader = $follower;
    -  }
    -  my @safe_names = @names;
    -  foreach (@safe_names) {
    -    confess sprintf "Name '$_' is length %d, not $namelen", length
    -      unless length == $namelen;
    -    # Argh. 5.6.1
    -    # next unless tr/A-Za-z0-9_//c;
    -    next if tr/A-Za-z0-9_// == length;
    -    $_ = '"' . perl_stringify ($_) . '"';
    -    # Ensure that the enclosing C comment doesn't end
    -    # by turning */  into *" . "/
    -    s!\*\/!\*"."/!gs;
    -    # gcc -Wall doesn't like finding /* inside a comment
    -    s!\/\*!/"."\*!gs;
    -  }
    -  $body .= wrap ($leader, $follower, join (" ", @safe_names) . " */") . "\n";
    -  # Figure out what to switch on.
    -  # (RMS, Spread of jump table, Position, Hashref)
    -  my @best = (1e38, ~0);
    -  # Prefer the last character over the others. (As it lets us shorten the
    -  # memEQ clause at no cost).
    -  foreach my $i ($namelen - 1, 0 .. ($namelen - 2)) {
    -    my ($min, $max) = (~0, 0);
    -    my %spread;
    -    if ($is_perl56) {
    -      # Need proper Unicode preserving hash keys for bytes in range 128-255
    -      # here too, for some reason. grr 5.6.1 yet again.
    -      tie %spread, 'ExtUtils::Constant::Aaargh56Hash';
    -    }
    -    foreach (@names) {
    -      my $char = substr $_, $i, 1;
    -      my $ord = ord $char;
    -      confess "char $ord is out of range" if $ord > 255;
    -      $max = $ord if $ord > $max;
    -      $min = $ord if $ord < $min;
    -      push @{$spread{$char}}, $_;
    -      # warn "$_ $char";
    -    }
    -    # I'm going to pick the character to split on that minimises the root
    -    # mean square of the number of names in each case. Normally this should
    -    # be the one with the most keys, but it may pick a 7 where the 8 has
    -    # one long linear search. I'm not sure if RMS or just sum of squares is
    -    # actually better.
    -    # $max and $min are for the tie-breaker if the root mean squares match.
    -    # Assuming that the compiler may be building a jump table for the
    -    # switch() then try to minimise the size of that jump table.
    -    # Finally use < not <= so that if it still ties the earliest part of
    -    # the string wins. Because if that passes but the memEQ fails, it may
    -    # only need the start of the string to bin the choice.
    -    # I think. But I'm micro-optimising. :-)
    -    # OK. Trump that. Now favour the last character of the string, before the
    -    # rest.
    -    my $ss;
    -    $ss += @$_ * @$_ foreach values %spread;
    -    my $rms = sqrt ($ss / keys %spread);
    -    if ($rms < $best[0] || ($rms == $best[0] && ($max - $min) < $best[1])) {
    -      @best = ($rms, $max - $min, $i, \%spread);
    -    }
    -  }
    -  confess "Internal error. Failed to pick a switch point for @names"
    -    unless defined $best[2];
    -  # use Data::Dumper; print Dumper (@best);
    -  my ($offset, $best) = @best[2,3];
    -  $body .= $indent . "/* Offset $offset gives the best switch position.  */\n";
    -
    -  my $do_front_chop = $offset == 0 && $namelen > 2;
    -  if ($do_front_chop) {
    -    $body .= $indent . "switch (*" . $self->name_param() . "++) {\n";
    -  } else {
    -    $body .= $indent . "switch (" . $self->name_param() . "[$offset]) {\n";
    -  }
    -  foreach my $char (sort keys %$best) {
    -    confess sprintf "'$char' is %d bytes long, not 1", length $char
    -      if length ($char) != 1;
    -    confess sprintf "char %#X is out of range", ord $char if ord ($char) > 255;
    -    $body .= $indent . "case '" . C_stringify ($char) . "':\n";
    -    foreach my $thisone (sort {
    -	# Deal with the case of an item actually being an array ref to 1 or 2
    -	# hashrefs. Don't assign to $a or $b, as they're aliases to the orignal
    -	my $l = ref $a eq 'ARRAY' ? ($a->[0] || $->[1]) : $a;
    -	my $r = ref $b eq 'ARRAY' ? ($b->[0] || $->[1]) : $b;
    -	# Sort by weight first
    -	($r->{weight} || 0) <=> ($l->{weight} || 0)
    -	    # Sort equal weights by name
    -	    or $l->{name} cmp $r->{name}}
    -			 # If this looks evil, maybe it is.  $items is a
    -			 # hashref, and we're doing a hash slice on it
    -			 @{$items}{@{$best->{$char}}}) {
    -      # warn "You are here";
    -      if ($do_front_chop) {
    -        $body .= $self->match_clause ({indent => 2 + length $indent,
    -				       checked_at => \$char}, $thisone);
    -      } else {
    -        $body .= $self->match_clause ({indent => 2 + length $indent,
    -				       checked_at => $offset}, $thisone);
    -      }
    -    }
    -    $body .= $indent . "  break;\n";
    -  }
    -  $body .= $indent . "}\n";
    -  return $body;
    -}
    -
    -sub C_constant_return_type {
    -  "static int";
    -}
    -
    -sub C_constant_prefix_param {
    -  '';
    -}
    -
    -sub C_constant_prefix_param_defintion {
    -  '';
    -}
    -
    -sub name_param_definition {
    -  "const char *" . $_[0]->name_param;
    -}
    -
    -sub namelen_param {
    -  'len';
    -}
    -
    -sub namelen_param_definition {
    -  'size_t ' . $_[0]->namelen_param;
    -}
    -
    -sub C_constant_other_params {
    -  '';
    -}
    -
    -sub C_constant_other_params_defintion {
    -  '';
    -}
    -
    -=item params WHAT
    -
    -An "internal" method, subject to change, currently called to allow an
    -overriding class to cache information that will then be passed into all
    -the C<*param*> calls. (Yes, having to read the source to make sense of this is
    -considered a known bug). I is be a hashref of types the constant
    -function will return. In ExtUtils::Constant::XS this method is used to
    -returns a hashref keyed IV NV PV SV to show which combination of pointers will
    -be needed in the C argument list generated by
    -C_constant_other_params_definition and C_constant_other_params
    -
    -=cut
    -
    -sub params {
    -  '';
    -}
    -
    -
    -=item dogfood arg_hashref, ITEM...
    -
    -An internal function to generate the embedded perl code that will regenerate
    -the constant subroutines.  Parameters are the same as for C_constant.
    -
    -Currently the base class does nothing and returns an empty string.
    -
    -=cut
    -
    -sub dogfood {
    -  ''
    -}
    -
    -=item C_constant arg_hashref, ITEM...
    -
    -A function that returns a B of C subroutine definitions that return
    -the value and type of constants when passed the name by the XS wrapper.
    -I gives a list of constant names. Each can either be a string,
    -which is taken as a C macro name, or a reference to a hash with the following
    -keys
    -
    -=over 8
    -
    -=item name
    -
    -The name of the constant, as seen by the perl code.
    -
    -=item type
    -
    -The type of the constant (I, I etc)
    -
    -=item value
    -
    -A C expression for the value of the constant, or a list of C expressions if
    -the type is aggregate. This defaults to the I if not given.
    -
    -=item macro
    -
    -The C pre-processor macro to use in the C<#ifdef>. This defaults to the
    -I, and is mainly used if I is an C. If a reference an
    -array is passed then the first element is used in place of the C<#ifdef>
    -line, and the second element in place of the C<#endif>. This allows
    -pre-processor constructions such as
    -
    -    #if defined (foo)
    -    #if !defined (bar)
    -    ...
    -    #endif
    -    #endif
    -
    -to be used to determine if a constant is to be defined.
    -
    -A "macro" 1 signals that the constant is always defined, so the C<#if>/C<#endif>
    -test is omitted.
    -
    -=item default
    -
    -Default value to use (instead of Cing with "your vendor has not
    -defined...") to return if the macro isn't defined. Specify a reference to
    -an array with type followed by value(s).
    -
    -=item pre
    -
    -C code to use before the assignment of the value of the constant. This allows
    -you to use temporary variables to extract a value from part of a C
    -and return this as I. This C code is places at the start of a block,
    -so you can declare variables in it.
    -
    -=item post
    -
    -C code to place between the assignment of value (to a temporary) and the
    -return from the function. This allows you to clear up anything in I
    .
    -Rarely needed.
    -
    -=item def_pre
    -
    -=item def_post
    -
    -Equivalents of I
     and I for the default value.
    -
    -=item utf8
    -
    -Generated internally. Is zero or undefined if name is 7 bit ASCII,
    -"no" if the name is 8 bit (and so should only match if SvUTF8() is false),
    -"yes" if the name is utf8 encoded.
    -
    -The internals automatically clone any name with characters 128-255 but none
    -256+ (ie one that could be either in bytes or utf8) into a second entry
    -which is utf8 encoded.
    -
    -=item weight
    -
    -Optional sorting weight for names, to determine the order of
    -linear testing when multiple names fall in the same case of a switch clause.
    -Higher comes earlier, undefined defaults to zero.
    -
    -=back
    -
    -In the argument hashref, I is the name of the package, and is only
    -used in comments inside the generated C code. I defaults to
    -C if undefined.
    -
    -I is the type returned by Cs that don't specify their
    -type. It defaults to the value of C. I should be given
    -either as a comma separated list of types that the C subroutine I
    -will generate or as a reference to a hash. I will be added to
    -the list if not present, as will any types given in the list of Is. The
    -resultant list should be the same list of types that C is
    -given. [Otherwise C and C may differ in the number of
    -parameters to the constant function. I is currently unused and
    -ignored. In future it may be used to pass in information used to change the C
    -indentation style used.]  The best way to maintain consistency is to pass in a
    -hash reference and let this function update it.
    -
    -I governs when child functions of I are generated.  If there
    -are I or more Is with the same length of name, then the code
    -to switch between them is placed into a function named I_I, for
    -example C for names 5 characters long.  The default I is
    -3.  A single C is always inlined.
    -
    -=cut
    -
    -# The parameter now BREAKOUT was previously documented as:
    -#
    -# I if defined signals that all the Is of the Is are of
    -# this length, and that the constant name passed in by perl is checked and
    -# also of this length. It is used during recursion, and should be C
    -# unless the caller has checked all the lengths during code generation, and
    -# the generated subroutine is only to be called with a name of this length.
    -#
    -# As you can see it now performs this function during recursion by being a
    -# scalar reference.
    -
    -sub C_constant {
    -  my ($self, $args, @items) = @_;
    -  my ($package, $subname, $default_type, $what, $indent, $breakout) =
    -    @{$args}{qw(package subname default_type types indent breakout)};
    -  $package ||= 'Foo';
    -  $subname ||= 'constant';
    -  # I'm not using this. But a hashref could be used for full formatting without
    -  # breaking this API
    -  # $indent ||= 0;
    -
    -  my ($namelen, $items);
    -  if (ref $breakout) {
    -    # We are called recursively. We trust @items to be normalised, $what to
    -    # be a hashref, and pinch %$items from our parent to save recalculation.
    -    ($namelen, $items) = @$breakout;
    -  } else {
    -    if ($is_perl56) {
    -      # Need proper Unicode preserving hash keys.
    -      require ExtUtils::Constant::Aaargh56Hash;
    -      $items = {};
    -      tie %$items, 'ExtUtils::Constant::Aaargh56Hash';
    -    }
    -    $breakout ||= 3;
    -    $default_type ||= $self->default_type();
    -    if (!ref $what) {
    -      # Convert line of the form IV,UV,NV to hash
    -      $what = {map {$_ => 1} split /,\s*/, ($what || '')};
    -      # Figure out what types we're dealing with, and assign all unknowns to the
    -      # default type
    -    }
    -    my @new_items;
    -    foreach my $orig (@items) {
    -      my ($name, $item);
    -      if (ref $orig) {
    -        # Make a copy which is a normalised version of the ref passed in.
    -        $name = $orig->{name};
    -        my ($type, $macro, $value) = @$orig{qw (type macro value)};
    -        $type ||= $default_type;
    -        $what->{$type} = 1;
    -        $item = {name=>$name, type=>$type};
    -
    -        undef $macro if defined $macro and $macro eq $name;
    -        $item->{macro} = $macro if defined $macro;
    -        undef $value if defined $value and $value eq $name;
    -        $item->{value} = $value if defined $value;
    -        foreach my $key (qw(default pre post def_pre def_post weight)) {
    -          my $value = $orig->{$key};
    -          $item->{$key} = $value if defined $value;
    -          # warn "$key $value";
    -        }
    -      } else {
    -        $name = $orig;
    -        $item = {name=>$name, type=>$default_type};
    -        $what->{$default_type} = 1;
    -      }
    -      warn +(ref ($self) || $self)
    -	. "doesn't know how to handle values of type $_ used in macro $name"
    -	  unless $self->valid_type ($item->{type});
    -      # tr///c is broken on 5.6.1 for utf8, so my original tr/\0-\177//c
    -      # doesn't work. Upgrade to 5.8
    -      # if ($name !~ tr/\0-\177//c || $] < 5.005_50) {
    -      if ($name =~ tr/\0-\177// == length $name || $] < 5.005_50) {
    -        # No characters outside 7 bit ASCII.
    -        if (exists $items->{$name}) {
    -          die "Multiple definitions for macro $name";
    -        }
    -        $items->{$name} = $item;
    -      } else {
    -        # No characters outside 8 bit. This is hardest.
    -        if (exists $items->{$name} and ref $items->{$name} ne 'ARRAY') {
    -          confess "Unexpected ASCII definition for macro $name";
    -        }
    -        # Again, 5.6.1 tr broken, so s/5\.6.*/5\.8\.0/;
    -        # if ($name !~ tr/\0-\377//c) {
    -        if ($name =~ tr/\0-\377// == length $name) {
    -#          if ($] < 5.007) {
    -#            $name = pack "C*", unpack "U*", $name;
    -#          }
    -          $item->{utf8} = 'no';
    -          $items->{$name}[1] = $item;
    -          push @new_items, $item;
    -          # Copy item, to create the utf8 variant.
    -          $item = {%$item};
    -        }
    -        # Encode the name as utf8 bytes.
    -        unless ($is_perl56) {
    -          utf8::encode($name);
    -        } else {
    -#          warn "Was >$name< " . length ${name};
    -          $name = pack 'C*', unpack 'C*', $name . pack 'U*';
    -#          warn "Now '${name}' " . length ${name};
    -        }
    -        if ($items->{$name}[0]) {
    -          die "Multiple definitions for macro $name";
    -        }
    -        $item->{utf8} = 'yes';
    -        $item->{name} = $name;
    -        $items->{$name}[0] = $item;
    -        # We have need for the utf8 flag.
    -        $what->{''} = 1;
    -      }
    -      push @new_items, $item;
    -    }
    -    @items = @new_items;
    -    # use Data::Dumper; print Dumper @items;
    -  }
    -  my $params = $self->params ($what);
    -
    -  # Probably "static int"
    -  my ($body, @subs);
    -  $body = $self->C_constant_return_type($params) . "\n$subname ("
    -    # Eg "pTHX_ "
    -    . $self->C_constant_prefix_param_defintion($params)
    -      # Probably "const char *name"
    -      . $self->name_param_definition($params);
    -  # Something like ", STRLEN len"
    -  $body .= ", " . $self->namelen_param_definition($params)
    -    unless defined $namelen;
    -  $body .= $self->C_constant_other_params_defintion($params);
    -  $body .= ") {\n";
    -
    -  if (defined $namelen) {
    -    # We are a child subroutine. Print the simple description
    -    my $comment = 'When generated this function returned values for the list'
    -      . ' of names given here.  However, subsequent manual editing may have'
    -        . ' added or removed some.';
    -    $body .= $self->switch_clause ({indent=>2, comment=>$comment},
    -				   $namelen, $items, @items);
    -  } else {
    -    # We are the top level.
    -    $body .= "  /* Initially switch on the length of the name.  */\n";
    -    $body .= $self->dogfood ({package => $package, subname => $subname,
    -			      default_type => $default_type, what => $what,
    -			      indent => $indent, breakout => $breakout},
    -			     @items);
    -    $body .= '  switch ('.$self->namelen_param().") {\n";
    -    # Need to group names of the same length
    -    my @by_length;
    -    foreach (@items) {
    -      push @{$by_length[length $_->{name}]}, $_;
    -    }
    -    foreach my $i (0 .. $#by_length) {
    -      next unless $by_length[$i];	# None of this length
    -      $body .= "  case $i:\n";
    -      if (@{$by_length[$i]} == 1) {
    -        my $only_thing = $by_length[$i]->[0];
    -        if ($only_thing->{utf8}) {
    -          if ($only_thing->{utf8} eq 'yes') {
    -            # With utf8 on flag item is passed in element 0
    -            $body .= $self->match_clause (undef, [$only_thing]);
    -          } else {
    -            # With utf8 off flag item is passed in element 1
    -            $body .= $self->match_clause (undef, [undef, $only_thing]);
    -          }
    -        } else {
    -          $body .= $self->match_clause (undef, $only_thing);
    -        }
    -      } elsif (@{$by_length[$i]} < $breakout) {
    -        $body .= $self->switch_clause ({indent=>4},
    -				       $i, $items, @{$by_length[$i]});
    -      } else {
    -        # Only use the minimal set of parameters actually needed by the types
    -        # of the names of this length.
    -        my $what = {};
    -        foreach (@{$by_length[$i]}) {
    -          $what->{$_->{type}} = 1;
    -          $what->{''} = 1 if $_->{utf8};
    -        }
    -        $params = $self->params ($what);
    -        push @subs, $self->C_constant ({package=>$package,
    -					subname=>"${subname}_$i",
    -					default_type => $default_type,
    -					types => $what, indent => $indent,
    -					breakout => [$i, $items]},
    -				       @{$by_length[$i]});
    -        $body .= "    return ${subname}_$i ("
    -	  # Eg "aTHX_ "
    -	  . $self->C_constant_prefix_param($params)
    -	    # Probably "name"
    -	    . $self->name_param($params);
    -	$body .= $self->C_constant_other_params($params);
    -        $body .= ");\n";
    -      }
    -      $body .= "    break;\n";
    -    }
    -    $body .= "  }\n";
    -  }
    -  my $notfound = $self->return_statement_for_notfound();
    -  $body .= "  $notfound\n" if $notfound;
    -  $body .= "}\n";
    -  return (@subs, $body);
    -}
    -
    -1;
    -__END__
    -
    -=back
    -
    -=head1 BUGS
    -
    -Not everything is documented yet.
    -
    -Probably others.
    -
    -=head1 AUTHOR
    -
    -Nicholas Clark  based on the code in C by Larry Wall and
    -others
    diff --git a/lib/perl5/5.8.8/ExtUtils/Constant/Utils.pm b/lib/perl5/5.8.8/ExtUtils/Constant/Utils.pm
    deleted file mode 100644
    index 3ef2228c..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/Constant/Utils.pm
    +++ /dev/null
    @@ -1,123 +0,0 @@
    -package ExtUtils::Constant::Utils;
    -
    -use strict;
    -use vars qw($VERSION @EXPORT_OK @ISA $is_perl56);
    -use Carp;
    -
    -@ISA = 'Exporter';
    -@EXPORT_OK = qw(C_stringify perl_stringify);
    -$VERSION = '0.01';
    -
    -$is_perl56 = ($] < 5.007 && $] > 5.005_50);
    -
    -=head1 NAME
    -
    -ExtUtils::Constant::Utils - helper functions for ExtUtils::Constant
    -
    -=head1 SYNOPSIS
    -
    -    use ExtUtils::Constant::Utils qw (C_stringify);
    -    $C_code = C_stringify $stuff;
    -
    -=head1 DESCRIPTION
    -
    -ExtUtils::Constant::Utils packages up utility subroutines used by
    -ExtUtils::Constant, ExtUtils::Constant::Base and derived classes. All its
    -functions are explicitly exportable.
    -
    -=head1 USAGE
    -
    -=over 4
    -
    -=item C_stringify NAME
    -
    -A function which returns a 7 bit ASCII correctly \ escaped version of the
    -string passed suitable for C's "" or ''. It will die if passed Unicode
    -characters.
    -
    -=cut
    -
    -# Hopefully make a happy C identifier.
    -sub C_stringify {
    -  local $_ = shift;
    -  return unless defined $_;
    -  # grr 5.6.1
    -  confess "Wide character in '$_' intended as a C identifier"
    -    if tr/\0-\377// != length;
    -  # grr 5.6.1 moreso because its regexps will break on data that happens to
    -  # be utf8, which includes my 8 bit test cases.
    -  $_ = pack 'C*', unpack 'U*', $_ . pack 'U*' if $is_perl56;
    -  s/\\/\\\\/g;
    -  s/([\"\'])/\\$1/g;	# Grr. fix perl mode.
    -  s/\n/\\n/g;		# Ensure newlines don't end up in octal
    -  s/\r/\\r/g;
    -  s/\t/\\t/g;
    -  s/\f/\\f/g;
    -  s/\a/\\a/g;
    -  s/([^\0-\177])/sprintf "\\%03o", ord $1/ge;
    -  unless ($] < 5.006) {
    -    # This will elicit a warning on 5.005_03 about [: :] being reserved unless
    -    # I cheat
    -    my $cheat = '([[:^print:]])';
    -    s/$cheat/sprintf "\\%03o", ord $1/ge;
    -  } else {
    -    require POSIX;
    -    s/([^A-Za-z0-9_])/POSIX::isprint($1) ? $1 : sprintf "\\%03o", ord $1/ge;
    -  }
    -  $_;
    -}
    -
    -=item perl_stringify NAME
    -
    -A function which returns a 7 bit ASCII correctly \ escaped version of the
    -string passed suitable for a perl "" string.
    -
    -=cut
    -
    -# Hopefully make a happy perl identifier.
    -sub perl_stringify {
    -  local $_ = shift;
    -  return unless defined $_;
    -  s/\\/\\\\/g;
    -  s/([\"\'])/\\$1/g;	# Grr. fix perl mode.
    -  s/\n/\\n/g;		# Ensure newlines don't end up in octal
    -  s/\r/\\r/g;
    -  s/\t/\\t/g;
    -  s/\f/\\f/g;
    -  s/\a/\\a/g;
    -  unless ($] < 5.006) {
    -    if ($] > 5.007) {
    -      s/([^\0-\177])/sprintf "\\x{%X}", ord $1/ge;
    -    } else {
    -      # Grr 5.6.1. And I don't think I can use utf8; to force the regexp
    -      # because 5.005_03 will fail.
    -      # This is grim, but I also can't split on //
    -      my $copy;
    -      foreach my $index (0 .. length ($_) - 1) {
    -        my $char = substr ($_, $index, 1);
    -        $copy .= ($char le "\177") ? $char : sprintf "\\x{%X}", ord $char;
    -      }
    -      $_ = $copy;
    -    }
    -    # This will elicit a warning on 5.005_03 about [: :] being reserved unless
    -    # I cheat
    -    my $cheat = '([[:^print:]])';
    -    s/$cheat/sprintf "\\%03o", ord $1/ge;
    -  } else {
    -    # Turns out "\x{}" notation only arrived with 5.6
    -    s/([^\0-\177])/sprintf "\\x%02X", ord $1/ge;
    -    require POSIX;
    -    s/([^A-Za-z0-9_])/POSIX::isprint($1) ? $1 : sprintf "\\%03o", ord $1/ge;
    -  }
    -  $_;
    -}
    -
    -1;
    -__END__
    -
    -=back
    -
    -=head1 AUTHOR
    -
    -Nicholas Clark  based on the code in C by Larry Wall and
    -others
    diff --git a/lib/perl5/5.8.8/ExtUtils/Constant/XS.pm b/lib/perl5/5.8.8/ExtUtils/Constant/XS.pm
    deleted file mode 100644
    index 51244f6b..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/Constant/XS.pm
    +++ /dev/null
    @@ -1,252 +0,0 @@
    -package ExtUtils::Constant::XS;
    -
    -use strict;
    -use vars qw($VERSION %XS_Constant %XS_TypeSet @ISA @EXPORT_OK $is_perl56);
    -use Carp;
    -use ExtUtils::Constant::Utils 'perl_stringify';
    -require ExtUtils::Constant::Base;
    -
    -
    -@ISA = qw(ExtUtils::Constant::Base Exporter);
    -@EXPORT_OK = qw(%XS_Constant %XS_TypeSet);
    -
    -$VERSION = '0.01';
    -
    -$is_perl56 = ($] < 5.007 && $] > 5.005_50);
    -
    -=head1 NAME
    -
    -ExtUtils::Constant::Base - base class for ExtUtils::Constant objects
    -
    -=head1 SYNOPSIS
    -
    -    require ExtUtils::Constant::XS;
    -
    -=head1 DESCRIPTION
    -
    -ExtUtils::Constant::XS overrides ExtUtils::Constant::Base to generate C
    -code for XS modules' constants.
    -
    -=head1 BUGS
    -
    -Nothing is documented.
    -
    -Probably others.
    -
    -=head1 AUTHOR
    -
    -Nicholas Clark  based on the code in C by Larry Wall and
    -others
    -
    -=cut
    -
    -# '' is used as a flag to indicate non-ascii macro names, and hence the need
    -# to pass in the utf8 on/off flag.
    -%XS_Constant = (
    -		''    => '',
    -		IV    => 'PUSHi(iv)',
    -		UV    => 'PUSHu((UV)iv)',
    -		NV    => 'PUSHn(nv)',
    -		PV    => 'PUSHp(pv, strlen(pv))',
    -		PVN   => 'PUSHp(pv, iv)',
    -		SV    => 'PUSHs(sv)',
    -		YES   => 'PUSHs(&PL_sv_yes)',
    -		NO    => 'PUSHs(&PL_sv_no)',
    -		UNDEF => '',	# implicit undef
    -);
    -
    -%XS_TypeSet = (
    -		IV    => '*iv_return = ',
    -		UV    => '*iv_return = (IV)',
    -		NV    => '*nv_return = ',
    -		PV    => '*pv_return = ',
    -		PVN   => ['*pv_return = ', '*iv_return = (IV)'],
    -		SV    => '*sv_return = ',
    -		YES   => undef,
    -		NO    => undef,
    -		UNDEF => undef,
    -);
    -
    -sub header {
    -  my $start = 1;
    -  my @lines;
    -  push @lines, "#define PERL_constant_NOTFOUND\t$start\n"; $start++;
    -  push @lines, "#define PERL_constant_NOTDEF\t$start\n"; $start++;
    -  foreach (sort keys %XS_Constant) {
    -    next if $_ eq '';
    -    push @lines, "#define PERL_constant_IS$_\t$start\n"; $start++;
    -  }
    -  push @lines, << 'EOT';
    -
    -#ifndef NVTYPE
    -typedef double NV; /* 5.6 and later define NVTYPE, and typedef NV to it.  */
    -#endif
    -#ifndef aTHX_
    -#define aTHX_ /* 5.6 or later define this for threading support.  */
    -#endif
    -#ifndef pTHX_
    -#define pTHX_ /* 5.6 or later define this for threading support.  */
    -#endif
    -EOT
    -
    -  return join '', @lines;
    -}
    -
    -sub valid_type {
    -  my ($self, $type) = @_;
    -  return exists $XS_TypeSet{$type};
    -}
    -
    -# This might actually be a return statement
    -sub assignment_clause_for_type {
    -  my $self = shift;
    -  my $args = shift;
    -  my $type = $args->{type};
    -  my $typeset = $XS_TypeSet{$type};
    -  if (ref $typeset) {
    -    die "Type $type is aggregate, but only single value given"
    -      if @_ == 1;
    -    return map {"$typeset->[$_]$_[$_];"} 0 .. $#$typeset;
    -  } elsif (defined $typeset) {
    -    confess "Aggregate value given for type $type"
    -      if @_ > 1;
    -    return "$typeset$_[0];";
    -  }
    -  return ();
    -}
    -
    -sub return_statement_for_type {
    -  my ($self, $type) = @_;
    -  # In the future may pass in an options hash
    -  $type = $type->{type} if ref $type;
    -  "return PERL_constant_IS$type;";
    -}
    -
    -sub return_statement_for_notdef {
    -  # my ($self) = @_;
    -  "return PERL_constant_NOTDEF;";
    -}
    -
    -sub return_statement_for_notfound {
    -  # my ($self) = @_;
    -  "return PERL_constant_NOTFOUND;";
    -}
    -
    -sub default_type {
    -  'IV';
    -}
    -
    -sub macro_from_name {
    -  my ($self, $item) = @_;
    -  my $macro = $item->{name};
    -  $macro = $item->{value} unless defined $macro;
    -  $macro;
    -}
    -
    -# Keep to the traditional perl source macro
    -sub memEQ {
    -  "memEQ";
    -}
    -
    -sub params {
    -  my ($self, $what) = @_;
    -  foreach (sort keys %$what) {
    -    warn "ExtUtils::Constant doesn't know how to handle values of type $_" unless defined $XS_Constant{$_};
    -  }
    -  my $params = {};
    -  $params->{''} = 1 if $what->{''};
    -  $params->{IV} = 1 if $what->{IV} || $what->{UV} || $what->{PVN};
    -  $params->{NV} = 1 if $what->{NV};
    -  $params->{PV} = 1 if $what->{PV} || $what->{PVN};
    -  $params->{SV} = 1 if $what->{SV};
    -  return $params;
    -}
    -
    -
    -sub C_constant_prefix_param {
    -  "aTHX_ ";
    -}
    -
    -sub C_constant_prefix_param_defintion {
    -  "pTHX_ ";
    -}
    -
    -sub namelen_param_definition {
    -  'STRLEN ' . $_[0] -> namelen_param;
    -}
    -
    -sub C_constant_other_params_defintion {
    -  my ($self, $params) = @_;
    -  my $body = '';
    -  $body .= ", int utf8" if $params->{''};
    -  $body .= ", IV *iv_return" if $params->{IV};
    -  $body .= ", NV *nv_return" if $params->{NV};
    -  $body .= ", const char **pv_return" if $params->{PV};
    -  $body .= ", SV **sv_return" if $params->{SV};
    -  $body;
    -}
    -
    -sub C_constant_other_params {
    -  my ($self, $params) = @_;
    -  my $body = '';
    -  $body .= ", utf8" if $params->{''};
    -  $body .= ", iv_return" if $params->{IV};
    -  $body .= ", nv_return" if $params->{NV};
    -  $body .= ", pv_return" if $params->{PV};
    -  $body .= ", sv_return" if $params->{SV};
    -  $body;
    -}
    -
    -sub dogfood {
    -  my ($self, $args, @items) = @_;
    -  my ($package, $subname, $default_type, $what, $indent, $breakout) =
    -    @{$args}{qw(package subname default_type what indent breakout)};
    -  my $result = <<"EOT";
    -  /* When generated this function returned values for the list of names given
    -     in this section of perl code.  Rather than manually editing these functions
    -     to add or remove constants, which would result in this comment and section
    -     of code becoming inaccurate, we recommend that you edit this section of
    -     code, and use it to regenerate a new set of constant functions which you
    -     then use to replace the originals.
    -
    -     Regenerate these constant functions by feeding this entire source file to
    -     perl -x
    -
    -#!$^X -w
    -use ExtUtils::Constant qw (constant_types C_constant XS_constant);
    -
    -EOT
    -  $result .= $self->dump_names ({default_type=>$default_type, what=>$what,
    -				 indent=>0, declare_types=>1},
    -				@items);
    -  $result .= <<'EOT';
    -
    -print constant_types(); # macro defs
    -EOT
    -  $package = perl_stringify($package);
    -  $result .=
    -    "foreach (C_constant (\"$package\", '$subname', '$default_type', \$types, ";
    -  # The form of the indent parameter isn't defined. (Yet)
    -  if (defined $indent) {
    -    require Data::Dumper;
    -    $Data::Dumper::Terse=1;
    -    $Data::Dumper::Terse=1; # Not used once. :-)
    -    chomp ($indent = Data::Dumper::Dumper ($indent));
    -    $result .= $indent;
    -  } else {
    -    $result .= 'undef';
    -  }
    -  $result .= ", $breakout" . ', @names) ) {
    -    print $_, "\n"; # C constant subs
    -}
    -print "#### XS Section:\n";
    -print XS_constant ("' . $package . '", $types);
    -__END__
    -   */
    -
    -';
    -
    -  $result;
    -}
    -
    -1;
    diff --git a/lib/perl5/5.8.8/ExtUtils/Embed.pm b/lib/perl5/5.8.8/ExtUtils/Embed.pm
    deleted file mode 100644
    index 2d6470ef..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/Embed.pm
    +++ /dev/null
    @@ -1,515 +0,0 @@
    -# $Id: Embed.pm,v 1.1.1.1 2002/01/16 19:27:19 schwern Exp $
    -require 5.002;
    -
    -package ExtUtils::Embed;
    -require Exporter;
    -require FileHandle;
    -use Config;
    -use Getopt::Std;
    -use File::Spec;
    -
    -#Only when we need them
    -#require ExtUtils::MakeMaker;
    -#require ExtUtils::Liblist;
    -
    -use vars qw(@ISA @EXPORT $VERSION
    -	    @Extensions $Verbose $lib_ext
    -	    $opt_o $opt_s 
    -	    );
    -use strict;
    -
    -$VERSION = 1.26;
    -
    -@ISA = qw(Exporter);
    -@EXPORT = qw(&xsinit &ldopts 
    -	     &ccopts &ccflags &ccdlflags &perl_inc
    -	     &xsi_header &xsi_protos &xsi_body);
    -
    -#let's have Miniperl borrow from us instead
    -#require ExtUtils::Miniperl;
    -#*canon = \&ExtUtils::Miniperl::canon;
    -
    -$Verbose = 0;
    -$lib_ext = $Config{lib_ext} || '.a';
    -
    -sub is_cmd { $0 eq '-e' }
    -
    -sub my_return {
    -    my $val = shift;
    -    if(is_cmd) {
    -	print $val;
    -    }
    -    else {
    -	return $val;
    -    }
    -}
    -
    -sub xsinit { 
    -    my($file, $std, $mods) = @_;
    -    my($fh,@mods,%seen);
    -    $file ||= "perlxsi.c";
    -    my $xsinit_proto = "pTHX";
    -
    -    if (@_) {
    -       @mods = @$mods if $mods;
    -    }
    -    else {
    -       getopts('o:s:');
    -       $file = $opt_o if defined $opt_o;
    -       $std  = $opt_s  if defined $opt_s;
    -       @mods = @ARGV;
    -    }
    -    $std = 1 unless scalar @mods;
    -
    -    if ($file eq "STDOUT") {
    -	$fh = \*STDOUT;
    -    }
    -    else {
    -	$fh = new FileHandle "> $file";
    -    }
    -
    -    push(@mods, static_ext()) if defined $std;
    -    @mods = grep(!$seen{$_}++, @mods);
    -
    -    print $fh &xsi_header();
    -    print $fh "EXTERN_C void xs_init ($xsinit_proto);\n\n";     
    -    print $fh &xsi_protos(@mods);
    -
    -    print $fh "\nEXTERN_C void\nxs_init($xsinit_proto)\n{\n";
    -    print $fh &xsi_body(@mods);
    -    print $fh "}\n";
    -
    -}
    -
    -sub xsi_header {
    -    return <
    -#include 
    -
    -EOF
    -}    
    -
    -sub xsi_protos {
    -    my(@exts) = @_;
    -    my(@retval,%seen);
    -    my $boot_proto = "pTHX_ CV* cv";
    -    foreach $_ (@exts){
    -        my($pname) = canon('/', $_);
    -        my($mname, $cname);
    -        ($mname = $pname) =~ s!/!::!g;
    -        ($cname = $pname) =~ s!/!__!g;
    -	my($ccode) = "EXTERN_C void boot_${cname} ($boot_proto);\n";
    -	next if $seen{$ccode}++;
    -        push(@retval, $ccode);
    -    }
    -    return join '', @retval;
    -}
    -
    -sub xsi_body {
    -    my(@exts) = @_;
    -    my($pname,@retval,%seen);
    -    my($dl) = canon('/','DynaLoader');
    -    push(@retval, "\tchar *file = __FILE__;\n");
    -    push(@retval, "\tdXSUB_SYS;\n") if $] > 5.002;
    -    push(@retval, "\n");
    -
    -    foreach $_ (@exts){
    -        my($pname) = canon('/', $_);
    -        my($mname, $cname, $ccode);
    -        ($mname = $pname) =~ s!/!::!g;
    -        ($cname = $pname) =~ s!/!__!g;
    -        if ($pname eq $dl){
    -            # Must NOT install 'DynaLoader::boot_DynaLoader' as 'bootstrap'!
    -            # boot_DynaLoader is called directly in DynaLoader.pm
    -            $ccode = "\t/* DynaLoader is a special case */\n\tnewXS(\"${mname}::boot_${cname}\", boot_${cname}, file);\n";
    -            push(@retval, $ccode) unless $seen{$ccode}++;
    -        } else {
    -            $ccode = "\tnewXS(\"${mname}::bootstrap\", boot_${cname}, file);\n";
    -            push(@retval, $ccode) unless $seen{$ccode}++;
    -        }
    -    }
    -    return join '', @retval;
    -}
    -
    -sub static_ext {
    -    unless (scalar @Extensions) {
    -	@Extensions = sort split /\s+/, $Config{static_ext};
    -	unshift @Extensions, qw(DynaLoader);
    -    }
    -    @Extensions;
    -}
    -
    -sub _escape {
    -    my $arg = shift;
    -    $$arg =~ s/([\(\)])/\\$1/g;
    -}
    -
    -sub _ldflags {
    -    my $ldflags = $Config{ldflags};
    -    _escape(\$ldflags);
    -    return $ldflags;
    -}
    -
    -sub _ccflags {
    -    my $ccflags = $Config{ccflags};
    -    _escape(\$ccflags);
    -    return $ccflags;
    -}
    -
    -sub _ccdlflags {
    -    my $ccdlflags = $Config{ccdlflags};
    -    _escape(\$ccdlflags);
    -    return $ccdlflags;
    -}
    -
    -sub ldopts {
    -    require ExtUtils::MakeMaker;
    -    require ExtUtils::Liblist;
    -    my($std,$mods,$link_args,$path) = @_;
    -    my(@mods,@link_args,@argv);
    -    my($dllib,$config_libs,@potential_libs,@path);
    -    local($") = ' ' unless $" eq ' ';
    -    if (scalar @_) {
    -       @link_args = @$link_args if $link_args;
    -       @mods = @$mods if $mods;
    -    }
    -    else {
    -       @argv = @ARGV;
    -       #hmm
    -       while($_ = shift @argv) {
    -	   /^-std$/  && do { $std = 1; next; };
    -	   /^--$/    && do { @link_args = @argv; last; };
    -	   /^-I(.*)/ && do { $path = $1 || shift @argv; next; };
    -	   push(@mods, $_); 
    -       }
    -    }
    -    $std = 1 unless scalar @link_args;
    -    my $sep = $Config{path_sep} || ':';
    -    @path = $path ? split(/\Q$sep/, $path) : @INC;
    -
    -    push(@potential_libs, @link_args)    if scalar @link_args;
    -    # makemaker includes std libs on windows by default
    -    if ($^O ne 'MSWin32' and defined($std)) {
    -	push(@potential_libs, $Config{perllibs});
    -    }
    -
    -    push(@mods, static_ext()) if $std;
    -
    -    my($mod,@ns,$root,$sub,$extra,$archive,@archives);
    -    print STDERR "Searching (@path) for archives\n" if $Verbose;
    -    foreach $mod (@mods) {
    -	@ns = split(/::|\/|\\/, $mod);
    -	$sub = $ns[-1];
    -	$root = File::Spec->catdir(@ns);
    -	
    -	print STDERR "searching for '$sub${lib_ext}'\n" if $Verbose;
    -	foreach (@path) {
    -	    next unless -e ($archive = File::Spec->catdir($_,"auto",$root,"$sub$lib_ext"));
    -	    push @archives, $archive;
    -	    if(-e ($extra = File::Spec->catdir($_,"auto",$root,"extralibs.ld"))) {
    -		local(*FH); 
    -		if(open(FH, $extra)) {
    -		    my($libs) = ; chomp $libs;
    -		    push @potential_libs, split /\s+/, $libs;
    -		}
    -		else {  
    -		    warn "Couldn't open '$extra'"; 
    -		}
    -	    }
    -	    last;
    -	}
    -    }
    -    #print STDERR "\@potential_libs = @potential_libs\n";
    -
    -    my $libperl;
    -    if ($^O eq 'MSWin32') {
    -	$libperl = $Config{libperl};
    -    }
    -    else {
    -	$libperl = (grep(/^-l\w*perl\w*$/, @link_args))[0]
    -	    || ($Config{libperl} =~ /^lib(\w+)(\Q$lib_ext\E|\.\Q$Config{dlext}\E)$/
    -		? "-l$1" : '')
    -	    || "-lperl";
    -    }
    -
    -    my $lpath = File::Spec->catdir($Config{archlibexp}, 'CORE');
    -    $lpath = qq["$lpath"] if $^O eq 'MSWin32';
    -    my($extralibs, $bsloadlibs, $ldloadlibs, $ld_run_path) =
    -	MM->ext(join ' ', "-L$lpath", $libperl, @potential_libs);
    -
    -    my $ld_or_bs = $bsloadlibs || $ldloadlibs;
    -    print STDERR "bs: $bsloadlibs ** ld: $ldloadlibs" if $Verbose;
    -    my $ccdlflags = _ccdlflags();
    -    my $ldflags   = _ldflags();
    -    my $linkage = "$ccdlflags $ldflags @archives $ld_or_bs";
    -    print STDERR "ldopts: '$linkage'\n" if $Verbose;
    -
    -    return $linkage if scalar @_;
    -    my_return("$linkage\n");
    -}
    -
    -sub ccflags {
    -    my $ccflags = _ccflags();
    -    my_return(" $ccflags ");
    -}
    -
    -sub ccdlflags {
    -    my $ccdlflags = _ccdlflags();
    -    my_return(" $ccdlflags ");
    -}
    -
    -sub perl_inc {
    -    my $dir = File::Spec->catdir($Config{archlibexp}, 'CORE');
    -    $dir = qq["$dir"] if $^O eq 'MSWin32';
    -    my_return(" -I$dir ");
    -}
    -
    -sub ccopts {
    -   ccflags . perl_inc;
    -}
    -
    -sub canon {
    -    my($as, @ext) = @_;
    -    foreach(@ext) {
    -       # might be X::Y or lib/auto/X/Y/Y.a
    -       next if s!::!/!g;
    -       s:^(lib|ext)/(auto/)?::;
    -       s:/\w+\.\w+$::;
    -    }
    -    grep(s:/:$as:, @ext) if ($as ne '/');
    -    @ext;
    -}
    -
    -__END__
    -
    -=head1 NAME
    -
    -ExtUtils::Embed - Utilities for embedding Perl in C/C++ applications
    -
    -=head1 SYNOPSIS
    -
    -
    - perl -MExtUtils::Embed -e xsinit 
    - perl -MExtUtils::Embed -e ccopts 
    - perl -MExtUtils::Embed -e ldopts 
    -
    -=head1 DESCRIPTION
    -
    -ExtUtils::Embed provides utility functions for embedding a Perl interpreter
    -and extensions in your C/C++ applications.  
    -Typically, an application B will invoke ExtUtils::Embed
    -functions while building your application.  
    -
    -=head1 @EXPORT
    -
    -ExtUtils::Embed exports the following functions:
    -
    -xsinit(), ldopts(), ccopts(), perl_inc(), ccflags(), 
    -ccdlflags(), xsi_header(), xsi_protos(), xsi_body()
    -
    -=head1 FUNCTIONS
    -
    -=over 4
    -
    -=item xsinit()
    -
    -Generate C/C++ code for the XS initializer function.
    -
    -When invoked as C<`perl -MExtUtils::Embed -e xsinit --`>
    -the following options are recognized:
    -
    -B<-o> Eoutput filenameE (Defaults to B)
    -
    -B<-o STDOUT> will print to STDOUT.
    -
    -B<-std> (Write code for extensions that are linked with the current Perl.)
    -
    -Any additional arguments are expected to be names of modules
    -to generate code for.
    -
    -When invoked with parameters the following are accepted and optional:
    -
    -C
    -
    -Where,
    -
    -B<$filename> is equivalent to the B<-o> option.
    -
    -B<$std> is boolean, equivalent to the B<-std> option.  
    -
    -B<[@modules]> is an array ref, same as additional arguments mentioned above.
    -
    -=item Examples
    -
    -
    - perl -MExtUtils::Embed -e xsinit -- -o xsinit.c Socket
    -
    -
    -This will generate code with an B function that glues the perl B function 
    -to the C B function and writes it to a file named F.
    -
    -Note that B is a special case where it must call B directly.
    -
    - perl -MExtUtils::Embed -e xsinit
    -
    -
    -This will generate code for linking with B and 
    -each static extension found in B<$Config{static_ext}>.
    -The code is written to the default file name B.
    -
    -
    - perl -MExtUtils::Embed -e xsinit -- -o xsinit.c -std DBI DBD::Oracle
    -
    -
    -Here, code is written for all the currently linked extensions along with code
    -for B and B.
    -
    -If you have a working B then there is rarely any need to statically link in any 
    -other extensions.
    -
    -=item ldopts()
    -
    -Output arguments for linking the Perl library and extensions to your
    -application.
    -
    -When invoked as C<`perl -MExtUtils::Embed -e ldopts --`>
    -the following options are recognized:
    -
    -B<-std> 
    -
    -Output arguments for linking the Perl library and any extensions linked
    -with the current Perl.
    -
    -B<-I> Epath1:path2E
    -
    -Search path for ModuleName.a archives.  
    -Default path is B<@INC>.
    -Library archives are expected to be found as 
    -B
    -For example, when looking for B relative to a search path, 
    -we should find B  
    -
    -When looking for B relative to a search path,
    -we should find B
    -
    -Keep in mind that you can always supply B
    -as an additional linker argument.
    -
    -B<-->  Elist of linker argsE
    -
    -Additional linker arguments to be considered.
    -
    -Any additional arguments found before the B<--> token 
    -are expected to be names of modules to generate code for.
    -
    -When invoked with parameters the following are accepted and optional:
    -
    -C
    -
    -Where:
    -
    -B<$std> is boolean, equivalent to the B<-std> option.  
    -
    -B<[@modules]> is equivalent to additional arguments found before the B<--> token.
    -
    -B<[@link_args]> is equivalent to arguments found after the B<--> token.
    -
    -B<$path> is equivalent to the B<-I> option.
    -
    -In addition, when ldopts is called with parameters, it will return the argument string
    -rather than print it to STDOUT.
    -
    -=item Examples
    -
    -
    - perl -MExtUtils::Embed -e ldopts
    -
    -
    -This will print arguments for linking with B, B and 
    -extensions found in B<$Config{static_ext}>.  This includes libraries
    -found in B<$Config{libs}> and the first ModuleName.a library
    -for each extension that is found by searching B<@INC> or the path 
    -specified by the B<-I> option.  
    -In addition, when ModuleName.a is found, additional linker arguments
    -are picked up from the B file in the same directory.
    -
    -
    - perl -MExtUtils::Embed -e ldopts -- -std Socket
    -
    -
    -This will do the same as the above example, along with printing additional arguments for linking with the B extension.
    -
    -
    - perl -MExtUtils::Embed -e ldopts -- DynaLoader
    -
    -
    -This will print arguments for linking with just the B extension
    -and B.
    -
    -
    - perl -MExtUtils::Embed -e ldopts -- -std Msql -- -L/usr/msql/lib -lmsql
    -
    -
    -Any arguments after the second '--' token are additional linker
    -arguments that will be examined for potential conflict.  If there is no
    -conflict, the additional arguments will be part of the output.  
    -
    -
    -=item perl_inc()
    -
    -For including perl header files this function simply prints:
    -
    - -I$Config{archlibexp}/CORE  
    -
    -So, rather than having to say:
    -
    - perl -MConfig -e 'print "-I$Config{archlibexp}/CORE"'
    -
    -Just say:
    -
    - perl -MExtUtils::Embed -e perl_inc
    -
    -=item ccflags(), ccdlflags()
    -
    -These functions simply print $Config{ccflags} and $Config{ccdlflags}
    -
    -=item ccopts()
    -
    -This function combines perl_inc(), ccflags() and ccdlflags() into one.
    -
    -=item xsi_header()
    -
    -This function simply returns a string defining the same B macro as
    -B along with #including B and B.  
    -
    -=item xsi_protos(@modules)
    -
    -This function returns a string of B prototypes for each @modules.
    -
    -=item xsi_body(@modules)
    -
    -This function returns a string of calls to B that glue the module B
    -function to B for each @modules.
    -
    -B uses the xsi_* functions to generate most of its code.
    -
    -=back
    -
    -=head1 EXAMPLES
    -
    -For examples on how to use B for building C/C++ applications
    -with embedded perl, see L.
    -
    -=head1 SEE ALSO
    -
    -L
    -
    -=head1 AUTHOR
    -
    -Doug MacEachern EFE
    -
    -Based on ideas from Tim Bunce EFE and
    -B by Andreas Koenig EFE and Tim Bunce.
    -
    -=cut
    -
    diff --git a/lib/perl5/5.8.8/ExtUtils/Install.pm b/lib/perl5/5.8.8/ExtUtils/Install.pm
    deleted file mode 100644
    index 30740e07..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/Install.pm
    +++ /dev/null
    @@ -1,544 +0,0 @@
    -package ExtUtils::Install;
    -
    -use 5.00503;
    -use vars qw(@ISA @EXPORT $VERSION);
    -$VERSION = '1.33';
    -
    -use Exporter;
    -use Carp ();
    -use Config qw(%Config);
    -@ISA = ('Exporter');
    -@EXPORT = ('install','uninstall','pm_to_blib', 'install_default');
    -$Is_VMS     = $^O eq 'VMS';
    -$Is_MacPerl = $^O eq 'MacOS';
    -
    -my $Inc_uninstall_warn_handler;
    -
    -# install relative to here
    -
    -my $INSTALL_ROOT = $ENV{PERL_INSTALL_ROOT};
    -
    -use File::Spec;
    -my $Curdir = File::Spec->curdir;
    -my $Updir  = File::Spec->updir;
    -
    -
    -=head1 NAME
    -
    -ExtUtils::Install - install files from here to there
    -
    -=head1 SYNOPSIS
    -
    -  use ExtUtils::Install;
    -
    -  install({ 'blib/lib' => 'some/install/dir' } );
    -
    -  uninstall($packlist);
    -
    -  pm_to_blib({ 'lib/Foo/Bar.pm' => 'blib/lib/Foo/Bar.pm' });
    -
    -
    -=head1 DESCRIPTION
    -
    -Handles the installing and uninstalling of perl modules, scripts, man
    -pages, etc...
    -
    -Both install() and uninstall() are specific to the way
    -ExtUtils::MakeMaker handles the installation and deinstallation of
    -perl modules. They are not designed as general purpose tools.
    -
    -=head2 Functions
    -
    -=over 4
    -
    -=item B
    -
    -    install(\%from_to);
    -    install(\%from_to, $verbose, $dont_execute, $uninstall_shadows);
    -
    -Copies each directory tree of %from_to to its corresponding value
    -preserving timestamps and permissions.
    -
    -There are two keys with a special meaning in the hash: "read" and
    -"write".  These contain packlist files.  After the copying is done,
    -install() will write the list of target files to $from_to{write}. If
    -$from_to{read} is given the contents of this file will be merged into
    -the written file. The read and the written file may be identical, but
    -on AFS it is quite likely that people are installing to a different
    -directory than the one where the files later appear.
    -
    -If $verbose is true, will print out each file removed.  Default is
    -false.  This is "make install VERBINST=1"
    -
    -If $dont_execute is true it will only print what it was going to do
    -without actually doing it.  Default is false.
    -
    -If $uninstall_shadows is true any differing versions throughout @INC
    -will be uninstalled.  This is "make install UNINST=1"
    -
    -=cut
    -
    -sub install {
    -    my($from_to,$verbose,$nonono,$inc_uninstall) = @_;
    -    $verbose ||= 0;
    -    $nonono  ||= 0;
    -
    -    use Cwd qw(cwd);
    -    use ExtUtils::Packlist;
    -    use File::Basename qw(dirname);
    -    use File::Copy qw(copy);
    -    use File::Find qw(find);
    -    use File::Path qw(mkpath);
    -    use File::Compare qw(compare);
    -
    -    my(%from_to) = %$from_to;
    -    my(%pack, $dir, $warn_permissions);
    -    my($packlist) = ExtUtils::Packlist->new();
    -    # -w doesn't work reliably on FAT dirs
    -    $warn_permissions++ if $^O eq 'MSWin32';
    -    local(*DIR);
    -    for (qw/read write/) {
    -	$pack{$_}=$from_to{$_};
    -	delete $from_to{$_};
    -    }
    -    my($source_dir_or_file);
    -    foreach $source_dir_or_file (sort keys %from_to) {
    -	#Check if there are files, and if yes, look if the corresponding
    -	#target directory is writable for us
    -	opendir DIR, $source_dir_or_file or next;
    -	for (readdir DIR) {
    -	    next if $_ eq $Curdir || $_ eq $Updir || $_ eq ".exists";
    -            my $targetdir = install_rooted_dir($from_to{$source_dir_or_file});
    -            mkpath($targetdir) unless $nonono;
    -	    if (!$nonono && !-w $targetdir) {
    -		warn "Warning: You do not have permissions to " .
    -		    "install into $from_to{$source_dir_or_file}"
    -		    unless $warn_permissions++;
    -	    }
    -	}
    -	closedir DIR;
    -    }
    -    my $tmpfile = install_rooted_file($pack{"read"});
    -    $packlist->read($tmpfile) if (-f $tmpfile);
    -    my $cwd = cwd();
    -
    -    MOD_INSTALL: foreach my $source (sort keys %from_to) {
    -	#copy the tree to the target directory without altering
    -	#timestamp and permission and remember for the .packlist
    -	#file. The packlist file contains the absolute paths of the
    -	#install locations. AFS users may call this a bug. We'll have
    -	#to reconsider how to add the means to satisfy AFS users also.
    -
    -	#October 1997: we want to install .pm files into archlib if
    -	#there are any files in arch. So we depend on having ./blib/arch
    -	#hardcoded here.
    -
    -	my $targetroot = install_rooted_dir($from_to{$source});
    -
    -        my $blib_lib  = File::Spec->catdir('blib', 'lib');
    -        my $blib_arch = File::Spec->catdir('blib', 'arch');
    -	if ($source eq $blib_lib and
    -	    exists $from_to{$blib_arch} and
    -	    directory_not_empty($blib_arch)) {
    -	    $targetroot = install_rooted_dir($from_to{$blib_arch});
    -            print "Files found in $blib_arch: installing files in $blib_lib into architecture dependent library tree\n";
    -	}
    -
    -        chdir $source or next;
    -	find(sub {
    -	    my ($mode,$size,$atime,$mtime) = (stat)[2,7,8,9];
    -	    return unless -f _;
    -
    -            my $origfile = $_;
    -	    return if $origfile eq ".exists";
    -	    my $targetdir  = File::Spec->catdir($targetroot, $File::Find::dir);
    -	    my $targetfile = File::Spec->catfile($targetdir, $origfile);
    -            my $sourcedir  = File::Spec->catdir($source, $File::Find::dir);
    -            my $sourcefile = File::Spec->catfile($sourcedir, $origfile);
    -
    -            my $save_cwd = cwd;
    -            chdir $cwd;  # in case the target is relative
    -                         # 5.5.3's File::Find missing no_chdir option.
    -
    -	    my $diff = 0;
    -	    if ( -f $targetfile && -s _ == $size) {
    -		# We have a good chance, we can skip this one
    -		$diff = compare($sourcefile, $targetfile);
    -	    } else {
    -		print "$sourcefile differs\n" if $verbose>1;
    -		$diff++;
    -	    }
    -
    -	    if ($diff){
    -		if (-f $targetfile){
    -		    forceunlink($targetfile) unless $nonono;
    -		} else {
    -		    mkpath($targetdir,0,0755) unless $nonono;
    -		    print "mkpath($targetdir,0,0755)\n" if $verbose>1;
    -		}
    -		copy($sourcefile, $targetfile) unless $nonono;
    -		print "Installing $targetfile\n";
    -		utime($atime,$mtime + $Is_VMS,$targetfile) unless $nonono>1;
    -		print "utime($atime,$mtime,$targetfile)\n" if $verbose>1;
    -		$mode = 0444 | ( $mode & 0111 ? 0111 : 0 );
    -		chmod $mode, $targetfile;
    -		print "chmod($mode, $targetfile)\n" if $verbose>1;
    -	    } else {
    -		print "Skipping $targetfile (unchanged)\n" if $verbose;
    -	    }
    -
    -	    if (defined $inc_uninstall) {
    -		inc_uninstall($sourcefile,$File::Find::dir,$verbose, 
    -                              $inc_uninstall ? 0 : 1);
    -	    }
    -
    -	    # Record the full pathname.
    -	    $packlist->{$targetfile}++;
    -
    -            # File::Find can get confused if you chdir in here.
    -            chdir $save_cwd;
    -
    -        # File::Find seems to always be Unixy except on MacPerl :(
    -	}, $Is_MacPerl ? $Curdir : '.' );
    -	chdir($cwd) or Carp::croak("Couldn't chdir to $cwd: $!");
    -    }
    -    if ($pack{'write'}) {
    -	$dir = install_rooted_dir(dirname($pack{'write'}));
    -	mkpath($dir,0,0755) unless $nonono;
    -	print "Writing $pack{'write'}\n";
    -	$packlist->write(install_rooted_file($pack{'write'})) unless $nonono;
    -    }
    -}
    -
    -sub install_rooted_file {
    -    if (defined $INSTALL_ROOT) {
    -	File::Spec->catfile($INSTALL_ROOT, $_[0]);
    -    } else {
    -	$_[0];
    -    }
    -}
    -
    -
    -sub install_rooted_dir {
    -    if (defined $INSTALL_ROOT) {
    -	File::Spec->catdir($INSTALL_ROOT, $_[0]);
    -    } else {
    -	$_[0];
    -    }
    -}
    -
    -
    -sub forceunlink {
    -    chmod 0666, $_[0];
    -    unlink $_[0] or Carp::croak("Cannot forceunlink $_[0]: $!")
    -}
    -
    -
    -sub directory_not_empty ($) {
    -  my($dir) = @_;
    -  my $files = 0;
    -  find(sub {
    -	   return if $_ eq ".exists";
    -	   if (-f) {
    -	     $File::Find::prune++;
    -	     $files = 1;
    -	   }
    -       }, $dir);
    -  return $files;
    -}
    -
    -
    -=item B I
    -
    -    install_default();
    -    install_default($fullext);
    -
    -Calls install() with arguments to copy a module from blib/ to the
    -default site installation location.
    -
    -$fullext is the name of the module converted to a directory
    -(ie. Foo::Bar would be Foo/Bar).  If $fullext is not specified, it
    -will attempt to read it from @ARGV.
    -
    -This is primarily useful for install scripts.
    -
    -B This function is not really useful because of the hard-coded
    -install location with no way to control site vs core vs vendor
    -directories and the strange way in which the module name is given.
    -Consider its use discouraged.
    -
    -=cut
    -
    -sub install_default {
    -  @_ < 2 or die "install_default should be called with 0 or 1 argument";
    -  my $FULLEXT = @_ ? shift : $ARGV[0];
    -  defined $FULLEXT or die "Do not know to where to write install log";
    -  my $INST_LIB = File::Spec->catdir($Curdir,"blib","lib");
    -  my $INST_ARCHLIB = File::Spec->catdir($Curdir,"blib","arch");
    -  my $INST_BIN = File::Spec->catdir($Curdir,'blib','bin');
    -  my $INST_SCRIPT = File::Spec->catdir($Curdir,'blib','script');
    -  my $INST_MAN1DIR = File::Spec->catdir($Curdir,'blib','man1');
    -  my $INST_MAN3DIR = File::Spec->catdir($Curdir,'blib','man3');
    -  install({
    -	   read => "$Config{sitearchexp}/auto/$FULLEXT/.packlist",
    -	   write => "$Config{installsitearch}/auto/$FULLEXT/.packlist",
    -	   $INST_LIB => (directory_not_empty($INST_ARCHLIB)) ?
    -			 $Config{installsitearch} :
    -			 $Config{installsitelib},
    -	   $INST_ARCHLIB => $Config{installsitearch},
    -	   $INST_BIN => $Config{installbin} ,
    -	   $INST_SCRIPT => $Config{installscript},
    -	   $INST_MAN1DIR => $Config{installman1dir},
    -	   $INST_MAN3DIR => $Config{installman3dir},
    -	  },1,0,0);
    -}
    -
    -
    -=item B
    -
    -    uninstall($packlist_file);
    -    uninstall($packlist_file, $verbose, $dont_execute);
    -
    -Removes the files listed in a $packlist_file.
    -
    -If $verbose is true, will print out each file removed.  Default is
    -false.
    -
    -If $dont_execute is true it will only print what it was going to do
    -without actually doing it.  Default is false.
    -
    -=cut
    -
    -sub uninstall {
    -    use ExtUtils::Packlist;
    -    my($fil,$verbose,$nonono) = @_;
    -    $verbose ||= 0;
    -    $nonono  ||= 0;
    -
    -    die "no packlist file found: $fil" unless -f $fil;
    -    # my $my_req = $self->catfile(qw(auto ExtUtils Install forceunlink.al));
    -    # require $my_req; # Hairy, but for the first
    -    my ($packlist) = ExtUtils::Packlist->new($fil);
    -    foreach (sort(keys(%$packlist))) {
    -	chomp;
    -	print "unlink $_\n" if $verbose;
    -	forceunlink($_) unless $nonono;
    -    }
    -    print "unlink $fil\n" if $verbose;
    -    forceunlink($fil) unless $nonono;
    -}
    -
    -sub inc_uninstall {
    -    my($filepath,$libdir,$verbose,$nonono) = @_;
    -    my($dir);
    -    my $file = (File::Spec->splitpath($filepath))[2];
    -    my %seen_dir = ();
    -
    -    my @PERL_ENV_LIB = split $Config{path_sep}, defined $ENV{'PERL5LIB'} 
    -      ? $ENV{'PERL5LIB'} : $ENV{'PERLLIB'} || '';
    -
    -    foreach $dir (@INC, @PERL_ENV_LIB, @Config{qw(archlibexp
    -						  privlibexp
    -						  sitearchexp
    -						  sitelibexp)}) {
    -	next if $dir eq $Curdir;
    -	next if $seen_dir{$dir}++;
    -	my($targetfile) = File::Spec->catfile($dir,$libdir,$file);
    -	next unless -f $targetfile;
    -
    -	# The reason why we compare file's contents is, that we cannot
    -	# know, which is the file we just installed (AFS). So we leave
    -	# an identical file in place
    -	my $diff = 0;
    -	if ( -f $targetfile && -s _ == -s $filepath) {
    -	    # We have a good chance, we can skip this one
    -	    $diff = compare($filepath,$targetfile);
    -	} else {
    -	    print "#$file and $targetfile differ\n" if $verbose>1;
    -	    $diff++;
    -	}
    -
    -	next unless $diff;
    -	if ($nonono) {
    -	    if ($verbose) {
    -		$Inc_uninstall_warn_handler ||= new ExtUtils::Install::Warn;
    -		$libdir =~ s|^\./||s ; # That's just cosmetics, no need to port. It looks prettier.
    -		$Inc_uninstall_warn_handler->add(
    -                                     File::Spec->catfile($libdir, $file),
    -                                     $targetfile
    -                                    );
    -	    }
    -	    # if not verbose, we just say nothing
    -	} else {
    -	    print "Unlinking $targetfile (shadowing?)\n";
    -	    forceunlink($targetfile);
    -	}
    -    }
    -}
    -
    -sub run_filter {
    -    my ($cmd, $src, $dest) = @_;
    -    local(*CMD, *SRC);
    -    open(CMD, "|$cmd >$dest") || die "Cannot fork: $!";
    -    open(SRC, $src)           || die "Cannot open $src: $!";
    -    my $buf;
    -    my $sz = 1024;
    -    while (my $len = sysread(SRC, $buf, $sz)) {
    -	syswrite(CMD, $buf, $len);
    -    }
    -    close SRC;
    -    close CMD or die "Filter command '$cmd' failed for $src";
    -}
    -
    -
    -=item B
    -
    -    pm_to_blib(\%from_to, $autosplit_dir);
    -    pm_to_blib(\%from_to, $autosplit_dir, $filter_cmd);
    -
    -Copies each key of %from_to to its corresponding value efficiently.
    -Filenames with the extension .pm are autosplit into the $autosplit_dir.
    -Any destination directories are created.
    -
    -$filter_cmd is an optional shell command to run each .pm file through
    -prior to splitting and copying.  Input is the contents of the module,
    -output the new module contents.
    -
    -You can have an environment variable PERL_INSTALL_ROOT set which will
    -be prepended as a directory to each installed file (and directory).
    -
    -=cut
    -
    -sub pm_to_blib {
    -    my($fromto,$autodir,$pm_filter) = @_;
    -
    -    use File::Basename qw(dirname);
    -    use File::Copy qw(copy);
    -    use File::Path qw(mkpath);
    -    use File::Compare qw(compare);
    -    use AutoSplit;
    -
    -    mkpath($autodir,0,0755);
    -    while(my($from, $to) = each %$fromto) {
    -	if( -f $to && -s $from == -s $to && -M $to < -M $from ) {
    -            print "Skip $to (unchanged)\n";
    -            next;
    -        }
    -
    -	# When a pm_filter is defined, we need to pre-process the source first
    -	# to determine whether it has changed or not.  Therefore, only perform
    -	# the comparison check when there's no filter to be ran.
    -	#    -- RAM, 03/01/2001
    -
    -	my $need_filtering = defined $pm_filter && length $pm_filter && 
    -                             $from =~ /\.pm$/;
    -
    -	if (!$need_filtering && 0 == compare($from,$to)) {
    -	    print "Skip $to (unchanged)\n";
    -	    next;
    -	}
    -	if (-f $to){
    -	    forceunlink($to);
    -	} else {
    -	    mkpath(dirname($to),0,0755);
    -	}
    -	if ($need_filtering) {
    -	    run_filter($pm_filter, $from, $to);
    -	    print "$pm_filter <$from >$to\n";
    -	} else {
    -	    copy($from,$to);
    -	    print "cp $from $to\n";
    -	}
    -	my($mode,$atime,$mtime) = (stat $from)[2,8,9];
    -	utime($atime,$mtime+$Is_VMS,$to);
    -	chmod(0444 | ( $mode & 0111 ? 0111 : 0 ),$to);
    -	next unless $from =~ /\.pm$/;
    -	_autosplit($to,$autodir);
    -    }
    -}
    -
    -
    -=begin _private
    -
    -=item _autosplit
    -
    -From 1.0307 back, AutoSplit will sometimes leave an open filehandle to
    -the file being split.  This causes problems on systems with mandatory
    -locking (ie. Windows).  So we wrap it and close the filehandle.
    -
    -=end _private
    -
    -=cut
    -
    -sub _autosplit {
    -    my $retval = autosplit(@_);
    -    close *AutoSplit::IN if defined *AutoSplit::IN{IO};
    -
    -    return $retval;
    -}
    -
    -
    -package ExtUtils::Install::Warn;
    -
    -sub new { bless {}, shift }
    -
    -sub add {
    -    my($self,$file,$targetfile) = @_;
    -    push @{$self->{$file}}, $targetfile;
    -}
    -
    -sub DESTROY {
    -    unless(defined $INSTALL_ROOT) {
    -        my $self = shift;
    -        my($file,$i,$plural);
    -        foreach $file (sort keys %$self) {
    -            $plural = @{$self->{$file}} > 1 ? "s" : "";
    -            print "## Differing version$plural of $file found. You might like to\n";
    -            for (0..$#{$self->{$file}}) {
    -                print "rm ", $self->{$file}[$_], "\n";
    -                $i++;
    -            }
    -        }
    -        $plural = $i>1 ? "all those files" : "this file";
    -        print "## Running 'make install UNINST=1' will unlink $plural for you.\n";
    -    }
    -}
    -
    -=back
    -
    -
    -=head1 ENVIRONMENT
    -
    -=over 4
    -
    -=item B
    -
    -Will be prepended to each install path.
    -
    -=back
    -
    -=head1 AUTHOR
    -
    -Original author lost in the mists of time.  Probably the same as Makemaker.
    -
    -Currently maintained by Michael G Schwern C
    -
    -Send patches and ideas to C.
    -
    -Send bug reports via http://rt.cpan.org/.  Please send your
    -generated Makefile along with your report.
    -
    -For more up-to-date information, see L.
    -
    -
    -=head1 LICENSE
    -
    -This program is free software; you can redistribute it and/or 
    -modify it under the same terms as Perl itself.
    -
    -See L
    -
    -
    -=cut
    -
    -1;
    diff --git a/lib/perl5/5.8.8/ExtUtils/Installed.pm b/lib/perl5/5.8.8/ExtUtils/Installed.pm
    deleted file mode 100644
    index 8b0c53c4..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/Installed.pm
    +++ /dev/null
    @@ -1,337 +0,0 @@
    -package ExtUtils::Installed;
    -
    -use 5.00503;
    -use strict;
    -use Carp qw();
    -use ExtUtils::Packlist;
    -use ExtUtils::MakeMaker;
    -use Config;
    -use File::Find;
    -use File::Basename;
    -use File::Spec;
    -
    -my $Is_VMS = $^O eq 'VMS';
    -my $DOSISH = ($^O =~ /^(MSWin\d\d|os2|dos|mint)$/);
    -
    -require VMS::Filespec if $Is_VMS;
    -
    -use vars qw($VERSION);
    -$VERSION = '0.08';
    -
    -sub _is_prefix {
    -    my ($self, $path, $prefix) = @_;
    -    return unless defined $prefix && defined $path;
    -
    -    if( $Is_VMS ) {
    -        $prefix = VMS::Filespec::unixify($prefix);
    -        $path   = VMS::Filespec::unixify($path);
    -    }
    -
    -    # Sloppy Unix path normalization.
    -    $prefix =~ s{/+}{/}g;
    -    $path   =~ s{/+}{/}g;
    -
    -    return 1 if substr($path, 0, length($prefix)) eq $prefix;
    -
    -    if ($DOSISH) {
    -        $path =~ s|\\|/|g;
    -        $prefix =~ s|\\|/|g;
    -        return 1 if $path =~ m{^\Q$prefix\E}i;
    -    }
    -    return(0);
    -}
    -
    -sub _is_doc { 
    -    my ($self, $path) = @_;
    -    my $man1dir = $Config{man1direxp};
    -    my $man3dir = $Config{man3direxp};
    -    return(($man1dir && $self->_is_prefix($path, $man1dir))
    -           ||
    -           ($man3dir && $self->_is_prefix($path, $man3dir))
    -           ? 1 : 0)
    -}
    - 
    -sub _is_type {
    -    my ($self, $path, $type) = @_;
    -    return 1 if $type eq "all";
    -
    -    return($self->_is_doc($path)) if $type eq "doc";
    -
    -    if ($type eq "prog") {
    -        return($self->_is_prefix($path, $Config{prefix} || $Config{prefixexp})
    -               &&
    -               !($self->_is_doc($path))
    -               ? 1 : 0);
    -    }
    -    return(0);
    -}
    -
    -sub _is_under {
    -    my ($self, $path, @under) = @_;
    -    $under[0] = "" if (! @under);
    -    foreach my $dir (@under) {
    -        return(1) if ($self->_is_prefix($path, $dir));
    -    }
    -
    -    return(0);
    -}
    -
    -sub new {
    -    my ($class) = @_;
    -    $class = ref($class) || $class;
    -    my $self = {};
    -
    -    my $archlib = $Config{archlibexp};
    -    my $sitearch = $Config{sitearchexp};
    -
    -    # File::Find does not know how to deal with VMS filepaths.
    -    if( $Is_VMS ) {
    -        $archlib  = VMS::Filespec::unixify($archlib);
    -        $sitearch = VMS::Filespec::unixify($sitearch);
    -    }
    -
    -    if ($DOSISH) {
    -        $archlib =~ s|\\|/|g;
    -        $sitearch =~ s|\\|/|g;
    -    }
    -
    -    # Read the core packlist
    -    $self->{Perl}{packlist} =
    -      ExtUtils::Packlist->new( File::Spec->catfile($archlib, '.packlist') );
    -    $self->{Perl}{version} = $Config{version};
    -
    -    # Read the module packlists
    -    my $sub = sub {
    -        # Only process module .packlists
    -        return if $_ ne ".packlist" || $File::Find::dir eq $archlib;
    -
    -        # Hack of the leading bits of the paths & convert to a module name
    -        my $module = $File::Find::name;
    -
    -        $module =~ s!\Q$archlib\E/?auto/(.*)/.packlist!$1!s  or
    -        $module =~ s!\Q$sitearch\E/?auto/(.*)/.packlist!$1!s;
    -        my $modfile = "$module.pm";
    -        $module =~ s!/!::!g;
    -
    -        # Find the top-level module file in @INC
    -        $self->{$module}{version} = '';
    -        foreach my $dir (@INC) {
    -            my $p = File::Spec->catfile($dir, $modfile);
    -            if (-r $p) {
    -                $module = _module_name($p, $module) if $Is_VMS;
    -
    -                require ExtUtils::MM;
    -                $self->{$module}{version} = MM->parse_version($p);
    -                last;
    -            }
    -        }
    -
    -        # Read the .packlist
    -        $self->{$module}{packlist} = 
    -          ExtUtils::Packlist->new($File::Find::name);
    -    };
    -
    -    my(@dirs) = grep { -e } ($archlib, $sitearch);
    -    find($sub, @dirs) if @dirs;
    -
    -    return(bless($self, $class));
    -}
    -
    -# VMS's non-case preserving file-system means the package name can't
    -# be reconstructed from the filename.
    -sub _module_name {
    -    my($file, $orig_module) = @_;
    -
    -    my $module = '';
    -    if (open PACKFH, $file) {
    -        while () {
    -            if (/package\s+(\S+)\s*;/) {
    -                my $pack = $1;
    -                # Make a sanity check, that lower case $module
    -                # is identical to lowercase $pack before
    -                # accepting it
    -                if (lc($pack) eq lc($orig_module)) {
    -                    $module = $pack;
    -                    last;
    -                }
    -            }
    -        }
    -        close PACKFH;
    -    }
    -
    -    print STDERR "Couldn't figure out the package name for $file\n"
    -      unless $module;
    -
    -    return $module;
    -}
    -
    -
    -
    -sub modules {
    -    my ($self) = @_;
    -
    -    # Bug/feature of sort in scalar context requires this.
    -    return wantarray ? sort keys %$self : keys %$self;
    -}
    -
    -sub files {
    -    my ($self, $module, $type, @under) = @_;
    -
    -    # Validate arguments
    -    Carp::croak("$module is not installed") if (! exists($self->{$module}));
    -    $type = "all" if (! defined($type));
    -    Carp::croak('type must be "all", "prog" or "doc"')
    -        if ($type ne "all" && $type ne "prog" && $type ne "doc");
    -
    -    my (@files);
    -    foreach my $file (keys(%{$self->{$module}{packlist}})) {
    -        push(@files, $file)
    -          if ($self->_is_type($file, $type) && 
    -              $self->_is_under($file, @under));
    -    }
    -    return(@files);
    -}
    -
    -sub directories {
    -    my ($self, $module, $type, @under) = @_;
    -    my (%dirs);
    -    foreach my $file ($self->files($module, $type, @under)) {
    -        $dirs{dirname($file)}++;
    -    }
    -    return sort keys %dirs;
    -}
    -
    -sub directory_tree {
    -    my ($self, $module, $type, @under) = @_;
    -    my (%dirs);
    -    foreach my $dir ($self->directories($module, $type, @under)) {
    -        $dirs{$dir}++;
    -        my ($last) = ("");
    -        while ($last ne $dir) {
    -            $last = $dir;
    -            $dir = dirname($dir);
    -            last if !$self->_is_under($dir, @under);
    -            $dirs{$dir}++;
    -        }
    -    }
    -    return(sort(keys(%dirs)));
    -}
    -
    -sub validate {
    -    my ($self, $module, $remove) = @_;
    -    Carp::croak("$module is not installed") if (! exists($self->{$module}));
    -    return($self->{$module}{packlist}->validate($remove));
    -}
    -
    -sub packlist {
    -    my ($self, $module) = @_;
    -    Carp::croak("$module is not installed") if (! exists($self->{$module}));
    -    return($self->{$module}{packlist});
    -}
    -
    -sub version {
    -    my ($self, $module) = @_;
    -    Carp::croak("$module is not installed") if (! exists($self->{$module}));
    -    return($self->{$module}{version});
    -}
    -
    -
    -1;
    -
    -__END__
    -
    -=head1 NAME
    -
    -ExtUtils::Installed - Inventory management of installed modules
    -
    -=head1 SYNOPSIS
    -
    -   use ExtUtils::Installed;
    -   my ($inst) = ExtUtils::Installed->new();
    -   my (@modules) = $inst->modules();
    -   my (@missing) = $inst->validate("DBI");
    -   my $all_files = $inst->files("DBI");
    -   my $files_below_usr_local = $inst->files("DBI", "all", "/usr/local");
    -   my $all_dirs = $inst->directories("DBI");
    -   my $dirs_below_usr_local = $inst->directory_tree("DBI", "prog");
    -   my $packlist = $inst->packlist("DBI");
    -
    -=head1 DESCRIPTION
    -
    -ExtUtils::Installed  provides a standard way to find out what core and module
    -files have been installed.  It uses the information stored in .packlist files
    -created during installation to provide this information.  In addition it
    -provides facilities to classify the installed files and to extract directory
    -information from the .packlist files.
    -
    -=head1 USAGE
    -
    -The new() function searches for all the installed .packlists on the system, and
    -stores their contents. The .packlists can be queried with the functions
    -described below.
    -
    -=head1 FUNCTIONS
    -
    -=over 4
    -
    -=item new()
    -
    -This takes no parameters, and searches for all the installed .packlists on the
    -system.  The packlists are read using the ExtUtils::packlist module.
    -
    -=item modules()
    -
    -This returns a list of the names of all the installed modules.  The perl 'core'
    -is given the special name 'Perl'.
    -
    -=item files()
    -
    -This takes one mandatory parameter, the name of a module.  It returns a list of
    -all the filenames from the package.  To obtain a list of core perl files, use
    -the module name 'Perl'.  Additional parameters are allowed.  The first is one
    -of the strings "prog", "doc" or "all", to select either just program files,
    -just manual files or all files.  The remaining parameters are a list of
    -directories. The filenames returned will be restricted to those under the
    -specified directories.
    -
    -=item directories()
    -
    -This takes one mandatory parameter, the name of a module.  It returns a list of
    -all the directories from the package.  Additional parameters are allowed.  The
    -first is one of the strings "prog", "doc" or "all", to select either just
    -program directories, just manual directories or all directories.  The remaining
    -parameters are a list of directories. The directories returned will be
    -restricted to those under the specified directories.  This method returns only
    -the leaf directories that contain files from the specified module.
    -
    -=item directory_tree()
    -
    -This is identical in operation to directories(), except that it includes all the
    -intermediate directories back up to the specified directories.
    -
    -=item validate()
    -
    -This takes one mandatory parameter, the name of a module.  It checks that all
    -the files listed in the modules .packlist actually exist, and returns a list of
    -any missing files.  If an optional second argument which evaluates to true is
    -given any missing files will be removed from the .packlist
    -
    -=item packlist()
    -
    -This returns the ExtUtils::Packlist object for the specified module.
    -
    -=item version()
    -
    -This returns the version number for the specified module.
    -
    -=back
    -
    -=head1 EXAMPLE
    -
    -See the example in L.
    -
    -=head1 AUTHOR
    -
    -Alan Burlison 
    -
    -=cut
    diff --git a/lib/perl5/5.8.8/ExtUtils/Liblist.pm b/lib/perl5/5.8.8/ExtUtils/Liblist.pm
    deleted file mode 100644
    index 4b098083..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/Liblist.pm
    +++ /dev/null
    @@ -1,285 +0,0 @@
    -package ExtUtils::Liblist;
    -
    -use vars qw($VERSION);
    -$VERSION = '1.01';
    -
    -use File::Spec;
    -require ExtUtils::Liblist::Kid;
    -@ISA = qw(ExtUtils::Liblist::Kid File::Spec);
    -
    -# Backwards compatibility with old interface.
    -sub ext {
    -    goto &ExtUtils::Liblist::Kid::ext;
    -}
    -
    -sub lsdir {
    -  shift;
    -  my $rex = qr/$_[1]/;
    -  opendir DIR, $_[0];
    -  my @out = grep /$rex/, readdir DIR;
    -  closedir DIR;
    -  return @out;
    -}
    -
    -__END__
    -
    -=head1 NAME
    -
    -ExtUtils::Liblist - determine libraries to use and how to use them
    -
    -=head1 SYNOPSIS
    -
    -  require ExtUtils::Liblist;
    -
    -  $MM->ext($potential_libs, $verbose, $need_names);
    -
    -  # Usually you can get away with:
    -  ExtUtils::Liblist->ext($potential_libs, $verbose, $need_names)
    -
    -=head1 DESCRIPTION
    -
    -This utility takes a list of libraries in the form C<-llib1 -llib2
    --llib3> and returns lines suitable for inclusion in an extension
    -Makefile.  Extra library paths may be included with the form
    -C<-L/another/path> this will affect the searches for all subsequent
    -libraries.
    -
    -It returns an array of four or five scalar values: EXTRALIBS,
    -BSLOADLIBS, LDLOADLIBS, LD_RUN_PATH, and, optionally, a reference to
    -the array of the filenames of actual libraries.  Some of these don't
    -mean anything unless on Unix.  See the details about those platform
    -specifics below.  The list of the filenames is returned only if
    -$need_names argument is true.
    -
    -Dependent libraries can be linked in one of three ways:
    -
    -=over 2
    -
    -=item * For static extensions
    -
    -by the ld command when the perl binary is linked with the extension
    -library. See EXTRALIBS below.
    -
    -=item * For dynamic extensions at build/link time
    -
    -by the ld command when the shared object is built/linked. See
    -LDLOADLIBS below.
    -
    -=item * For dynamic extensions at load time
    -
    -by the DynaLoader when the shared object is loaded. See BSLOADLIBS
    -below.
    -
    -=back
    -
    -=head2 EXTRALIBS
    -
    -List of libraries that need to be linked with when linking a perl
    -binary which includes this extension. Only those libraries that
    -actually exist are included.  These are written to a file and used
    -when linking perl.
    -
    -=head2 LDLOADLIBS and LD_RUN_PATH
    -
    -List of those libraries which can or must be linked into the shared
    -library when created using ld. These may be static or dynamic
    -libraries.  LD_RUN_PATH is a colon separated list of the directories
    -in LDLOADLIBS. It is passed as an environment variable to the process
    -that links the shared library.
    -
    -=head2 BSLOADLIBS
    -
    -List of those libraries that are needed but can be linked in
    -dynamically at run time on this platform.  SunOS/Solaris does not need
    -this because ld records the information (from LDLOADLIBS) into the
    -object file.  This list is used to create a .bs (bootstrap) file.
    -
    -=head1 PORTABILITY
    -
    -This module deals with a lot of system dependencies and has quite a
    -few architecture specific Cs in the code.
    -
    -=head2 VMS implementation
    -
    -The version of ext() which is executed under VMS differs from the
    -Unix-OS/2 version in several respects:
    -
    -=over 2
    -
    -=item *
    -
    -Input library and path specifications are accepted with or without the
    -C<-l> and C<-L> prefixes used by Unix linkers.  If neither prefix is
    -present, a token is considered a directory to search if it is in fact
    -a directory, and a library to search for otherwise.  Authors who wish
    -their extensions to be portable to Unix or OS/2 should use the Unix
    -prefixes, since the Unix-OS/2 version of ext() requires them.
    -
    -=item *
    -
    -Wherever possible, shareable images are preferred to object libraries,
    -and object libraries to plain object files.  In accordance with VMS
    -naming conventions, ext() looks for files named Ishr and Irtl;
    -it also looks for Ilib and libI to accommodate Unix conventions
    -used in some ported software.
    -
    -=item *
    -
    -For each library that is found, an appropriate directive for a linker options
    -file is generated.  The return values are space-separated strings of
    -these directives, rather than elements used on the linker command line.
    -
    -=item *
    -
    -LDLOADLIBS contains both the libraries found based on C<$potential_libs> and
    -the CRTLs, if any, specified in Config.pm.  EXTRALIBS contains just those
    -libraries found based on C<$potential_libs>.  BSLOADLIBS and LD_RUN_PATH
    -are always empty.
    -
    -=back
    -
    -In addition, an attempt is made to recognize several common Unix library
    -names, and filter them out or convert them to their VMS equivalents, as
    -appropriate.
    -
    -In general, the VMS version of ext() should properly handle input from
    -extensions originally designed for a Unix or VMS environment.  If you
    -encounter problems, or discover cases where the search could be improved,
    -please let us know.
    -
    -=head2 Win32 implementation
    -
    -The version of ext() which is executed under Win32 differs from the
    -Unix-OS/2 version in several respects:
    -
    -=over 2
    -
    -=item *
    -
    -If C<$potential_libs> is empty, the return value will be empty.
    -Otherwise, the libraries specified by C<$Config{perllibs}> (see Config.pm)
    -will be appended to the list of C<$potential_libs>.  The libraries
    -will be searched for in the directories specified in C<$potential_libs>,
    -C<$Config{libpth}>, and in C<$Config{installarchlib}/CORE>.
    -For each library that is found,  a space-separated list of fully qualified
    -library pathnames is generated.
    -
    -=item *
    -
    -Input library and path specifications are accepted with or without the
    -C<-l> and C<-L> prefixes used by Unix linkers.
    -
    -An entry of the form C<-La:\foo> specifies the C directory to look
    -for the libraries that follow.
    -
    -An entry of the form C<-lfoo> specifies the library C, which may be
    -spelled differently depending on what kind of compiler you are using.  If
    -you are using GCC, it gets translated to C, but for other win32
    -compilers, it becomes C.  If no files are found by those translated
    -names, one more attempt is made to find them using either C or
    -C, depending on whether GCC or some other win32 compiler is
    -being used, respectively.
    -
    -If neither the C<-L> or C<-l> prefix is present in an entry, the entry is
    -considered a directory to search if it is in fact a directory, and a
    -library to search for otherwise.  The C<$Config{lib_ext}> suffix will
    -be appended to any entries that are not directories and don't already have
    -the suffix.
    -
    -Note that the C<-L> and C<-l> prefixes are B, but authors
    -who wish their extensions to be portable to Unix or OS/2 should use the
    -prefixes, since the Unix-OS/2 version of ext() requires them.
    -
    -=item *
    -
    -Entries cannot be plain object files, as many Win32 compilers will
    -not handle object files in the place of libraries.
    -
    -=item *
    -
    -Entries in C<$potential_libs> beginning with a colon and followed by
    -alphanumeric characters are treated as flags.  Unknown flags will be ignored.
    -
    -An entry that matches C disables the appending of default
    -libraries found in C<$Config{perllibs}> (this should be only needed very rarely).
    -
    -An entry that matches C disables all searching for
    -the libraries specified after it.  Translation of C<-Lfoo> and
    -C<-lfoo> still happens as appropriate (depending on compiler being used,
    -as reflected by C<$Config{cc}>), but the entries are not verified to be
    -valid files or directories.
    -
    -An entry that matches C reenables searching for
    -the libraries specified after it.  You can put it at the end to
    -enable searching for default libraries specified by C<$Config{perllibs}>.
    -
    -=item *
    -
    -The libraries specified may be a mixture of static libraries and
    -import libraries (to link with DLLs).  Since both kinds are used
    -pretty transparently on the Win32 platform, we do not attempt to
    -distinguish between them.
    -
    -=item *
    -
    -LDLOADLIBS and EXTRALIBS are always identical under Win32, and BSLOADLIBS
    -and LD_RUN_PATH are always empty (this may change in future).
    -
    -=item *
    -
    -You must make sure that any paths and path components are properly
    -surrounded with double-quotes if they contain spaces. For example,
    -C<$potential_libs> could be (literally):
    -
    -	"-Lc:\Program Files\vc\lib" msvcrt.lib "la test\foo bar.lib"
    -
    -Note how the first and last entries are protected by quotes in order
    -to protect the spaces.
    -
    -=item *
    -
    -Since this module is most often used only indirectly from extension
    -C files, here is an example C entry to add
    -a library to the build process for an extension:
    -
    -        LIBS => ['-lgl']
    -
    -When using GCC, that entry specifies that MakeMaker should first look
    -for C (followed by C) in all the locations specified by
    -C<$Config{libpth}>.
    -
    -When using a compiler other than GCC, the above entry will search for
    -C (followed by C).
    -
    -If the library happens to be in a location not in C<$Config{libpth}>,
    -you need:
    -
    -        LIBS => ['-Lc:\gllibs -lgl']
    -
    -Here is a less often used example:
    -
    -        LIBS => ['-lgl', ':nosearch -Ld:\mesalibs -lmesa -luser32']
    -
    -This specifies a search for library C as before.  If that search
    -fails to find the library, it looks at the next item in the list. The
    -C<:nosearch> flag will prevent searching for the libraries that follow,
    -so it simply returns the value as C<-Ld:\mesalibs -lmesa -luser32>,
    -since GCC can use that value as is with its linker.
    -
    -When using the Visual C compiler, the second item is returned as
    -C<-libpath:d:\mesalibs mesa.lib user32.lib>.
    -
    -When using the Borland compiler, the second item is returned as
    -C<-Ld:\mesalibs mesa.lib user32.lib>, and MakeMaker takes care of
    -moving the C<-Ld:\mesalibs> to the correct place in the linker
    -command line.
    -
    -=back
    -
    -
    -=head1 SEE ALSO
    -
    -L
    -
    -=cut
    -
    diff --git a/lib/perl5/5.8.8/ExtUtils/Liblist/Kid.pm b/lib/perl5/5.8.8/ExtUtils/Liblist/Kid.pm
    deleted file mode 100644
    index d67aa019..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/Liblist/Kid.pm
    +++ /dev/null
    @@ -1,548 +0,0 @@
    -package ExtUtils::Liblist::Kid;
    -
    -# XXX Splitting this out into its own .pm is a temporary solution.
    -
    -# This kid package is to be used by MakeMaker.  It will not work if
    -# $self is not a Makemaker.
    -
    -use 5.00503;
    -# Broken out of MakeMaker from version 4.11
    -
    -use strict;
    -use vars qw($VERSION);
    -$VERSION = 1.30;
    -
    -use Config;
    -use Cwd 'cwd';
    -use File::Basename;
    -use File::Spec;
    -
    -sub ext {
    -  if   ($^O eq 'VMS')     { return &_vms_ext;      }
    -  elsif($^O eq 'MSWin32') { return &_win32_ext;    }
    -  else                    { return &_unix_os2_ext; }
    -}
    -
    -sub _unix_os2_ext {
    -    my($self,$potential_libs, $verbose, $give_libs) = @_;
    -    $verbose ||= 0;
    -
    -    if ($^O =~ 'os2' and $Config{perllibs}) { 
    -	# Dynamic libraries are not transitive, so we may need including
    -	# the libraries linked against perl.dll again.
    -
    -	$potential_libs .= " " if $potential_libs;
    -	$potential_libs .= $Config{perllibs};
    -    }
    -    return ("", "", "", "", ($give_libs ? [] : ())) unless $potential_libs;
    -    warn "Potential libraries are '$potential_libs':\n" if $verbose;
    -
    -    my($so)   = $Config{so};
    -    my($libs) = defined $Config{perllibs} ? $Config{perllibs} : $Config{libs};
    -    my $Config_libext = $Config{lib_ext} || ".a";
    -
    -
    -    # compute $extralibs, $bsloadlibs and $ldloadlibs from
    -    # $potential_libs
    -    # this is a rewrite of Andy Dougherty's extliblist in perl
    -
    -    my(@searchpath); # from "-L/path" entries in $potential_libs
    -    my(@libpath) = split " ", $Config{'libpth'};
    -    my(@ldloadlibs, @bsloadlibs, @extralibs, @ld_run_path, %ld_run_path_seen);
    -    my(@libs, %libs_seen);
    -    my($fullname, $thislib, $thispth, @fullname);
    -    my($pwd) = cwd(); # from Cwd.pm
    -    my($found) = 0;
    -
    -    foreach $thislib (split ' ', $potential_libs){
    -
    -	# Handle possible linker path arguments.
    -	if ($thislib =~ s/^(-[LR]|-Wl,-R)//){	# save path flag type
    -	    my($ptype) = $1;
    -	    unless (-d $thislib){
    -		warn "$ptype$thislib ignored, directory does not exist\n"
    -			if $verbose;
    -		next;
    -	    }
    -	    my($rtype) = $ptype;
    -	    if (($ptype eq '-R') or ($ptype eq '-Wl,-R')) {
    -		if ($Config{'lddlflags'} =~ /-Wl,-R/) {
    -		    $rtype = '-Wl,-R';
    -		} elsif ($Config{'lddlflags'} =~ /-R/) {
    -		    $rtype = '-R';
    -		}
    -	    }
    -	    unless (File::Spec->file_name_is_absolute($thislib)) {
    -	      warn "Warning: $ptype$thislib changed to $ptype$pwd/$thislib\n";
    -	      $thislib = $self->catdir($pwd,$thislib);
    -	    }
    -	    push(@searchpath, $thislib);
    -	    push(@extralibs,  "$ptype$thislib");
    -	    push(@ldloadlibs, "$rtype$thislib");
    -	    next;
    -	}
    -
    -	# Handle possible library arguments.
    -	unless ($thislib =~ s/^-l//){
    -	  warn "Unrecognized argument in LIBS ignored: '$thislib'\n";
    -	  next;
    -	}
    -
    -	my($found_lib)=0;
    -	foreach $thispth (@searchpath, @libpath){
    -
    -		# Try to find the full name of the library.  We need this to
    -		# determine whether it's a dynamically-loadable library or not.
    -		# This tends to be subject to various os-specific quirks.
    -		# For gcc-2.6.2 on linux (March 1995), DLD can not load
    -		# .sa libraries, with the exception of libm.sa, so we
    -		# deliberately skip them.
    -	    if (@fullname =
    -		    $self->lsdir($thispth,"^\Qlib$thislib.$so.\E[0-9]+")){
    -		# Take care that libfoo.so.10 wins against libfoo.so.9.
    -		# Compare two libraries to find the most recent version
    -		# number.  E.g.  if you have libfoo.so.9.0.7 and
    -		# libfoo.so.10.1, first convert all digits into two
    -		# decimal places.  Then we'll add ".00" to the shorter
    -		# strings so that we're comparing strings of equal length
    -		# Thus we'll compare libfoo.so.09.07.00 with
    -		# libfoo.so.10.01.00.  Some libraries might have letters
    -		# in the version.  We don't know what they mean, but will
    -		# try to skip them gracefully -- we'll set any letter to
    -		# '0'.  Finally, sort in reverse so we can take the
    -		# first element.
    -
    -		#TODO: iterate through the directory instead of sorting
    -
    -		$fullname = "$thispth/" .
    -		(sort { my($ma) = $a;
    -			my($mb) = $b;
    -			$ma =~ tr/A-Za-z/0/s;
    -			$ma =~ s/\b(\d)\b/0$1/g;
    -			$mb =~ tr/A-Za-z/0/s;
    -			$mb =~ s/\b(\d)\b/0$1/g;
    -			while (length($ma) < length($mb)) { $ma .= ".00"; }
    -			while (length($mb) < length($ma)) { $mb .= ".00"; }
    -			# Comparison deliberately backwards
    -			$mb cmp $ma;} @fullname)[0];
    -	    } elsif (-f ($fullname="$thispth/lib$thislib.$so")
    -		 && (($Config{'dlsrc'} ne "dl_dld.xs") || ($thislib eq "m"))){
    -	    } elsif (-f ($fullname="$thispth/lib${thislib}_s$Config_libext")
    -                 && (! $Config{'archname'} =~ /RM\d\d\d-svr4/)
    -		 && ($thislib .= "_s") ){ # we must explicitly use _s version
    -	    } elsif (-f ($fullname="$thispth/lib$thislib$Config_libext")){
    -	    } elsif (-f ($fullname="$thispth/$thislib$Config_libext")){
    -            } elsif (-f ($fullname="$thispth/lib$thislib.dll$Config_libext")){
    -	    } elsif (-f ($fullname="$thispth/Slib$thislib$Config_libext")){
    -	    } elsif ($^O eq 'dgux'
    -		 && -l ($fullname="$thispth/lib$thislib$Config_libext")
    -		 && readlink($fullname) =~ /^elink:/s) {
    -		 # Some of DG's libraries look like misconnected symbolic
    -		 # links, but development tools can follow them.  (They
    -		 # look like this:
    -		 #
    -		 #    libm.a -> elink:${SDE_PATH:-/usr}/sde/\
    -		 #    ${TARGET_BINARY_INTERFACE:-m88kdgux}/usr/lib/libm.a
    -		 #
    -		 # , the compilation tools expand the environment variables.)
    -	    } else {
    -		warn "$thislib not found in $thispth\n" if $verbose;
    -		next;
    -	    }
    -	    warn "'-l$thislib' found at $fullname\n" if $verbose;
    -	    push @libs, $fullname unless $libs_seen{$fullname}++;
    -	    $found++;
    -	    $found_lib++;
    -
    -	    # Now update library lists
    -
    -	    # what do we know about this library...
    -	    my $is_dyna = ($fullname !~ /\Q$Config_libext\E\z/);
    -	    my $in_perl = ($libs =~ /\B-l\Q${thislib}\E\b/s);
    -
    -            # include the path to the lib once in the dynamic linker path
    -            # but only if it is a dynamic lib and not in Perl itself
    -            my($fullnamedir) = dirname($fullname);
    -            push @ld_run_path, $fullnamedir
    -                 if $is_dyna && !$in_perl &&
    -                    !$ld_run_path_seen{$fullnamedir}++;
    -
    -	    # Do not add it into the list if it is already linked in
    -	    # with the main perl executable.
    -	    # We have to special-case the NeXT, because math and ndbm 
    -	    # are both in libsys_s
    -	    unless ($in_perl || 
    -		($Config{'osname'} eq 'next' &&
    -		    ($thislib eq 'm' || $thislib eq 'ndbm')) ){
    -		push(@extralibs, "-l$thislib");
    -	    }
    -
    -	    # We might be able to load this archive file dynamically
    -	    if ( ($Config{'dlsrc'} =~ /dl_next/ && $Config{'osvers'} lt '4_0')
    -	    ||   ($Config{'dlsrc'} =~ /dl_dld/) )
    -	    {
    -		# We push -l$thislib instead of $fullname because
    -		# it avoids hardwiring a fixed path into the .bs file.
    -		# Mkbootstrap will automatically add dl_findfile() to
    -		# the .bs file if it sees a name in the -l format.
    -		# USE THIS, when dl_findfile() is fixed: 
    -		# push(@bsloadlibs, "-l$thislib");
    -		# OLD USE WAS while checking results against old_extliblist
    -		push(@bsloadlibs, "$fullname");
    -	    } else {
    -		if ($is_dyna){
    -                    # For SunOS4, do not add in this shared library if
    -                    # it is already linked in the main perl executable
    -		    push(@ldloadlibs, "-l$thislib")
    -			unless ($in_perl and $^O eq 'sunos');
    -		} else {
    -		    push(@ldloadlibs, "-l$thislib");
    -		}
    -	    }
    -	    last;	# found one here so don't bother looking further
    -	}
    -	warn "Note (probably harmless): "
    -		     ."No library found for -l$thislib\n"
    -	    unless $found_lib>0;
    -    }
    -
    -    unless( $found ) {
    -        return ('','','','', ($give_libs ? \@libs : ()));
    -    }
    -    else {
    -        return ("@extralibs", "@bsloadlibs", "@ldloadlibs",
    -                join(":",@ld_run_path), ($give_libs ? \@libs : ()));
    -    }
    -}
    -
    -sub _win32_ext {
    -
    -    require Text::ParseWords;
    -
    -    my($self, $potential_libs, $verbose, $give_libs) = @_;
    -    $verbose ||= 0;
    -
    -    # If user did not supply a list, we punt.
    -    # (caller should probably use the list in $Config{libs})
    -    return ("", "", "", "", ($give_libs ? [] : ())) unless $potential_libs;
    -
    -    my $cc		= $Config{cc};
    -    my $VC		= $cc =~ /^cl/i;
    -    my $BC		= $cc =~ /^bcc/i;
    -    my $GC		= $cc =~ /^gcc/i;
    -    my $so		= $Config{'so'};
    -    my $libs		= $Config{'perllibs'};
    -    my $libpth		= $Config{'libpth'};
    -    my $libext		= $Config{'lib_ext'} || ".lib";
    -    my(@libs, %libs_seen);
    -
    -    if ($libs and $potential_libs !~ /:nodefault/i) { 
    -	# If Config.pm defines a set of default libs, we always
    -	# tack them on to the user-supplied list, unless the user
    -	# specified :nodefault
    -
    -	$potential_libs .= " " if $potential_libs;
    -	$potential_libs .= $libs;
    -    }
    -    warn "Potential libraries are '$potential_libs':\n" if $verbose;
    -
    -    # normalize to forward slashes
    -    $libpth =~ s,\\,/,g;
    -    $potential_libs =~ s,\\,/,g;
    -
    -    # compute $extralibs from $potential_libs
    -
    -    my @searchpath;		    # from "-L/path" in $potential_libs
    -    my @libpath		= Text::ParseWords::quotewords('\s+', 0, $libpth);
    -    my @extralibs;
    -    my $pwd		= cwd();    # from Cwd.pm
    -    my $lib		= '';
    -    my $found		= 0;
    -    my $search		= 1;
    -    my($fullname, $thislib, $thispth);
    -
    -    # add "$Config{installarchlib}/CORE" to default search path
    -    push @libpath, "$Config{installarchlib}/CORE";
    -
    -    if ($VC and exists $ENV{LIB} and $ENV{LIB}) {
    -        push @libpath, split /;/, $ENV{LIB};
    -    }
    -
    -    foreach (Text::ParseWords::quotewords('\s+', 0, $potential_libs)){
    -
    -	$thislib = $_;
    -
    -        # see if entry is a flag
    -	if (/^:\w+$/) {
    -	    $search	= 0 if lc eq ':nosearch';
    -	    $search	= 1 if lc eq ':search';
    -	    warn "Ignoring unknown flag '$thislib'\n"
    -		if $verbose and !/^:(no)?(search|default)$/i;
    -	    next;
    -	}
    -
    -	# if searching is disabled, do compiler-specific translations
    -	unless ($search) {
    -	    s/^-l(.+)$/$1.lib/ unless $GC;
    -	    s/^-L/-libpath:/ if $VC;
    -	    push(@extralibs, $_);
    -	    $found++;
    -	    next;
    -	}
    -
    -	# handle possible linker path arguments
    -	if (s/^-L// and not -d) {
    -	    warn "$thislib ignored, directory does not exist\n"
    -		if $verbose;
    -	    next;
    -	}
    -	elsif (-d) {
    -	    unless (File::Spec->file_name_is_absolute($_)) {
    -	      warn "Warning: '$thislib' changed to '-L$pwd/$_'\n";
    -	      $_ = $self->catdir($pwd,$_);
    -	    }
    -	    push(@searchpath, $_);
    -	    next;
    -	}
    -
    -	# handle possible library arguments
    -	if (s/^-l// and $GC and !/^lib/i) {
    -	    $_ = "lib$_";
    -	}
    -	$_ .= $libext if !/\Q$libext\E$/i;
    -
    -	my $secondpass = 0;
    -    LOOKAGAIN:
    -
    -        # look for the file itself
    -	if (-f) {
    -	    warn "'$thislib' found as '$_'\n" if $verbose;
    -	    $found++;
    -	    push(@extralibs, $_);
    -	    next;
    -	}
    -
    -	my $found_lib = 0;
    -	foreach $thispth (@searchpath, @libpath){
    -	    unless (-f ($fullname="$thispth\\$_")) {
    -		warn "'$thislib' not found as '$fullname'\n" if $verbose;
    -		next;
    -	    }
    -	    warn "'$thislib' found as '$fullname'\n" if $verbose;
    -	    $found++;
    -	    $found_lib++;
    -	    push(@extralibs, $fullname);
    -	    push @libs, $fullname unless $libs_seen{$fullname}++;
    -	    last;
    -	}
    -
    -	# do another pass with (or without) leading 'lib' if they used -l
    -	if (!$found_lib and $thislib =~ /^-l/ and !$secondpass++) {
    -	    if ($GC) {
    -		goto LOOKAGAIN if s/^lib//i;
    -	    }
    -	    elsif (!/^lib/i) {
    -		$_ = "lib$_";
    -		goto LOOKAGAIN;
    -	    }
    -	}
    -
    -	# give up
    -	warn "Note (probably harmless): "
    -		     ."No library found for $thislib\n"
    -	    unless $found_lib>0;
    -
    -    }
    -
    -    return ('','','','', ($give_libs ? \@libs : ())) unless $found;
    -
    -    # make sure paths with spaces are properly quoted
    -    @extralibs = map { (/\s/ && !/^".*"$/) ? qq["$_"] : $_ } @extralibs;
    -    @libs = map { (/\s/ && !/^".*"$/) ? qq["$_"] : $_ } @libs;
    -    $lib = join(' ',@extralibs);
    -
    -    # normalize back to backward slashes (to help braindead tools)
    -    # XXX this may break equally braindead GNU tools that don't understand
    -    # backslashes, either.  Seems like one can't win here.  Cursed be CP/M.
    -    $lib =~ s,/,\\,g;
    -
    -    warn "Result: $lib\n" if $verbose;
    -    wantarray ? ($lib, '', $lib, '', ($give_libs ? \@libs : ())) : $lib;
    -}
    -
    -
    -sub _vms_ext {
    -  my($self, $potential_libs,$verbose,$give_libs) = @_;
    -  $verbose ||= 0;
    -
    -  my(@crtls,$crtlstr);
    -  my($dbgqual) = $self->{OPTIMIZE} || $Config{'optimize'} ||
    -                 $self->{CCFLAGS}   || $Config{'ccflags'};
    -  @crtls = ( ($dbgqual =~ m-/Debug-i ? $Config{'dbgprefix'} : '')
    -              . 'PerlShr/Share' );
    -  push(@crtls, grep { not /\(/ } split /\s+/, $Config{'perllibs'});
    -  push(@crtls, grep { not /\(/ } split /\s+/, $Config{'libc'});
    -  # In general, we pass through the basic libraries from %Config unchanged.
    -  # The one exception is that if we're building in the Perl source tree, and
    -  # a library spec could be resolved via a logical name, we go to some trouble
    -  # to insure that the copy in the local tree is used, rather than one to
    -  # which a system-wide logical may point.
    -  if ($self->{PERL_SRC}) {
    -    my($lib,$locspec,$type);
    -    foreach $lib (@crtls) { 
    -      if (($locspec,$type) = $lib =~ m-^([\w$\-]+)(/\w+)?- and $locspec =~ /perl/i) {
    -        if    (lc $type eq '/share')   { $locspec .= $Config{'exe_ext'}; }
    -        elsif (lc $type eq '/library') { $locspec .= $Config{'lib_ext'}; }
    -        else                           { $locspec .= $Config{'obj_ext'}; }
    -        $locspec = $self->catfile($self->{PERL_SRC},$locspec);
    -        $lib = "$locspec$type" if -e $locspec;
    -      }
    -    }
    -  }
    -  $crtlstr = @crtls ? join(' ',@crtls) : '';
    -
    -  unless ($potential_libs) {
    -    warn "Result:\n\tEXTRALIBS: \n\tLDLOADLIBS: $crtlstr\n" if $verbose;
    -    return ('', '', $crtlstr, '', ($give_libs ? [] : ()));
    -  }
    -
    -  my(@dirs,@libs,$dir,$lib,%found,@fndlibs,$ldlib);
    -  my $cwd = cwd();
    -  my($so,$lib_ext,$obj_ext) = @Config{'so','lib_ext','obj_ext'};
    -  # List of common Unix library names and their VMS equivalents
    -  # (VMS equivalent of '' indicates that the library is automatically
    -  # searched by the linker, and should be skipped here.)
    -  my(@flibs, %libs_seen);
    -  my %libmap = ( 'm' => '', 'f77' => '', 'F77' => '', 'V77' => '', 'c' => '',
    -                 'malloc' => '', 'crypt' => '', 'resolv' => '', 'c_s' => '',
    -                 'socket' => '', 'X11' => 'DECW$XLIBSHR',
    -                 'Xt' => 'DECW$XTSHR', 'Xm' => 'DECW$XMLIBSHR',
    -                 'Xmu' => 'DECW$XMULIBSHR');
    -  if ($Config{'vms_cc_type'} ne 'decc') { $libmap{'curses'} = 'VAXCCURSE'; }
    -
    -  warn "Potential libraries are '$potential_libs'\n" if $verbose;
    -
    -  # First, sort out directories and library names in the input
    -  foreach $lib (split ' ',$potential_libs) {
    -    push(@dirs,$1),   next if $lib =~ /^-L(.*)/;
    -    push(@dirs,$lib), next if $lib =~ /[:>\]]$/;
    -    push(@dirs,$lib), next if -d $lib;
    -    push(@libs,$1),   next if $lib =~ /^-l(.*)/;
    -    push(@libs,$lib);
    -  }
    -  push(@dirs,split(' ',$Config{'libpth'}));
    -
    -  # Now make sure we've got VMS-syntax absolute directory specs
    -  # (We don't, however, check whether someone's hidden a relative
    -  # path in a logical name.)
    -  foreach $dir (@dirs) {
    -    unless (-d $dir) {
    -      warn "Skipping nonexistent Directory $dir\n" if $verbose > 1;
    -      $dir = '';
    -      next;
    -    }
    -    warn "Resolving directory $dir\n" if $verbose;
    -    if (File::Spec->file_name_is_absolute($dir)) { 
    -        $dir = $self->fixpath($dir,1); 
    -    }
    -    else { 
    -        $dir = $self->catdir($cwd,$dir); 
    -    }
    -  }
    -  @dirs = grep { length($_) } @dirs;
    -  unshift(@dirs,''); # Check each $lib without additions first
    -
    -  LIB: foreach $lib (@libs) {
    -    if (exists $libmap{$lib}) {
    -      next unless length $libmap{$lib};
    -      $lib = $libmap{$lib};
    -    }
    -
    -    my(@variants,$variant,$cand);
    -    my($ctype) = '';
    -
    -    # If we don't have a file type, consider it a possibly abbreviated name and
    -    # check for common variants.  We try these first to grab libraries before
    -    # a like-named executable image (e.g. -lperl resolves to perlshr.exe
    -    # before perl.exe).
    -    if ($lib !~ /\.[^:>\]]*$/) {
    -      push(@variants,"${lib}shr","${lib}rtl","${lib}lib");
    -      push(@variants,"lib$lib") if $lib !~ /[:>\]]/;
    -    }
    -    push(@variants,$lib);
    -    warn "Looking for $lib\n" if $verbose;
    -    foreach $variant (@variants) {
    -      my($fullname, $name);
    -
    -      foreach $dir (@dirs) {
    -        my($type);
    -
    -        $name = "$dir$variant";
    -        warn "\tChecking $name\n" if $verbose > 2;
    -        $fullname = VMS::Filespec::rmsexpand($name);
    -        if (defined $fullname and -f $fullname) {
    -          # It's got its own suffix, so we'll have to figure out the type
    -          if    ($fullname =~ /(?:$so|exe)$/i)      { $type = 'SHR'; }
    -          elsif ($fullname =~ /(?:$lib_ext|olb)$/i) { $type = 'OLB'; }
    -          elsif ($fullname =~ /(?:$obj_ext|obj)$/i) {
    -            warn "Note (probably harmless): "
    -                ."Plain object file $fullname found in library list\n";
    -            $type = 'OBJ';
    -          }
    -          else {
    -            warn "Note (probably harmless): "
    -                ."Unknown library type for $fullname; assuming shared\n";
    -            $type = 'SHR';
    -          }
    -        }
    -        elsif (-f ($fullname = VMS::Filespec::rmsexpand($name,$so))      or
    -               -f ($fullname = VMS::Filespec::rmsexpand($name,'.exe')))     {
    -          $type = 'SHR';
    -          $name = $fullname unless $fullname =~ /exe;?\d*$/i;
    -        }
    -        elsif (not length($ctype) and  # If we've got a lib already, 
    -                                       # don't bother
    -               ( -f ($fullname = VMS::Filespec::rmsexpand($name,$lib_ext)) or
    -                 -f ($fullname = VMS::Filespec::rmsexpand($name,'.olb'))))  {
    -          $type = 'OLB';
    -          $name = $fullname unless $fullname =~ /olb;?\d*$/i;
    -        }
    -        elsif (not length($ctype) and  # If we've got a lib already, 
    -                                       # don't bother
    -               ( -f ($fullname = VMS::Filespec::rmsexpand($name,$obj_ext)) or
    -                 -f ($fullname = VMS::Filespec::rmsexpand($name,'.obj'))))  {
    -          warn "Note (probably harmless): "
    -		       ."Plain object file $fullname found in library list\n";
    -          $type = 'OBJ';
    -          $name = $fullname unless $fullname =~ /obj;?\d*$/i;
    -        }
    -        if (defined $type) {
    -          $ctype = $type; $cand = $name;
    -          last if $ctype eq 'SHR';
    -        }
    -      }
    -      if ($ctype) { 
    -        # This has to precede any other CRTLs, so just make it first
    -        if ($cand eq 'VAXCCURSE') { unshift @{$found{$ctype}}, $cand; }  
    -        else                      { push    @{$found{$ctype}}, $cand; }
    -        warn "\tFound as $cand (really $fullname), type $ctype\n" 
    -          if $verbose > 1;
    -	push @flibs, $name unless $libs_seen{$fullname}++;
    -        next LIB;
    -      }
    -    }
    -    warn "Note (probably harmless): "
    -		 ."No library found for $lib\n";
    -  }
    -
    -  push @fndlibs, @{$found{OBJ}}                      if exists $found{OBJ};
    -  push @fndlibs, map { "$_/Library" } @{$found{OLB}} if exists $found{OLB};
    -  push @fndlibs, map { "$_/Share"   } @{$found{SHR}} if exists $found{SHR};
    -  $lib = join(' ',@fndlibs);
    -
    -  $ldlib = $crtlstr ? "$lib $crtlstr" : $lib;
    -  warn "Result:\n\tEXTRALIBS: $lib\n\tLDLOADLIBS: $ldlib\n" if $verbose;
    -  wantarray ? ($lib, '', $ldlib, '', ($give_libs ? \@flibs : ())) : $lib;
    -}
    -
    -1;
    diff --git a/lib/perl5/5.8.8/ExtUtils/MANIFEST.SKIP b/lib/perl5/5.8.8/ExtUtils/MANIFEST.SKIP
    deleted file mode 100644
    index 56686212..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/MANIFEST.SKIP
    +++ /dev/null
    @@ -1,30 +0,0 @@
    -# Avoid version control files.
    -\bRCS\b
    -\bCVS\b
    -\bSCCS\b
    -,v$
    -\B\.svn\b
    -\b_darcs\b
    -
    -# Avoid Makemaker generated and utility files.
    -\bMANIFEST\.bak
    -\bMakefile$
    -\bblib/
    -\bMakeMaker-\d
    -\bpm_to_blib\.ts$
    -\bpm_to_blib$
    -\bblibdirs\.ts$         # 6.18 through 6.25 generated this
    -
    -# Avoid Module::Build generated and utility files.
    -\bBuild$
    -\b_build/
    -
    -# Avoid temp and backup files.
    -~$
    -\.old$
    -\#$
    -\b\.#
    -\.bak$
    -
    -# Avoid Devel::Cover files.
    -\bcover_db\b
    diff --git a/lib/perl5/5.8.8/ExtUtils/MM.pm b/lib/perl5/5.8.8/ExtUtils/MM.pm
    deleted file mode 100644
    index 978cedae..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/MM.pm
    +++ /dev/null
    @@ -1,84 +0,0 @@
    -package ExtUtils::MM;
    -
    -use strict;
    -use ExtUtils::MakeMaker::Config;
    -use vars qw(@ISA $VERSION);
    -$VERSION = '0.05';
    -
    -require ExtUtils::Liblist;
    -require ExtUtils::MakeMaker;
    -
    -@ISA = qw(ExtUtils::Liblist ExtUtils::MakeMaker);
    -
    -=head1 NAME
    -
    -ExtUtils::MM - OS adjusted ExtUtils::MakeMaker subclass
    -
    -=head1 SYNOPSIS
    -
    -  require ExtUtils::MM;
    -  my $mm = MM->new(...);
    -
    -=head1 DESCRIPTION
    -
    -B
    -
    -ExtUtils::MM is a subclass of ExtUtils::MakeMaker which automatically
    -chooses the appropriate OS specific subclass for you
    -(ie. ExtUils::MM_Unix, etc...).
    -
    -It also provides a convenient alias via the MM class (I didn't want
    -MakeMaker modules outside of ExtUtils/).
    -
    -This class might turn out to be a temporary solution, but MM won't go
    -away.
    -
    -=cut
    -
    -{
    -    # Convenient alias.
    -    package MM;
    -    use vars qw(@ISA);
    -    @ISA = qw(ExtUtils::MM);
    -    sub DESTROY {}
    -}
    -
    -my %Is = ();
    -$Is{VMS}    = $^O eq 'VMS';
    -$Is{OS2}    = $^O eq 'os2';
    -$Is{MacOS}  = $^O eq 'MacOS';
    -if( $^O eq 'MSWin32' ) {
    -    Win32::IsWin95() ? $Is{Win95} = 1 : $Is{Win32} = 1;
    -}
    -$Is{UWIN}   = $^O =~ /^uwin(-nt)?$/;
    -$Is{Cygwin} = $^O eq 'cygwin';
    -$Is{Msys}   = $^O eq 'msys';
    -$Is{NW5}    = $Config{osname} eq 'NetWare';  # intentional
    -$Is{BeOS}   = $^O =~ /beos/i;    # XXX should this be that loose?
    -$Is{DOS}    = $^O eq 'dos';
    -if( $Is{NW5} ) {
    -    $^O = 'NetWare';
    -    delete $Is{Win32};
    -}
    -$Is{VOS}    = $^O eq 'vos';
    -$Is{QNX}    = $^O eq 'qnx';
    -$Is{AIX}    = $^O eq 'aix';
    -
    -$Is{Unix}   = !grep { $_ } values %Is;
    -
    -map { delete $Is{$_} unless $Is{$_} } keys %Is;
    -_assert( keys %Is == 1 );
    -my($OS) = keys %Is;
    -
    -
    -my $class = "ExtUtils::MM_$OS";
    -eval "require $class" unless $INC{"ExtUtils/MM_$OS.pm"};
    -die $@ if $@;
    -unshift @ISA, $class;
    -
    -
    -sub _assert {
    -    my $sanity = shift;
    -    die sprintf "Assert failed at %s line %d\n", (caller)[1,2] unless $sanity;
    -    return;
    -}
    diff --git a/lib/perl5/5.8.8/ExtUtils/MM_AIX.pm b/lib/perl5/5.8.8/ExtUtils/MM_AIX.pm
    deleted file mode 100644
    index 7de7da55..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/MM_AIX.pm
    +++ /dev/null
    @@ -1,80 +0,0 @@
    -package ExtUtils::MM_AIX;
    -
    -use strict;
    -use vars qw($VERSION @ISA);
    -$VERSION = '0.03';
    -
    -require ExtUtils::MM_Unix;
    -@ISA = qw(ExtUtils::MM_Unix);
    -
    -use ExtUtils::MakeMaker qw(neatvalue);
    -
    -
    -=head1 NAME
    -
    -ExtUtils::MM_AIX - AIX specific subclass of ExtUtils::MM_Unix
    -
    -=head1 SYNOPSIS
    -
    -  Don't use this module directly.
    -  Use ExtUtils::MM and let it choose.
    -
    -=head1 DESCRIPTION
    -
    -This is a subclass of ExtUtils::MM_Unix which contains functionality for
    -AIX.
    -
    -Unless otherwise stated it works just like ExtUtils::MM_Unix
    -
    -=head2 Overridden methods
    -
    -=head3 dlsyms
    -
    -Define DL_FUNCS and DL_VARS and write the *.exp files.
    -
    -=cut
    -
    -sub dlsyms {
    -    my($self,%attribs) = @_;
    -
    -    return '' unless $self->needs_linking();
    -
    -    my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
    -    my($vars)  = $attribs{DL_VARS} || $self->{DL_VARS} || [];
    -    my($funclist)  = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
    -    my(@m);
    -
    -    push(@m,"
    -dynamic :: $self->{BASEEXT}.exp
    -
    -") unless $self->{SKIPHASH}{'dynamic'}; # dynamic and static are subs, so...
    -
    -    push(@m,"
    -static :: $self->{BASEEXT}.exp
    -
    -") unless $self->{SKIPHASH}{'static'};  # we avoid a warning if we tick them
    -
    -    push(@m,"
    -$self->{BASEEXT}.exp: Makefile.PL
    -",'	$(PERLRUN) -e \'use ExtUtils::Mksymlists; \\
    -	Mksymlists("NAME" => "',$self->{NAME},'", "DL_FUNCS" => ',
    -	neatvalue($funcs), ', "FUNCLIST" => ', neatvalue($funclist),
    -	', "DL_VARS" => ', neatvalue($vars), ');\'
    -');
    -
    -    join('',@m);
    -}
    -
    -
    -=head1 AUTHOR
    -
    -Michael G Schwern  with code from ExtUtils::MM_Unix
    -
    -=head1 SEE ALSO
    -
    -L
    -
    -=cut
    -
    -
    -1;
    diff --git a/lib/perl5/5.8.8/ExtUtils/MM_Any.pm b/lib/perl5/5.8.8/ExtUtils/MM_Any.pm
    deleted file mode 100644
    index 8369e63a..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/MM_Any.pm
    +++ /dev/null
    @@ -1,1683 +0,0 @@
    -package ExtUtils::MM_Any;
    -
    -use strict;
    -use vars qw($VERSION @ISA);
    -$VERSION = '0.13';
    -
    -use File::Spec;
    -BEGIN { @ISA = qw(File::Spec); }
    -
    -# We need $Verbose
    -use ExtUtils::MakeMaker qw($Verbose);
    -
    -use ExtUtils::MakeMaker::Config;
    -
    -
    -# So we don't have to keep calling the methods over and over again,
    -# we have these globals to cache the values.  Faster and shrtr.
    -my $Curdir  = __PACKAGE__->curdir;
    -my $Rootdir = __PACKAGE__->rootdir;
    -my $Updir   = __PACKAGE__->updir;
    -
    -
    -=head1 NAME
    -
    -ExtUtils::MM_Any - Platform-agnostic MM methods
    -
    -=head1 SYNOPSIS
    -
    -  FOR INTERNAL USE ONLY!
    -
    -  package ExtUtils::MM_SomeOS;
    -
    -  # Temporarily, you have to subclass both.  Put MM_Any first.
    -  require ExtUtils::MM_Any;
    -  require ExtUtils::MM_Unix;
    -  @ISA = qw(ExtUtils::MM_Any ExtUtils::Unix);
    -
    -=head1 DESCRIPTION
    -
    -B
    -
    -ExtUtils::MM_Any is a superclass for the ExtUtils::MM_* set of
    -modules.  It contains methods which are either inherently
    -cross-platform or are written in a cross-platform manner.
    -
    -Subclass off of ExtUtils::MM_Any I ExtUtils::MM_Unix.  This is a
    -temporary solution.
    -
    -B
    -
    -
    -=head1 METHODS
    -
    -Any methods marked I must be implemented by subclasses.
    -
    -
    -=head2 Cross-platform helper methods
    -
    -These are methods which help writing cross-platform code.
    -
    -
    -
    -=head3 os_flavor  I
    -
    -    my @os_flavor = $mm->os_flavor;
    -
    -@os_flavor is the style of operating system this is, usually
    -corresponding to the MM_*.pm file we're using.  
    -
    -The first element of @os_flavor is the major family (ie. Unix,
    -Windows, VMS, OS/2, etc...) and the rest are sub families.
    -
    -Some examples:
    -
    -    Cygwin98       ('Unix',  'Cygwin', 'Cygwin9x')
    -    Windows NT     ('Win32', 'WinNT')
    -    Win98          ('Win32', 'Win9x')
    -    Linux          ('Unix',  'Linux')
    -    MacOS X        ('Unix',  'Darwin', 'MacOS', 'MacOS X')
    -    OS/2           ('OS/2')
    -
    -This is used to write code for styles of operating system.  
    -See os_flavor_is() for use.
    -
    -
    -=head3 os_flavor_is
    -
    -    my $is_this_flavor = $mm->os_flavor_is($this_flavor);
    -    my $is_this_flavor = $mm->os_flavor_is(@one_of_these_flavors);
    -
    -Checks to see if the current operating system is one of the given flavors.
    -
    -This is useful for code like:
    -
    -    if( $mm->os_flavor_is('Unix') ) {
    -        $out = `foo 2>&1`;
    -    }
    -    else {
    -        $out = `foo`;
    -    }
    -
    -=cut
    -
    -sub os_flavor_is {
    -    my $self = shift;
    -    my %flavors = map { ($_ => 1) } $self->os_flavor;
    -    return (grep { $flavors{$_} } @_) ? 1 : 0;
    -}
    -
    -
    -=head3 split_command
    -
    -    my @cmds = $MM->split_command($cmd, @args);
    -
    -Most OS have a maximum command length they can execute at once.  Large
    -modules can easily generate commands well past that limit.  Its
    -necessary to split long commands up into a series of shorter commands.
    -
    -C will return a series of @cmds each processing part of
    -the args.  Collectively they will process all the arguments.  Each
    -individual line in @cmds will not be longer than the
    -$self->max_exec_len being careful to take into account macro expansion.
    -
    -$cmd should include any switches and repeated initial arguments.
    -
    -If no @args are given, no @cmds will be returned.
    -
    -Pairs of arguments will always be preserved in a single command, this
    -is a heuristic for things like pm_to_blib and pod2man which work on
    -pairs of arguments.  This makes things like this safe:
    -
    -    $self->split_command($cmd, %pod2man);
    -
    -
    -=cut
    -
    -sub split_command {
    -    my($self, $cmd, @args) = @_;
    -
    -    my @cmds = ();
    -    return(@cmds) unless @args;
    -
    -    # If the command was given as a here-doc, there's probably a trailing
    -    # newline.
    -    chomp $cmd;
    -
    -    # set aside 20% for macro expansion.
    -    my $len_left = int($self->max_exec_len * 0.80);
    -    $len_left -= length $self->_expand_macros($cmd);
    -
    -    do {
    -        my $arg_str = '';
    -        my @next_args;
    -        while( @next_args = splice(@args, 0, 2) ) {
    -            # Two at a time to preserve pairs.
    -            my $next_arg_str = "\t  ". join ' ', @next_args, "\n";
    -
    -            if( !length $arg_str ) {
    -                $arg_str .= $next_arg_str
    -            }
    -            elsif( length($arg_str) + length($next_arg_str) > $len_left ) {
    -                unshift @args, @next_args;
    -                last;
    -            }
    -            else {
    -                $arg_str .= $next_arg_str;
    -            }
    -        }
    -        chop $arg_str;
    -
    -        push @cmds, $self->escape_newlines("$cmd \n$arg_str");
    -    } while @args;
    -
    -    return @cmds;
    -}
    -
    -
    -sub _expand_macros {
    -    my($self, $cmd) = @_;
    -
    -    $cmd =~ s{\$\((\w+)\)}{
    -        defined $self->{$1} ? $self->{$1} : "\$($1)"
    -    }e;
    -    return $cmd;
    -}
    -
    -
    -=head3 echo
    -
    -    my @commands = $MM->echo($text);
    -    my @commands = $MM->echo($text, $file);
    -    my @commands = $MM->echo($text, $file, $appending);
    -
    -Generates a set of @commands which print the $text to a $file.
    -
    -If $file is not given, output goes to STDOUT.
    -
    -If $appending is true the $file will be appended to rather than
    -overwritten.
    -
    -=cut
    -
    -sub echo {
    -    my($self, $text, $file, $appending) = @_;
    -    $appending ||= 0;
    -
    -    my @cmds = map { '$(NOECHO) $(ECHO) '.$self->quote_literal($_) } 
    -               split /\n/, $text;
    -    if( $file ) {
    -        my $redirect = $appending ? '>>' : '>';
    -        $cmds[0] .= " $redirect $file";
    -        $_ .= " >> $file" foreach @cmds[1..$#cmds];
    -    }
    -
    -    return @cmds;
    -}
    -
    -
    -=head3 wraplist
    -
    -  my $args = $mm->wraplist(@list);
    -
    -Takes an array of items and turns them into a well-formatted list of
    -arguments.  In most cases this is simply something like:
    -
    -    FOO \
    -    BAR \
    -    BAZ
    -
    -=cut
    -
    -sub wraplist {
    -    my $self = shift;
    -    return join " \\\n\t", @_;
    -}
    -
    -
    -=head3 cd  I
    -
    -  my $subdir_cmd = $MM->cd($subdir, @cmds);
    -
    -This will generate a make fragment which runs the @cmds in the given
    -$dir.  The rough equivalent to this, except cross platform.
    -
    -  cd $subdir && $cmd
    -
    -Currently $dir can only go down one level.  "foo" is fine.  "foo/bar" is
    -not.  "../foo" is right out.
    -
    -The resulting $subdir_cmd has no leading tab nor trailing newline.  This
    -makes it easier to embed in a make string.  For example.
    -
    -      my $make = sprintf <<'CODE', $subdir_cmd;
    -  foo :
    -      $(ECHO) what
    -      %s
    -      $(ECHO) mouche
    -  CODE
    -
    -
    -=head3 oneliner  I
    -
    -  my $oneliner = $MM->oneliner($perl_code);
    -  my $oneliner = $MM->oneliner($perl_code, \@switches);
    -
    -This will generate a perl one-liner safe for the particular platform
    -you're on based on the given $perl_code and @switches (a -e is
    -assumed) suitable for using in a make target.  It will use the proper
    -shell quoting and escapes.
    -
    -$(PERLRUN) will be used as perl.
    -
    -Any newlines in $perl_code will be escaped.  Leading and trailing
    -newlines will be stripped.  Makes this idiom much easier:
    -
    -    my $code = $MM->oneliner(<<'CODE', [...switches...]);
    -some code here
    -another line here
    -CODE
    -
    -Usage might be something like:
    -
    -    # an echo emulation
    -    $oneliner = $MM->oneliner('print "Foo\n"');
    -    $make = '$oneliner > somefile';
    -
    -All dollar signs must be doubled in the $perl_code if you expect them
    -to be interpreted normally, otherwise it will be considered a make
    -macro.  Also remember to quote make macros else it might be used as a
    -bareword.  For example:
    -
    -    # Assign the value of the $(VERSION_FROM) make macro to $vf.
    -    $oneliner = $MM->oneliner('$$vf = "$(VERSION_FROM)"');
    -
    -Its currently very simple and may be expanded sometime in the figure
    -to include more flexible code and switches.
    -
    -
    -=head3 quote_literal  I
    -
    -    my $safe_text = $MM->quote_literal($text);
    -
    -This will quote $text so it is interpreted literally in the shell.
    -
    -For example, on Unix this would escape any single-quotes in $text and
    -put single-quotes around the whole thing.
    -
    -
    -=head3 escape_newlines  I
    -
    -    my $escaped_text = $MM->escape_newlines($text);
    -
    -Shell escapes newlines in $text.
    -
    -
    -=head3 max_exec_len  I
    -
    -    my $max_exec_len = $MM->max_exec_len;
    -
    -Calculates the maximum command size the OS can exec.  Effectively,
    -this is the max size of a shell command line.
    -
    -=for _private
    -$self->{_MAX_EXEC_LEN} is set by this method, but only for testing purposes.
    -
    -
    -
    -
    -
    -=head2 Targets
    -
    -These are methods which produce make targets.
    -
    -
    -=head3 all_target
    -
    -Generate the default target 'all'.
    -
    -=cut
    -
    -sub all_target {
    -    my $self = shift;
    -
    -    return <<'MAKE_EXT';
    -all :: pure_all
    -	$(NOECHO) $(NOOP)
    -MAKE_EXT
    -
    -}
    -
    -
    -=head3 blibdirs_target
    -
    -    my $make_frag = $mm->blibdirs_target;
    -
    -Creates the blibdirs target which creates all the directories we use
    -in blib/.
    -
    -The blibdirs.ts target is deprecated.  Depend on blibdirs instead.
    -
    -
    -=cut
    -
    -sub blibdirs_target {
    -    my $self = shift;
    -
    -    my @dirs = map { uc "\$(INST_$_)" } qw(libdir archlib
    -                                           autodir archautodir
    -                                           bin script
    -                                           man1dir man3dir
    -                                          );
    -
    -    my @exists = map { $_.'$(DFSEP).exists' } @dirs;
    -
    -    my $make = sprintf <<'MAKE', join(' ', @exists);
    -blibdirs : %s
    -	$(NOECHO) $(NOOP)
    -
    -# Backwards compat with 6.18 through 6.25
    -blibdirs.ts : blibdirs
    -	$(NOECHO) $(NOOP)
    -
    -MAKE
    -
    -    $make .= $self->dir_target(@dirs);
    -
    -    return $make;
    -}
    -
    -
    -=head3 clean (o)
    -
    -Defines the clean target.
    -
    -=cut
    -
    -sub clean {
    -# --- Cleanup and Distribution Sections ---
    -
    -    my($self, %attribs) = @_;
    -    my @m;
    -    push(@m, '
    -# Delete temporary files but do not touch installed files. We don\'t delete
    -# the Makefile here so a later make realclean still has a makefile to use.
    -
    -clean :: clean_subdirs
    -');
    -
    -    my @files = values %{$self->{XS}}; # .c files from *.xs files
    -    my @dirs  = qw(blib);
    -
    -    # Normally these are all under blib but they might have been
    -    # redefined.
    -    # XXX normally this would be a good idea, but the Perl core sets
    -    # INST_LIB = ../../lib rather than actually installing the files.
    -    # So a "make clean" in an ext/ directory would blow away lib.
    -    # Until the core is adjusted let's leave this out.
    -#     push @dirs, qw($(INST_ARCHLIB) $(INST_LIB)
    -#                    $(INST_BIN) $(INST_SCRIPT)
    -#                    $(INST_MAN1DIR) $(INST_MAN3DIR)
    -#                    $(INST_LIBDIR) $(INST_ARCHLIBDIR) $(INST_AUTODIR) 
    -#                    $(INST_STATIC) $(INST_DYNAMIC) $(INST_BOOT)
    -#                 );
    -                  
    -
    -    if( $attribs{FILES} ) {
    -        # Use @dirs because we don't know what's in here.
    -        push @dirs, ref $attribs{FILES}                ?
    -                        @{$attribs{FILES}}             :
    -                        split /\s+/, $attribs{FILES}   ;
    -    }
    -
    -    push(@files, qw[$(MAKE_APERL_FILE) 
    -                    perlmain.c tmon.out mon.out so_locations 
    -                    blibdirs.ts pm_to_blib pm_to_blib.ts
    -                    *$(OBJ_EXT) *$(LIB_EXT) perl.exe perl perl$(EXE_EXT)
    -                    $(BOOTSTRAP) $(BASEEXT).bso
    -                    $(BASEEXT).def lib$(BASEEXT).def
    -                    $(BASEEXT).exp $(BASEEXT).x
    -                   ]);
    -
    -    push(@files, $self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'));
    -    push(@files, $self->catfile('$(INST_ARCHAUTODIR)','extralibs.ld'));
    -
    -    # core files
    -    push(@files, qw[core core.*perl.*.? *perl.core]);
    -    push(@files, map { "core." . "[0-9]"x$_ } (1..5));
    -
    -    # OS specific things to clean up.  Use @dirs since we don't know
    -    # what might be in here.
    -    push @dirs, $self->extra_clean_files;
    -
    -    # Occasionally files are repeated several times from different sources
    -    { my(%f) = map { ($_ => 1) } @files; @files = keys %f; }
    -    { my(%d) = map { ($_ => 1) } @dirs;  @dirs  = keys %d; }
    -
    -    push @m, map "\t$_\n", $self->split_command('- $(RM_F)',  @files);
    -    push @m, map "\t$_\n", $self->split_command('- $(RM_RF)', @dirs);
    -
    -    # Leave Makefile.old around for realclean
    -    push @m, <<'MAKE';
    -	- $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD) $(DEV_NULL)
    -MAKE
    -
    -    push(@m, "\t$attribs{POSTOP}\n")   if $attribs{POSTOP};
    -
    -    join("", @m);
    -}
    -
    -
    -=head3 clean_subdirs_target
    -
    -  my $make_frag = $MM->clean_subdirs_target;
    -
    -Returns the clean_subdirs target.  This is used by the clean target to
    -call clean on any subdirectories which contain Makefiles.
    -
    -=cut
    -
    -sub clean_subdirs_target {
    -    my($self) = shift;
    -
    -    # No subdirectories, no cleaning.
    -    return <<'NOOP_FRAG' unless @{$self->{DIR}};
    -clean_subdirs :
    -	$(NOECHO) $(NOOP)
    -NOOP_FRAG
    -
    -
    -    my $clean = "clean_subdirs :\n";
    -
    -    for my $dir (@{$self->{DIR}}) {
    -        my $subclean = $self->oneliner(sprintf <<'CODE', $dir);
    -chdir '%s';  system '$(MAKE) clean' if -f '$(FIRST_MAKEFILE)';
    -CODE
    -
    -        $clean .= "\t$subclean\n";
    -    }
    -
    -    return $clean;
    -}
    -
    -
    -=head3 dir_target
    -
    -    my $make_frag = $mm->dir_target(@directories);
    -
    -Generates targets to create the specified directories and set its
    -permission to 0755.
    -
    -Because depending on a directory to just ensure it exists doesn't work
    -too well (the modified time changes too often) dir_target() creates a
    -.exists file in the created directory.  It is this you should depend on.
    -For portability purposes you should use the $(DIRFILESEP) macro rather
    -than a '/' to seperate the directory from the file.
    -
    -    yourdirectory$(DIRFILESEP).exists
    -
    -=cut
    -
    -sub dir_target {
    -    my($self, @dirs) = @_;
    -
    -    my $make = '';
    -    foreach my $dir (@dirs) {
    -        $make .= sprintf <<'MAKE', ($dir) x 7;
    -%s$(DFSEP).exists :: Makefile.PL
    -	$(NOECHO) $(MKPATH) %s
    -	$(NOECHO) $(CHMOD) 755 %s
    -	$(NOECHO) $(TOUCH) %s$(DFSEP).exists
    -
    -MAKE
    -
    -    }
    -
    -    return $make;
    -}
    -
    -
    -=head3 distdir
    -
    -Defines the scratch directory target that will hold the distribution
    -before tar-ing (or shar-ing).
    -
    -=cut
    -
    -# For backwards compatibility.
    -*dist_dir = *distdir;
    -
    -sub distdir {
    -    my($self) = shift;
    -
    -    my $meta_target = $self->{NO_META} ? '' : 'distmeta';
    -    my $sign_target = !$self->{SIGN}   ? '' : 'distsignature';
    -
    -    return sprintf <<'MAKE_FRAG', $meta_target, $sign_target;
    -create_distdir :
    -	$(RM_RF) $(DISTVNAME)
    -	$(PERLRUN) "-MExtUtils::Manifest=manicopy,maniread" \
    -		-e "manicopy(maniread(),'$(DISTVNAME)', '$(DIST_CP)');"
    -
    -distdir : create_distdir %s %s
    -	$(NOECHO) $(NOOP)
    -
    -MAKE_FRAG
    -
    -}
    -
    -
    -=head3 dist_test
    -
    -Defines a target that produces the distribution in the
    -scratchdirectory, and runs 'perl Makefile.PL; make ;make test' in that
    -subdirectory.
    -
    -=cut
    -
    -sub dist_test {
    -    my($self) = shift;
    -
    -    my $mpl_args = join " ", map qq["$_"], @ARGV;
    -
    -    my $test = $self->cd('$(DISTVNAME)',
    -                         '$(ABSPERLRUN) Makefile.PL '.$mpl_args,
    -                         '$(MAKE) $(PASTHRU)',
    -                         '$(MAKE) test $(PASTHRU)'
    -                        );
    -
    -    return sprintf <<'MAKE_FRAG', $test;
    -disttest : distdir
    -	%s
    -
    -MAKE_FRAG
    -
    -
    -}
    -
    -
    -=head3 dynamic (o)
    -
    -Defines the dynamic target.
    -
    -=cut
    -
    -sub dynamic {
    -# --- Dynamic Loading Sections ---
    -
    -    my($self) = shift;
    -    '
    -dynamic :: $(FIRST_MAKEFILE) $(INST_DYNAMIC) $(INST_BOOT)
    -	$(NOECHO) $(NOOP)
    -';
    -}
    -
    -
    -=head3 makemakerdflt_target
    -
    -  my $make_frag = $mm->makemakerdflt_target
    -
    -Returns a make fragment with the makemakerdeflt_target specified.
    -This target is the first target in the Makefile, is the default target
    -and simply points off to 'all' just in case any make variant gets
    -confused or something gets snuck in before the real 'all' target.
    -
    -=cut
    -
    -sub makemakerdflt_target {
    -    return <<'MAKE_FRAG';
    -makemakerdflt: all
    -	$(NOECHO) $(NOOP)
    -MAKE_FRAG
    -
    -}
    -
    -
    -=head3 manifypods_target
    -
    -  my $manifypods_target = $self->manifypods_target;
    -
    -Generates the manifypods target.  This target generates man pages from
    -all POD files in MAN1PODS and MAN3PODS.
    -
    -=cut
    -
    -sub manifypods_target {
    -    my($self) = shift;
    -
    -    my $man1pods      = '';
    -    my $man3pods      = '';
    -    my $dependencies  = '';
    -
    -    # populate manXpods & dependencies:
    -    foreach my $name (keys %{$self->{MAN1PODS}}, keys %{$self->{MAN3PODS}}) {
    -        $dependencies .= " \\\n\t$name";
    -    }
    -
    -    foreach my $name (keys %{$self->{MAN3PODS}}) {
    -        $dependencies .= " \\\n\t$name"
    -    }
    -
    -    my $manify = <{"MAN${section}PODS"};
    -        push @man_cmds, $self->split_command(<metafile_target;
    -
    -Generate the metafile target.
    -
    -Writes the file META.yml YAML encoded meta-data about the module in
    -the distdir.  The format follows Module::Build's as closely as
    -possible.  Additionally, we include:
    -
    -    version_from
    -    installdirs
    -
    -=cut
    -
    -sub metafile_target {
    -    my $self = shift;
    -
    -    return <<'MAKE_FRAG' if $self->{NO_META};
    -metafile:
    -	$(NOECHO) $(NOOP)
    -MAKE_FRAG
    -
    -    my $prereq_pm = '';
    -    foreach my $mod ( sort { lc $a cmp lc $b } keys %{$self->{PREREQ_PM}} ) {
    -        my $ver = $self->{PREREQ_PM}{$mod};
    -        $prereq_pm .= sprintf "    %-30s %s\n", "$mod:", $ver;
    -    }
    -
    -    my $meta = <{DISTNAME}
    -version:      $self->{VERSION}
    -version_from: $self->{VERSION_FROM}
    -installdirs:  $self->{INSTALLDIRS}
    -requires:
    -$prereq_pm
    -distribution_type: module
    -generated_by: ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION
    -YAML
    -
    -    my @write_meta = $self->echo($meta, 'META_new.yml');
    -
    -    return sprintf <<'MAKE_FRAG', join("\n\t", @write_meta);
    -metafile : create_distdir
    -	$(NOECHO) $(ECHO) Generating META.yml
    -	%s
    -	-$(NOECHO) $(MV) META_new.yml $(DISTVNAME)/META.yml
    -MAKE_FRAG
    -
    -}
    -
    -
    -=head3 distmeta_target
    -
    -    my $make_frag = $mm->distmeta_target;
    -
    -Generates the distmeta target to add META.yml to the MANIFEST in the
    -distdir.
    -
    -=cut
    -
    -sub distmeta_target {
    -    my $self = shift;
    -
    -    my $add_meta = $self->oneliner(<<'CODE', ['-MExtUtils::Manifest=maniadd']);
    -eval { maniadd({q{META.yml} => q{Module meta-data (added by MakeMaker)}}) } 
    -    or print "Could not add META.yml to MANIFEST: $${'@'}\n"
    -CODE
    -
    -    my $add_meta_to_distdir = $self->cd('$(DISTVNAME)', $add_meta);
    -
    -    return sprintf <<'MAKE', $add_meta_to_distdir;
    -distmeta : create_distdir metafile
    -	$(NOECHO) %s
    -
    -MAKE
    -
    -}
    -
    -
    -=head3 realclean (o)
    -
    -Defines the realclean target.
    -
    -=cut
    -
    -sub realclean {
    -    my($self, %attribs) = @_;
    -
    -    my @dirs  = qw($(DISTVNAME));
    -    my @files = qw($(FIRST_MAKEFILE) $(MAKEFILE_OLD));
    -
    -    # Special exception for the perl core where INST_* is not in blib.
    -    # This cleans up the files built from the ext/ directory (all XS).
    -    if( $self->{PERL_CORE} ) {
    -	push @dirs, qw($(INST_AUTODIR) $(INST_ARCHAUTODIR));
    -        push @files, values %{$self->{PM}};
    -    }
    -
    -    if( $self->has_link_code ){
    -        push @files, qw($(OBJECT));
    -    }
    -
    -    if( $attribs{FILES} ) {
    -        if( ref $attribs{FILES} ) {
    -            push @dirs, @{ $attribs{FILES} };
    -        }
    -        else {
    -            push @dirs, split /\s+/, $attribs{FILES};
    -        }
    -    }
    -
    -    # Occasionally files are repeated several times from different sources
    -    { my(%f) = map { ($_ => 1) } @files;  @files = keys %f; }
    -    { my(%d) = map { ($_ => 1) } @dirs;   @dirs  = keys %d; }
    -
    -    my $rm_cmd  = join "\n\t", map { "$_" } 
    -                    $self->split_command('- $(RM_F)',  @files);
    -    my $rmf_cmd = join "\n\t", map { "$_" } 
    -                    $self->split_command('- $(RM_RF)', @dirs);
    -
    -    my $m = sprintf <<'MAKE', $rm_cmd, $rmf_cmd;
    -# Delete temporary files (via clean) and also delete dist files
    -realclean purge ::  clean realclean_subdirs
    -	%s
    -	%s
    -MAKE
    -
    -    $m .= "\t$attribs{POSTOP}\n" if $attribs{POSTOP};
    -
    -    return $m;
    -}
    -
    -
    -=head3 realclean_subdirs_target
    -
    -  my $make_frag = $MM->realclean_subdirs_target;
    -
    -Returns the realclean_subdirs target.  This is used by the realclean
    -target to call realclean on any subdirectories which contain Makefiles.
    -
    -=cut
    -
    -sub realclean_subdirs_target {
    -    my $self = shift;
    -
    -    return <<'NOOP_FRAG' unless @{$self->{DIR}};
    -realclean_subdirs :
    -	$(NOECHO) $(NOOP)
    -NOOP_FRAG
    -
    -    my $rclean = "realclean_subdirs :\n";
    -
    -    foreach my $dir (@{$self->{DIR}}) {
    -        foreach my $makefile ('$(MAKEFILE_OLD)', '$(FIRST_MAKEFILE)' ) {
    -            my $subrclean .= $self->oneliner(sprintf <<'CODE', $dir, ($makefile) x 2);
    -chdir '%s';  system '$(MAKE) $(USEMAKEFILE) %s realclean' if -f '%s';
    -CODE
    -
    -            $rclean .= sprintf <<'RCLEAN', $subrclean;
    -	- %s
    -RCLEAN
    -
    -        }
    -    }
    -
    -    return $rclean;
    -}
    -
    -
    -=head3 signature_target
    -
    -    my $target = $mm->signature_target;
    -
    -Generate the signature target.
    -
    -Writes the file SIGNATURE with "cpansign -s".
    -
    -=cut
    -
    -sub signature_target {
    -    my $self = shift;
    -
    -    return <<'MAKE_FRAG';
    -signature :
    -	cpansign -s
    -MAKE_FRAG
    -
    -}
    -
    -
    -=head3 distsignature_target
    -
    -    my $make_frag = $mm->distsignature_target;
    -
    -Generates the distsignature target to add SIGNATURE to the MANIFEST in the
    -distdir.
    -
    -=cut
    -
    -sub distsignature_target {
    -    my $self = shift;
    -
    -    my $add_sign = $self->oneliner(<<'CODE', ['-MExtUtils::Manifest=maniadd']);
    -eval { maniadd({q{SIGNATURE} => q{Public-key signature (added by MakeMaker)}}) } 
    -    or print "Could not add SIGNATURE to MANIFEST: $${'@'}\n"
    -CODE
    -
    -    my $sign_dist        = $self->cd('$(DISTVNAME)' => 'cpansign -s');
    -
    -    # cpansign -s complains if SIGNATURE is in the MANIFEST yet does not
    -    # exist
    -    my $touch_sig        = $self->cd('$(DISTVNAME)' => '$(TOUCH) SIGNATURE');
    -    my $add_sign_to_dist = $self->cd('$(DISTVNAME)' => $add_sign );
    -
    -    return sprintf <<'MAKE', $add_sign_to_dist, $touch_sig, $sign_dist
    -distsignature : create_distdir
    -	$(NOECHO) %s
    -	$(NOECHO) %s
    -	%s
    -
    -MAKE
    -
    -}
    -
    -
    -=head3 special_targets
    -
    -  my $make_frag = $mm->special_targets
    -
    -Returns a make fragment containing any targets which have special
    -meaning to make.  For example, .SUFFIXES and .PHONY.
    -
    -=cut
    -
    -sub special_targets {
    -    my $make_frag = <<'MAKE_FRAG';
    -.SUFFIXES : .xs .c .C .cpp .i .s .cxx .cc $(OBJ_EXT)
    -
    -.PHONY: all config static dynamic test linkext manifest blibdirs clean realclean disttest distdir
    -
    -MAKE_FRAG
    -
    -    $make_frag .= <<'MAKE_FRAG' if $ENV{CLEARCASE_ROOT};
    -.NO_CONFIG_REC: Makefile
    -
    -MAKE_FRAG
    -
    -    return $make_frag;
    -}
    -
    -
    -
    -
    -=head2 Init methods
    -
    -Methods which help initialize the MakeMaker object and macros.
    -
    -
    -=head3 init_INST
    -
    -    $mm->init_INST;
    -
    -Called by init_main.  Sets up all INST_* variables except those related
    -to XS code.  Those are handled in init_xs.
    -
    -=cut
    -
    -sub init_INST {
    -    my($self) = shift;
    -
    -    $self->{INST_ARCHLIB} ||= $self->catdir($Curdir,"blib","arch");
    -    $self->{INST_BIN}     ||= $self->catdir($Curdir,'blib','bin');
    -
    -    # INST_LIB typically pre-set if building an extension after
    -    # perl has been built and installed. Setting INST_LIB allows
    -    # you to build directly into, say $Config{privlibexp}.
    -    unless ($self->{INST_LIB}){
    -	if ($self->{PERL_CORE}) {
    -            if (defined $Cross::platform) {
    -                $self->{INST_LIB} = $self->{INST_ARCHLIB} = 
    -                  $self->catdir($self->{PERL_LIB},"..","xlib",
    -                                     $Cross::platform);
    -            }
    -            else {
    -                $self->{INST_LIB} = $self->{INST_ARCHLIB} = $self->{PERL_LIB};
    -            }
    -	} else {
    -	    $self->{INST_LIB} = $self->catdir($Curdir,"blib","lib");
    -	}
    -    }
    -
    -    my @parentdir = split(/::/, $self->{PARENT_NAME});
    -    $self->{INST_LIBDIR}      = $self->catdir('$(INST_LIB)',     @parentdir);
    -    $self->{INST_ARCHLIBDIR}  = $self->catdir('$(INST_ARCHLIB)', @parentdir);
    -    $self->{INST_AUTODIR}     = $self->catdir('$(INST_LIB)', 'auto', 
    -                                              '$(FULLEXT)');
    -    $self->{INST_ARCHAUTODIR} = $self->catdir('$(INST_ARCHLIB)', 'auto',
    -                                              '$(FULLEXT)');
    -
    -    $self->{INST_SCRIPT}  ||= $self->catdir($Curdir,'blib','script');
    -
    -    $self->{INST_MAN1DIR} ||= $self->catdir($Curdir,'blib','man1');
    -    $self->{INST_MAN3DIR} ||= $self->catdir($Curdir,'blib','man3');
    -
    -    return 1;
    -}
    -
    -
    -=head3 init_INSTALL
    -
    -    $mm->init_INSTALL;
    -
    -Called by init_main.  Sets up all INSTALL_* variables (except
    -INSTALLDIRS) and *PREFIX.
    -
    -=cut
    -
    -sub init_INSTALL {
    -    my($self) = shift;
    -
    -    if( $self->{ARGS}{INSTALLBASE} and $self->{ARGS}{PREFIX} ) {
    -        die "Only one of PREFIX or INSTALLBASE can be given.  Not both.\n";
    -    }
    -
    -    if( $self->{ARGS}{INSTALLBASE} ) {
    -        $self->init_INSTALL_from_INSTALLBASE;
    -    }
    -    else {
    -        $self->init_INSTALL_from_PREFIX;
    -    }
    -}
    -
    -
    -=head3 init_INSTALL_from_PREFIX
    -
    -  $mm->init_INSTALL_from_PREFIX;
    -
    -=cut
    -
    -sub init_INSTALL_from_PREFIX {
    -    my $self = shift;
    -
    -    $self->init_lib2arch;
    -
    -    # There are often no Config.pm defaults for these new man variables so 
    -    # we fall back to the old behavior which is to use installman*dir
    -    foreach my $num (1, 3) {
    -        my $k = 'installsiteman'.$num.'dir';
    -
    -        $self->{uc $k} ||= uc "\$(installman${num}dir)"
    -          unless $Config{$k};
    -    }
    -
    -    foreach my $num (1, 3) {
    -        my $k = 'installvendorman'.$num.'dir';
    -
    -        unless( $Config{$k} ) {
    -            $self->{uc $k}  ||= $Config{usevendorprefix}
    -                              ? uc "\$(installman${num}dir)"
    -                              : '';
    -        }
    -    }
    -
    -    $self->{INSTALLSITEBIN} ||= '$(INSTALLBIN)'
    -      unless $Config{installsitebin};
    -
    -    unless( $Config{installvendorbin} ) {
    -        $self->{INSTALLVENDORBIN} ||= $Config{usevendorprefix} 
    -                                    ? $Config{installbin}
    -                                    : '';
    -    }
    -
    -
    -    my $iprefix = $Config{installprefixexp} || $Config{installprefix} || 
    -                  $Config{prefixexp}        || $Config{prefix} || '';
    -    my $vprefix = $Config{usevendorprefix}  ? $Config{vendorprefixexp} : '';
    -    my $sprefix = $Config{siteprefixexp}    || '';
    -
    -    # 5.005_03 doesn't have a siteprefix.
    -    $sprefix = $iprefix unless $sprefix;
    -
    -
    -    $self->{PREFIX}       ||= '';
    -
    -    if( $self->{PREFIX} ) {
    -        @{$self}{qw(PERLPREFIX SITEPREFIX VENDORPREFIX)} =
    -          ('$(PREFIX)') x 3;
    -    }
    -    else {
    -        $self->{PERLPREFIX}   ||= $iprefix;
    -        $self->{SITEPREFIX}   ||= $sprefix;
    -        $self->{VENDORPREFIX} ||= $vprefix;
    -
    -        # Lots of MM extension authors like to use $(PREFIX) so we
    -        # put something sensible in there no matter what.
    -        $self->{PREFIX} = '$('.uc $self->{INSTALLDIRS}.'PREFIX)';
    -    }
    -
    -    my $arch    = $Config{archname};
    -    my $version = $Config{version};
    -
    -    # default style
    -    my $libstyle = $Config{installstyle} || 'lib/perl5';
    -    my $manstyle = '';
    -
    -    if( $self->{LIBSTYLE} ) {
    -        $libstyle = $self->{LIBSTYLE};
    -        $manstyle = $self->{LIBSTYLE} eq 'lib/perl5' ? 'lib/perl5' : '';
    -    }
    -
    -    # Some systems, like VOS, set installman*dir to '' if they can't
    -    # read man pages.
    -    for my $num (1, 3) {
    -        $self->{'INSTALLMAN'.$num.'DIR'} ||= 'none'
    -          unless $Config{'installman'.$num.'dir'};
    -    }
    -
    -    my %bin_layouts = 
    -    (
    -        bin         => { s => $iprefix,
    -                         t => 'perl',
    -                         d => 'bin' },
    -        vendorbin   => { s => $vprefix,
    -                         t => 'vendor',
    -                         d => 'bin' },
    -        sitebin     => { s => $sprefix,
    -                         t => 'site',
    -                         d => 'bin' },
    -        script      => { s => $iprefix,
    -                         t => 'perl',
    -                         d => 'bin' },
    -    );
    -    
    -    my %man_layouts =
    -    (
    -        man1dir         => { s => $iprefix,
    -                             t => 'perl',
    -                             d => 'man/man1',
    -                             style => $manstyle, },
    -        siteman1dir     => { s => $sprefix,
    -                             t => 'site',
    -                             d => 'man/man1',
    -                             style => $manstyle, },
    -        vendorman1dir   => { s => $vprefix,
    -                             t => 'vendor',
    -                             d => 'man/man1',
    -                             style => $manstyle, },
    -
    -        man3dir         => { s => $iprefix,
    -                             t => 'perl',
    -                             d => 'man/man3',
    -                             style => $manstyle, },
    -        siteman3dir     => { s => $sprefix,
    -                             t => 'site',
    -                             d => 'man/man3',
    -                             style => $manstyle, },
    -        vendorman3dir   => { s => $vprefix,
    -                             t => 'vendor',
    -                             d => 'man/man3',
    -                             style => $manstyle, },
    -    );
    -
    -    my %lib_layouts =
    -    (
    -        privlib     => { s => $iprefix,
    -                         t => 'perl',
    -                         d => '',
    -                         style => $libstyle, },
    -        vendorlib   => { s => $vprefix,
    -                         t => 'vendor',
    -                         d => '',
    -                         style => $libstyle, },
    -        sitelib     => { s => $sprefix,
    -                         t => 'site',
    -                         d => 'site_perl',
    -                         style => $libstyle, },
    -        
    -        archlib     => { s => $iprefix,
    -                         t => 'perl',
    -                         d => "$version/$arch",
    -                         style => $libstyle },
    -        vendorarch  => { s => $vprefix,
    -                         t => 'vendor',
    -                         d => "$version/$arch",
    -                         style => $libstyle },
    -        sitearch    => { s => $sprefix,
    -                         t => 'site',
    -                         d => "site_perl/$version/$arch",
    -                         style => $libstyle },
    -    );
    -
    -
    -    # Special case for LIB.
    -    if( $self->{LIB} ) {
    -        foreach my $var (keys %lib_layouts) {
    -            my $Installvar = uc "install$var";
    -
    -            if( $var =~ /arch/ ) {
    -                $self->{$Installvar} ||= 
    -                  $self->catdir($self->{LIB}, $Config{archname});
    -            }
    -            else {
    -                $self->{$Installvar} ||= $self->{LIB};
    -            }
    -        }
    -    }
    -
    -    my %type2prefix = ( perl    => 'PERLPREFIX',
    -                        site    => 'SITEPREFIX',
    -                        vendor  => 'VENDORPREFIX'
    -                      );
    -
    -    my %layouts = (%bin_layouts, %man_layouts, %lib_layouts);
    -    while( my($var, $layout) = each(%layouts) ) {
    -        my($s, $t, $d, $style) = @{$layout}{qw(s t d style)};
    -        my $r = '$('.$type2prefix{$t}.')';
    -
    -        print STDERR "Prefixing $var\n" if $Verbose >= 2;
    -
    -        my $installvar = "install$var";
    -        my $Installvar = uc $installvar;
    -        next if $self->{$Installvar};
    -
    -        $d = "$style/$d" if $style;
    -        $self->prefixify($installvar, $s, $r, $d);
    -
    -        print STDERR "  $Installvar == $self->{$Installvar}\n" 
    -          if $Verbose >= 2;
    -    }
    -
    -    # Generate these if they weren't figured out.
    -    $self->{VENDORARCHEXP} ||= $self->{INSTALLVENDORARCH};
    -    $self->{VENDORLIBEXP}  ||= $self->{INSTALLVENDORLIB};
    -
    -    return 1;
    -}
    -
    -
    -=head3 init_from_INSTALLBASE
    -
    -    $mm->init_from_INSTALLBASE
    -
    -=cut
    -
    -my %map = (
    -           lib      => [qw(lib perl5)],
    -           arch     => [('lib', 'perl5', $Config{archname})],
    -           bin      => [qw(bin)],
    -           man1dir  => [qw(man man1)],
    -           man3dir  => [qw(man man3)]
    -          );
    -$map{script} = $map{bin};
    -
    -sub init_INSTALL_from_INSTALLBASE {
    -    my $self = shift;
    -
    -    @{$self}{qw(PREFIX VENDORPREFIX SITEPREFIX PERLPREFIX)} = 
    -                                                         '$(INSTALLBASE)';
    -
    -    my %install;
    -    foreach my $thing (keys %map) {
    -        foreach my $dir (('', 'SITE', 'VENDOR')) {
    -            my $uc_thing = uc $thing;
    -            my $key = "INSTALL".$dir.$uc_thing;
    -
    -            $install{$key} ||= 
    -              $self->catdir('$(INSTALLBASE)', @{$map{$thing}});
    -        }
    -    }
    -
    -    # Adjust for variable quirks.
    -    $install{INSTALLARCHLIB} ||= delete $install{INSTALLARCH};
    -    $install{INSTALLPRIVLIB} ||= delete $install{INSTALLLIB};
    -    delete @install{qw(INSTALLVENDORSCRIPT INSTALLSITESCRIPT)};
    -
    -    foreach my $key (keys %install) {
    -        $self->{$key} ||= $install{$key};
    -    }
    -
    -    return 1;
    -}
    -
    -
    -=head3 init_VERSION  I
    -
    -    $mm->init_VERSION
    -
    -Initialize macros representing versions of MakeMaker and other tools
    -
    -MAKEMAKER: path to the MakeMaker module.
    -
    -MM_VERSION: ExtUtils::MakeMaker Version
    -
    -MM_REVISION: ExtUtils::MakeMaker version control revision (for backwards 
    -             compat)
    -
    -VERSION: version of your module
    -
    -VERSION_MACRO: which macro represents the version (usually 'VERSION')
    -
    -VERSION_SYM: like version but safe for use as an RCS revision number
    -
    -DEFINE_VERSION: -D line to set the module version when compiling
    -
    -XS_VERSION: version in your .xs file.  Defaults to $(VERSION)
    -
    -XS_VERSION_MACRO: which macro represents the XS version.
    -
    -XS_DEFINE_VERSION: -D line to set the xs version when compiling.
    -
    -Called by init_main.
    -
    -=cut
    -
    -sub init_VERSION {
    -    my($self) = shift;
    -
    -    $self->{MAKEMAKER}  = $ExtUtils::MakeMaker::Filename;
    -    $self->{MM_VERSION} = $ExtUtils::MakeMaker::VERSION;
    -    $self->{MM_REVISION}= $ExtUtils::MakeMaker::Revision;
    -    $self->{VERSION_FROM} ||= '';
    -
    -    if ($self->{VERSION_FROM}){
    -        $self->{VERSION} = $self->parse_version($self->{VERSION_FROM});
    -        if( $self->{VERSION} eq 'undef' ) {
    -            require Carp;
    -            Carp::carp("WARNING: Setting VERSION via file ".
    -                       "'$self->{VERSION_FROM}' failed\n");
    -        }
    -    }
    -
    -    # strip blanks
    -    if (defined $self->{VERSION}) {
    -        $self->{VERSION} =~ s/^\s+//;
    -        $self->{VERSION} =~ s/\s+$//;
    -    }
    -    else {
    -        $self->{VERSION} = '';
    -    }
    -
    -
    -    $self->{VERSION_MACRO}  = 'VERSION';
    -    ($self->{VERSION_SYM} = $self->{VERSION}) =~ s/\W/_/g;
    -    $self->{DEFINE_VERSION} = '-D$(VERSION_MACRO)=\"$(VERSION)\"';
    -
    -
    -    # Graham Barr and Paul Marquess had some ideas how to ensure
    -    # version compatibility between the *.pm file and the
    -    # corresponding *.xs file. The bottomline was, that we need an
    -    # XS_VERSION macro that defaults to VERSION:
    -    $self->{XS_VERSION} ||= $self->{VERSION};
    -
    -    $self->{XS_VERSION_MACRO}  = 'XS_VERSION';
    -    $self->{XS_DEFINE_VERSION} = '-D$(XS_VERSION_MACRO)=\"$(XS_VERSION)\"';
    -
    -}
    -
    -
    -=head3 init_others  I
    -
    -    $MM->init_others();
    -
    -Initializes the macro definitions used by tools_other() and places them
    -in the $MM object.
    -
    -If there is no description, its the same as the parameter to
    -WriteMakefile() documented in ExtUtils::MakeMaker.
    -
    -Defines at least these macros.
    -
    -  Macro             Description
    -
    -  NOOP              Do nothing
    -  NOECHO            Tell make not to display the command itself
    -
    -  MAKEFILE
    -  FIRST_MAKEFILE
    -  MAKEFILE_OLD
    -  MAKE_APERL_FILE   File used by MAKE_APERL
    -
    -  SHELL             Program used to run
    -                    shell commands
    -
    -  ECHO              Print text adding a newline on the end
    -  RM_F              Remove a file 
    -  RM_RF             Remove a directory          
    -  TOUCH             Update a file's timestamp   
    -  TEST_F            Test for a file's existence 
    -  CP                Copy a file                 
    -  MV                Move a file                 
    -  CHMOD             Change permissions on a     
    -                    file
    -
    -  UMASK_NULL        Nullify umask
    -  DEV_NULL          Supress all command output
    -
    -
    -=head3 init_DIRFILESEP  I
    -
    -  $MM->init_DIRFILESEP;
    -  my $dirfilesep = $MM->{DIRFILESEP};
    -
    -Initializes the DIRFILESEP macro which is the seperator between the
    -directory and filename in a filepath.  ie. / on Unix, \ on Win32 and
    -nothing on VMS.
    -
    -For example:
    -
    -    # instead of $(INST_ARCHAUTODIR)/extralibs.ld
    -    $(INST_ARCHAUTODIR)$(DIRFILESEP)extralibs.ld
    -
    -Something of a hack but it prevents a lot of code duplication between
    -MM_* variants.
    -
    -Do not use this as a seperator between directories.  Some operating
    -systems use different seperators between subdirectories as between
    -directories and filenames (for example:  VOLUME:[dir1.dir2]file on VMS).
    -
    -=head3 init_linker  I
    -
    -    $mm->init_linker;
    -
    -Initialize macros which have to do with linking.
    -
    -PERL_ARCHIVE: path to libperl.a equivalent to be linked to dynamic
    -extensions.
    -
    -PERL_ARCHIVE_AFTER: path to a library which should be put on the
    -linker command line I the external libraries to be linked to
    -dynamic extensions.  This may be needed if the linker is one-pass, and
    -Perl includes some overrides for C RTL functions, such as malloc().
    -
    -EXPORT_LIST: name of a file that is passed to linker to define symbols
    -to be exported.
    -
    -Some OSes do not need these in which case leave it blank.
    -
    -
    -=head3 init_platform
    -
    -    $mm->init_platform
    -
    -Initialize any macros which are for platform specific use only.
    -
    -A typical one is the version number of your OS specific mocule.
    -(ie. MM_Unix_VERSION or MM_VMS_VERSION).
    -
    -=cut
    -
    -sub init_platform {
    -    return '';
    -}
    -
    -
    -
    -
    -
    -=head2 Tools
    -
    -A grab bag of methods to generate specific macros and commands.
    -
    -
    -
    -=head3 manifypods
    -
    -Defines targets and routines to translate the pods into manpages and
    -put them into the INST_* directories.
    -
    -=cut
    -
    -sub manifypods {
    -    my $self          = shift;
    -
    -    my $POD2MAN_macro = $self->POD2MAN_macro();
    -    my $manifypods_target = $self->manifypods_target();
    -
    -    return <POD2MAN_macro
    -
    -Returns a definition for the POD2MAN macro.  This is a program
    -which emulates the pod2man utility.  You can add more switches to the
    -command by simply appending them on the macro.
    -
    -Typical usage:
    -
    -    $(POD2MAN) --section=3 --perm_rw=$(PERM_RW) podfile1 man_page1 ...
    -
    -=cut
    -
    -sub POD2MAN_macro {
    -    my $self = shift;
    -
    -# Need the trailing '--' so perl stops gobbling arguments and - happens
    -# to be an alternative end of line seperator on VMS so we quote it
    -    return <<'END_OF_DEF';
    -POD2MAN_EXE = $(PERLRUN) "-MExtUtils::Command::MM" -e pod2man "--"
    -POD2MAN = $(POD2MAN_EXE)
    -END_OF_DEF
    -}
    -
    -
    -=head3 test_via_harness
    -
    -  my $command = $mm->test_via_harness($perl, $tests);
    -
    -Returns a $command line which runs the given set of $tests with
    -Test::Harness and the given $perl.
    -
    -Used on the t/*.t files.
    -
    -=cut
    -
    -sub test_via_harness {
    -    my($self, $perl, $tests) = @_;
    -
    -    return qq{\t$perl "-MExtUtils::Command::MM" }.
    -           qq{"-e" "test_harness(\$(TEST_VERBOSE), '\$(INST_LIB)', '\$(INST_ARCHLIB)')" $tests\n};
    -}
    -
    -=head3 test_via_script
    -
    -  my $command = $mm->test_via_script($perl, $script);
    -
    -Returns a $command line which just runs a single test without
    -Test::Harness.  No checks are done on the results, they're just
    -printed.
    -
    -Used for test.pl, since they don't always follow Test::Harness
    -formatting.
    -
    -=cut
    -
    -sub test_via_script {
    -    my($self, $perl, $script) = @_;
    -    return qq{\t$perl "-I\$(INST_LIB)" "-I\$(INST_ARCHLIB)" $script\n};
    -}
    -
    -
    -=head3 tool_autosplit
    -
    -Defines a simple perl call that runs autosplit. May be deprecated by
    -pm_to_blib soon.
    -
    -=cut
    -
    -sub tool_autosplit {
    -    my($self, %attribs) = @_;
    -
    -    my $maxlen = $attribs{MAXLEN} ? '$$AutoSplit::Maxlen=$attribs{MAXLEN};' 
    -                                  : '';
    -
    -    my $asplit = $self->oneliner(sprintf <<'PERL_CODE', $maxlen);
    -use AutoSplit; %s autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1)
    -PERL_CODE
    -
    -    return sprintf <<'MAKE_FRAG', $asplit;
    -# Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto
    -AUTOSPLITFILE = %s
    -
    -MAKE_FRAG
    -
    -}
    -
    -
    -
    -
    -=head2 File::Spec wrappers
    -
    -ExtUtils::MM_Any is a subclass of File::Spec.  The methods noted here
    -override File::Spec.
    -
    -
    -
    -=head3 catfile
    -
    -File::Spec <= 0.83 has a bug where the file part of catfile is not
    -canonicalized.  This override fixes that bug.
    -
    -=cut
    -
    -sub catfile {
    -    my $self = shift;
    -    return $self->canonpath($self->SUPER::catfile(@_));
    -}
    -
    -
    -
    -=head2 Misc
    -
    -Methods I can't really figure out where they should go yet.
    -
    -
    -=head3 find_tests
    -
    -  my $test = $mm->find_tests;
    -
    -Returns a string suitable for feeding to the shell to return all
    -tests in t/*.t.
    -
    -=cut
    -
    -sub find_tests {
    -    my($self) = shift;
    -    return -d 't' ? 't/*.t' : '';
    -}
    -
    -
    -=head3 extra_clean_files
    -
    -    my @files_to_clean = $MM->extra_clean_files;
    -
    -Returns a list of OS specific files to be removed in the clean target in
    -addition to the usual set.
    -
    -=cut
    -
    -# An empty method here tickled a perl 5.8.1 bug and would return its object.
    -sub extra_clean_files { 
    -    return;
    -}
    -
    -
    -=head3 installvars
    -
    -    my @installvars = $mm->installvars;
    -
    -A list of all the INSTALL* variables without the INSTALL prefix.  Useful
    -for iteration or building related variable sets.
    -
    -=cut
    -
    -sub installvars {
    -    return qw(PRIVLIB SITELIB  VENDORLIB
    -              ARCHLIB SITEARCH VENDORARCH
    -              BIN     SITEBIN  VENDORBIN
    -              SCRIPT
    -              MAN1DIR SITEMAN1DIR VENDORMAN1DIR
    -              MAN3DIR SITEMAN3DIR VENDORMAN3DIR
    -             );
    -}
    -
    -
    -=head3 libscan
    -
    -  my $wanted = $self->libscan($path);
    -
    -Takes a path to a file or dir and returns an empty string if we don't
    -want to include this file in the library.  Otherwise it returns the
    -the $path unchanged.
    -
    -Mainly used to exclude version control administrative directories from
    -installation.
    -
    -=cut
    -
    -sub libscan {
    -    my($self,$path) = @_;
    -    my($dirs,$file) = ($self->splitpath($path))[1,2];
    -    return '' if grep /^(?:RCS|CVS|SCCS|\.svn|_darcs)$/, 
    -                     $self->splitdir($dirs), $file;
    -
    -    return $path;
    -}
    -
    -
    -=head3 platform_constants
    -
    -    my $make_frag = $mm->platform_constants
    -
    -Returns a make fragment defining all the macros initialized in
    -init_platform() rather than put them in constants().
    -
    -=cut
    -
    -sub platform_constants {
    -    return '';
    -}
    -
    -
    -=head1 AUTHOR
    -
    -Michael G Schwern  and the denizens of
    -makemaker@perl.org with code from ExtUtils::MM_Unix and
    -ExtUtils::MM_Win32.
    -
    -
    -=cut
    -
    -1;
    diff --git a/lib/perl5/5.8.8/ExtUtils/MM_BeOS.pm b/lib/perl5/5.8.8/ExtUtils/MM_BeOS.pm
    deleted file mode 100644
    index 6d93ad4c..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/MM_BeOS.pm
    +++ /dev/null
    @@ -1,60 +0,0 @@
    -package ExtUtils::MM_BeOS;
    -
    -=head1 NAME
    -
    -ExtUtils::MM_BeOS - methods to override UN*X behaviour in ExtUtils::MakeMaker
    -
    -=head1 SYNOPSIS
    -
    - use ExtUtils::MM_BeOS;	# Done internally by ExtUtils::MakeMaker if needed
    -
    -=head1 DESCRIPTION
    -
    -See ExtUtils::MM_Unix for a documentation of the methods provided
    -there. This package overrides the implementation of these methods, not
    -the semantics.
    -
    -=over 4
    -
    -=cut 
    -
    -use ExtUtils::MakeMaker::Config;
    -use File::Spec;
    -require ExtUtils::MM_Any;
    -require ExtUtils::MM_Unix;
    -
    -use vars qw(@ISA $VERSION);
    -@ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
    -$VERSION = '1.05';
    -
    -
    -=item os_flavor
    -
    -BeOS is BeOS.
    -
    -=cut
    -
    -sub os_flavor {
    -    return('BeOS');
    -}
    -
    -=item init_linker
    -
    -libperl.a equivalent to be linked to dynamic extensions.
    -
    -=cut
    -
    -sub init_linker {
    -    my($self) = shift;
    -
    -    $self->{PERL_ARCHIVE} ||= 
    -      File::Spec->catdir('$(PERL_INC)',$Config{libperl});
    -    $self->{PERL_ARCHIVE_AFTER} ||= '';
    -    $self->{EXPORT_LIST}  ||= '';
    -}
    -
    -=back
    -
    -1;
    -__END__
    -
    diff --git a/lib/perl5/5.8.8/ExtUtils/MM_Cygwin.pm b/lib/perl5/5.8.8/ExtUtils/MM_Cygwin.pm
    deleted file mode 100644
    index adb8d420..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/MM_Cygwin.pm
    +++ /dev/null
    @@ -1,106 +0,0 @@
    -package ExtUtils::MM_Cygwin;
    -
    -use strict;
    -use vars qw($VERSION @ISA);
    -
    -use ExtUtils::MakeMaker::Config;
    -use File::Spec;
    -
    -require ExtUtils::MM_Any;
    -require ExtUtils::MM_Unix;
    -@ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
    -
    -$VERSION = '1.08';
    -
    -
    -=head1 NAME
    -
    -ExtUtils::MM_Cygwin - methods to override UN*X behaviour in ExtUtils::MakeMaker
    -
    -=head1 SYNOPSIS
    -
    - use ExtUtils::MM_Cygwin; # Done internally by ExtUtils::MakeMaker if needed
    -
    -=head1 DESCRIPTION
    -
    -See ExtUtils::MM_Unix for a documentation of the methods provided there.
    -
    -=over 4
    -
    -=item os_flavor
    -
    -We're Unix and Cygwin.
    -
    -=cut
    -
    -sub os_flavor {
    -    return('Unix', 'Cygwin');
    -}
    -
    -=item cflags
    -
    -if configured for dynamic loading, triggers #define EXT in EXTERN.h
    -
    -=cut
    -
    -sub cflags {
    -    my($self,$libperl)=@_;
    -    return $self->{CFLAGS} if $self->{CFLAGS};
    -    return '' unless $self->needs_linking();
    -
    -    my $base = $self->SUPER::cflags($libperl);
    -    foreach (split /\n/, $base) {
    -        /^(\S*)\s*=\s*(\S*)$/ and $self->{$1} = $2;
    -    };
    -    $self->{CCFLAGS} .= " -DUSEIMPORTLIB" if ($Config{useshrplib} eq 'true');
    -
    -    return $self->{CFLAGS} = qq{
    -CCFLAGS = $self->{CCFLAGS}
    -OPTIMIZE = $self->{OPTIMIZE}
    -PERLTYPE = $self->{PERLTYPE}
    -};
    -
    -}
    -
    -
    -=item replace_manpage_separator
    -
    -replaces strings '::' with '.' in MAN*POD man page names
    -
    -=cut
    -
    -sub replace_manpage_separator {
    -    my($self, $man) = @_;
    -    $man =~ s{/+}{.}g;
    -    return $man;
    -}
    -
    -=item init_linker
    -
    -points to libperl.a
    -
    -=cut
    -
    -sub init_linker {
    -    my $self = shift;
    -
    -    if ($Config{useshrplib} eq 'true') {
    -        my $libperl = '$(PERL_INC)' .'/'. "$Config{libperl}";
    -        if( $] >= 5.006002 ) {
    -            $libperl =~ s/a$/dll.a/;
    -        }
    -        $self->{PERL_ARCHIVE} = $libperl;
    -    } else {
    -        $self->{PERL_ARCHIVE} = 
    -          '$(PERL_INC)' .'/'. ("$Config{libperl}" or "libperl.a");
    -    }
    -
    -    $self->{PERL_ARCHIVE_AFTER} ||= '';
    -    $self->{EXPORT_LIST}  ||= '';
    -}
    -
    -=back
    -
    -=cut
    -
    -1;
    diff --git a/lib/perl5/5.8.8/ExtUtils/MM_DOS.pm b/lib/perl5/5.8.8/ExtUtils/MM_DOS.pm
    deleted file mode 100644
    index b985d00c..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/MM_DOS.pm
    +++ /dev/null
    @@ -1,66 +0,0 @@
    -package ExtUtils::MM_DOS;
    -
    -use strict;
    -use vars qw($VERSION @ISA);
    -
    -$VERSION = 0.02;
    -
    -require ExtUtils::MM_Any;
    -require ExtUtils::MM_Unix;
    -@ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
    -
    -
    -=head1 NAME
    -
    -ExtUtils::MM_DOS - DOS specific subclass of ExtUtils::MM_Unix
    -
    -=head1 SYNOPSIS
    -
    -  Don't use this module directly.
    -  Use ExtUtils::MM and let it choose.
    -
    -=head1 DESCRIPTION
    -
    -This is a subclass of ExtUtils::MM_Unix which contains functionality
    -for DOS.
    -
    -Unless otherwise stated, it works just like ExtUtils::MM_Unix
    -
    -=head2 Overridden methods
    -
    -=over 4
    -
    -=item os_flavor
    -
    -=cut
    -
    -sub os_flavor {
    -    return('DOS');
    -}
    -
    -=item B
    -
    -Generates Foo__Bar.3 style man page names
    -
    -=cut
    -
    -sub replace_manpage_separator {
    -    my($self, $man) = @_;
    -
    -    $man =~ s,/+,__,g;
    -    return $man;
    -}
    -
    -=back
    -
    -=head1 AUTHOR
    -
    -Michael G Schwern  with code from ExtUtils::MM_Unix
    -
    -=head1 SEE ALSO
    -
    -L, L
    -
    -=cut
    -
    -1;
    diff --git a/lib/perl5/5.8.8/ExtUtils/MM_MacOS.pm b/lib/perl5/5.8.8/ExtUtils/MM_MacOS.pm
    deleted file mode 100644
    index de578f8b..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/MM_MacOS.pm
    +++ /dev/null
    @@ -1,38 +0,0 @@
    -package ExtUtils::MM_MacOS;
    -
    -$VERSION = 1.08;
    -
    -sub new {
    -    die <<'UNSUPPORTED';
    -MacOS Classic (MacPerl) is no longer supported by MakeMaker.
    -Please use Module::Build instead.
    -UNSUPPORTED
    -}
    -
    -=head1 NAME
    -
    -ExtUtils::MM_MacOS - once produced Makefiles for MacOS Classic
    -
    -=head1 SYNOPSIS
    -
    -  # MM_MacOS no longer contains any code.  This is just a stub.
    -
    -=head1 DESCRIPTION
    -
    -Once upon a time, MakeMaker could produce an approximation of a correct
    -Makefile on MacOS Classic (MacPerl).  Due to a lack of maintainers, this
    -fell out of sync with the rest of MakeMaker and hadn't worked in years.
    -Since there's little chance of it being repaired, MacOS Classic is fading
    -away, and the code was icky to begin with, the code has been deleted to
    -make maintenance easier.
    -
    -Those interested in writing modules for MacPerl should use Module::Build
    -which works better than MakeMaker ever did.
    -
    -Anyone interested in resurrecting this file should pull the old version
    -from the MakeMaker CVS repository and contact makemaker@perl.org, but we
    -really encourage you to work on Module::Build instead.
    -
    -=cut
    -
    -1;
    diff --git a/lib/perl5/5.8.8/ExtUtils/MM_Msys.pm b/lib/perl5/5.8.8/ExtUtils/MM_Msys.pm
    deleted file mode 100644
    index a55e0b1c..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/MM_Msys.pm
    +++ /dev/null
    @@ -1,106 +0,0 @@
    -package ExtUtils::MM_Msys;
    -
    -use strict;
    -use vars qw($VERSION @ISA);
    -
    -use ExtUtils::MakeMaker::Config;
    -use File::Spec;
    -
    -require ExtUtils::MM_Any;
    -require ExtUtils::MM_Unix;
    -@ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
    -
    -$VERSION = '1.08';
    -
    -
    -=head1 NAME
    -
    -ExtUtils::MM_Msys - methods to override UN*X behaviour in ExtUtils::MakeMaker
    -
    -=head1 SYNOPSIS
    -
    - use ExtUtils::MM_Msys; # Done internally by ExtUtils::MakeMaker if needed
    -
    -=head1 DESCRIPTION
    -
    -See ExtUtils::MM_Unix for a documentation of the methods provided there.
    -
    -=over 4
    -
    -=item os_flavor
    -
    -We're Unix and Msys.
    -
    -=cut
    -
    -sub os_flavor {
    -    return('Unix', 'Msys');
    -}
    -
    -=item cflags
    -
    -if configured for dynamic loading, triggers #define EXT in EXTERN.h
    -
    -=cut
    -
    -sub cflags {
    -    my($self,$libperl)=@_;
    -    return $self->{CFLAGS} if $self->{CFLAGS};
    -    return '' unless $self->needs_linking();
    -
    -    my $base = $self->SUPER::cflags($libperl);
    -    foreach (split /\n/, $base) {
    -        /^(\S*)\s*=\s*(\S*)$/ and $self->{$1} = $2;
    -    };
    -    $self->{CCFLAGS} .= " -DUSEIMPORTLIB" if ($Config{useshrplib} eq 'true');
    -
    -    return $self->{CFLAGS} = qq{
    -CCFLAGS = $self->{CCFLAGS}
    -OPTIMIZE = $self->{OPTIMIZE}
    -PERLTYPE = $self->{PERLTYPE}
    -};
    -
    -}
    -
    -
    -=item replace_manpage_separator
    -
    -replaces strings '::' with '.' in MAN*POD man page names
    -
    -=cut
    -
    -sub replace_manpage_separator {
    -    my($self, $man) = @_;
    -    $man =~ s{/+}{.}g;
    -    return $man;
    -}
    -
    -=item init_linker
    -
    -points to libperl.a
    -
    -=cut
    -
    -sub init_linker {
    -    my $self = shift;
    -
    -    if ($Config{useshrplib} eq 'true') {
    -        my $libperl = '$(PERL_INC)' .'/'. "$Config{libperl}";
    -        if( $] >= 5.006002 ) {
    -            $libperl =~ s/a$/dll.a/;
    -        }
    -        $self->{PERL_ARCHIVE} = $libperl;
    -    } else {
    -        $self->{PERL_ARCHIVE} = 
    -          '$(PERL_INC)' .'/'. ("$Config{libperl}" or "libperl.a");
    -    }
    -
    -    $self->{PERL_ARCHIVE_AFTER} ||= '';
    -    $self->{EXPORT_LIST}  ||= '';
    -}
    -
    -=back
    -
    -=cut
    -
    -1;
    diff --git a/lib/perl5/5.8.8/ExtUtils/MM_NW5.pm b/lib/perl5/5.8.8/ExtUtils/MM_NW5.pm
    deleted file mode 100644
    index 6d9c4920..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/MM_NW5.pm
    +++ /dev/null
    @@ -1,271 +0,0 @@
    -package ExtUtils::MM_NW5;
    -
    -=head1 NAME
    -
    -ExtUtils::MM_NW5 - methods to override UN*X behaviour in ExtUtils::MakeMaker
    -
    -=head1 SYNOPSIS
    -
    - use ExtUtils::MM_NW5; # Done internally by ExtUtils::MakeMaker if needed
    -
    -=head1 DESCRIPTION
    -
    -See ExtUtils::MM_Unix for a documentation of the methods provided
    -there. This package overrides the implementation of these methods, not
    -the semantics.
    -
    -=over
    -
    -=cut 
    -
    -use strict;
    -use ExtUtils::MakeMaker::Config;
    -use File::Basename;
    -
    -use vars qw(@ISA $VERSION);
    -$VERSION = '2.08';
    -
    -require ExtUtils::MM_Win32;
    -@ISA = qw(ExtUtils::MM_Win32);
    -
    -use ExtUtils::MakeMaker qw( &neatvalue );
    -
    -$ENV{EMXSHELL} = 'sh'; # to run `commands`
    -
    -my $BORLAND  = $Config{'cc'} =~ /^bcc/i;
    -my $GCC      = $Config{'cc'} =~ /^gcc/i;
    -my $DMAKE    = $Config{'make'} =~ /^dmake/i;
    -
    -
    -=item os_flavor
    -
    -We're Netware in addition to being Windows.
    -
    -=cut
    -
    -sub os_flavor {
    -    my $self = shift;
    -    return ($self->SUPER::os_flavor, 'Netware');
    -}
    -
    -=item init_platform
    -
    -Add Netware macros.
    -
    -LIBPTH, BASE_IMPORT, NLM_VERSION, MPKTOOL, TOOLPATH, BOOT_SYMBOL,
    -NLM_SHORT_NAME, INCLUDE, PATH, MM_NW5_REVISION
    -
    -
    -=item platform_constants
    -
    -Add Netware macros initialized above to the Makefile.
    -
    -=cut
    -
    -sub init_platform {
    -    my($self) = shift;
    -
    -    # To get Win32's setup.
    -    $self->SUPER::init_platform;
    -
    -    # incpath is copied to makefile var INCLUDE in constants sub, here just 
    -    # make it empty
    -    my $libpth = $Config{'libpth'};
    -    $libpth =~ s( )(;);
    -    $self->{'LIBPTH'} = $libpth;
    -
    -    $self->{'BASE_IMPORT'} = $Config{'base_import'};
    -
    -    # Additional import file specified from Makefile.pl
    -    if($self->{'base_import'}) {
    -        $self->{'BASE_IMPORT'} .= ', ' . $self->{'base_import'};
    -    }
    - 
    -    $self->{'NLM_VERSION'} = $Config{'nlm_version'};
    -    $self->{'MPKTOOL'}	= $Config{'mpktool'};
    -    $self->{'TOOLPATH'}	= $Config{'toolpath'};
    -
    -    (my $boot = $self->{'NAME'}) =~ s/:/_/g;
    -    $self->{'BOOT_SYMBOL'}=$boot;
    -
    -    # If the final binary name is greater than 8 chars,
    -    # truncate it here.
    -    if(length($self->{'BASEEXT'}) > 8) {
    -        $self->{'NLM_SHORT_NAME'} = substr($self->{'BASEEXT'},0,8);
    -    }
    -
    -    # Get the include path and replace the spaces with ;
    -    # Copy this to makefile as INCLUDE = d:\...;d:\;
    -    ($self->{INCLUDE} = $Config{'incpath'}) =~ s/([ ]*)-I/;/g;
    -
    -    # Set the path to CodeWarrior binaries which might not have been set in
    -    # any other place
    -    $self->{PATH} = '$(PATH);$(TOOLPATH)';
    -
    -    $self->{MM_NW5_VERSION} = $VERSION;
    -}
    -
    -sub platform_constants {
    -    my($self) = shift;
    -    my $make_frag = '';
    -
    -    # Setup Win32's constants.
    -    $make_frag .= $self->SUPER::platform_constants;
    -
    -    foreach my $macro (qw(LIBPTH BASE_IMPORT NLM_VERSION MPKTOOL 
    -                          TOOLPATH BOOT_SYMBOL NLM_SHORT_NAME INCLUDE PATH
    -                          MM_NW5_VERSION
    -                      ))
    -    {
    -        next unless defined $self->{$macro};
    -        $make_frag .= "$macro = $self->{$macro}\n";
    -    }
    -
    -    return $make_frag;
    -}
    -
    -
    -=item const_cccmd
    -
    -=cut
    -
    -sub const_cccmd {
    -    my($self,$libperl)=@_;
    -    return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
    -    return '' unless $self->needs_linking();
    -    return $self->{CONST_CCCMD} = <<'MAKE_FRAG';
    -CCCMD = $(CC) $(CCFLAGS) $(INC) $(OPTIMIZE) \
    -	$(PERLTYPE) $(MPOLLUTE) -o $@ \
    -	-DVERSION=\"$(VERSION)\" -DXS_VERSION=\"$(XS_VERSION)\"
    -MAKE_FRAG
    -
    -}
    -
    -
    -=item static_lib
    -
    -=cut
    -
    -sub static_lib {
    -    my($self) = @_;
    -
    -    return '' unless $self->has_link_code;
    -
    -    my $m = <<'END';
    -$(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)$(DFSEP).exists
    -	$(RM_RF) $@
    -END
    -
    -    # If this extension has it's own library (eg SDBM_File)
    -    # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
    -    $m .= <<'END'  if $self->{MYEXTLIB};
    -	$self->{CP} $(MYEXTLIB) $@
    -END
    -
    -    my $ar_arg;
    -    if( $BORLAND ) {
    -        $ar_arg = '$@ $(OBJECT:^"+")';
    -    }
    -    elsif( $GCC ) {
    -        $ar_arg = '-ru $@ $(OBJECT)';
    -    }
    -    else {
    -        $ar_arg = '-type library -o $@ $(OBJECT)';
    -    }
    -
    -    $m .= sprintf <<'END', $ar_arg;
    -	$(AR) %s
    -	$(NOECHO) $(ECHO) "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)\extralibs.ld
    -	$(CHMOD) 755 $@
    -END
    -
    -    $m .= <<'END' if $self->{PERL_SRC};
    -	$(NOECHO) $(ECHO) "$(EXTRALIBS)" >> $(PERL_SRC)\ext.libs
    -
    -
    -END
    -    return $m;
    -}
    -
    -=item dynamic_lib
    -
    -Defines how to produce the *.so (or equivalent) files.
    -
    -=cut
    -
    -sub dynamic_lib {
    -    my($self, %attribs) = @_;
    -    return '' unless $self->needs_linking(); #might be because of a subdir
    -
    -    return '' unless $self->has_link_code;
    -
    -    my($otherldflags) = $attribs{OTHERLDFLAGS} || ($BORLAND ? 'c0d32.obj': '');
    -    my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
    -    my($ldfrom) = '$(LDFROM)';
    -
    -    (my $boot = $self->{NAME}) =~ s/:/_/g;
    -
    -    my $m = <<'MAKE_FRAG';
    -# This section creates the dynamically loadable $(INST_DYNAMIC)
    -# from $(OBJECT) and possibly $(MYEXTLIB).
    -OTHERLDFLAGS = '.$otherldflags.'
    -INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
    -
    -# Create xdc data for an MT safe NLM in case of mpk build
    -$(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)$(DFSEP).exists
    -	$(NOECHO) $(ECHO) Export boot_$(BOOT_SYMBOL) > $(BASEEXT).def
    -	$(NOECHO) $(ECHO) $(BASE_IMPORT) >> $(BASEEXT).def
    -	$(NOECHO) $(ECHO) Import @$(PERL_INC)\perl.imp >> $(BASEEXT).def
    -MAKE_FRAG
    -
    -
    -    if ( $self->{CCFLAGS} =~ m/ -DMPK_ON /) {
    -        $m .= <<'MAKE_FRAG';
    -	$(MPKTOOL) $(XDCFLAGS) $(BASEEXT).xdc
    -	$(NOECHO) $(ECHO) xdcdata $(BASEEXT).xdc >> $(BASEEXT).def
    -MAKE_FRAG
    -    }
    -
    -    # Reconstruct the X.Y.Z version.
    -    my $version = join '.', map { sprintf "%d", $_ }
    -                              $] =~ /(\d)\.(\d{3})(\d{2})/;
    -    $m .= sprintf '	$(LD) $(LDFLAGS) $(OBJECT:.obj=.obj) -desc "Perl %s Extension ($(BASEEXT))  XS_VERSION: $(XS_VERSION)" -nlmversion $(NLM_VERSION)', $version;
    -
    -    # Taking care of long names like FileHandle, ByteLoader, SDBM_File etc
    -    if($self->{NLM_SHORT_NAME}) {
    -        # In case of nlms with names exceeding 8 chars, build nlm in the 
    -        # current dir, rename and move to auto\lib.
    -        $m .= q{ -o $(NLM_SHORT_NAME).$(DLEXT)}
    -    } else {
    -        $m .= q{ -o $(INST_AUTODIR)\\$(BASEEXT).$(DLEXT)}
    -    }
    -
    -    # Add additional lib files if any (SDBM_File)
    -    $m .= q{ $(MYEXTLIB) } if $self->{MYEXTLIB};
    -
    -    $m .= q{ $(PERL_INC)\Main.lib -commandfile $(BASEEXT).def}."\n";
    -
    -    if($self->{NLM_SHORT_NAME}) {
    -        $m .= <<'MAKE_FRAG';
    -	if exist $(INST_AUTODIR)\$(NLM_SHORT_NAME).$(DLEXT) del $(INST_AUTODIR)\$(NLM_SHORT_NAME).$(DLEXT) 
    -	move $(NLM_SHORT_NAME).$(DLEXT) $(INST_AUTODIR)
    -MAKE_FRAG
    -    }
    -
    -    $m .= <<'MAKE_FRAG';
    -
    -	$(CHMOD) 755 $@
    -MAKE_FRAG
    -
    -    return $m;
    -}
    -
    -
    -1;
    -__END__
    -
    -=back
    -
    -=cut 
    -
    -
    diff --git a/lib/perl5/5.8.8/ExtUtils/MM_OS2.pm b/lib/perl5/5.8.8/ExtUtils/MM_OS2.pm
    deleted file mode 100644
    index 6bfb4a3f..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/MM_OS2.pm
    +++ /dev/null
    @@ -1,153 +0,0 @@
    -package ExtUtils::MM_OS2;
    -
    -use strict;
    -use vars qw($VERSION @ISA);
    -
    -use ExtUtils::MakeMaker qw(neatvalue);
    -use File::Spec;
    -
    -$VERSION = '1.05';
    -
    -require ExtUtils::MM_Any;
    -require ExtUtils::MM_Unix;
    -@ISA = qw(ExtUtils::MM_Any ExtUtils::MM_Unix);
    -
    -=pod
    -
    -=head1 NAME
    -
    -ExtUtils::MM_OS2 - methods to override UN*X behaviour in ExtUtils::MakeMaker
    -
    -=head1 SYNOPSIS
    -
    - use ExtUtils::MM_OS2; # Done internally by ExtUtils::MakeMaker if needed
    -
    -=head1 DESCRIPTION
    -
    -See ExtUtils::MM_Unix for a documentation of the methods provided
    -there. This package overrides the implementation of these methods, not
    -the semantics.
    -
    -=head1 METHODS
    -
    -=over 4
    -
    -=item init_dist
    -
    -Define TO_UNIX to convert OS2 linefeeds to Unix style.
    -
    -=cut
    -
    -sub init_dist {
    -    my($self) = @_;
    -
    -    $self->{TO_UNIX} ||= <<'MAKE_TEXT';
    -$(NOECHO) $(TEST_F) tmp.zip && $(RM_F) tmp.zip; $(ZIP) -ll -mr tmp.zip $(DISTVNAME) && unzip -o tmp.zip && $(RM_F) tmp.zip
    -MAKE_TEXT
    -
    -    $self->SUPER::init_dist;
    -}
    -
    -sub dlsyms {
    -    my($self,%attribs) = @_;
    -
    -    my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
    -    my($vars)  = $attribs{DL_VARS} || $self->{DL_VARS} || [];
    -    my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
    -    my($imports)  = $attribs{IMPORTS} || $self->{IMPORTS} || {};
    -    my(@m);
    -    (my $boot = $self->{NAME}) =~ s/:/_/g;
    -
    -    if (not $self->{SKIPHASH}{'dynamic'}) {
    -	push(@m,"
    -$self->{BASEEXT}.def: Makefile.PL
    -",
    -     '	$(PERL) "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -e \'use ExtUtils::Mksymlists; \\
    -     Mksymlists("NAME" => "$(NAME)", "DLBASE" => "$(DLBASE)", ',
    -     '"VERSION" => "$(VERSION)", "DISTNAME" => "$(DISTNAME)", ',
    -     '"INSTALLDIRS" => "$(INSTALLDIRS)", ',
    -     '"DL_FUNCS" => ',neatvalue($funcs),
    -     ', "FUNCLIST" => ',neatvalue($funclist),
    -     ', "IMPORTS" => ',neatvalue($imports),
    -     ', "DL_VARS" => ', neatvalue($vars), ');\'
    -');
    -    }
    -    if ($self->{IMPORTS} && %{$self->{IMPORTS}}) {
    -	# Make import files (needed for static build)
    -	-d 'tmp_imp' or mkdir 'tmp_imp', 0777 or die "Can't mkdir tmp_imp";
    -	open IMP, '>tmpimp.imp' or die "Can't open tmpimp.imp";
    -	my ($name, $exp);
    -	while (($name, $exp)= each %{$self->{IMPORTS}}) {
    -	    my ($lib, $id) = ($exp =~ /(.*)\.(.*)/) or die "Malformed IMPORT `$exp'";
    -	    print IMP "$name $lib $id ?\n";
    -	}
    -	close IMP or die "Can't close tmpimp.imp";
    -	# print "emximp -o tmpimp$Config::Config{lib_ext} tmpimp.imp\n";
    -	system "emximp -o tmpimp$Config::Config{lib_ext} tmpimp.imp" 
    -	    and die "Cannot make import library: $!, \$?=$?";
    -	unlink ;
    -	system "cd tmp_imp; $Config::Config{ar} x ../tmpimp$Config::Config{lib_ext}" 
    -	    and die "Cannot extract import objects: $!, \$?=$?";      
    -    }
    -    join('',@m);
    -}
    -
    -sub static_lib {
    -    my($self) = @_;
    -    my $old = $self->ExtUtils::MM_Unix::static_lib();
    -    return $old unless $self->{IMPORTS} && %{$self->{IMPORTS}};
    -    
    -    my @chunks = split /\n{2,}/, $old;
    -    shift @chunks unless length $chunks[0]; # Empty lines at the start
    -    $chunks[0] .= <<'EOC';
    -
    -	$(AR) $(AR_STATIC_ARGS) $@ tmp_imp/* && $(RANLIB) $@
    -EOC
    -    return join "\n\n". '', @chunks;
    -}
    -
    -sub replace_manpage_separator {
    -    my($self,$man) = @_;
    -    $man =~ s,/+,.,g;
    -    $man;
    -}
    -
    -sub maybe_command {
    -    my($self,$file) = @_;
    -    $file =~ s,[/\\]+,/,g;
    -    return $file if -x $file && ! -d _;
    -    return "$file.exe" if -x "$file.exe" && ! -d _;
    -    return "$file.cmd" if -x "$file.cmd" && ! -d _;
    -    return;
    -}
    -
    -=item init_linker
    -
    -=cut
    -
    -sub init_linker {
    -    my $self = shift;
    -
    -    $self->{PERL_ARCHIVE} = "\$(PERL_INC)/libperl\$(LIB_EXT)";
    -
    -    $self->{PERL_ARCHIVE_AFTER} = $OS2::is_aout
    -      ? ''
    -      : '$(PERL_INC)/libperl_override$(LIB_EXT)';
    -    $self->{EXPORT_LIST} = '$(BASEEXT).def';
    -}
    -
    -=item os_flavor
    -
    -OS/2 is OS/2
    -
    -=cut
    -
    -sub os_flavor {
    -    return('OS/2');
    -}
    -
    -=back
    -
    -=cut
    -
    -1;
    diff --git a/lib/perl5/5.8.8/ExtUtils/MM_QNX.pm b/lib/perl5/5.8.8/ExtUtils/MM_QNX.pm
    deleted file mode 100644
    index d975289e..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/MM_QNX.pm
    +++ /dev/null
    @@ -1,58 +0,0 @@
    -package ExtUtils::MM_QNX;
    -
    -use strict;
    -use vars qw($VERSION @ISA);
    -$VERSION = '0.02';
    -
    -require ExtUtils::MM_Unix;
    -@ISA = qw(ExtUtils::MM_Unix);
    -
    -
    -=head1 NAME
    -
    -ExtUtils::MM_QNX - QNX specific subclass of ExtUtils::MM_Unix
    -
    -=head1 SYNOPSIS
    -
    -  Don't use this module directly.
    -  Use ExtUtils::MM and let it choose.
    -
    -=head1 DESCRIPTION
    -
    -This is a subclass of ExtUtils::MM_Unix which contains functionality for
    -QNX.
    -
    -Unless otherwise stated it works just like ExtUtils::MM_Unix
    -
    -=head2 Overridden methods
    -
    -=head3 extra_clean_files
    -
    -Add .err files corresponding to each .c file.
    -
    -=cut
    -
    -sub extra_clean_files {
    -    my $self = shift;
    -
    -    my @errfiles = @{$self->{C}};
    -    for ( @errfiles ) {
    -	s/.c$/.err/;
    -    }
    -
    -    return( @errfiles, 'perlmain.err' );
    -}
    -
    -
    -=head1 AUTHOR
    -
    -Michael G Schwern  with code from ExtUtils::MM_Unix
    -
    -=head1 SEE ALSO
    -
    -L
    -
    -=cut
    -
    -
    -1;
    diff --git a/lib/perl5/5.8.8/ExtUtils/MM_UWIN.pm b/lib/perl5/5.8.8/ExtUtils/MM_UWIN.pm
    deleted file mode 100644
    index 1667d552..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/MM_UWIN.pm
    +++ /dev/null
    @@ -1,65 +0,0 @@
    -package ExtUtils::MM_UWIN;
    -
    -use strict;
    -use vars qw($VERSION @ISA);
    -$VERSION = 0.02;
    -
    -require ExtUtils::MM_Unix;
    -@ISA = qw(ExtUtils::MM_Unix);
    -
    -
    -=head1 NAME
    -
    -ExtUtils::MM_UWIN - U/WIN specific subclass of ExtUtils::MM_Unix
    -
    -=head1 SYNOPSIS
    -
    -  Don't use this module directly.
    -  Use ExtUtils::MM and let it choose.
    -
    -=head1 DESCRIPTION
    -
    -This is a subclass of ExtUtils::MM_Unix which contains functionality for
    -the AT&T U/WIN UNIX on Windows environment.
    -
    -Unless otherwise stated it works just like ExtUtils::MM_Unix
    -
    -=head2 Overridden methods
    -
    -=over 4
    -
    -=item os_flavor
    -
    -In addition to being Unix, we're U/WIN.
    -
    -=cut
    -
    -sub os_flavor {
    -    return('Unix', 'U/WIN');
    -}
    -
    -
    -=item B
    -
    -=cut
    -
    -sub replace_manpage_separator {
    -    my($self, $man) = @_;
    -
    -    $man =~ s,/+,.,g;
    -    return $man;
    -}
    -
    -=back
    -
    -=head1 AUTHOR
    -
    -Michael G Schwern  with code from ExtUtils::MM_Unix
    -
    -=head1 SEE ALSO
    -
    -L, L
    -
    -=cut
    -
    -1;
    diff --git a/lib/perl5/5.8.8/ExtUtils/MM_Unix.pm b/lib/perl5/5.8.8/ExtUtils/MM_Unix.pm
    deleted file mode 100644
    index 9d792a86..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/MM_Unix.pm
    +++ /dev/null
    @@ -1,3674 +0,0 @@
    -package ExtUtils::MM_Unix;
    -
    -require 5.005_03;  # Maybe further back, dunno
    -
    -use strict;
    -
    -use Exporter ();
    -use Carp;
    -use ExtUtils::MakeMaker::Config;
    -use File::Basename qw(basename dirname);
    -use DirHandle;
    -
    -use vars qw($VERSION @ISA
    -            $Is_OS2 $Is_VMS $Is_Win32 $Is_Dos
    -            $Is_OSF $Is_IRIX  $Is_NetBSD $Is_BSD
    -            $Is_SunOS4 $Is_Solaris $Is_SunOS $Is_Interix
    -            $Verbose %pm
    -            %Config_Override
    -           );
    -
    -use ExtUtils::MakeMaker qw($Verbose neatvalue);
    -
    -$VERSION = '1.50';
    -
    -require ExtUtils::MM_Any;
    -@ISA = qw(ExtUtils::MM_Any);
    -
    -BEGIN { 
    -    $Is_OS2     = $^O eq 'os2';
    -    $Is_Win32   = $^O eq 'MSWin32' || $Config{osname} eq 'NetWare';
    -    $Is_Dos     = $^O eq 'dos';
    -    $Is_VMS     = $^O eq 'VMS';
    -    $Is_OSF     = $^O eq 'dec_osf';
    -    $Is_IRIX    = $^O eq 'irix';
    -    $Is_NetBSD  = $^O eq 'netbsd';
    -    $Is_Interix = $^O eq 'interix';
    -    $Is_SunOS4  = $^O eq 'sunos';
    -    $Is_Solaris = $^O eq 'solaris';
    -    $Is_SunOS   = $Is_SunOS4 || $Is_Solaris;
    -    $Is_BSD     = $^O =~ /^(?:free|net|open)bsd$/ or
    -                  $^O eq 'bsdos' or $^O eq 'interix';
    -}
    -
    -BEGIN {
    -    if( $Is_VMS ) {
    -        # For things like vmsify()
    -        require VMS::Filespec;
    -        VMS::Filespec->import;
    -    }
    -}
    -
    -
    -=head1 NAME
    -
    -ExtUtils::MM_Unix - methods used by ExtUtils::MakeMaker
    -
    -=head1 SYNOPSIS
    -
    -C
    -
    -=head1 DESCRIPTION
    -
    -The methods provided by this package are designed to be used in
    -conjunction with ExtUtils::MakeMaker. When MakeMaker writes a
    -Makefile, it creates one or more objects that inherit their methods
    -from a package C. MM itself doesn't provide any methods, but it
    -ISA ExtUtils::MM_Unix class. The inheritance tree of MM lets operating
    -specific packages take the responsibility for all the methods provided
    -by MM_Unix. We are trying to reduce the number of the necessary
    -overrides by defining rather primitive operations within
    -ExtUtils::MM_Unix.
    -
    -If you are going to write a platform specific MM package, please try
    -to limit the necessary overrides to primitive methods, and if it is not
    -possible to do so, let's work out how to achieve that gain.
    -
    -If you are overriding any of these methods in your Makefile.PL (in the
    -MY class), please report that to the makemaker mailing list. We are
    -trying to minimize the necessary method overrides and switch to data
    -driven Makefile.PLs wherever possible. In the long run less methods
    -will be overridable via the MY class.
    -
    -=head1 METHODS
    -
    -The following description of methods is still under
    -development. Please refer to the code for not suitably documented
    -sections and complain loudly to the makemaker@perl.org mailing list.
    -Better yet, provide a patch.
    -
    -Not all of the methods below are overridable in a
    -Makefile.PL. Overridable methods are marked as (o). All methods are
    -overridable by a platform specific MM_*.pm file.
    -
    -Cross-platform methods are being moved into MM_Any.  If you can't find
    -something that used to be in here, look in MM_Any.
    -
    -=cut
    -
    -# So we don't have to keep calling the methods over and over again,
    -# we have these globals to cache the values.  Faster and shrtr.
    -my $Curdir  = __PACKAGE__->curdir;
    -my $Rootdir = __PACKAGE__->rootdir;
    -my $Updir   = __PACKAGE__->updir;
    -
    -
    -=head2 Methods
    -
    -=over 4
    -
    -=item os_flavor
    -
    -Simply says that we're Unix.
    -
    -=cut
    -
    -sub os_flavor {
    -    return('Unix');
    -}
    -
    -
    -=item c_o (o)
    -
    -Defines the suffix rules to compile different flavors of C files to
    -object files.
    -
    -=cut
    -
    -sub c_o {
    -# --- Translation Sections ---
    -
    -    my($self) = shift;
    -    return '' unless $self->needs_linking();
    -    my(@m);
    -    if (my $cpp = $Config{cpprun}) {
    -        my $cpp_cmd = $self->const_cccmd;
    -        $cpp_cmd =~ s/^CCCMD\s*=\s*\$\(CC\)/$cpp/;
    -        push @m, '
    -.c.i:
    -	'. $cpp_cmd . ' $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.c > $*.i
    -';
    -    }
    -    push @m, '
    -.c.s:
    -	$(CCCMD) -S $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.c
    -';
    -    push @m, '
    -.c$(OBJ_EXT):
    -	$(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.c
    -';
    -    push @m, '
    -.C$(OBJ_EXT):
    -	$(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.C
    -' if !$Is_OS2 and !$Is_Win32 and !$Is_Dos; #Case-specific
    -    push @m, '
    -.cpp$(OBJ_EXT):
    -	$(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.cpp
    -
    -.cxx$(OBJ_EXT):
    -	$(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.cxx
    -
    -.cc$(OBJ_EXT):
    -	$(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.cc
    -';
    -    join "", @m;
    -}
    -
    -=item cflags (o)
    -
    -Does very much the same as the cflags script in the perl
    -distribution. It doesn't return the whole compiler command line, but
    -initializes all of its parts. The const_cccmd method then actually
    -returns the definition of the CCCMD macro which uses these parts.
    -
    -=cut
    -
    -#'
    -
    -sub cflags {
    -    my($self,$libperl)=@_;
    -    return $self->{CFLAGS} if $self->{CFLAGS};
    -    return '' unless $self->needs_linking();
    -
    -    my($prog, $uc, $perltype, %cflags);
    -    $libperl ||= $self->{LIBPERL_A} || "libperl$self->{LIB_EXT}" ;
    -    $libperl =~ s/\.\$\(A\)$/$self->{LIB_EXT}/;
    -
    -    @cflags{qw(cc ccflags optimize shellflags)}
    -	= @Config{qw(cc ccflags optimize shellflags)};
    -    my($optdebug) = "";
    -
    -    $cflags{shellflags} ||= '';
    -
    -    my(%map) =  (
    -		D =>   '-DDEBUGGING',
    -		E =>   '-DEMBED',
    -		DE =>  '-DDEBUGGING -DEMBED',
    -		M =>   '-DEMBED -DMULTIPLICITY',
    -		DM =>  '-DDEBUGGING -DEMBED -DMULTIPLICITY',
    -		);
    -
    -    if ($libperl =~ /libperl(\w*)\Q$self->{LIB_EXT}/){
    -	$uc = uc($1);
    -    } else {
    -	$uc = ""; # avoid warning
    -    }
    -    $perltype = $map{$uc} ? $map{$uc} : "";
    -
    -    if ($uc =~ /^D/) {
    -	$optdebug = "-g";
    -    }
    -
    -
    -    my($name);
    -    ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
    -    if ($prog = $Config{$name}) {
    -	# Expand hints for this extension via the shell
    -	print STDOUT "Processing $name hint:\n" if $Verbose;
    -	my(@o)=`cc=\"$cflags{cc}\"
    -	  ccflags=\"$cflags{ccflags}\"
    -	  optimize=\"$cflags{optimize}\"
    -	  perltype=\"$cflags{perltype}\"
    -	  optdebug=\"$cflags{optdebug}\"
    -	  eval '$prog'
    -	  echo cc=\$cc
    -	  echo ccflags=\$ccflags
    -	  echo optimize=\$optimize
    -	  echo perltype=\$perltype
    -	  echo optdebug=\$optdebug
    -	  `;
    -	my($line);
    -	foreach $line (@o){
    -	    chomp $line;
    -	    if ($line =~ /(.*?)=\s*(.*)\s*$/){
    -		$cflags{$1} = $2;
    -		print STDOUT "	$1 = $2\n" if $Verbose;
    -	    } else {
    -		print STDOUT "Unrecognised result from hint: '$line'\n";
    -	    }
    -	}
    -    }
    -
    -    if ($optdebug) {
    -	$cflags{optimize} = $optdebug;
    -    }
    -
    -    for (qw(ccflags optimize perltype)) {
    -        $cflags{$_} ||= '';
    -	$cflags{$_} =~ s/^\s+//;
    -	$cflags{$_} =~ s/\s+/ /g;
    -	$cflags{$_} =~ s/\s+$//;
    -	$self->{uc $_} ||= $cflags{$_};
    -    }
    -
    -    if ($self->{POLLUTE}) {
    -	$self->{CCFLAGS} .= ' -DPERL_POLLUTE ';
    -    }
    -
    -    my $pollute = '';
    -    if ($Config{usemymalloc} and not $Config{bincompat5005}
    -	and not $Config{ccflags} =~ /-DPERL_POLLUTE_MALLOC\b/
    -	and $self->{PERL_MALLOC_OK}) {
    -	$pollute = '$(PERL_MALLOC_DEF)';
    -    }
    -
    -    $self->{CCFLAGS}  = quote_paren($self->{CCFLAGS});
    -    $self->{OPTIMIZE} = quote_paren($self->{OPTIMIZE});
    -
    -    return $self->{CFLAGS} = qq{
    -CCFLAGS = $self->{CCFLAGS}
    -OPTIMIZE = $self->{OPTIMIZE}
    -PERLTYPE = $self->{PERLTYPE}
    -MPOLLUTE = $pollute
    -};
    -
    -}
    -
    -
    -=item const_cccmd (o)
    -
    -Returns the full compiler call for C programs and stores the
    -definition in CONST_CCCMD.
    -
    -=cut
    -
    -sub const_cccmd {
    -    my($self,$libperl)=@_;
    -    return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
    -    return '' unless $self->needs_linking();
    -    return $self->{CONST_CCCMD} =
    -	q{CCCMD = $(CC) -c $(PASTHRU_INC) $(INC) \\
    -	$(CCFLAGS) $(OPTIMIZE) \\
    -	$(PERLTYPE) $(MPOLLUTE) $(DEFINE_VERSION) \\
    -	$(XS_DEFINE_VERSION)};
    -}
    -
    -=item const_config (o)
    -
    -Defines a couple of constants in the Makefile that are imported from
    -%Config.
    -
    -=cut
    -
    -sub const_config {
    -# --- Constants Sections ---
    -
    -    my($self) = shift;
    -    my(@m,$m);
    -    push(@m,"\n# These definitions are from config.sh (via $INC{'Config.pm'})\n");
    -    push(@m,"\n# They may have been overridden via Makefile.PL or on the command line\n");
    -    my(%once_only);
    -    foreach $m (@{$self->{CONFIG}}){
    -	# SITE*EXP macros are defined in &constants; avoid duplicates here
    -	next if $once_only{$m};
    -	$self->{uc $m} = quote_paren($self->{uc $m});
    -	push @m, uc($m) , ' = ' , $self->{uc $m}, "\n";
    -	$once_only{$m} = 1;
    -    }
    -    join('', @m);
    -}
    -
    -=item const_loadlibs (o)
    -
    -Defines EXTRALIBS, LDLOADLIBS, BSLOADLIBS, LD_RUN_PATH. See
    -L for details.
    -
    -=cut
    -
    -sub const_loadlibs {
    -    my($self) = shift;
    -    return "" unless $self->needs_linking;
    -    my @m;
    -    push @m, qq{
    -# $self->{NAME} might depend on some other libraries:
    -# See ExtUtils::Liblist for details
    -#
    -};
    -    my($tmp);
    -    for $tmp (qw/
    -	 EXTRALIBS LDLOADLIBS BSLOADLIBS
    -	 /) {
    -	next unless defined $self->{$tmp};
    -	push @m, "$tmp = $self->{$tmp}\n";
    -    }
    -    # don't set LD_RUN_PATH if empty
    -    for $tmp (qw/
    -	 LD_RUN_PATH
    -	 /) {
    -	next unless $self->{$tmp};
    -	push @m, "$tmp = $self->{$tmp}\n";
    -    }
    -    return join "", @m;
    -}
    -
    -=item constants (o)
    -
    -  my $make_frag = $mm->constants;
    -
    -Prints out macros for lots of constants.
    -
    -=cut
    -
    -sub constants {
    -    my($self) = @_;
    -    my @m = ();
    -
    -    $self->{DFSEP} = '$(DIRFILESEP)';  # alias for internal use
    -
    -    for my $macro (qw(
    -
    -              AR_STATIC_ARGS DIRFILESEP DFSEP
    -              NAME NAME_SYM 
    -              VERSION    VERSION_MACRO    VERSION_SYM DEFINE_VERSION
    -              XS_VERSION XS_VERSION_MACRO             XS_DEFINE_VERSION
    -              INST_ARCHLIB INST_SCRIPT INST_BIN INST_LIB
    -              INST_MAN1DIR INST_MAN3DIR
    -              MAN1EXT      MAN3EXT
    -              INSTALLDIRS INSTALLBASE DESTDIR PREFIX
    -              PERLPREFIX      SITEPREFIX      VENDORPREFIX
    -                   ),
    -                   (map { ("INSTALL".$_,
    -                          "DESTINSTALL".$_)
    -                        } $self->installvars),
    -                   qw(
    -              PERL_LIB    
    -              PERL_ARCHLIB
    -              LIBPERL_A MYEXTLIB
    -              FIRST_MAKEFILE MAKEFILE_OLD MAKE_APERL_FILE 
    -              PERLMAINCC PERL_SRC PERL_INC 
    -              PERL            FULLPERL          ABSPERL
    -              PERLRUN         FULLPERLRUN       ABSPERLRUN
    -              PERLRUNINST     FULLPERLRUNINST   ABSPERLRUNINST
    -              PERL_CORE
    -              PERM_RW PERM_RWX
    -
    -	      ) ) 
    -    {
    -	next unless defined $self->{$macro};
    -
    -        # pathnames can have sharp signs in them; escape them so
    -        # make doesn't think it is a comment-start character.
    -        $self->{$macro} =~ s/#/\\#/g;
    -	push @m, "$macro = $self->{$macro}\n";
    -    }
    -
    -    push @m, qq{
    -MAKEMAKER   = $self->{MAKEMAKER}
    -MM_VERSION  = $self->{MM_VERSION}
    -MM_REVISION = $self->{MM_REVISION}
    -};
    -
    -    push @m, q{
    -# FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle).
    -# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle)
    -# PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar)
    -# DLBASE  = Basename part of dynamic library. May be just equal BASEEXT.
    -};
    -
    -    for my $macro (qw/
    -              MAKE
    -	      FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT
    -	      LDFROM LINKTYPE BOOTDEP
    -	      /	) 
    -    {
    -	next unless defined $self->{$macro};
    -	push @m, "$macro = $self->{$macro}\n";
    -    }
    -
    -    push @m, "
    -# Handy lists of source code files:
    -XS_FILES = ".$self->wraplist(sort keys %{$self->{XS}})."
    -C_FILES  = ".$self->wraplist(@{$self->{C}})."
    -O_FILES  = ".$self->wraplist(@{$self->{O_FILES}})."
    -H_FILES  = ".$self->wraplist(@{$self->{H}})."
    -MAN1PODS = ".$self->wraplist(sort keys %{$self->{MAN1PODS}})."
    -MAN3PODS = ".$self->wraplist(sort keys %{$self->{MAN3PODS}})."
    -";
    -
    -
    -    push @m, q{
    -# Where is the Config information that we are using/depend on
    -CONFIGDEP = $(PERL_ARCHLIB)$(DFSEP)Config.pm $(PERL_INC)$(DFSEP)config.h
    -};
    -
    -
    -    push @m, qq{
    -# Where to build things
    -INST_LIBDIR      = $self->{INST_LIBDIR}
    -INST_ARCHLIBDIR  = $self->{INST_ARCHLIBDIR}
    -
    -INST_AUTODIR     = $self->{INST_AUTODIR}
    -INST_ARCHAUTODIR = $self->{INST_ARCHAUTODIR}
    -
    -INST_STATIC      = $self->{INST_STATIC}
    -INST_DYNAMIC     = $self->{INST_DYNAMIC}
    -INST_BOOT        = $self->{INST_BOOT}
    -};
    -
    -
    -    push @m, qq{
    -# Extra linker info
    -EXPORT_LIST        = $self->{EXPORT_LIST}
    -PERL_ARCHIVE       = $self->{PERL_ARCHIVE}
    -PERL_ARCHIVE_AFTER = $self->{PERL_ARCHIVE_AFTER}
    -};
    -
    -    push @m, "
    -
    -TO_INST_PM = ".$self->wraplist(sort keys %{$self->{PM}})."
    -
    -PM_TO_BLIB = ".$self->wraplist(%{$self->{PM}})."
    -";
    -
    -    join('',@m);
    -}
    -
    -
    -=item depend (o)
    -
    -Same as macro for the depend attribute.
    -
    -=cut
    -
    -sub depend {
    -    my($self,%attribs) = @_;
    -    my(@m,$key,$val);
    -    while (($key,$val) = each %attribs){
    -	last unless defined $key;
    -	push @m, "$key : $val\n";
    -    }
    -    join "", @m;
    -}
    -
    -
    -=item init_DEST
    -
    -  $mm->init_DEST
    -
    -Defines the DESTDIR and DEST* variables paralleling the INSTALL*.
    -
    -=cut
    -
    -sub init_DEST {
    -    my $self = shift;
    -
    -    # Initialize DESTDIR
    -    $self->{DESTDIR} ||= '';
    -
    -    # Make DEST variables.
    -    foreach my $var ($self->installvars) {
    -        my $destvar = 'DESTINSTALL'.$var;
    -        $self->{$destvar} ||= '$(DESTDIR)$(INSTALL'.$var.')';
    -    }
    -}
    -
    -
    -=item init_dist
    -
    -  $mm->init_dist;
    -
    -Defines a lot of macros for distribution support.
    -
    -  macro         description                     default
    -
    -  TAR           tar command to use              tar
    -  TARFLAGS      flags to pass to TAR            cvf
    -
    -  ZIP           zip command to use              zip
    -  ZIPFLAGS      flags to pass to ZIP            -r
    -
    -  COMPRESS      compression command to          gzip --best
    -                use for tarfiles
    -  SUFFIX        suffix to put on                .gz 
    -                compressed files
    -
    -  SHAR          shar command to use             shar
    -
    -  PREOP         extra commands to run before
    -                making the archive 
    -  POSTOP        extra commands to run after
    -                making the archive
    -
    -  TO_UNIX       a command to convert linefeeds
    -                to Unix style in your archive 
    -
    -  CI            command to checkin your         ci -u
    -                sources to version control
    -  RCS_LABEL     command to label your sources   rcs -Nv$(VERSION_SYM): -q
    -                just after CI is run
    -
    -  DIST_CP       $how argument to manicopy()     best
    -                when the distdir is created
    -
    -  DIST_DEFAULT  default target to use to        tardist
    -                create a distribution
    -
    -  DISTVNAME     name of the resulting archive   $(DISTNAME)-$(VERSION)
    -                (minus suffixes)
    -
    -=cut
    -
    -sub init_dist {
    -    my $self = shift;
    -
    -    $self->{TAR}      ||= 'tar';
    -    $self->{TARFLAGS} ||= 'cvf';
    -    $self->{ZIP}      ||= 'zip';
    -    $self->{ZIPFLAGS} ||= '-r';
    -    $self->{COMPRESS} ||= 'gzip --best';
    -    $self->{SUFFIX}   ||= '.gz';
    -    $self->{SHAR}     ||= 'shar';
    -    $self->{PREOP}    ||= '$(NOECHO) $(NOOP)'; # eg update MANIFEST
    -    $self->{POSTOP}   ||= '$(NOECHO) $(NOOP)'; # eg remove the distdir
    -    $self->{TO_UNIX}  ||= '$(NOECHO) $(NOOP)';
    -
    -    $self->{CI}       ||= 'ci -u';
    -    $self->{RCS_LABEL}||= 'rcs -Nv$(VERSION_SYM): -q';
    -    $self->{DIST_CP}  ||= 'best';
    -    $self->{DIST_DEFAULT} ||= 'tardist';
    -
    -    ($self->{DISTNAME} = $self->{NAME}) =~ s{::}{-}g unless $self->{DISTNAME};
    -    $self->{DISTVNAME} ||= $self->{DISTNAME}.'-'.$self->{VERSION};
    -
    -}
    -
    -=item dist (o)
    -
    -  my $dist_macros = $mm->dist(%overrides);
    -
    -Generates a make fragment defining all the macros initialized in
    -init_dist.
    -
    -%overrides can be used to override any of the above.
    -
    -=cut
    -
    -sub dist {
    -    my($self, %attribs) = @_;
    -
    -    my $make = '';
    -    foreach my $key (qw( 
    -            TAR TARFLAGS ZIP ZIPFLAGS COMPRESS SUFFIX SHAR
    -            PREOP POSTOP TO_UNIX
    -            CI RCS_LABEL DIST_CP DIST_DEFAULT
    -            DISTNAME DISTVNAME
    -           ))
    -    {
    -        my $value = $attribs{$key} || $self->{$key};
    -        $make .= "$key = $value\n";
    -    }
    -
    -    return $make;
    -}
    -
    -=item dist_basics (o)
    -
    -Defines the targets distclean, distcheck, skipcheck, manifest, veryclean.
    -
    -=cut
    -
    -sub dist_basics {
    -    my($self) = shift;
    -
    -    return <<'MAKE_FRAG';
    -distclean :: realclean distcheck
    -	$(NOECHO) $(NOOP)
    -
    -distcheck :
    -	$(PERLRUN) "-MExtUtils::Manifest=fullcheck" -e fullcheck
    -
    -skipcheck :
    -	$(PERLRUN) "-MExtUtils::Manifest=skipcheck" -e skipcheck
    -
    -manifest :
    -	$(PERLRUN) "-MExtUtils::Manifest=mkmanifest" -e mkmanifest
    -
    -veryclean : realclean
    -	$(RM_F) *~ *.orig */*~ */*.orig
    -
    -MAKE_FRAG
    -
    -}
    -
    -=item dist_ci (o)
    -
    -Defines a check in target for RCS.
    -
    -=cut
    -
    -sub dist_ci {
    -    my($self) = shift;
    -    return q{
    -ci :
    -	$(PERLRUN) "-MExtUtils::Manifest=maniread" \\
    -	  -e "@all = keys %{ maniread() };" \\
    -	  -e "print(qq{Executing $(CI) @all\n}); system(qq{$(CI) @all});" \\
    -	  -e "print(qq{Executing $(RCS_LABEL) ...\n}); system(qq{$(RCS_LABEL) @all});"
    -};
    -}
    -
    -=item dist_core (o)
    -
    -  my $dist_make_fragment = $MM->dist_core;
    -
    -Puts the targets necessary for 'make dist' together into one make
    -fragment.
    -
    -=cut
    -
    -sub dist_core {
    -    my($self) = shift;
    -
    -    my $make_frag = '';
    -    foreach my $target (qw(dist tardist uutardist tarfile zipdist zipfile 
    -                           shdist))
    -    {
    -        my $method = $target.'_target';
    -        $make_frag .= "\n";
    -        $make_frag .= $self->$method();
    -    }
    -
    -    return $make_frag;
    -}
    -
    -
    -=item B
    -
    -  my $make_frag = $MM->dist_target;
    -
    -Returns the 'dist' target to make an archive for distribution.  This
    -target simply checks to make sure the Makefile is up-to-date and
    -depends on $(DIST_DEFAULT).
    -
    -=cut
    -
    -sub dist_target {
    -    my($self) = shift;
    -
    -    my $date_check = $self->oneliner(<<'CODE', ['-l']);
    -print 'Warning: Makefile possibly out of date with $(VERSION_FROM)'
    -    if -e '$(VERSION_FROM)' and -M '$(VERSION_FROM)' < -M '$(FIRST_MAKEFILE)';
    -CODE
    -
    -    return sprintf <<'MAKE_FRAG', $date_check;
    -dist : $(DIST_DEFAULT) $(FIRST_MAKEFILE)
    -	$(NOECHO) %s
    -MAKE_FRAG
    -}
    -
    -=item B
    -
    -  my $make_frag = $MM->tardist_target;
    -
    -Returns the 'tardist' target which is simply so 'make tardist' works.
    -The real work is done by the dynamically named tardistfile_target()
    -method, tardist should have that as a dependency.
    -
    -=cut
    -
    -sub tardist_target {
    -    my($self) = shift;
    -
    -    return <<'MAKE_FRAG';
    -tardist : $(DISTVNAME).tar$(SUFFIX)
    -	$(NOECHO) $(NOOP)
    -MAKE_FRAG
    -}
    -
    -=item B
    -
    -  my $make_frag = $MM->zipdist_target;
    -
    -Returns the 'zipdist' target which is simply so 'make zipdist' works.
    -The real work is done by the dynamically named zipdistfile_target()
    -method, zipdist should have that as a dependency.
    -
    -=cut
    -
    -sub zipdist_target {
    -    my($self) = shift;
    -
    -    return <<'MAKE_FRAG';
    -zipdist : $(DISTVNAME).zip
    -	$(NOECHO) $(NOOP)
    -MAKE_FRAG
    -}
    -
    -=item B
    -
    -  my $make_frag = $MM->tarfile_target;
    -
    -The name of this target is the name of the tarball generated by
    -tardist.  This target does the actual work of turning the distdir into
    -a tarball.
    -
    -=cut
    -
    -sub tarfile_target {
    -    my($self) = shift;
    -
    -    return <<'MAKE_FRAG';
    -$(DISTVNAME).tar$(SUFFIX) : distdir
    -	$(PREOP)
    -	$(TO_UNIX)
    -	$(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME)
    -	$(RM_RF) $(DISTVNAME)
    -	$(COMPRESS) $(DISTVNAME).tar
    -	$(POSTOP)
    -MAKE_FRAG
    -}
    -
    -=item zipfile_target
    -
    -  my $make_frag = $MM->zipfile_target;
    -
    -The name of this target is the name of the zip file generated by
    -zipdist.  This target does the actual work of turning the distdir into
    -a zip file.
    -
    -=cut
    -
    -sub zipfile_target {
    -    my($self) = shift;
    -
    -    return <<'MAKE_FRAG';
    -$(DISTVNAME).zip : distdir
    -	$(PREOP)
    -	$(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME)
    -	$(RM_RF) $(DISTVNAME)
    -	$(POSTOP)
    -MAKE_FRAG
    -}
    -
    -=item uutardist_target
    -
    -  my $make_frag = $MM->uutardist_target;
    -
    -Converts the tarfile into a uuencoded file
    -
    -=cut
    -
    -sub uutardist_target {
    -    my($self) = shift;
    -
    -    return <<'MAKE_FRAG';
    -uutardist : $(DISTVNAME).tar$(SUFFIX)
    -	uuencode $(DISTVNAME).tar$(SUFFIX) $(DISTVNAME).tar$(SUFFIX) > $(DISTVNAME).tar$(SUFFIX)_uu
    -MAKE_FRAG
    -}
    -
    -
    -=item shdist_target
    -
    -  my $make_frag = $MM->shdist_target;
    -
    -Converts the distdir into a shell archive.
    -
    -=cut
    -
    -sub shdist_target {
    -    my($self) = shift;
    -
    -    return <<'MAKE_FRAG';
    -shdist : distdir
    -	$(PREOP)
    -	$(SHAR) $(DISTVNAME) > $(DISTVNAME).shar
    -	$(RM_RF) $(DISTVNAME)
    -	$(POSTOP)
    -MAKE_FRAG
    -}
    -
    -
    -=item dlsyms (o)
    -
    -Used by some OS' to define DL_FUNCS and DL_VARS and write the *.exp files.
    -
    -Normally just returns an empty string.
    -
    -=cut
    -
    -sub dlsyms {
    -    return '';
    -}
    -
    -
    -=item dynamic_bs (o)
    -
    -Defines targets for bootstrap files.
    -
    -=cut
    -
    -sub dynamic_bs {
    -    my($self, %attribs) = @_;
    -    return '
    -BOOTSTRAP =
    -' unless $self->has_link_code();
    -
    -    my $target = $Is_VMS ? '$(MMS$TARGET)' : '$@';
    -
    -    return sprintf <<'MAKE_FRAG', ($target) x 5;
    -BOOTSTRAP = $(BASEEXT).bs
    -
    -# As Mkbootstrap might not write a file (if none is required)
    -# we use touch to prevent make continually trying to remake it.
    -# The DynaLoader only reads a non-empty file.
    -$(BOOTSTRAP) : $(FIRST_MAKEFILE) $(BOOTDEP) $(INST_ARCHAUTODIR)$(DFSEP).exists
    -	$(NOECHO) $(ECHO) "Running Mkbootstrap for $(NAME) ($(BSLOADLIBS))"
    -	$(NOECHO) $(PERLRUN) \
    -		"-MExtUtils::Mkbootstrap" \
    -		-e "Mkbootstrap('$(BASEEXT)','$(BSLOADLIBS)');"
    -	$(NOECHO) $(TOUCH) %s
    -	$(CHMOD) $(PERM_RW) %s
    -
    -$(INST_BOOT) : $(BOOTSTRAP) $(INST_ARCHAUTODIR)$(DFSEP).exists
    -	$(NOECHO) $(RM_RF) %s
    -	- $(CP) $(BOOTSTRAP) %s
    -	$(CHMOD) $(PERM_RW) %s
    -MAKE_FRAG
    -}
    -
    -=item dynamic_lib (o)
    -
    -Defines how to produce the *.so (or equivalent) files.
    -
    -=cut
    -
    -sub dynamic_lib {
    -    my($self, %attribs) = @_;
    -    return '' unless $self->needs_linking(); #might be because of a subdir
    -
    -    return '' unless $self->has_link_code;
    -
    -    my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
    -    my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
    -    my($armaybe) = $attribs{ARMAYBE} || $self->{ARMAYBE} || ":";
    -    my($ldfrom) = '$(LDFROM)';
    -    $armaybe = 'ar' if ($Is_OSF and $armaybe eq ':');
    -    my(@m);
    -    my $ld_opt = $Is_OS2 ? '$(OPTIMIZE) ' : '';	# Useful on other systems too?
    -    my $ld_fix = $Is_OS2 ? '|| ( $(RM_F) $@ && sh -c false )' : '';
    -    push(@m,'
    -# This section creates the dynamically loadable $(INST_DYNAMIC)
    -# from $(OBJECT) and possibly $(MYEXTLIB).
    -ARMAYBE = '.$armaybe.'
    -OTHERLDFLAGS = '.$ld_opt.$otherldflags.'
    -INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
    -INST_DYNAMIC_FIX = '.$ld_fix.'
    -
    -$(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)$(DFSEP).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(PERL_ARCHIVE_AFTER) $(INST_DYNAMIC_DEP)
    -');
    -    if ($armaybe ne ':'){
    -	$ldfrom = 'tmp$(LIB_EXT)';
    -	push(@m,'	$(ARMAYBE) cr '.$ldfrom.' $(OBJECT)'."\n");
    -	push(@m,'	$(RANLIB) '."$ldfrom\n");
    -    }
    -    $ldfrom = "-all $ldfrom -none" if $Is_OSF;
    -
    -    # The IRIX linker doesn't use LD_RUN_PATH
    -    my $ldrun = $Is_IRIX && $self->{LD_RUN_PATH} ?         
    -                       qq{-rpath "$self->{LD_RUN_PATH}"} : '';
    -
    -    # For example in AIX the shared objects/libraries from previous builds
    -    # linger quite a while in the shared dynalinker cache even when nobody
    -    # is using them.  This is painful if one for instance tries to restart
    -    # a failed build because the link command will fail unnecessarily 'cos
    -    # the shared object/library is 'busy'.
    -    push(@m,'	$(RM_F) $@
    -');
    -
    -    my $libs = '$(LDLOADLIBS)';
    -
    -    if (($Is_NetBSD || $Is_Interix) && $Config{'useshrplib'}) {
    -	# Use nothing on static perl platforms, and to the flags needed
    -	# to link against the shared libperl library on shared perl
    -	# platforms.  We peek at lddlflags to see if we need -Wl,-R
    -	# or -R to add paths to the run-time library search path.
    -        if ($Config{'lddlflags'} =~ /-Wl,-R/) {
    -            $libs .= ' -L$(PERL_INC) -Wl,-R$(INSTALLARCHLIB)/CORE -Wl,-R$(PERL_ARCHLIB)/CORE -lperl';
    -        } elsif ($Config{'lddlflags'} =~ /-R/) {
    -            $libs .= ' -L$(PERL_INC) -R$(INSTALLARCHLIB)/CORE -R$(PERL_ARCHLIB)/CORE -lperl';
    -        }
    -    }
    -
    -    my $ld_run_path_shell = "";
    -    if ($self->{LD_RUN_PATH} ne "") {
    -	$ld_run_path_shell = 'LD_RUN_PATH="$(LD_RUN_PATH)" ';
    -    }
    -
    -    push @m, sprintf <<'MAKE', $ld_run_path_shell, $ldrun, $ldfrom, $libs;
    -	%s$(LD) %s $(LDDLFLAGS) %s $(OTHERLDFLAGS) -o $@ $(MYEXTLIB)	\
    -	  $(PERL_ARCHIVE) %s $(PERL_ARCHIVE_AFTER) $(EXPORT_LIST)	\
    -	  $(INST_DYNAMIC_FIX)
    -MAKE
    -
    -    push @m, <<'MAKE';
    -	$(CHMOD) $(PERM_RWX) $@
    -MAKE
    -
    -    return join('',@m);
    -}
    -
    -=item exescan
    -
    -Deprecated method. Use libscan instead.
    -
    -=cut
    -
    -sub exescan {
    -    my($self,$path) = @_;
    -    $path;
    -}
    -
    -=item extliblist
    -
    -Called by init_others, and calls ext ExtUtils::Liblist. See
    -L for details.
    -
    -=cut
    -
    -sub extliblist {
    -    my($self,$libs) = @_;
    -    require ExtUtils::Liblist;
    -    $self->ext($libs, $Verbose);
    -}
    -
    -=item find_perl
    -
    -Finds the executables PERL and FULLPERL
    -
    -=cut
    -
    -sub find_perl {
    -    my($self, $ver, $names, $dirs, $trace) = @_;
    -    my($name, $dir);
    -    if ($trace >= 2){
    -        print "Looking for perl $ver by these names:
    -@$names
    -in these dirs:
    -@$dirs
    -";
    -    }
    -
    -    my $stderr_duped = 0;
    -    local *STDERR_COPY;
    -    unless ($Is_BSD) {
    -        if( open(STDERR_COPY, '>&STDERR') ) {
    -            $stderr_duped = 1;
    -        }
    -        else {
    -            warn <{PERL_SRC} may be undefined
    -            my ($abs, $val);
    -            if ($self->file_name_is_absolute($name)) {     # /foo/bar
    -                $abs = $name;
    -            } elsif ($self->canonpath($name) eq 
    -                     $self->canonpath(basename($name))) {  # foo
    -                $abs = $self->catfile($dir, $name);
    -            } else {                                            # foo/bar
    -                $abs = $self->catfile($Curdir, $name);
    -            }
    -            print "Checking $abs\n" if ($trace >= 2);
    -            next unless $self->maybe_command($abs);
    -            print "Executing $abs\n" if ($trace >= 2);
    -
    -            my $version_check = qq{$abs -le "require $ver; print qq{VER_OK}"};
    -            # To avoid using the unportable 2>&1 to supress STDERR,
    -            # we close it before running the command.
    -            # However, thanks to a thread library bug in many BSDs
    -            # ( http://www.freebsd.org/cgi/query-pr.cgi?pr=51535 )
    -            # we cannot use the fancier more portable way in here
    -            # but instead need to use the traditional 2>&1 construct.
    -            if ($Is_BSD) {
    -                $val = `$version_check 2>&1`;
    -            } else {
    -                close STDERR if $stderr_duped;
    -                $val = `$version_check`;
    -                open STDERR, '>&STDERR_COPY' if $stderr_duped;
    -            }
    -
    -            if ($val =~ /^VER_OK/) {
    -                print "Using PERL=$abs\n" if $trace;
    -                return $abs;
    -            } elsif ($trace >= 2) {
    -                print "Result: '$val'\n";
    -            }
    -        }
    -    }
    -    print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
    -    0; # false and not empty
    -}
    -
    -
    -=item fixin
    -
    -  $mm->fixin(@files);
    -
    -Inserts the sharpbang or equivalent magic number to a set of @files.
    -
    -=cut
    -
    -sub fixin { # stolen from the pink Camel book, more or less
    -    my($self, @files) = @_;
    -
    -    my($does_shbang) = $Config{'sharpbang'} =~ /^\s*\#\!/;
    -    for my $file (@files) {
    -        my $file_new = "$file.new";
    -        my $file_bak = "$file.bak";
    -
    -	local(*FIXIN);
    -	local(*FIXOUT);
    -	open(FIXIN, $file) or croak "Can't process '$file': $!";
    -	local $/ = "\n";
    -	chomp(my $line = );
    -	next unless $line =~ s/^\s*\#!\s*//;     # Not a shbang file.
    -	# Now figure out the interpreter name.
    -	my($cmd,$arg) = split ' ', $line, 2;
    -	$cmd =~ s!^.*/!!;
    -
    -	# Now look (in reverse) for interpreter in absolute PATH (unless perl).
    -        my $interpreter;
    -	if ($cmd eq "perl") {
    -            if ($Config{startperl} =~ m,^\#!.*/perl,) {
    -                $interpreter = $Config{startperl};
    -                $interpreter =~ s,^\#!,,;
    -            } else {
    -                $interpreter = $Config{perlpath};
    -            }
    -	} else {
    -	    my(@absdirs) = reverse grep {$self->file_name_is_absolute} $self->path;
    -	    $interpreter = '';
    -	    my($dir);
    -	    foreach $dir (@absdirs) {
    -		if ($self->maybe_command($cmd)) {
    -		    warn "Ignoring $interpreter in $file\n" if $Verbose && $interpreter;
    -		    $interpreter = $self->catfile($dir,$cmd);
    -		}
    -	    }
    -	}
    -	# Figure out how to invoke interpreter on this machine.
    -
    -	my($shb) = "";
    -	if ($interpreter) {
    -	    print STDOUT "Changing sharpbang in $file to $interpreter" if $Verbose;
    -	    # this is probably value-free on DOSISH platforms
    -	    if ($does_shbang) {
    -		$shb .= "$Config{'sharpbang'}$interpreter";
    -		$shb .= ' ' . $arg if defined $arg;
    -		$shb .= "\n";
    -	    }
    -	    $shb .= qq{
    -eval 'exec $interpreter $arg -S \$0 \${1+"\$\@"}'
    -    if 0; # not running under some shell
    -} unless $Is_Win32; # this won't work on win32, so don't
    -	} else {
    -	    warn "Can't find $cmd in PATH, $file unchanged"
    -		if $Verbose;
    -	    next;
    -	}
    -
    -	unless ( open(FIXOUT,">$file_new") ) {
    -	    warn "Can't create new $file: $!\n";
    -	    next;
    -	}
    -	
    -	# Print out the new #! line (or equivalent).
    -	local $\;
    -	undef $/;
    -	print FIXOUT $shb, ;
    -	close FIXIN;
    -	close FIXOUT;
    -
    -        chmod 0666, $file_bak;
    -        unlink $file_bak;
    -	unless ( _rename($file, $file_bak) ) {	
    -	    warn "Can't rename $file to $file_bak: $!";
    -	    next;
    -	}
    -	unless ( _rename($file_new, $file) ) {	
    -	    warn "Can't rename $file_new to $file: $!";
    -	    unless ( _rename($file_bak, $file) ) {
    -	        warn "Can't rename $file_bak back to $file either: $!";
    -		warn "Leaving $file renamed as $file_bak\n";
    -	    }
    -	    next;
    -	}
    -	unlink $file_bak;
    -    } continue {
    -	close(FIXIN) if fileno(FIXIN);
    -	system("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';;
    -    }
    -}
    -
    -
    -sub _rename {
    -    my($old, $new) = @_;
    -
    -    foreach my $file ($old, $new) {
    -        if( $Is_VMS and basename($file) !~ /\./ ) {
    -            # rename() in 5.8.0 on VMS will not rename a file if it
    -            # does not contain a dot yet it returns success.
    -            $file = "$file.";
    -        }
    -    }
    -
    -    return rename($old, $new);
    -}
    -
    -
    -=item force (o)
    -
    -Writes an empty FORCE: target.
    -
    -=cut
    -
    -sub force {
    -    my($self) = shift;
    -    '# Phony target to force checking subdirectories.
    -FORCE:
    -	$(NOECHO) $(NOOP)
    -';
    -}
    -
    -=item guess_name
    -
    -Guess the name of this package by examining the working directory's
    -name. MakeMaker calls this only if the developer has not supplied a
    -NAME attribute.
    -
    -=cut
    -
    -# ';
    -
    -sub guess_name {
    -    my($self) = @_;
    -    use Cwd 'cwd';
    -    my $name = basename(cwd());
    -    $name =~ s|[\-_][\d\.\-]+\z||;  # this is new with MM 5.00, we
    -                                    # strip minus or underline
    -                                    # followed by a float or some such
    -    print "Warning: Guessing NAME [$name] from current directory name.\n";
    -    $name;
    -}
    -
    -=item has_link_code
    -
    -Returns true if C, XS, MYEXTLIB or similar objects exist within this
    -object that need a compiler. Does not descend into subdirectories as
    -needs_linking() does.
    -
    -=cut
    -
    -sub has_link_code {
    -    my($self) = shift;
    -    return $self->{HAS_LINK_CODE} if defined $self->{HAS_LINK_CODE};
    -    if ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB}){
    -	$self->{HAS_LINK_CODE} = 1;
    -	return 1;
    -    }
    -    return $self->{HAS_LINK_CODE} = 0;
    -}
    -
    -
    -=item init_dirscan
    -
    -Scans the directory structure and initializes DIR, XS, XS_FILES, PM,
    -C, C_FILES, O_FILES, H, H_FILES, PL_FILES, MAN*PODS, EXE_FILES.
    -
    -Called by init_main.
    -
    -=cut
    -
    -sub init_dirscan {	# --- File and Directory Lists (.xs .pm .pod etc)
    -    my($self) = @_;
    -    my($name, %dir, %xs, %c, %h, %pl_files, %manifypods);
    -    my %pm;
    -
    -    my %ignore = map {( $_ => 1 )} qw(Makefile.PL Build.PL test.pl t);
    -
    -    # ignore the distdir
    -    $Is_VMS ? $ignore{"$self->{DISTVNAME}.dir"} = 1
    -            : $ignore{$self->{DISTVNAME}} = 1;
    -
    -    @ignore{map lc, keys %ignore} = values %ignore if $Is_VMS;
    -
    -    foreach $name ($self->lsdir($Curdir)){
    -	next if $name =~ /\#/;
    -	next if $name eq $Curdir or $name eq $Updir or $ignore{$name};
    -	next unless $self->libscan($name);
    -	if (-d $name){
    -	    next if -l $name; # We do not support symlinks at all
    -            next if $self->{NORECURS};
    -	    $dir{$name} = $name if (-f $self->catfile($name,"Makefile.PL"));
    -	} elsif ($name =~ /\.xs\z/){
    -	    my($c); ($c = $name) =~ s/\.xs\z/.c/;
    -	    $xs{$name} = $c;
    -	    $c{$c} = 1;
    -	} elsif ($name =~ /\.c(pp|xx|c)?\z/i){  # .c .C .cpp .cxx .cc
    -	    $c{$name} = 1
    -		unless $name =~ m/perlmain\.c/; # See MAP_TARGET
    -	} elsif ($name =~ /\.h\z/i){
    -	    $h{$name} = 1;
    -	} elsif ($name =~ /\.PL\z/) {
    -	    ($pl_files{$name} = $name) =~ s/\.PL\z// ;
    -	} elsif (($Is_VMS || $Is_Dos) && $name =~ /[._]pl$/i) {
    -	    # case-insensitive filesystem, one dot per name, so foo.h.PL
    -	    # under Unix appears as foo.h_pl under VMS or fooh.pl on Dos
    -	    local($/); open(PL,$name); my $txt = ; close PL;
    -	    if ($txt =~ /Extracting \S+ \(with variable substitutions/) {
    -		($pl_files{$name} = $name) =~ s/[._]pl\z//i ;
    -	    }
    -	    else { 
    -                $pm{$name} = $self->catfile($self->{INST_LIBDIR},$name); 
    -            }
    -	} elsif ($name =~ /\.(p[ml]|pod)\z/){
    -	    $pm{$name} = $self->catfile($self->{INST_LIBDIR},$name);
    -	}
    -    }
    -
    -    # Some larger extensions often wish to install a number of *.pm/pl
    -    # files into the library in various locations.
    -
    -    # The attribute PMLIBDIRS holds an array reference which lists
    -    # subdirectories which we should search for library files to
    -    # install. PMLIBDIRS defaults to [ 'lib', $self->{BASEEXT} ].  We
    -    # recursively search through the named directories (skipping any
    -    # which don't exist or contain Makefile.PL files).
    -
    -    # For each *.pm or *.pl file found $self->libscan() is called with
    -    # the default installation path in $_[1]. The return value of
    -    # libscan defines the actual installation location.  The default
    -    # libscan function simply returns the path.  The file is skipped
    -    # if libscan returns false.
    -
    -    # The default installation location passed to libscan in $_[1] is:
    -    #
    -    #  ./*.pm		=> $(INST_LIBDIR)/*.pm
    -    #  ./xyz/...	=> $(INST_LIBDIR)/xyz/...
    -    #  ./lib/...	=> $(INST_LIB)/...
    -    #
    -    # In this way the 'lib' directory is seen as the root of the actual
    -    # perl library whereas the others are relative to INST_LIBDIR
    -    # (which includes PARENT_NAME). This is a subtle distinction but one
    -    # that's important for nested modules.
    -
    -    unless( $self->{PMLIBDIRS} ) {
    -        if( $Is_VMS ) {
    -            # Avoid logical name vs directory collisions
    -            $self->{PMLIBDIRS} = ['./lib', "./$self->{BASEEXT}"];
    -        }
    -        else {
    -            $self->{PMLIBDIRS} = ['lib', $self->{BASEEXT}];
    -        }
    -    }
    -
    -    #only existing directories that aren't in $dir are allowed
    -
    -    # Avoid $_ wherever possible:
    -    # @{$self->{PMLIBDIRS}} = grep -d && !$dir{$_}, @{$self->{PMLIBDIRS}};
    -    my (@pmlibdirs) = @{$self->{PMLIBDIRS}};
    -    my ($pmlibdir);
    -    @{$self->{PMLIBDIRS}} = ();
    -    foreach $pmlibdir (@pmlibdirs) {
    -	-d $pmlibdir && !$dir{$pmlibdir} && push @{$self->{PMLIBDIRS}}, $pmlibdir;
    -    }
    -
    -    if (@{$self->{PMLIBDIRS}}){
    -	print "Searching PMLIBDIRS: @{$self->{PMLIBDIRS}}\n"
    -	    if ($Verbose >= 2);
    -	require File::Find;
    -        File::Find::find(sub {
    -            if (-d $_){
    -                unless ($self->libscan($_)){
    -                    $File::Find::prune = 1;
    -                }
    -                return;
    -            }
    -            return if /\#/;
    -            return if /~$/;    # emacs temp files
    -            return if /,v$/;   # RCS files
    -
    -	    my $path   = $File::Find::name;
    -            my $prefix = $self->{INST_LIBDIR};
    -            my $striplibpath;
    -
    -	    $prefix =  $self->{INST_LIB} 
    -                if ($striplibpath = $path) =~ s:^(\W*)lib\W:$1:i;
    -
    -	    my($inst) = $self->catfile($prefix,$striplibpath);
    -	    local($_) = $inst; # for backwards compatibility
    -	    $inst = $self->libscan($inst);
    -	    print "libscan($path) => '$inst'\n" if ($Verbose >= 2);
    -	    return unless $inst;
    -	    $pm{$path} = $inst;
    -	}, @{$self->{PMLIBDIRS}});
    -    }
    -
    -    $self->{PM}  ||= \%pm;
    -    $self->{PL_FILES} ||= \%pl_files;
    -
    -    $self->{DIR} ||= [sort keys %dir];
    -
    -    $self->{XS}  ||= \%xs;
    -    $self->{C}   ||= [sort keys %c];
    -    my @o_files = @{$self->{C}};
    -    $self->{O_FILES} = [grep s/\.c(pp|xx|c)?\z/$self->{OBJ_EXT}/i, @o_files];
    -                            
    -    $self->{H}   ||= [sort keys %h];
    -
    -    # Set up names of manual pages to generate from pods
    -    my %pods;
    -    foreach my $man (qw(MAN1 MAN3)) {
    -	unless ($self->{"${man}PODS"}) {
    -	    $self->{"${man}PODS"} = {};
    -	    $pods{$man} = 1 unless 
    -              $self->{"INSTALL${man}DIR"} =~ /^(none|\s*)$/;
    -	}
    -    }
    -
    -    if ($pods{MAN1}) {
    -	if ( exists $self->{EXE_FILES} ) {
    -	    foreach $name (@{$self->{EXE_FILES}}) {
    -		local *FH;
    -		my($ispod)=0;
    -		if (open(FH,"<$name")) {
    -		    while () {
    -			if (/^=(?:head\d+|item|pod)\b/) {
    -			    $ispod=1;
    -			    last;
    -			}
    -		    }
    -		    close FH;
    -		} else {
    -		    # If it doesn't exist yet, we assume, it has pods in it
    -		    $ispod = 1;
    -		}
    -		next unless $ispod;
    -		if ($pods{MAN1}) {
    -		    $self->{MAN1PODS}->{$name} =
    -		      $self->catfile("\$(INST_MAN1DIR)", basename($name).".\$(MAN1EXT)");
    -		}
    -	    }
    -	}
    -    }
    -    if ($pods{MAN3}) {
    -	my %manifypods = (); # we collect the keys first, i.e. the files
    -			     # we have to convert to pod
    -	foreach $name (keys %{$self->{PM}}) {
    -	    if ($name =~ /\.pod\z/ ) {
    -		$manifypods{$name} = $self->{PM}{$name};
    -	    } elsif ($name =~ /\.p[ml]\z/ ) {
    -		local *FH;
    -		my($ispod)=0;
    -		if (open(FH,"<$name")) {
    -		    while () {
    -			if (/^=head1\s+\w+/) {
    -			    $ispod=1;
    -			    last;
    -			}
    -		    }
    -		    close FH;
    -		} else {
    -		    $ispod = 1;
    -		}
    -		if( $ispod ) {
    -		    $manifypods{$name} = $self->{PM}{$name};
    -		}
    -	    }
    -	}
    -
    -	# Remove "Configure.pm" and similar, if it's not the only pod listed
    -	# To force inclusion, just name it "Configure.pod", or override 
    -        # MAN3PODS
    -	foreach $name (keys %manifypods) {
    -           if ($self->{PERL_CORE} and $name =~ /(config|setup).*\.pm/is) {
    -		delete $manifypods{$name};
    -		next;
    -	    }
    -	    my($manpagename) = $name;
    -	    $manpagename =~ s/\.p(od|m|l)\z//;
    -           # everything below lib is ok
    -	    unless($manpagename =~ s!^\W*lib\W+!!s) {
    -		$manpagename = $self->catfile(
    -                                split(/::/,$self->{PARENT_NAME}),$manpagename
    -                               );
    -	    }
    -	    if ($pods{MAN3}) {
    -		$manpagename = $self->replace_manpage_separator($manpagename);
    -		$self->{MAN3PODS}->{$name} =
    -		  $self->catfile("\$(INST_MAN3DIR)", "$manpagename.\$(MAN3EXT)");
    -	    }
    -	}
    -    }
    -}
    -
    -=item init_DIRFILESEP
    -
    -Using / for Unix.  Called by init_main.
    -
    -=cut
    -
    -sub init_DIRFILESEP {
    -    my($self) = shift;
    -
    -    $self->{DIRFILESEP} = '/';
    -}
    -    
    -
    -=item init_main
    -
    -Initializes AR, AR_STATIC_ARGS, BASEEXT, CONFIG, DISTNAME, DLBASE,
    -EXE_EXT, FULLEXT, FULLPERL, FULLPERLRUN, FULLPERLRUNINST, INST_*,
    -INSTALL*, INSTALLDIRS, LIB_EXT, LIBPERL_A, MAP_TARGET, NAME,
    -OBJ_EXT, PARENT_NAME, PERL, PERL_ARCHLIB, PERL_INC, PERL_LIB,
    -PERL_SRC, PERLRUN, PERLRUNINST, PREFIX, VERSION,
    -VERSION_SYM, XS_VERSION.
    -
    -=cut
    -
    -sub init_main {
    -    my($self) = @_;
    -
    -    # --- Initialize Module Name and Paths
    -
    -    # NAME    = Foo::Bar::Oracle
    -    # FULLEXT = Foo/Bar/Oracle
    -    # BASEEXT = Oracle
    -    # PARENT_NAME = Foo::Bar
    -### Only UNIX:
    -###    ($self->{FULLEXT} =
    -###     $self->{NAME}) =~ s!::!/!g ; #eg. BSD/Foo/Socket
    -    $self->{FULLEXT} = $self->catdir(split /::/, $self->{NAME});
    -
    -
    -    # Copied from DynaLoader:
    -
    -    my(@modparts) = split(/::/,$self->{NAME});
    -    my($modfname) = $modparts[-1];
    -
    -    # Some systems have restrictions on files names for DLL's etc.
    -    # mod2fname returns appropriate file base name (typically truncated)
    -    # It may also edit @modparts if required.
    -    if (defined &DynaLoader::mod2fname) {
    -        $modfname = &DynaLoader::mod2fname(\@modparts);
    -    }
    -
    -    ($self->{PARENT_NAME}, $self->{BASEEXT}) = $self->{NAME} =~ m!(?:([\w:]+)::)?(\w+)\z! ;
    -    $self->{PARENT_NAME} ||= '';
    -
    -    if (defined &DynaLoader::mod2fname) {
    -	# As of 5.001m, dl_os2 appends '_'
    -	$self->{DLBASE} = $modfname;
    -    } else {
    -	$self->{DLBASE} = '$(BASEEXT)';
    -    }
    -
    -
    -    # --- Initialize PERL_LIB, PERL_SRC
    -
    -    # *Real* information: where did we get these two from? ...
    -    my $inc_config_dir = dirname($INC{'Config.pm'});
    -    my $inc_carp_dir   = dirname($INC{'Carp.pm'});
    -
    -    unless ($self->{PERL_SRC}){
    -	my($dir);
    -	foreach $dir ($Updir,
    -                  $self->catdir($Updir,$Updir),
    -                  $self->catdir($Updir,$Updir,$Updir),
    -                  $self->catdir($Updir,$Updir,$Updir,$Updir),
    -                  $self->catdir($Updir,$Updir,$Updir,$Updir,$Updir))
    -        {
    -	    if (
    -		-f $self->catfile($dir,"config_h.SH")
    -		&&
    -		-f $self->catfile($dir,"perl.h")
    -		&&
    -		-f $self->catfile($dir,"lib","Exporter.pm")
    -	       ) {
    -		$self->{PERL_SRC}=$dir ;
    -		last;
    -	    }
    -	}
    -    }
    -
    -    warn "PERL_CORE is set but I can't find your PERL_SRC!\n" if
    -      $self->{PERL_CORE} and !$self->{PERL_SRC};
    -
    -    if ($self->{PERL_SRC}){
    -	$self->{PERL_LIB}     ||= $self->catdir("$self->{PERL_SRC}","lib");
    -
    -        if (defined $Cross::platform) {
    -            $self->{PERL_ARCHLIB} = 
    -              $self->catdir("$self->{PERL_SRC}","xlib",$Cross::platform);
    -            $self->{PERL_INC}     = 
    -              $self->catdir("$self->{PERL_SRC}","xlib",$Cross::platform, 
    -                                 $Is_Win32?("CORE"):());
    -        }
    -        else {
    -            $self->{PERL_ARCHLIB} = $self->{PERL_LIB};
    -            $self->{PERL_INC}     = ($Is_Win32) ? 
    -              $self->catdir($self->{PERL_LIB},"CORE") : $self->{PERL_SRC};
    -        }
    -
    -	# catch a situation that has occurred a few times in the past:
    -	unless (
    -		-s $self->catfile($self->{PERL_SRC},'cflags')
    -		or
    -		$Is_VMS
    -		&&
    -		-s $self->catfile($self->{PERL_SRC},'perlshr_attr.opt')
    -		or
    -		$Is_Win32
    -	       ){
    -	    warn qq{
    -You cannot build extensions below the perl source tree after executing
    -a 'make clean' in the perl source tree.
    -
    -To rebuild extensions distributed with the perl source you should
    -simply Configure (to include those extensions) and then build perl as
    -normal. After installing perl the source tree can be deleted. It is
    -not needed for building extensions by running 'perl Makefile.PL'
    -usually without extra arguments.
    -
    -It is recommended that you unpack and build additional extensions away
    -from the perl source tree.
    -};
    -	}
    -    } else {
    -	# we should also consider $ENV{PERL5LIB} here
    -        my $old = $self->{PERL_LIB} || $self->{PERL_ARCHLIB} || $self->{PERL_INC};
    -	$self->{PERL_LIB}     ||= $Config{privlibexp};
    -	$self->{PERL_ARCHLIB} ||= $Config{archlibexp};
    -	$self->{PERL_INC}     = $self->catdir("$self->{PERL_ARCHLIB}","CORE"); # wild guess for now
    -	my $perl_h;
    -
    -	if (not -f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h"))
    -	    and not $old){
    -	    # Maybe somebody tries to build an extension with an
    -	    # uninstalled Perl outside of Perl build tree
    -	    my $found;
    -	    for my $dir (@INC) {
    -	      $found = $dir, last if -e $self->catdir($dir, "Config.pm");
    -	    }
    -	    if ($found) {
    -	      my $inc = dirname $found;
    -	      if (-e $self->catdir($inc, "perl.h")) {
    -		$self->{PERL_LIB}	   = $found;
    -		$self->{PERL_ARCHLIB}	   = $found;
    -		$self->{PERL_INC}	   = $inc;
    -		$self->{UNINSTALLED_PERL}  = 1;
    -		print STDOUT <{INSTALLDIRS} ||= "site";
    -
    -    $self->{MAN1EXT} ||= $Config{man1ext};
    -    $self->{MAN3EXT} ||= $Config{man3ext};
    -
    -    # Get some stuff out of %Config if we haven't yet done so
    -    print STDOUT "CONFIG must be an array ref\n"
    -	if ($self->{CONFIG} and ref $self->{CONFIG} ne 'ARRAY');
    -    $self->{CONFIG} = [] unless (ref $self->{CONFIG});
    -    push(@{$self->{CONFIG}}, @ExtUtils::MakeMaker::Get_from_Config);
    -    push(@{$self->{CONFIG}}, 'shellflags') if $Config{shellflags};
    -    my(%once_only);
    -    foreach my $m (@{$self->{CONFIG}}){
    -	next if $once_only{$m};
    -	print STDOUT "CONFIG key '$m' does not exist in Config.pm\n"
    -		unless exists $Config{$m};
    -	$self->{uc $m} ||= $Config{$m};
    -	$once_only{$m} = 1;
    -    }
    -
    -# This is too dangerous:
    -#    if ($^O eq "next") {
    -#	$self->{AR} = "libtool";
    -#	$self->{AR_STATIC_ARGS} = "-o";
    -#    }
    -# But I leave it as a placeholder
    -
    -    $self->{AR_STATIC_ARGS} ||= "cr";
    -
    -    # These should never be needed
    -    $self->{OBJ_EXT} ||= '.o';
    -    $self->{LIB_EXT} ||= '.a';
    -
    -    $self->{MAP_TARGET} ||= "perl";
    -
    -    $self->{LIBPERL_A} ||= "libperl$self->{LIB_EXT}";
    -
    -    # make a simple check if we find Exporter
    -    warn "Warning: PERL_LIB ($self->{PERL_LIB}) seems not to be a perl library directory
    -        (Exporter.pm not found)"
    -	unless -f $self->catfile("$self->{PERL_LIB}","Exporter.pm") ||
    -        $self->{NAME} eq "ExtUtils::MakeMaker";
    -}
    -
    -=item init_others
    -
    -Initializes EXTRALIBS, BSLOADLIBS, LDLOADLIBS, LIBS, LD_RUN_PATH, LD,
    -OBJECT, BOOTDEP, PERLMAINCC, LDFROM, LINKTYPE, SHELL, NOOP,
    -FIRST_MAKEFILE, MAKEFILE_OLD, NOECHO, RM_F, RM_RF, TEST_F,
    -TOUCH, CP, MV, CHMOD, UMASK_NULL, ECHO, ECHO_N
    -
    -=cut
    -
    -sub init_others {	# --- Initialize Other Attributes
    -    my($self) = shift;
    -
    -    $self->{LD} ||= 'ld';
    -
    -    # Compute EXTRALIBS, BSLOADLIBS and LDLOADLIBS from $self->{LIBS}
    -    # Lets look at $self->{LIBS} carefully: It may be an anon array, a string or
    -    # undefined. In any case we turn it into an anon array:
    -
    -    # May check $Config{libs} too, thus not empty.
    -    $self->{LIBS} = [$self->{LIBS}] unless ref $self->{LIBS};
    -
    -    $self->{LIBS} = [''] unless @{$self->{LIBS}} && defined $self->{LIBS}[0];
    -    $self->{LD_RUN_PATH} = "";
    -    my($libs);
    -    foreach $libs ( @{$self->{LIBS}} ){
    -	$libs =~ s/^\s*(.*\S)\s*$/$1/; # remove leading and trailing whitespace
    -	my(@libs) = $self->extliblist($libs);
    -	if ($libs[0] or $libs[1] or $libs[2]){
    -	    # LD_RUN_PATH now computed by ExtUtils::Liblist
    -	    ($self->{EXTRALIBS},  $self->{BSLOADLIBS}, 
    -             $self->{LDLOADLIBS}, $self->{LD_RUN_PATH}) = @libs;
    -	    last;
    -	}
    -    }
    -
    -    if ( $self->{OBJECT} ) {
    -	$self->{OBJECT} =~ s!\.o(bj)?\b!\$(OBJ_EXT)!g;
    -    } else {
    -	# init_dirscan should have found out, if we have C files
    -	$self->{OBJECT} = "";
    -	$self->{OBJECT} = '$(BASEEXT)$(OBJ_EXT)' if @{$self->{C}||[]};
    -    }
    -    $self->{OBJECT} =~ s/\n+/ \\\n\t/g;
    -    $self->{BOOTDEP}  = (-f "$self->{BASEEXT}_BS") ? "$self->{BASEEXT}_BS" : "";
    -    $self->{PERLMAINCC} ||= '$(CC)';
    -    $self->{LDFROM} = '$(OBJECT)' unless $self->{LDFROM};
    -
    -    # Sanity check: don't define LINKTYPE = dynamic if we're skipping
    -    # the 'dynamic' section of MM.  We don't have this problem with
    -    # 'static', since we either must use it (%Config says we can't
    -    # use dynamic loading) or the caller asked for it explicitly.
    -    if (!$self->{LINKTYPE}) {
    -       $self->{LINKTYPE} = $self->{SKIPHASH}{'dynamic'}
    -                        ? 'static'
    -                        : ($Config{usedl} ? 'dynamic' : 'static');
    -    };
    -
    -    $self->{NOOP}               ||= '$(SHELL) -c true';
    -    $self->{NOECHO}             = '@' unless defined $self->{NOECHO};
    -
    -    $self->{FIRST_MAKEFILE}     ||= $self->{MAKEFILE} || 'Makefile';
    -    $self->{MAKEFILE}           ||= $self->{FIRST_MAKEFILE};
    -    $self->{MAKEFILE_OLD}       ||= $self->{MAKEFILE}.'.old';
    -    $self->{MAKE_APERL_FILE}    ||= $self->{MAKEFILE}.'.aperl';
    -
    -    # Some makes require a wrapper around macros passed in on the command 
    -    # line.
    -    $self->{MACROSTART}         ||= '';
    -    $self->{MACROEND}           ||= '';
    -
    -    # Not everybody uses -f to indicate "use this Makefile instead"
    -    $self->{USEMAKEFILE}        ||= '-f';
    -
    -    $self->{SHELL}              ||= $Config{sh} || '/bin/sh';
    -
    -    $self->{ECHO}       ||= 'echo';
    -    $self->{ECHO_N}     ||= 'echo -n';
    -    $self->{RM_F}       ||= "rm -f";
    -    $self->{RM_RF}      ||= "rm -rf";
    -    $self->{TOUCH}      ||= "touch";
    -    $self->{TEST_F}     ||= "test -f";
    -    $self->{CP}         ||= "cp";
    -    $self->{MV}         ||= "mv";
    -    $self->{CHMOD}      ||= "chmod";
    -    $self->{MKPATH}     ||= '$(ABSPERLRUN) "-MExtUtils::Command" -e mkpath';
    -    $self->{EQUALIZE_TIMESTAMP} ||= 
    -      '$(ABSPERLRUN) "-MExtUtils::Command" -e eqtime';
    -
    -    $self->{UNINST}     ||= 0;
    -    $self->{VERBINST}   ||= 0;
    -    $self->{MOD_INSTALL} ||= 
    -      $self->oneliner(<<'CODE', ['-MExtUtils::Install']);
    -install({@ARGV}, '$(VERBINST)', 0, '$(UNINST)');
    -CODE
    -    $self->{DOC_INSTALL}        ||= 
    -      '$(ABSPERLRUN) "-MExtUtils::Command::MM" -e perllocal_install';
    -    $self->{UNINSTALL}          ||= 
    -      '$(ABSPERLRUN) "-MExtUtils::Command::MM" -e uninstall';
    -    $self->{WARN_IF_OLD_PACKLIST} ||= 
    -      '$(ABSPERLRUN) "-MExtUtils::Command::MM" -e warn_if_old_packlist';
    -    $self->{FIXIN}              ||= 
    -      q{$(PERLRUN) "-MExtUtils::MY" -e "MY->fixin(shift)"};
    -
    -    $self->{UMASK_NULL}         ||= "umask 0";
    -    $self->{DEV_NULL}           ||= "> /dev/null 2>&1";
    -
    -    return 1;
    -}
    -
    -
    -=item init_linker
    -
    -Unix has no need of special linker flags.
    -
    -=cut
    -
    -sub init_linker {
    -    my($self) = shift;
    -    $self->{PERL_ARCHIVE} ||= '';
    -    $self->{PERL_ARCHIVE_AFTER} ||= '';
    -    $self->{EXPORT_LIST}  ||= '';
    -}
    -
    -
    -=begin _protected
    -
    -=item init_lib2arch
    -
    -    $mm->init_lib2arch
    -
    -=end _protected
    -
    -=cut
    -
    -sub init_lib2arch {
    -    my($self) = shift;
    -
    -    # The user who requests an installation directory explicitly
    -    # should not have to tell us an architecture installation directory
    -    # as well. We look if a directory exists that is named after the
    -    # architecture. If not we take it as a sign that it should be the
    -    # same as the requested installation directory. Otherwise we take
    -    # the found one.
    -    for my $libpair ({l=>"privlib",   a=>"archlib"}, 
    -                     {l=>"sitelib",   a=>"sitearch"},
    -                     {l=>"vendorlib", a=>"vendorarch"},
    -                    )
    -    {
    -        my $lib = "install$libpair->{l}";
    -        my $Lib = uc $lib;
    -        my $Arch = uc "install$libpair->{a}";
    -        if( $self->{$Lib} && ! $self->{$Arch} ){
    -            my($ilib) = $Config{$lib};
    -
    -            $self->prefixify($Arch,$ilib,$self->{$Lib});
    -
    -            unless (-d $self->{$Arch}) {
    -                print STDOUT "Directory $self->{$Arch} not found\n" 
    -                  if $Verbose;
    -                $self->{$Arch} = $self->{$Lib};
    -            }
    -            print STDOUT "Defaulting $Arch to $self->{$Arch}\n" if $Verbose;
    -        }
    -    }
    -}
    -
    -
    -=item init_PERL
    -
    -    $mm->init_PERL;
    -
    -Called by init_main.  Sets up ABSPERL, PERL, FULLPERL and all the
    -*PERLRUN* permutations.
    -
    -    PERL is allowed to be miniperl
    -    FULLPERL must be a complete perl
    -
    -    ABSPERL is PERL converted to an absolute path
    -
    -    *PERLRUN contains everything necessary to run perl, find it's
    -         libraries, etc...
    -
    -    *PERLRUNINST is *PERLRUN + everything necessary to find the
    -         modules being built.
    -
    -=cut
    -
    -sub init_PERL {
    -    my($self) = shift;
    -
    -    my @defpath = ();
    -    foreach my $component ($self->{PERL_SRC}, $self->path(), 
    -                           $Config{binexp}) 
    -    {
    -	push @defpath, $component if defined $component;
    -    }
    -
    -    # Build up a set of file names (not command names).
    -    my $thisperl = $self->canonpath($^X);
    -    $thisperl .= $Config{exe_ext} unless 
    -                # VMS might have a file version # at the end
    -      $Is_VMS ? $thisperl =~ m/$Config{exe_ext}(;\d+)?$/i
    -              : $thisperl =~ m/$Config{exe_ext}$/i;
    -
    -    # We need a relative path to perl when in the core.
    -    $thisperl = $self->abs2rel($thisperl) if $self->{PERL_CORE};
    -
    -    my @perls = ($thisperl);
    -    push @perls, map { "$_$Config{exe_ext}" }
    -                     ('perl', 'perl5', "perl$Config{version}");
    -
    -    # miniperl has priority over all but the cannonical perl when in the
    -    # core.  Otherwise its a last resort.
    -    my $miniperl = "miniperl$Config{exe_ext}";
    -    if( $self->{PERL_CORE} ) {
    -        splice @perls, 1, 0, $miniperl;
    -    }
    -    else {
    -        push @perls, $miniperl;
    -    }
    -
    -    $self->{PERL} ||=
    -        $self->find_perl(5.0, \@perls, \@defpath, $Verbose );
    -    # don't check if perl is executable, maybe they have decided to
    -    # supply switches with perl
    -
    -    # When built for debugging, VMS doesn't create perl.exe but ndbgperl.exe.
    -    my $perl_name = 'perl';
    -    $perl_name = 'ndbgperl' if $Is_VMS && 
    -      defined $Config{usevmsdebug} && $Config{usevmsdebug} eq 'define';
    -
    -    # XXX This logic is flawed.  If "miniperl" is anywhere in the path
    -    # it will get confused.  It should be fixed to work only on the filename.
    -    # Define 'FULLPERL' to be a non-miniperl (used in test: target)
    -    ($self->{FULLPERL} = $self->{PERL}) =~ s/miniperl/$perl_name/i
    -	unless $self->{FULLPERL};
    -
    -    # Little hack to get around VMS's find_perl putting "MCR" in front
    -    # sometimes.
    -    $self->{ABSPERL} = $self->{PERL};
    -    my $has_mcr = $self->{ABSPERL} =~ s/^MCR\s*//;
    -    if( $self->file_name_is_absolute($self->{ABSPERL}) ) {
    -        $self->{ABSPERL} = '$(PERL)';
    -    }
    -    else {
    -        $self->{ABSPERL} = $self->rel2abs($self->{ABSPERL});
    -        $self->{ABSPERL} = 'MCR '.$self->{ABSPERL} if $has_mcr;
    -    }
    -
    -    # Are we building the core?
    -    $self->{PERL_CORE} = $ENV{PERL_CORE} unless exists $self->{PERL_CORE};
    -    $self->{PERL_CORE} = 0               unless defined $self->{PERL_CORE};
    -
    -    # How do we run perl?
    -    foreach my $perl (qw(PERL FULLPERL ABSPERL)) {
    -        my $run  = $perl.'RUN';
    -
    -        $self->{$run}  = "\$($perl)";
    -
    -        # Make sure perl can find itself before it's installed.
    -        $self->{$run} .= q{ "-I$(PERL_LIB)" "-I$(PERL_ARCHLIB)"} 
    -          if $self->{UNINSTALLED_PERL} || $self->{PERL_CORE};
    -
    -        $self->{$perl.'RUNINST'} = 
    -          sprintf q{$(%sRUN) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"}, $perl;
    -    }
    -
    -    return 1;
    -}
    -
    -
    -=item init_platform
    -
    -=item platform_constants
    -
    -Add MM_Unix_VERSION.
    -
    -=cut
    -
    -sub init_platform {
    -    my($self) = shift;
    -
    -    $self->{MM_Unix_VERSION} = $VERSION;
    -    $self->{PERL_MALLOC_DEF} = '-DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc '.
    -                               '-Dfree=Perl_mfree -Drealloc=Perl_realloc '.
    -                               '-Dcalloc=Perl_calloc';
    -
    -}
    -
    -sub platform_constants {
    -    my($self) = shift;
    -    my $make_frag = '';
    -
    -    foreach my $macro (qw(MM_Unix_VERSION PERL_MALLOC_DEF))
    -    {
    -        next unless defined $self->{$macro};
    -        $make_frag .= "$macro = $self->{$macro}\n";
    -    }
    -
    -    return $make_frag;
    -}
    -
    -
    -=item init_PERM
    -
    -  $mm->init_PERM
    -
    -Called by init_main.  Initializes PERL_*
    -
    -=cut
    -
    -sub init_PERM {
    -    my($self) = shift;
    -
    -    $self->{PERM_RW}  = 644  unless defined $self->{PERM_RW};
    -    $self->{PERM_RWX} = 755  unless defined $self->{PERM_RWX};
    -
    -    return 1;
    -}
    -
    -
    -=item init_xs
    -
    -    $mm->init_xs
    -
    -Sets up macros having to do with XS code.  Currently just INST_STATIC,
    -INST_DYNAMIC and INST_BOOT.
    -
    -=cut
    -
    -sub init_xs {
    -    my $self = shift;
    -
    -    if ($self->has_link_code()) {
    -        $self->{INST_STATIC}  = 
    -          $self->catfile('$(INST_ARCHAUTODIR)', '$(BASEEXT)$(LIB_EXT)');
    -        $self->{INST_DYNAMIC} = 
    -          $self->catfile('$(INST_ARCHAUTODIR)', '$(DLBASE).$(DLEXT)');
    -        $self->{INST_BOOT}    = 
    -          $self->catfile('$(INST_ARCHAUTODIR)', '$(BASEEXT).bs');
    -    } else {
    -        $self->{INST_STATIC}  = '';
    -        $self->{INST_DYNAMIC} = '';
    -        $self->{INST_BOOT}    = '';
    -    }
    -}    
    -
    -=item install (o)
    -
    -Defines the install target.
    -
    -=cut
    -
    -sub install {
    -    my($self, %attribs) = @_;
    -    my(@m);
    -
    -    push @m, q{
    -install :: all pure_install doc_install
    -	$(NOECHO) $(NOOP)
    -
    -install_perl :: all pure_perl_install doc_perl_install
    -	$(NOECHO) $(NOOP)
    -
    -install_site :: all pure_site_install doc_site_install
    -	$(NOECHO) $(NOOP)
    -
    -install_vendor :: all pure_vendor_install doc_vendor_install
    -	$(NOECHO) $(NOOP)
    -
    -pure_install :: pure_$(INSTALLDIRS)_install
    -	$(NOECHO) $(NOOP)
    -
    -doc_install :: doc_$(INSTALLDIRS)_install
    -	$(NOECHO) $(NOOP)
    -
    -pure__install : pure_site_install
    -	$(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
    -
    -doc__install : doc_site_install
    -	$(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site
    -
    -pure_perl_install ::
    -	$(NOECHO) $(MOD_INSTALL) \
    -		read }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
    -		write }.$self->catfile('$(DESTINSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q{ \
    -		$(INST_LIB) $(DESTINSTALLPRIVLIB) \
    -		$(INST_ARCHLIB) $(DESTINSTALLARCHLIB) \
    -		$(INST_BIN) $(DESTINSTALLBIN) \
    -		$(INST_SCRIPT) $(DESTINSTALLSCRIPT) \
    -		$(INST_MAN1DIR) $(DESTINSTALLMAN1DIR) \
    -		$(INST_MAN3DIR) $(DESTINSTALLMAN3DIR)
    -	$(NOECHO) $(WARN_IF_OLD_PACKLIST) \
    -		}.$self->catdir('$(SITEARCHEXP)','auto','$(FULLEXT)').q{
    -
    -
    -pure_site_install ::
    -	$(NOECHO) $(MOD_INSTALL) \
    -		read }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{ \
    -		write }.$self->catfile('$(DESTINSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q{ \
    -		$(INST_LIB) $(DESTINSTALLSITELIB) \
    -		$(INST_ARCHLIB) $(DESTINSTALLSITEARCH) \
    -		$(INST_BIN) $(DESTINSTALLSITEBIN) \
    -		$(INST_SCRIPT) $(DESTINSTALLSCRIPT) \
    -		$(INST_MAN1DIR) $(DESTINSTALLSITEMAN1DIR) \
    -		$(INST_MAN3DIR) $(DESTINSTALLSITEMAN3DIR)
    -	$(NOECHO) $(WARN_IF_OLD_PACKLIST) \
    -		}.$self->catdir('$(PERL_ARCHLIB)','auto','$(FULLEXT)').q{
    -
    -pure_vendor_install ::
    -	$(NOECHO) $(MOD_INSTALL) \
    -		read }.$self->catfile('$(VENDORARCHEXP)','auto','$(FULLEXT)','.packlist').q{ \
    -		write }.$self->catfile('$(DESTINSTALLVENDORARCH)','auto','$(FULLEXT)','.packlist').q{ \
    -		$(INST_LIB) $(DESTINSTALLVENDORLIB) \
    -		$(INST_ARCHLIB) $(DESTINSTALLVENDORARCH) \
    -		$(INST_BIN) $(DESTINSTALLVENDORBIN) \
    -		$(INST_SCRIPT) $(DESTINSTALLSCRIPT) \
    -		$(INST_MAN1DIR) $(DESTINSTALLVENDORMAN1DIR) \
    -		$(INST_MAN3DIR) $(DESTINSTALLVENDORMAN3DIR)
    -
    -doc_perl_install ::
    -	$(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLARCHLIB)/perllocal.pod
    -	-$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
    -	-$(NOECHO) $(DOC_INSTALL) \
    -		"Module" "$(NAME)" \
    -		"installed into" "$(INSTALLPRIVLIB)" \
    -		LINKTYPE "$(LINKTYPE)" \
    -		VERSION "$(VERSION)" \
    -		EXE_FILES "$(EXE_FILES)" \
    -		>> }.$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{
    -
    -doc_site_install ::
    -	$(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLARCHLIB)/perllocal.pod
    -	-$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
    -	-$(NOECHO) $(DOC_INSTALL) \
    -		"Module" "$(NAME)" \
    -		"installed into" "$(INSTALLSITELIB)" \
    -		LINKTYPE "$(LINKTYPE)" \
    -		VERSION "$(VERSION)" \
    -		EXE_FILES "$(EXE_FILES)" \
    -		>> }.$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{
    -
    -doc_vendor_install ::
    -	$(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLARCHLIB)/perllocal.pod
    -	-$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
    -	-$(NOECHO) $(DOC_INSTALL) \
    -		"Module" "$(NAME)" \
    -		"installed into" "$(INSTALLVENDORLIB)" \
    -		LINKTYPE "$(LINKTYPE)" \
    -		VERSION "$(VERSION)" \
    -		EXE_FILES "$(EXE_FILES)" \
    -		>> }.$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{
    -
    -};
    -
    -    push @m, q{
    -uninstall :: uninstall_from_$(INSTALLDIRS)dirs
    -	$(NOECHO) $(NOOP)
    -
    -uninstall_from_perldirs ::
    -	$(NOECHO) $(UNINSTALL) }.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{
    -
    -uninstall_from_sitedirs ::
    -	$(NOECHO) $(UNINSTALL) }.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{
    -
    -uninstall_from_vendordirs ::
    -	$(NOECHO) $(UNINSTALL) }.$self->catfile('$(VENDORARCHEXP)','auto','$(FULLEXT)','.packlist').q{
    -};
    -
    -    join("",@m);
    -}
    -
    -=item installbin (o)
    -
    -Defines targets to make and to install EXE_FILES.
    -
    -=cut
    -
    -sub installbin {
    -    my($self) = shift;
    -
    -    return "" unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY";
    -    my @exefiles = @{$self->{EXE_FILES}};
    -    return "" unless @exefiles;
    -
    -    @exefiles = map vmsify($_), @exefiles if $Is_VMS;
    -
    -    my %fromto;
    -    for my $from (@exefiles) {
    -	my($path)= $self->catfile('$(INST_SCRIPT)', basename($from));
    -
    -	local($_) = $path; # for backwards compatibility
    -	my $to = $self->libscan($path);
    -	print "libscan($from) => '$to'\n" if ($Verbose >=2);
    -
    -        $to = vmsify($to) if $Is_VMS;
    -	$fromto{$from} = $to;
    -    }
    -    my @to   = values %fromto;
    -
    -    my @m;
    -    push(@m, qq{
    -EXE_FILES = @exefiles
    -
    -pure_all :: @to
    -	\$(NOECHO) \$(NOOP)
    -
    -realclean ::
    -});
    -
    -    # realclean can get rather large.
    -    push @m, map "\t$_\n", $self->split_command('$(RM_F)', @to);
    -    push @m, "\n";
    -
    -
    -    # A target for each exe file.
    -    while (my($from,$to) = each %fromto) {
    -	last unless defined $from;
    -
    -	push @m, sprintf <<'MAKE', $to, $from, $to, $from, $to, $to, $to;
    -%s : %s $(FIRST_MAKEFILE) $(INST_SCRIPT)$(DFSEP).exists $(INST_BIN)$(DFSEP).exists
    -	$(NOECHO) $(RM_F) %s
    -	$(CP) %s %s
    -	$(FIXIN) %s
    -	-$(NOECHO) $(CHMOD) $(PERM_RWX) %s
    -
    -MAKE
    -
    -    }
    -
    -    join "", @m;
    -}
    -
    -
    -=item linkext (o)
    -
    -Defines the linkext target which in turn defines the LINKTYPE.
    -
    -=cut
    -
    -sub linkext {
    -    my($self, %attribs) = @_;
    -    # LINKTYPE => static or dynamic or ''
    -    my($linktype) = defined $attribs{LINKTYPE} ?
    -      $attribs{LINKTYPE} : '$(LINKTYPE)';
    -    "
    -linkext :: $linktype
    -	\$(NOECHO) \$(NOOP)
    -";
    -}
    -
    -=item lsdir
    -
    -Takes as arguments a directory name and a regular expression. Returns
    -all entries in the directory that match the regular expression.
    -
    -=cut
    -
    -sub lsdir {
    -    my($self) = shift;
    -    my($dir, $regex) = @_;
    -    my(@ls);
    -    my $dh = new DirHandle;
    -    $dh->open($dir || ".") or return ();
    -    @ls = $dh->read;
    -    $dh->close;
    -    @ls = grep(/$regex/, @ls) if $regex;
    -    @ls;
    -}
    -
    -=item macro (o)
    -
    -Simple subroutine to insert the macros defined by the macro attribute
    -into the Makefile.
    -
    -=cut
    -
    -sub macro {
    -    my($self,%attribs) = @_;
    -    my(@m,$key,$val);
    -    while (($key,$val) = each %attribs){
    -	last unless defined $key;
    -	push @m, "$key = $val\n";
    -    }
    -    join "", @m;
    -}
    -
    -=item makeaperl (o)
    -
    -Called by staticmake. Defines how to write the Makefile to produce a
    -static new perl.
    -
    -By default the Makefile produced includes all the static extensions in
    -the perl library. (Purified versions of library files, e.g.,
    -DynaLoader_pure_p1_c0_032.a are automatically ignored to avoid link errors.)
    -
    -=cut
    -
    -sub makeaperl {
    -    my($self, %attribs) = @_;
    -    my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) =
    -	@attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
    -    my(@m);
    -    push @m, "
    -# --- MakeMaker makeaperl section ---
    -MAP_TARGET    = $target
    -FULLPERL      = $self->{FULLPERL}
    -";
    -    return join '', @m if $self->{PARENT};
    -
    -    my($dir) = join ":", @{$self->{DIR}};
    -
    -    unless ($self->{MAKEAPERL}) {
    -	push @m, q{
    -$(MAP_TARGET) :: static $(MAKE_APERL_FILE)
    -	$(MAKE) $(USEMAKEFILE) $(MAKE_APERL_FILE) $@
    -
    -$(MAKE_APERL_FILE) : $(FIRST_MAKEFILE) pm_to_blib
    -	$(NOECHO) $(ECHO) Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET)
    -	$(NOECHO) $(PERLRUNINST) \
    -		Makefile.PL DIR=}, $dir, q{ \
    -		MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
    -		MAKEAPERL=1 NORECURS=1 CCCDLFLAGS=};
    -
    -	foreach (@ARGV){
    -		if( /\s/ ){
    -			s/=(.*)/='$1'/;
    -		}
    -		push @m, " \\\n\t\t$_";
    -	}
    -#	push @m, map( " \\\n\t\t$_", @ARGV );
    -	push @m, "\n";
    -
    -	return join '', @m;
    -    }
    -
    -
    -
    -    my($cccmd, $linkcmd, $lperl);
    -
    -
    -    $cccmd = $self->const_cccmd($libperl);
    -    $cccmd =~ s/^CCCMD\s*=\s*//;
    -    $cccmd =~ s/\$\(INC\)/ "-I$self->{PERL_INC}" /;
    -    $cccmd .= " $Config{cccdlflags}"
    -	if ($Config{useshrplib} eq 'true');
    -    $cccmd =~ s/\(CC\)/\(PERLMAINCC\)/;
    -
    -    # The front matter of the linkcommand...
    -    $linkcmd = join ' ', "\$(CC)",
    -	    grep($_, @Config{qw(ldflags ccdlflags)});
    -    $linkcmd =~ s/\s+/ /g;
    -    $linkcmd =~ s,(perl\.exp),\$(PERL_INC)/$1,;
    -
    -    # Which *.a files could we make use of...
    -    my %static;
    -    require File::Find;
    -    File::Find::find(sub {
    -	return unless m/\Q$self->{LIB_EXT}\E$/;
    -
    -        # Skip perl's libraries.
    -        return if m/^libperl/ or m/^perl\Q$self->{LIB_EXT}\E$/;
    -
    -	# Skip purified versions of libraries 
    -        # (e.g., DynaLoader_pure_p1_c0_032.a)
    -	return if m/_pure_\w+_\w+_\w+\.\w+$/ and -f "$File::Find::dir/.pure";
    -
    -	if( exists $self->{INCLUDE_EXT} ){
    -		my $found = 0;
    -		my $incl;
    -		my $xx;
    -
    -		($xx = $File::Find::name) =~ s,.*?/auto/,,s;
    -		$xx =~ s,/?$_,,;
    -		$xx =~ s,/,::,g;
    -
    -		# Throw away anything not explicitly marked for inclusion.
    -		# DynaLoader is implied.
    -		foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
    -			if( $xx eq $incl ){
    -				$found++;
    -				last;
    -			}
    -		}
    -		return unless $found;
    -	}
    -	elsif( exists $self->{EXCLUDE_EXT} ){
    -		my $excl;
    -		my $xx;
    -
    -		($xx = $File::Find::name) =~ s,.*?/auto/,,s;
    -		$xx =~ s,/?$_,,;
    -		$xx =~ s,/,::,g;
    -
    -		# Throw away anything explicitly marked for exclusion
    -		foreach $excl (@{$self->{EXCLUDE_EXT}}){
    -			return if( $xx eq $excl );
    -		}
    -	}
    -
    -	# don't include the installed version of this extension. I
    -	# leave this line here, although it is not necessary anymore:
    -	# I patched minimod.PL instead, so that Miniperl.pm won't
    -	# enclude duplicates
    -
    -	# Once the patch to minimod.PL is in the distribution, I can
    -	# drop it
    -	return if $File::Find::name =~ m:auto/$self->{FULLEXT}/$self->{BASEEXT}$self->{LIB_EXT}\z:;
    -	use Cwd 'cwd';
    -	$static{cwd() . "/" . $_}++;
    -    }, grep( -d $_, @{$searchdirs || []}) );
    -
    -    # We trust that what has been handed in as argument, will be buildable
    -    $static = [] unless $static;
    -    @static{@{$static}} = (1) x @{$static};
    -
    -    $extra = [] unless $extra && ref $extra eq 'ARRAY';
    -    for (sort keys %static) {
    -	next unless /\Q$self->{LIB_EXT}\E\z/;
    -	$_ = dirname($_) . "/extralibs.ld";
    -	push @$extra, $_;
    -    }
    -
    -    grep(s/^(.*)/"-I$1"/, @{$perlinc || []});
    -
    -    $target ||= "perl";
    -    $tmp    ||= ".";
    -
    -# MAP_STATIC doesn't look into subdirs yet. Once "all" is made and we
    -# regenerate the Makefiles, MAP_STATIC and the dependencies for
    -# extralibs.all are computed correctly
    -    push @m, "
    -MAP_LINKCMD   = $linkcmd
    -MAP_PERLINC   = @{$perlinc || []}
    -MAP_STATIC    = ",
    -join(" \\\n\t", reverse sort keys %static), "
    -
    -MAP_PRELIBS   = $Config{perllibs} $Config{cryptlib}
    -";
    -
    -    if (defined $libperl) {
    -	($lperl = $libperl) =~ s/\$\(A\)/$self->{LIB_EXT}/;
    -    }
    -    unless ($libperl && -f $lperl) { # Ilya's code...
    -	my $dir = $self->{PERL_SRC} || "$self->{PERL_ARCHLIB}/CORE";
    -	$dir = "$self->{PERL_ARCHLIB}/.." if $self->{UNINSTALLED_PERL};
    -	$libperl ||= "libperl$self->{LIB_EXT}";
    -	$libperl   = "$dir/$libperl";
    -	$lperl   ||= "libperl$self->{LIB_EXT}";
    -	$lperl     = "$dir/$lperl";
    -
    -        if (! -f $libperl and ! -f $lperl) {
    -          # We did not find a static libperl. Maybe there is a shared one?
    -          if ($Is_SunOS) {
    -            $lperl  = $libperl = "$dir/$Config{libperl}";
    -            # SUNOS ld does not take the full path to a shared library
    -            $libperl = '' if $Is_SunOS4;
    -          }
    -        }
    -
    -	print STDOUT "Warning: $libperl not found
    -    If you're going to build a static perl binary, make sure perl is installed
    -    otherwise ignore this warning\n"
    -		unless (-f $lperl || defined($self->{PERL_SRC}));
    -    }
    -
    -    # SUNOS ld does not take the full path to a shared library
    -    my $llibperl = $libperl ? '$(MAP_LIBPERL)' : '-lperl';
    -
    -    push @m, "
    -MAP_LIBPERL = $libperl
    -LLIBPERL    = $llibperl
    -";
    -
    -    push @m, '
    -$(INST_ARCHAUTODIR)/extralibs.all : $(INST_ARCHAUTODIR)$(DFSEP).exists '.join(" \\\n\t", @$extra).'
    -	$(NOECHO) $(RM_F)  $@
    -	$(NOECHO) $(TOUCH) $@
    -';
    -
    -    my $catfile;
    -    foreach $catfile (@$extra){
    -	push @m, "\tcat $catfile >> \$\@\n";
    -    }
    -
    -push @m, "
    -\$(MAP_TARGET) :: $tmp/perlmain\$(OBJ_EXT) \$(MAP_LIBPERL) \$(MAP_STATIC) \$(INST_ARCHAUTODIR)/extralibs.all
    -	\$(MAP_LINKCMD) -o \$\@ \$(OPTIMIZE) $tmp/perlmain\$(OBJ_EXT) \$(LDFROM) \$(MAP_STATIC) \$(LLIBPERL) `cat \$(INST_ARCHAUTODIR)/extralibs.all` \$(MAP_PRELIBS)
    -	\$(NOECHO) \$(ECHO) 'To install the new \"\$(MAP_TARGET)\" binary, call'
    -	\$(NOECHO) \$(ECHO) '    \$(MAKE) \$(USEMAKEFILE) $makefilename inst_perl MAP_TARGET=\$(MAP_TARGET)'
    -	\$(NOECHO) \$(ECHO) 'To remove the intermediate files say'
    -	\$(NOECHO) \$(ECHO) '    \$(MAKE) \$(USEMAKEFILE) $makefilename map_clean'
    -
    -$tmp/perlmain\$(OBJ_EXT): $tmp/perlmain.c
    -";
    -    push @m, "\t".$self->cd($tmp, qq[$cccmd "-I\$(PERL_INC)" perlmain.c])."\n";
    -
    -    push @m, qq{
    -$tmp/perlmain.c: $makefilename}, q{
    -	$(NOECHO) $(ECHO) Writing $@
    -	$(NOECHO) $(PERL) $(MAP_PERLINC) "-MExtUtils::Miniperl" \\
    -		-e "writemain(grep s#.*/auto/##s, split(q| |, q|$(MAP_STATIC)|))" > $@t && $(MV) $@t $@
    -
    -};
    -    push @m, "\t", q{$(NOECHO) $(PERL) $(INSTALLSCRIPT)/fixpmain
    -} if (defined (&Dos::UseLFN) && Dos::UseLFN()==0);
    -
    -
    -    push @m, q{
    -doc_inst_perl:
    -	$(NOECHO) $(ECHO) Appending installation info to $(DESTINSTALLARCHLIB)/perllocal.pod
    -	-$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
    -	-$(NOECHO) $(DOC_INSTALL) \
    -		"Perl binary" "$(MAP_TARGET)" \
    -		MAP_STATIC "$(MAP_STATIC)" \
    -		MAP_EXTRA "`cat $(INST_ARCHAUTODIR)/extralibs.all`" \
    -		MAP_LIBPERL "$(MAP_LIBPERL)" \
    -		>> }.$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{
    -
    -};
    -
    -    push @m, q{
    -inst_perl: pure_inst_perl doc_inst_perl
    -
    -pure_inst_perl: $(MAP_TARGET)
    -	}.$self->{CP}.q{ $(MAP_TARGET) }.$self->catfile('$(DESTINSTALLBIN)','$(MAP_TARGET)').q{
    -
    -clean :: map_clean
    -
    -map_clean :
    -	}.$self->{RM_F}.qq{ $tmp/perlmain\$(OBJ_EXT) $tmp/perlmain.c \$(MAP_TARGET) $makefilename \$(INST_ARCHAUTODIR)/extralibs.all
    -};
    -
    -    join '', @m;
    -}
    -
    -=item makefile (o)
    -
    -Defines how to rewrite the Makefile.
    -
    -=cut
    -
    -sub makefile {
    -    my($self) = shift;
    -    my $m;
    -    # We do not know what target was originally specified so we
    -    # must force a manual rerun to be sure. But as it should only
    -    # happen very rarely it is not a significant problem.
    -    $m = '
    -$(OBJECT) : $(FIRST_MAKEFILE)
    -
    -' if $self->{OBJECT};
    -
    -    my $newer_than_target = $Is_VMS ? '$(MMS$SOURCE_LIST)' : '$?';
    -    my $mpl_args = join " ", map qq["$_"], @ARGV;
    -
    -    $m .= sprintf <<'MAKE_FRAG', $newer_than_target, $mpl_args;
    -# We take a very conservative approach here, but it's worth it.
    -# We move Makefile to Makefile.old here to avoid gnu make looping.
    -$(FIRST_MAKEFILE) : Makefile.PL $(CONFIGDEP)
    -	$(NOECHO) $(ECHO) "Makefile out-of-date with respect to %s"
    -	$(NOECHO) $(ECHO) "Cleaning current config before rebuilding Makefile..."
    -	-$(NOECHO) $(RM_F) $(MAKEFILE_OLD)
    -	-$(NOECHO) $(MV)   $(FIRST_MAKEFILE) $(MAKEFILE_OLD)
    -	- $(MAKE) $(USEMAKEFILE) $(MAKEFILE_OLD) clean $(DEV_NULL)
    -	$(PERLRUN) Makefile.PL %s
    -	$(NOECHO) $(ECHO) "==> Your Makefile has been rebuilt. <=="
    -	$(NOECHO) $(ECHO) "==> Please rerun the $(MAKE) command.  <=="
    -	false
    -
    -MAKE_FRAG
    -
    -    return $m;
    -}
    -
    -
    -=item maybe_command
    -
    -Returns true, if the argument is likely to be a command.
    -
    -=cut
    -
    -sub maybe_command {
    -    my($self,$file) = @_;
    -    return $file if -x $file && ! -d $file;
    -    return;
    -}
    -
    -
    -=item needs_linking (o)
    -
    -Does this module need linking? Looks into subdirectory objects (see
    -also has_link_code())
    -
    -=cut
    -
    -sub needs_linking {
    -    my($self) = shift;
    -    my($child,$caller);
    -    $caller = (caller(0))[3];
    -    confess("needs_linking called too early") if 
    -      $caller =~ /^ExtUtils::MakeMaker::/;
    -    return $self->{NEEDS_LINKING} if defined $self->{NEEDS_LINKING};
    -    if ($self->has_link_code or $self->{MAKEAPERL}){
    -	$self->{NEEDS_LINKING} = 1;
    -	return 1;
    -    }
    -    foreach $child (keys %{$self->{CHILDREN}}) {
    -	if ($self->{CHILDREN}->{$child}->needs_linking) {
    -	    $self->{NEEDS_LINKING} = 1;
    -	    return 1;
    -	}
    -    }
    -    return $self->{NEEDS_LINKING} = 0;
    -}
    -
    -=item nicetext
    -
    -misnamed method (will have to be changed). The MM_Unix method just
    -returns the argument without further processing.
    -
    -On VMS used to insure that colons marking targets are preceded by
    -space - most Unix Makes don't need this, but it's necessary under VMS
    -to distinguish the target delimiter from a colon appearing as part of
    -a filespec.
    -
    -=cut
    -
    -sub nicetext {
    -    my($self,$text) = @_;
    -    $text;
    -}
    -
    -=item parse_abstract
    -
    -parse a file and return what you think is the ABSTRACT
    -
    -=cut
    -
    -sub parse_abstract {
    -    my($self,$parsefile) = @_;
    -    my $result;
    -    local *FH;
    -    local $/ = "\n";
    -    open(FH,$parsefile) or die "Could not open '$parsefile': $!";
    -    my $inpod = 0;
    -    my $package = $self->{DISTNAME};
    -    $package =~ s/-/::/g;
    -    while () {
    -        $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
    -        next if !$inpod;
    -        chop;
    -        next unless /^($package\s-\s)(.*)/;
    -        $result = $2;
    -        last;
    -    }
    -    close FH;
    -    return $result;
    -}
    -
    -=item parse_version
    -
    -parse a file and return what you think is $VERSION in this file set to.
    -It will return the string "undef" if it can't figure out what $VERSION
    -is. $VERSION should be for all to see, so our $VERSION or plain $VERSION
    -are okay, but my $VERSION is not.
    -
    -=cut
    -
    -sub parse_version {
    -    my($self,$parsefile) = @_;
    -    my $result;
    -    local *FH;
    -    local $/ = "\n";
    -    local $_;
    -    open(FH,$parsefile) or die "Could not open '$parsefile': $!";
    -    my $inpod = 0;
    -    while () {
    -	$inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod;
    -	next if $inpod || /^\s*#/;
    -	chop;
    -	next unless /(?{$key};
    -	push @pasthru, "$key=\"\$($key)\"";
    -    }
    -
    -    foreach $key (qw(DEFINE INC)) {
    -        next unless defined $self->{$key};
    -	push @pasthru, "PASTHRU_$key=\"\$(PASTHRU_$key)\"";
    -    }
    -
    -    push @m, "\nPASTHRU = ", join ($sep, @pasthru), "\n";
    -    join "", @m;
    -}
    -
    -=item perl_script
    -
    -Takes one argument, a file name, and returns the file name, if the
    -argument is likely to be a perl script. On MM_Unix this is true for
    -any ordinary, readable file.
    -
    -=cut
    -
    -sub perl_script {
    -    my($self,$file) = @_;
    -    return $file if -r $file && -f _;
    -    return;
    -}
    -
    -=item perldepend (o)
    -
    -Defines the dependency from all *.h files that come with the perl
    -distribution.
    -
    -=cut
    -
    -sub perldepend {
    -    my($self) = shift;
    -    my(@m);
    -
    -    my $make_config = $self->cd('$(PERL_SRC)', '$(MAKE) lib/Config.pm');
    -
    -    push @m, sprintf <<'MAKE_FRAG', $make_config if $self->{PERL_SRC};
    -# Check for unpropogated config.sh changes. Should never happen.
    -# We do NOT just update config.h because that is not sufficient.
    -# An out of date config.h is not fatal but complains loudly!
    -$(PERL_INC)/config.h: $(PERL_SRC)/config.sh
    -	-$(NOECHO) $(ECHO) "Warning: $(PERL_INC)/config.h out of date with $(PERL_SRC)/config.sh"; false
    -
    -$(PERL_ARCHLIB)/Config.pm: $(PERL_SRC)/config.sh
    -	$(NOECHO) $(ECHO) "Warning: $(PERL_ARCHLIB)/Config.pm may be out of date with $(PERL_SRC)/config.sh"
    -	%s
    -MAKE_FRAG
    -
    -    return join "", @m unless $self->needs_linking;
    -
    -    push @m, q{
    -PERL_HDRS = \
    -	$(PERL_INC)/EXTERN.h		\
    -	$(PERL_INC)/INTERN.h		\
    -	$(PERL_INC)/XSUB.h		\
    -	$(PERL_INC)/av.h		\
    -	$(PERL_INC)/cc_runtime.h	\
    -	$(PERL_INC)/config.h		\
    -	$(PERL_INC)/cop.h		\
    -	$(PERL_INC)/cv.h		\
    -	$(PERL_INC)/dosish.h		\
    -	$(PERL_INC)/embed.h		\
    -	$(PERL_INC)/embedvar.h		\
    -	$(PERL_INC)/fakethr.h		\
    -	$(PERL_INC)/form.h		\
    -	$(PERL_INC)/gv.h		\
    -	$(PERL_INC)/handy.h		\
    -	$(PERL_INC)/hv.h		\
    -	$(PERL_INC)/intrpvar.h		\
    -	$(PERL_INC)/iperlsys.h		\
    -	$(PERL_INC)/keywords.h		\
    -	$(PERL_INC)/mg.h		\
    -	$(PERL_INC)/nostdio.h		\
    -	$(PERL_INC)/op.h		\
    -	$(PERL_INC)/opcode.h		\
    -	$(PERL_INC)/patchlevel.h	\
    -	$(PERL_INC)/perl.h		\
    -	$(PERL_INC)/perlio.h		\
    -	$(PERL_INC)/perlsdio.h		\
    -	$(PERL_INC)/perlsfio.h		\
    -	$(PERL_INC)/perlvars.h		\
    -	$(PERL_INC)/perly.h		\
    -	$(PERL_INC)/pp.h		\
    -	$(PERL_INC)/pp_proto.h		\
    -	$(PERL_INC)/proto.h		\
    -	$(PERL_INC)/regcomp.h		\
    -	$(PERL_INC)/regexp.h		\
    -	$(PERL_INC)/regnodes.h		\
    -	$(PERL_INC)/scope.h		\
    -	$(PERL_INC)/sv.h		\
    -	$(PERL_INC)/thrdvar.h		\
    -	$(PERL_INC)/thread.h		\
    -	$(PERL_INC)/unixish.h		\
    -	$(PERL_INC)/util.h
    -
    -$(OBJECT) : $(PERL_HDRS)
    -} if $self->{OBJECT};
    -
    -    push @m, join(" ", values %{$self->{XS}})." : \$(XSUBPPDEPS)\n"  if %{$self->{XS}};
    -
    -    join "\n", @m;
    -}
    -
    -
    -=item perm_rw (o)
    -
    -Returns the attribute C or the string C<644>.
    -Used as the string that is passed
    -to the C command to set the permissions for read/writeable files.
    -MakeMaker chooses C<644> because it has turned out in the past that
    -relying on the umask provokes hard-to-track bug reports.
    -When the return value is used by the perl function C, it is
    -interpreted as an octal value.
    -
    -=cut
    -
    -sub perm_rw {
    -    return shift->{PERM_RW};
    -}
    -
    -=item perm_rwx (o)
    -
    -Returns the attribute C or the string C<755>,
    -i.e. the string that is passed
    -to the C command to set the permissions for executable files.
    -See also perl_rw.
    -
    -=cut
    -
    -sub perm_rwx {
    -    return shift->{PERM_RWX};
    -}
    -
    -=item pm_to_blib
    -
    -Defines target that copies all files in the hash PM to their
    -destination and autosplits them. See L
    -
    -=cut
    -
    -sub pm_to_blib {
    -    my $self = shift;
    -    my($autodir) = $self->catdir('$(INST_LIB)','auto');
    -    my $r = q{
    -pm_to_blib : $(TO_INST_PM)
    -};
    -
    -    my $pm_to_blib = $self->oneliner(<split_command($pm_to_blib, %{$self->{PM}});
    -
    -    $r .= join '', map { "\t\$(NOECHO) $_\n" } @cmds;
    -    $r .= qq{\t\$(NOECHO) \$(TOUCH) pm_to_blib\n};
    -
    -    return $r;
    -}
    -
    -=item post_constants (o)
    -
    -Returns an empty string per default. Dedicated to overrides from
    -within Makefile.PL after all constants have been defined.
    -
    -=cut
    -
    -sub post_constants{
    -    "";
    -}
    -
    -=item post_initialize (o)
    -
    -Returns an empty string per default. Used in Makefile.PLs to add some
    -chunk of text to the Makefile after the object is initialized.
    -
    -=cut
    -
    -sub post_initialize {
    -    "";
    -}
    -
    -=item postamble (o)
    -
    -Returns an empty string. Can be used in Makefile.PLs to write some
    -text to the Makefile at the end.
    -
    -=cut
    -
    -sub postamble {
    -    "";
    -}
    -
    -=item ppd
    -
    -Defines target that creates a PPD (Perl Package Description) file
    -for a binary distribution.
    -
    -=cut
    -
    -sub ppd {
    -    my($self) = @_;
    -
    -    if ($self->{ABSTRACT_FROM}){
    -        $self->{ABSTRACT} = $self->parse_abstract($self->{ABSTRACT_FROM}) or
    -            carp "WARNING: Setting ABSTRACT via file ".
    -                 "'$self->{ABSTRACT_FROM}' failed\n";
    -    }
    -
    -    my ($pack_ver) = join ",", (split (/\./, $self->{VERSION}), (0)x4)[0..3];
    -
    -    my $abstract = $self->{ABSTRACT} || '';
    -    $abstract =~ s/\n/\\n/sg;
    -    $abstract =~ s//>/g;
    -
    -    my $author = $self->{AUTHOR} || '';
    -    $author =~ s//>/g;
    -
    -    my $ppd_xml = sprintf <<'PPD_HTML', $pack_ver, $abstract, $author;
    -
    -    $(DISTNAME)
    -    %s
    -    %s
    -PPD_HTML
    -
    -    $ppd_xml .= "    \n";
    -    foreach my $prereq (sort keys %{$self->{PREREQ_PM}}) {
    -        my $pre_req = $prereq;
    -        $pre_req =~ s/::/-/g;
    -        my ($dep_ver) = join ",", (split (/\./, $self->{PREREQ_PM}{$prereq}), 
    -                                  (0) x 4) [0 .. 3];
    -        $ppd_xml .= sprintf <<'PPD_OUT', $pre_req, $dep_ver;
    -        
    -PPD_OUT
    -
    -    }
    -
    -    $ppd_xml .= sprintf <<'PPD_OUT', $Config{archname};
    -        
    -        
    -PPD_OUT
    -
    -    if ($self->{PPM_INSTALL_SCRIPT}) {
    -        if ($self->{PPM_INSTALL_EXEC}) {
    -            $ppd_xml .= sprintf qq{        %s\n},
    -                  $self->{PPM_INSTALL_EXEC}, $self->{PPM_INSTALL_SCRIPT};
    -        }
    -        else {
    -            $ppd_xml .= sprintf qq{        %s\n}, 
    -                  $self->{PPM_INSTALL_SCRIPT};
    -        }
    -    }
    -
    -    my ($bin_location) = $self->{BINARY_LOCATION} || '';
    -    $bin_location =~ s/\\/\\\\/g;
    -
    -    $ppd_xml .= sprintf <<'PPD_XML', $bin_location;
    -        
    -    
    -
    -PPD_XML
    -
    -    my @ppd_cmds = $self->echo($ppd_xml, '$(DISTNAME).ppd');
    -
    -    return sprintf <<'PPD_OUT', join "\n\t", @ppd_cmds;
    -# Creates a PPD (Perl Package Description) for a binary distribution.
    -ppd:
    -	%s
    -PPD_OUT
    -
    -}
    -
    -=item prefixify
    -
    -  $MM->prefixify($var, $prefix, $new_prefix, $default);
    -
    -Using either $MM->{uc $var} || $Config{lc $var}, it will attempt to
    -replace it's $prefix with a $new_prefix.  
    -
    -Should the $prefix fail to match I a PREFIX was given as an
    -argument to WriteMakefile() it will set it to the $new_prefix +
    -$default.  This is for systems whose file layouts don't neatly fit into
    -our ideas of prefixes.
    -
    -This is for heuristics which attempt to create directory structures
    -that mirror those of the installed perl.
    -
    -For example:
    -
    -    $MM->prefixify('installman1dir', '/usr', '/home/foo', 'man/man1');
    -
    -this will attempt to remove '/usr' from the front of the
    -$MM->{INSTALLMAN1DIR} path (initializing it to $Config{installman1dir}
    -if necessary) and replace it with '/home/foo'.  If this fails it will
    -simply use '/home/foo/man/man1'.
    -
    -=cut
    -
    -sub prefixify {
    -    my($self,$var,$sprefix,$rprefix,$default) = @_;
    -
    -    my $path = $self->{uc $var} || 
    -               $Config_Override{lc $var} || $Config{lc $var} || '';
    -
    -    $rprefix .= '/' if $sprefix =~ m|/$|;
    -
    -    print STDERR "  prefixify $var => $path\n" if $Verbose >= 2;
    -    print STDERR "    from $sprefix to $rprefix\n" if $Verbose >= 2;
    -
    -    if( $self->{ARGS}{PREFIX} && $self->file_name_is_absolute($path) && 
    -        $path !~ s{^\Q$sprefix\E\b}{$rprefix}s ) 
    -    {
    -
    -        print STDERR "    cannot prefix, using default.\n" if $Verbose >= 2;
    -        print STDERR "    no default!\n" if !$default && $Verbose >= 2;
    -
    -        $path = $self->catdir($rprefix, $default) if $default;
    -    }
    -
    -    print "    now $path\n" if $Verbose >= 2;
    -    return $self->{uc $var} = $path;
    -}
    -
    -
    -=item processPL (o)
    -
    -Defines targets to run *.PL files.
    -
    -=cut
    -
    -sub processPL {
    -    my $self = shift;
    -    my $pl_files = $self->{PL_FILES};
    -
    -    return "" unless $pl_files;
    -
    -    my $m = '';
    -    foreach my $plfile (sort keys %$pl_files) {
    -        my $list = ref($pl_files->{$plfile})
    -                     ?  $pl_files->{$plfile}
    -		     : [$pl_files->{$plfile}];
    -
    -	foreach my $target (@$list) {
    -            if( $Is_VMS ) {
    -                $plfile = vmsify($plfile);
    -                $target = vmsify($target);
    -            }
    -
    -	    # Normally a .PL file runs AFTER pm_to_blib so it can have
    -	    # blib in its @INC and load the just built modules.  BUT if
    -	    # the generated module is something in $(TO_INST_PM) which
    -	    # pm_to_blib depends on then it can't depend on pm_to_blib
    -	    # else we have a dependency loop.
    -	    my $pm_dep;
    -	    my $perlrun;
    -	    if( defined $self->{PM}{$target} ) {
    -		$pm_dep  = '';
    -		$perlrun = 'PERLRUN';
    -	    }
    -	    else {
    -		$pm_dep  = 'pm_to_blib';
    -		$perlrun = 'PERLRUNINST';
    -	    }
    -
    -            $m .= < in command line arguments.
    -Doesn't handle recursive Makefile C<$(...)> constructs,
    -but handles simple ones.
    -
    -=cut
    -
    -sub quote_paren {
    -    my $arg = shift;
    -    $arg =~ s{\$\((.+?)\)}{\$\\\\($1\\\\)}g;	# protect $(...)
    -    $arg =~ s{(?replace_manpage_separator($file_path);
    -
    -Takes the name of a package, which may be a nested package, in the
    -form 'Foo/Bar.pm' and replaces the slash with C<::> or something else
    -safe for a man page file name.  Returns the replacement.
    -
    -=cut
    -
    -sub replace_manpage_separator {
    -    my($self,$man) = @_;
    -
    -    $man =~ s,/+,::,g;
    -    return $man;
    -}
    -
    -
    -=item cd
    -
    -=cut
    -
    -sub cd {
    -    my($self, $dir, @cmds) = @_;
    -
    -    # No leading tab and no trailing newline makes for easier embedding
    -    my $make_frag = join "\n\t", map { "cd $dir && $_" } @cmds;
    -
    -    return $make_frag;
    -}
    -
    -=item oneliner
    -
    -=cut
    -
    -sub oneliner {
    -    my($self, $cmd, $switches) = @_;
    -    $switches = [] unless defined $switches;
    -
    -    # Strip leading and trailing newlines
    -    $cmd =~ s{^\n+}{};
    -    $cmd =~ s{\n+$}{};
    -
    -    my @cmds = split /\n/, $cmd;
    -    $cmd = join " \n\t  -e ", map $self->quote_literal($_), @cmds;
    -    $cmd = $self->escape_newlines($cmd);
    -
    -    $switches = join ' ', @$switches;
    -
    -    return qq{\$(ABSPERLRUN) $switches -e $cmd};   
    -}
    -
    -
    -=item quote_literal
    -
    -=cut
    -
    -sub quote_literal {
    -    my($self, $text) = @_;
    -
    -    # I think all we have to quote is single quotes and I think
    -    # this is a safe way to do it.
    -    $text =~ s{'}{'\\''}g;
    -
    -    return "'$text'";
    -}
    -
    -
    -=item escape_newlines
    -
    -=cut
    -
    -sub escape_newlines {
    -    my($self, $text) = @_;
    -
    -    $text =~ s{\n}{\\\n}g;
    -
    -    return $text;
    -}
    -
    -
    -=item max_exec_len
    -
    -Using POSIX::ARG_MAX.  Otherwise falling back to 4096.
    -
    -=cut
    -
    -sub max_exec_len {
    -    my $self = shift;
    -
    -    if (!defined $self->{_MAX_EXEC_LEN}) {
    -        if (my $arg_max = eval { require POSIX;  &POSIX::ARG_MAX }) {
    -            $self->{_MAX_EXEC_LEN} = $arg_max;
    -        }
    -        else {      # POSIX minimum exec size
    -            $self->{_MAX_EXEC_LEN} = 4096;
    -        }
    -    }
    -
    -    return $self->{_MAX_EXEC_LEN};
    -}
    -
    -
    -=item static (o)
    -
    -Defines the static target.
    -
    -=cut
    -
    -sub static {
    -# --- Static Loading Sections ---
    -
    -    my($self) = shift;
    -    '
    -## $(INST_PM) has been moved to the all: target.
    -## It remains here for awhile to allow for old usage: "make static"
    -static :: $(FIRST_MAKEFILE) $(INST_STATIC)
    -	$(NOECHO) $(NOOP)
    -';
    -}
    -
    -=item static_lib (o)
    -
    -Defines how to produce the *.a (or equivalent) files.
    -
    -=cut
    -
    -sub static_lib {
    -    my($self) = @_;
    -    return '' unless $self->has_link_code;
    -
    -    my(@m);
    -    push(@m, <<'END');
    -
    -$(INST_STATIC) : $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)$(DFSEP).exists
    -	$(RM_RF) $@
    -END
    -
    -    # If this extension has its own library (eg SDBM_File)
    -    # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
    -    push(@m, <<'MAKE_FRAG') if $self->{MYEXTLIB};
    -	$(CP) $(MYEXTLIB) $@
    -MAKE_FRAG
    -
    -    my $ar; 
    -    if (exists $self->{FULL_AR} && -x $self->{FULL_AR}) {
    -        # Prefer the absolute pathed ar if available so that PATH
    -        # doesn't confuse us.  Perl itself is built with the full_ar.  
    -        $ar = 'FULL_AR';
    -    } else {
    -        $ar = 'AR';
    -    }
    -    push @m, sprintf <<'MAKE_FRAG', $ar;
    -	$(%s) $(AR_STATIC_ARGS) $@ $(OBJECT) && $(RANLIB) $@
    -	$(CHMOD) $(PERM_RWX) $@
    -	$(NOECHO) $(ECHO) "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)/extralibs.ld
    -MAKE_FRAG
    -
    -    # Old mechanism - still available:
    -    push @m, <<'MAKE_FRAG' if $self->{PERL_SRC} && $self->{EXTRALIBS};
    -	$(NOECHO) $(ECHO) "$(EXTRALIBS)" >> $(PERL_SRC)/ext.libs
    -MAKE_FRAG
    -
    -    join('', @m);
    -}
    -
    -=item staticmake (o)
    -
    -Calls makeaperl.
    -
    -=cut
    -
    -sub staticmake {
    -    my($self, %attribs) = @_;
    -    my(@static);
    -
    -    my(@searchdirs)=($self->{PERL_ARCHLIB}, $self->{SITEARCHEXP},  $self->{INST_ARCHLIB});
    -
    -    # And as it's not yet built, we add the current extension
    -    # but only if it has some C code (or XS code, which implies C code)
    -    if (@{$self->{C}}) {
    -	@static = $self->catfile($self->{INST_ARCHLIB},
    -				 "auto",
    -				 $self->{FULLEXT},
    -				 "$self->{BASEEXT}$self->{LIB_EXT}"
    -				);
    -    }
    -
    -    # Either we determine now, which libraries we will produce in the
    -    # subdirectories or we do it at runtime of the make.
    -
    -    # We could ask all subdir objects, but I cannot imagine, why it
    -    # would be necessary.
    -
    -    # Instead we determine all libraries for the new perl at
    -    # runtime.
    -    my(@perlinc) = ($self->{INST_ARCHLIB}, $self->{INST_LIB}, $self->{PERL_ARCHLIB}, $self->{PERL_LIB});
    -
    -    $self->makeaperl(MAKE	=> $self->{MAKEFILE},
    -		     DIRS	=> \@searchdirs,
    -		     STAT	=> \@static,
    -		     INCL	=> \@perlinc,
    -		     TARGET	=> $self->{MAP_TARGET},
    -		     TMP	=> "",
    -		     LIBPERL	=> $self->{LIBPERL_A}
    -		    );
    -}
    -
    -=item subdir_x (o)
    -
    -Helper subroutine for subdirs
    -
    -=cut
    -
    -sub subdir_x {
    -    my($self, $subdir) = @_;
    -
    -    my $subdir_cmd = $self->cd($subdir, 
    -      '$(MAKE) $(USEMAKEFILE) $(FIRST_MAKEFILE) all $(PASTHRU)'
    -    );
    -    return sprintf <<'EOT', $subdir_cmd;
    -
    -subdirs ::
    -	$(NOECHO) %s
    -EOT
    -
    -}
    -
    -=item subdirs (o)
    -
    -Defines targets to process subdirectories.
    -
    -=cut
    -
    -sub subdirs {
    -# --- Sub-directory Sections ---
    -    my($self) = shift;
    -    my(@m,$dir);
    -    # This method provides a mechanism to automatically deal with
    -    # subdirectories containing further Makefile.PL scripts.
    -    # It calls the subdir_x() method for each subdirectory.
    -    foreach $dir (@{$self->{DIR}}){
    -	push(@m, $self->subdir_x($dir));
    -####	print "Including $dir subdirectory\n";
    -    }
    -    if (@m){
    -	unshift(@m, "
    -# The default clean, realclean and test targets in this Makefile
    -# have automatically been given entries for each subdir.
    -
    -");
    -    } else {
    -	push(@m, "\n# none")
    -    }
    -    join('',@m);
    -}
    -
    -=item test (o)
    -
    -Defines the test targets.
    -
    -=cut
    -
    -sub test {
    -# --- Test and Installation Sections ---
    -
    -    my($self, %attribs) = @_;
    -    my $tests = $attribs{TESTS} || '';
    -    if (!$tests && -d 't') {
    -        $tests = $self->find_tests;
    -    }
    -    # note: 'test.pl' name is also hardcoded in init_dirscan()
    -    my(@m);
    -    push(@m,"
    -TEST_VERBOSE=0
    -TEST_TYPE=test_\$(LINKTYPE)
    -TEST_FILE = test.pl
    -TEST_FILES = $tests
    -TESTDB_SW = -d
    -
    -testdb :: testdb_\$(LINKTYPE)
    -
    -test :: \$(TEST_TYPE)
    -");
    -
    -    foreach my $dir (@{ $self->{DIR} }) {
    -        my $test = $self->oneliner(sprintf <<'CODE', $dir);
    -chdir '%s';  
    -system '$(MAKE) test $(PASTHRU)' 
    -    if -f '$(FIRST_MAKEFILE)';
    -CODE
    -
    -        push(@m, "\t\$(NOECHO) $test\n");
    -    }
    -
    -    push(@m, "\t\$(NOECHO) \$(ECHO) 'No tests defined for \$(NAME) extension.'\n")
    -	unless $tests or -f "test.pl" or @{$self->{DIR}};
    -    push(@m, "\n");
    -
    -    push(@m, "test_dynamic :: pure_all\n");
    -    push(@m, $self->test_via_harness('$(FULLPERLRUN)', '$(TEST_FILES)')) 
    -      if $tests;
    -    push(@m, $self->test_via_script('$(FULLPERLRUN)', '$(TEST_FILE)')) 
    -      if -f "test.pl";
    -    push(@m, "\n");
    -
    -    push(@m, "testdb_dynamic :: pure_all\n");
    -    push(@m, $self->test_via_script('$(FULLPERLRUN) $(TESTDB_SW)', 
    -                                    '$(TEST_FILE)'));
    -    push(@m, "\n");
    -
    -    # Occasionally we may face this degenerate target:
    -    push @m, "test_ : test_dynamic\n\n";
    -
    -    if ($self->needs_linking()) {
    -	push(@m, "test_static :: pure_all \$(MAP_TARGET)\n");
    -	push(@m, $self->test_via_harness('./$(MAP_TARGET)', '$(TEST_FILES)')) if $tests;
    -	push(@m, $self->test_via_script('./$(MAP_TARGET)', '$(TEST_FILE)')) if -f "test.pl";
    -	push(@m, "\n");
    -	push(@m, "testdb_static :: pure_all \$(MAP_TARGET)\n");
    -	push(@m, $self->test_via_script('./$(MAP_TARGET) $(TESTDB_SW)', '$(TEST_FILE)'));
    -	push(@m, "\n");
    -    } else {
    -	push @m, "test_static :: test_dynamic\n";
    -	push @m, "testdb_static :: testdb_dynamic\n";
    -    }
    -    join("", @m);
    -}
    -
    -=item test_via_harness (override)
    -
    -For some reason which I forget, Unix machines like to have
    -PERL_DL_NONLAZY set for tests.
    -
    -=cut
    -
    -sub test_via_harness {
    -    my($self, $perl, $tests) = @_;
    -    return $self->SUPER::test_via_harness("PERL_DL_NONLAZY=1 $perl", $tests);
    -}
    -
    -=item test_via_script (override)
    -
    -Again, the PERL_DL_NONLAZY thing.
    -
    -=cut
    -
    -sub test_via_script {
    -    my($self, $perl, $script) = @_;
    -    return $self->SUPER::test_via_script("PERL_DL_NONLAZY=1 $perl", $script);
    -}
    -
    -
    -=item tools_other (o)
    -
    -    my $make_frag = $MM->tools_other;
    -
    -Returns a make fragment containing definitions for the macros init_others() 
    -initializes.
    -
    -=cut
    -
    -sub tools_other {
    -    my($self) = shift;
    -    my @m;
    -
    -    # We set PM_FILTER as late as possible so it can see all the earlier
    -    # on macro-order sensitive makes such as nmake.
    -    for my $tool (qw{ SHELL CHMOD CP MV NOOP NOECHO RM_F RM_RF TEST_F TOUCH 
    -                      UMASK_NULL DEV_NULL MKPATH EQUALIZE_TIMESTAMP 
    -                      ECHO ECHO_N
    -                      UNINST VERBINST
    -                      MOD_INSTALL DOC_INSTALL UNINSTALL
    -                      WARN_IF_OLD_PACKLIST
    -		      MACROSTART MACROEND
    -                      USEMAKEFILE
    -                      PM_FILTER
    -                      FIXIN
    -                    } ) 
    -    {
    -        next unless defined $self->{$tool};
    -        push @m, "$tool = $self->{$tool}\n";
    -    }
    -
    -    return join "", @m;
    -}
    -
    -=item tool_xsubpp (o)
    -
    -Determines typemaps, xsubpp version, prototype behaviour.
    -
    -=cut
    -
    -sub tool_xsubpp {
    -    my($self) = shift;
    -    return "" unless $self->needs_linking;
    -
    -    my $xsdir;
    -    my @xsubpp_dirs = @INC;
    -
    -    # Make sure we pick up the new xsubpp if we're building perl.
    -    unshift @xsubpp_dirs, $self->{PERL_LIB} if $self->{PERL_CORE};
    -
    -    foreach my $dir (@xsubpp_dirs) {
    -        $xsdir = $self->catdir($dir, 'ExtUtils');
    -        if( -r $self->catfile($xsdir, "xsubpp") ) {
    -            last;
    -        }
    -    }
    -
    -    my $tmdir   = File::Spec->catdir($self->{PERL_LIB},"ExtUtils");
    -    my(@tmdeps) = $self->catfile($tmdir,'typemap');
    -    if( $self->{TYPEMAPS} ){
    -	my $typemap;
    -	foreach $typemap (@{$self->{TYPEMAPS}}){
    -		if( ! -f  $typemap ){
    -			warn "Typemap $typemap not found.\n";
    -		}
    -		else{
    -			push(@tmdeps,  $typemap);
    -		}
    -	}
    -    }
    -    push(@tmdeps, "typemap") if -f "typemap";
    -    my(@tmargs) = map("-typemap $_", @tmdeps);
    -    if( exists $self->{XSOPT} ){
    - 	unshift( @tmargs, $self->{XSOPT} );
    -    }
    -
    -    if ($Is_VMS                          &&
    -        $Config{'ldflags'}               && 
    -        $Config{'ldflags'} =~ m!/Debug!i &&
    -        (!exists($self->{XSOPT}) || $self->{XSOPT} !~ /linenumbers/)
    -       ) 
    -    {
    -        unshift(@tmargs,'-nolinenumbers');
    -    }
    -
    -
    -    $self->{XSPROTOARG} = "" unless defined $self->{XSPROTOARG};
    -
    -    return qq{
    -XSUBPPDIR = $xsdir
    -XSUBPP = \$(XSUBPPDIR)\$(DFSEP)xsubpp
    -XSUBPPRUN = \$(PERLRUN) \$(XSUBPP)
    -XSPROTOARG = $self->{XSPROTOARG}
    -XSUBPPDEPS = @tmdeps \$(XSUBPP)
    -XSUBPPARGS = @tmargs
    -XSUBPP_EXTRA_ARGS = 
    -};
    -};
    -
    -
    -=item all_target
    -
    -Build man pages, too
    -
    -=cut
    -
    -sub all_target {
    -    my $self = shift;
    -
    -    return <<'MAKE_EXT';
    -all :: pure_all manifypods
    -	$(NOECHO) $(NOOP)
    -MAKE_EXT
    -}
    -
    -=item top_targets (o)
    -
    -Defines the targets all, subdirs, config, and O_FILES
    -
    -=cut
    -
    -sub top_targets {
    -# --- Target Sections ---
    -
    -    my($self) = shift;
    -    my(@m);
    -
    -    push @m, $self->all_target, "\n" unless $self->{SKIPHASH}{'all'};
    -
    -    push @m, '
    -pure_all :: config pm_to_blib subdirs linkext
    -	$(NOECHO) $(NOOP)
    -
    -subdirs :: $(MYEXTLIB)
    -	$(NOECHO) $(NOOP)
    -
    -config :: $(FIRST_MAKEFILE) blibdirs
    -	$(NOECHO) $(NOOP)
    -';
    -
    -    push @m, '
    -$(O_FILES): $(H_FILES)
    -' if @{$self->{O_FILES} || []} && @{$self->{H} || []};
    -
    -    push @m, q{
    -help :
    -	perldoc ExtUtils::MakeMaker
    -};
    -
    -    join('',@m);
    -}
    -
    -=item writedoc
    -
    -Obsolete, deprecated method. Not used since Version 5.21.
    -
    -=cut
    -
    -sub writedoc {
    -# --- perllocal.pod section ---
    -    my($self,$what,$name,@attribs)=@_;
    -    my $time = localtime;
    -    print "=head2 $time: $what C<$name>\n\n=over 4\n\n=item *\n\n";
    -    print join "\n\n=item *\n\n", map("C<$_>",@attribs);
    -    print "\n\n=back\n\n";
    -}
    -
    -=item xs_c (o)
    -
    -Defines the suffix rules to compile XS files to C.
    -
    -=cut
    -
    -sub xs_c {
    -    my($self) = shift;
    -    return '' unless $self->needs_linking();
    -    '
    -.xs.c:
    -	$(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $(XSUBPP_EXTRA_ARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c
    -';
    -}
    -
    -=item xs_cpp (o)
    -
    -Defines the suffix rules to compile XS files to C++.
    -
    -=cut
    -
    -sub xs_cpp {
    -    my($self) = shift;
    -    return '' unless $self->needs_linking();
    -    '
    -.xs.cpp:
    -	$(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.cpp
    -';
    -}
    -
    -=item xs_o (o)
    -
    -Defines suffix rules to go from XS to object files directly. This is
    -only intended for broken make implementations.
    -
    -=cut
    -
    -sub xs_o {	# many makes are too dumb to use xs_c then c_o
    -    my($self) = shift;
    -    return '' unless $self->needs_linking();
    -    '
    -.xs$(OBJ_EXT):
    -	$(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc && $(MV) $*.xsc $*.c
    -	$(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.c
    -';
    -}
    -
    -
    -1;
    -
    -=back
    -
    -=head1 SEE ALSO
    -
    -L
    -
    -=cut
    -
    -__END__
    diff --git a/lib/perl5/5.8.8/ExtUtils/MM_VMS.pm b/lib/perl5/5.8.8/ExtUtils/MM_VMS.pm
    deleted file mode 100644
    index 7677420c..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/MM_VMS.pm
    +++ /dev/null
    @@ -1,1953 +0,0 @@
    -package ExtUtils::MM_VMS;
    -
    -use strict;
    -
    -use ExtUtils::MakeMaker::Config;
    -require Exporter;
    -
    -BEGIN {
    -    # so we can compile the thing on non-VMS platforms.
    -    if( $^O eq 'VMS' ) {
    -        require VMS::Filespec;
    -        VMS::Filespec->import;
    -    }
    -}
    -
    -use File::Basename;
    -
    -# $Revision can't be on the same line or SVN/K gets confused
    -use vars qw($Revision
    -            $VERSION @ISA);
    -$VERSION = '5.73';
    -
    -require ExtUtils::MM_Any;
    -require ExtUtils::MM_Unix;
    -@ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
    -
    -use ExtUtils::MakeMaker qw($Verbose neatvalue);
    -$Revision = $ExtUtils::MakeMaker::Revision;
    -
    -
    -=head1 NAME
    -
    -ExtUtils::MM_VMS - methods to override UN*X behaviour in ExtUtils::MakeMaker
    -
    -=head1 SYNOPSIS
    -
    -  Do not use this directly.
    -  Instead, use ExtUtils::MM and it will figure out which MM_*
    -  class to use for you.
    -
    -=head1 DESCRIPTION
    -
    -See ExtUtils::MM_Unix for a documentation of the methods provided
    -there. This package overrides the implementation of these methods, not
    -the semantics.
    -
    -=head2 Methods always loaded
    -
    -=over 4
    -
    -=item wraplist
    -
    -Converts a list into a string wrapped at approximately 80 columns.
    -
    -=cut
    -
    -sub wraplist {
    -    my($self) = shift;
    -    my($line,$hlen) = ('',0);
    -
    -    foreach my $word (@_) {
    -      # Perl bug -- seems to occasionally insert extra elements when
    -      # traversing array (scalar(@array) doesn't show them, but
    -      # foreach(@array) does) (5.00307)
    -      next unless $word =~ /\w/;
    -      $line .= ' ' if length($line);
    -      if ($hlen > 80) { $line .= "\\\n\t"; $hlen = 0; }
    -      $line .= $word;
    -      $hlen += length($word) + 2;
    -    }
    -    $line;
    -}
    -
    -
    -# This isn't really an override.  It's just here because ExtUtils::MM_VMS
    -# appears in @MM::ISA before ExtUtils::Liblist::Kid, so if there isn't an ext()
    -# in MM_VMS, then AUTOLOAD is called, and bad things happen.  So, we just
    -# mimic inheritance here and hand off to ExtUtils::Liblist::Kid.
    -# XXX This hackery will die soon. --Schwern
    -sub ext {
    -    require ExtUtils::Liblist::Kid;
    -    goto &ExtUtils::Liblist::Kid::ext;
    -}
    -
    -=back
    -
    -=head2 Methods
    -
    -Those methods which override default MM_Unix methods are marked
    -"(override)", while methods unique to MM_VMS are marked "(specific)".
    -For overridden methods, documentation is limited to an explanation
    -of why this method overrides the MM_Unix method; see the ExtUtils::MM_Unix
    -documentation for more details.
    -
    -=over 4
    -
    -=item guess_name (override)
    -
    -Try to determine name of extension being built.  We begin with the name
    -of the current directory.  Since VMS filenames are case-insensitive,
    -however, we look for a F<.pm> file whose name matches that of the current
    -directory (presumably the 'main' F<.pm> file for this extension), and try
    -to find a C statement from which to obtain the Mixed::Case
    -package name.
    -
    -=cut
    -
    -sub guess_name {
    -    my($self) = @_;
    -    my($defname,$defpm,@pm,%xs,$pm);
    -    local *PM;
    -
    -    $defname = basename(fileify($ENV{'DEFAULT'}));
    -    $defname =~ s![\d\-_]*\.dir.*$!!;  # Clip off .dir;1 suffix, and package version
    -    $defpm = $defname;
    -    # Fallback in case for some reason a user has copied the files for an
    -    # extension into a working directory whose name doesn't reflect the
    -    # extension's name.  We'll use the name of a unique .pm file, or the
    -    # first .pm file with a matching .xs file.
    -    if (not -e "${defpm}.pm") {
    -      @pm = map { s/.pm$//; $_ } glob('*.pm');
    -      if (@pm == 1) { ($defpm = $pm[0]) =~ s/.pm$//; }
    -      elsif (@pm) {
    -        %xs = map { s/.xs$//; ($_,1) } glob('*.xs');
    -        if (keys %xs) { 
    -            foreach $pm (@pm) { 
    -                $defpm = $pm, last if exists $xs{$pm}; 
    -            } 
    -        }
    -      }
    -    }
    -    if (open(PM,"${defpm}.pm")){
    -        while () {
    -            if (/^\s*package\s+([^;]+)/i) {
    -                $defname = $1;
    -                last;
    -            }
    -        }
    -        print STDOUT "Warning (non-fatal): Couldn't find package name in ${defpm}.pm;\n\t",
    -                     "defaulting package name to $defname\n"
    -            if eof(PM);
    -        close PM;
    -    }
    -    else {
    -        print STDOUT "Warning (non-fatal): Couldn't find ${defpm}.pm;\n\t",
    -                     "defaulting package name to $defname\n";
    -    }
    -    $defname =~ s#[\d.\-_]+$##;
    -    $defname;
    -}
    -
    -=item find_perl (override)
    -
    -Use VMS file specification syntax and CLI commands to find and
    -invoke Perl images.
    -
    -=cut
    -
    -sub find_perl {
    -    my($self, $ver, $names, $dirs, $trace) = @_;
    -    my($name,$dir,$vmsfile,@sdirs,@snames,@cand);
    -    my($rslt);
    -    my($inabs) = 0;
    -    local *TCF;
    -
    -    if( $self->{PERL_CORE} ) {
    -        # Check in relative directories first, so we pick up the current
    -        # version of Perl if we're running MakeMaker as part of the main build.
    -        @sdirs = sort { my($absa) = $self->file_name_is_absolute($a);
    -                        my($absb) = $self->file_name_is_absolute($b);
    -                        if ($absa && $absb) { return $a cmp $b }
    -                        else { return $absa ? 1 : ($absb ? -1 : ($a cmp $b)); }
    -                      } @$dirs;
    -        # Check miniperl before perl, and check names likely to contain
    -        # version numbers before "generic" names, so we pick up an
    -        # executable that's less likely to be from an old installation.
    -        @snames = sort { my($ba) = $a =~ m!([^:>\]/]+)$!;  # basename
    -                         my($bb) = $b =~ m!([^:>\]/]+)$!;
    -                         my($ahasdir) = (length($a) - length($ba) > 0);
    -                         my($bhasdir) = (length($b) - length($bb) > 0);
    -                         if    ($ahasdir and not $bhasdir) { return 1; }
    -                         elsif ($bhasdir and not $ahasdir) { return -1; }
    -                         else { $bb =~ /\d/ <=> $ba =~ /\d/
    -                                  or substr($ba,0,1) cmp substr($bb,0,1)
    -                                  or length($bb) <=> length($ba) } } @$names;
    -    }
    -    else {
    -        @sdirs  = @$dirs;
    -        @snames = @$names;
    -    }
    -
    -    # Image names containing Perl version use '_' instead of '.' under VMS
    -    foreach $name (@snames) { $name =~ s/\.(\d+)$/_$1/; }
    -    if ($trace >= 2){
    -	print "Looking for perl $ver by these names:\n";
    -	print "\t@snames,\n";
    -	print "in these dirs:\n";
    -	print "\t@sdirs\n";
    -    }
    -    foreach $dir (@sdirs){
    -	next unless defined $dir; # $self->{PERL_SRC} may be undefined
    -	$inabs++ if $self->file_name_is_absolute($dir);
    -	if ($inabs == 1) {
    -	    # We've covered relative dirs; everything else is an absolute
    -	    # dir (probably an installed location).  First, we'll try potential
    -	    # command names, to see whether we can avoid a long MCR expression.
    -	    foreach $name (@snames) { push(@cand,$name) if $name =~ /^[\w\-\$]+$/; }
    -	    $inabs++; # Should happen above in next $dir, but just in case . . .
    -	}
    -	foreach $name (@snames){
    -	    if ($name !~ m![/:>\]]!) { push(@cand,$self->catfile($dir,$name)); }
    -	    else                     { push(@cand,$self->fixpath($name,0));    }
    -	}
    -    }
    -    foreach $name (@cand) {
    -	print "Checking $name\n" if ($trace >= 2);
    -	# If it looks like a potential command, try it without the MCR
    -        if ($name =~ /^[\w\-\$]+$/) {
    -            open(TCF,">temp_mmvms.com") || die('unable to open temp file');
    -            print TCF "\$ set message/nofacil/nosever/noident/notext\n";
    -            print TCF "\$ $name -e \"require $ver; print \"\"VER_OK\\n\"\"\"\n";
    -            close TCF;
    -            $rslt = `\@temp_mmvms.com` ;
    -            unlink('temp_mmvms.com');
    -            if ($rslt =~ /VER_OK/) {
    -                print "Using PERL=$name\n" if $trace;
    -                return $name;
    -            }
    -        }
    -	next unless $vmsfile = $self->maybe_command($name);
    -	$vmsfile =~ s/;[\d\-]*$//;  # Clip off version number; we can use a newer version as well
    -	print "Executing $vmsfile\n" if ($trace >= 2);
    -        open(TCF,">temp_mmvms.com") || die('unable to open temp file');
    -        print TCF "\$ set message/nofacil/nosever/noident/notext\n";
    -        print TCF "\$ mcr $vmsfile -e \"require $ver; print \"\"VER_OK\\n\"\"\" \n";
    -        close TCF;
    -        $rslt = `\@temp_mmvms.com`;
    -        unlink('temp_mmvms.com');
    -        if ($rslt =~ /VER_OK/) {
    -	    print "Using PERL=MCR $vmsfile\n" if $trace;
    -	    return "MCR $vmsfile";
    -	}
    -    }
    -    print STDOUT "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n";
    -    0; # false and not empty
    -}
    -
    -=item maybe_command (override)
    -
    -Follows VMS naming conventions for executable files.
    -If the name passed in doesn't exactly match an executable file,
    -appends F<.Exe> (or equivalent) to check for executable image, and F<.Com>
    -to check for DCL procedure.  If this fails, checks directories in DCL$PATH
    -and finally F for an executable file having the name specified,
    -with or without the F<.Exe>-equivalent suffix.
    -
    -=cut
    -
    -sub maybe_command {
    -    my($self,$file) = @_;
    -    return $file if -x $file && ! -d _;
    -    my(@dirs) = ('');
    -    my(@exts) = ('',$Config{'exe_ext'},'.exe','.com');
    -    my($dir,$ext);
    -    if ($file !~ m![/:>\]]!) {
    -	for (my $i = 0; defined $ENV{"DCL\$PATH;$i"}; $i++) {
    -	    $dir = $ENV{"DCL\$PATH;$i"};
    -	    $dir .= ':' unless $dir =~ m%[\]:]$%;
    -	    push(@dirs,$dir);
    -	}
    -	push(@dirs,'Sys$System:');
    -	foreach $dir (@dirs) {
    -	    my $sysfile = "$dir$file";
    -	    foreach $ext (@exts) {
    -		return $file if -x "$sysfile$ext" && ! -d _;
    -	    }
    -	}
    -    }
    -    return 0;
    -}
    -
    -
    -=item pasthru (override)
    -
    -VMS has $(MMSQUALIFIERS) which is a listing of all the original command line
    -options.  This is used in every invokation of make in the VMS Makefile so
    -PASTHRU should not be necessary.  Using PASTHRU tends to blow commands past
    -the 256 character limit.
    -
    -=cut
    -
    -sub pasthru {
    -    return "PASTHRU=\n";
    -}
    -
    -
    -=item pm_to_blib (override)
    -
    -VMS wants a dot in every file so we can't have one called 'pm_to_blib',
    -it becomes 'pm_to_blib.' and MMS/K isn't smart enough to know that when
    -you have a target called 'pm_to_blib' it should look for 'pm_to_blib.'.
    -
    -So in VMS its pm_to_blib.ts.
    -
    -=cut
    -
    -sub pm_to_blib {
    -    my $self = shift;
    -
    -    my $make = $self->SUPER::pm_to_blib;
    -
    -    $make =~ s{^pm_to_blib :}{pm_to_blib.ts :}m;
    -    $make =~ s{\$\(TOUCH\) pm_to_blib}{\$(TOUCH) pm_to_blib.ts};
    -
    -    $make = <<'MAKE' . $make;
    -# Dummy target to match Unix target name; we use pm_to_blib.ts as
    -# timestamp file to avoid repeated invocations under VMS
    -pm_to_blib : pm_to_blib.ts
    -	$(NOECHO) $(NOOP)
    -
    -MAKE
    -
    -    return $make;
    -}
    -
    -
    -=item perl_script (override)
    -
    -If name passed in doesn't specify a readable file, appends F<.com> or
    -F<.pl> and tries again, since it's customary to have file types on all files
    -under VMS.
    -
    -=cut
    -
    -sub perl_script {
    -    my($self,$file) = @_;
    -    return $file if -r $file && ! -d _;
    -    return "$file.com" if -r "$file.com";
    -    return "$file.pl" if -r "$file.pl";
    -    return '';
    -}
    -
    -
    -=item replace_manpage_separator
    -
    -Use as separator a character which is legal in a VMS-syntax file name.
    -
    -=cut
    -
    -sub replace_manpage_separator {
    -    my($self,$man) = @_;
    -    $man = unixify($man);
    -    $man =~ s#/+#__#g;
    -    $man;
    -}
    -
    -=item init_DEST
    -
    -(override) Because of the difficulty concatenating VMS filepaths we
    -must pre-expand the DEST* variables.
    -
    -=cut
    -
    -sub init_DEST {
    -    my $self = shift;
    -
    -    $self->SUPER::init_DEST;
    -
    -    # Expand DEST variables.
    -    foreach my $var ($self->installvars) {
    -        my $destvar = 'DESTINSTALL'.$var;
    -        $self->{$destvar} = File::Spec->eliminate_macros($self->{$destvar});
    -    }
    -}
    -
    -
    -=item init_DIRFILESEP
    -
    -No seperator between a directory path and a filename on VMS.
    -
    -=cut
    -
    -sub init_DIRFILESEP {
    -    my($self) = shift;
    -
    -    $self->{DIRFILESEP} = '';
    -    return 1;
    -}
    -
    -
    -=item init_main (override)
    -
    -
    -=cut
    -
    -sub init_main {
    -    my($self) = shift;
    -
    -    $self->SUPER::init_main;
    -
    -    $self->{DEFINE} ||= '';
    -    if ($self->{DEFINE} ne '') {
    -        my(@terms) = split(/\s+/,$self->{DEFINE});
    -        my(@defs,@udefs);
    -        foreach my $def (@terms) {
    -            next unless $def;
    -            my $targ = \@defs;
    -            if ($def =~ s/^-([DU])//) {    # If it was a Unix-style definition
    -                $targ = \@udefs if $1 eq 'U';
    -                $def =~ s/='(.*)'$/=$1/;  # then remove shell-protection ''
    -                $def =~ s/^'(.*)'$/$1/;   # from entire term or argument
    -            }
    -            if ($def =~ /=/) {
    -                $def =~ s/"/""/g;  # Protect existing " from DCL
    -                $def = qq["$def"]; # and quote to prevent parsing of =
    -            }
    -            push @$targ, $def;
    -        }
    -
    -        $self->{DEFINE} = '';
    -        if (@defs)  { 
    -            $self->{DEFINE}  = '/Define=(' . join(',',@defs)  . ')'; 
    -        }
    -        if (@udefs) { 
    -            $self->{DEFINE} .= '/Undef=('  . join(',',@udefs) . ')'; 
    -        }
    -    }
    -}
    -
    -=item init_others (override)
    -
    -Provide VMS-specific forms of various utility commands, then hand
    -off to the default MM_Unix method.
    -
    -DEV_NULL should probably be overriden with something.
    -
    -Also changes EQUALIZE_TIMESTAMP to set revision date of target file to
    -one second later than source file, since MMK interprets precisely
    -equal revision dates for a source and target file as a sign that the
    -target needs to be updated.
    -
    -=cut
    -
    -sub init_others {
    -    my($self) = @_;
    -
    -    $self->{NOOP}               = 'Continue';
    -    $self->{NOECHO}             ||= '@ ';
    -
    -    $self->{MAKEFILE}           ||= 'Descrip.MMS';
    -    $self->{FIRST_MAKEFILE}     ||= $self->{MAKEFILE};
    -    $self->{MAKE_APERL_FILE}    ||= 'Makeaperl.MMS';
    -    $self->{MAKEFILE_OLD}       ||= '$(FIRST_MAKEFILE)_old';
    -
    -    $self->{MACROSTART}         ||= '/Macro=(';
    -    $self->{MACROEND}           ||= ')';
    -    $self->{USEMAKEFILE}        ||= '/Descrip=';
    -
    -    $self->{ECHO}     ||= '$(ABSPERLRUN) -le "print qq{@ARGV}"';
    -    $self->{ECHO_N}   ||= '$(ABSPERLRUN) -e  "print qq{@ARGV}"';
    -    $self->{TOUCH}    ||= '$(ABSPERLRUN) "-MExtUtils::Command" -e touch';
    -    $self->{CHMOD}    ||= '$(ABSPERLRUN) "-MExtUtils::Command" -e chmod'; 
    -    $self->{RM_F}     ||= '$(ABSPERLRUN) "-MExtUtils::Command" -e rm_f';
    -    $self->{RM_RF}    ||= '$(ABSPERLRUN) "-MExtUtils::Command" -e rm_rf';
    -    $self->{TEST_F}   ||= '$(ABSPERLRUN) "-MExtUtils::Command" -e test_f';
    -    $self->{EQUALIZE_TIMESTAMP} ||= '$(ABSPERLRUN) -we "open F,qq{>>$ARGV[1]};close F;utime(0,(stat($ARGV[0]))[9]+1,$ARGV[1])"';
    -
    -    $self->{MOD_INSTALL} ||= 
    -      $self->oneliner(<<'CODE', ['-MExtUtils::Install']);
    -install({split(' ',)}, '$(VERBINST)', 0, '$(UNINST)');
    -CODE
    -
    -    $self->{SHELL}    ||= 'Posix';
    -
    -    $self->SUPER::init_others;
    -
    -    # So we can copy files into directories with less fuss
    -    $self->{CP}         = '$(ABSPERLRUN) "-MExtUtils::Command" -e cp';
    -    $self->{MV}         = '$(ABSPERLRUN) "-MExtUtils::Command" -e mv';
    -
    -    $self->{UMASK_NULL} = '! ';  
    -
    -    # Redirection on VMS goes before the command, not after as on Unix.
    -    # $(DEV_NULL) is used once and its not worth going nuts over making
    -    # it work.  However, Unix's DEV_NULL is quite wrong for VMS.
    -    $self->{DEV_NULL}   = '';
    -
    -    if ($self->{OBJECT} =~ /\s/) {
    -        $self->{OBJECT} =~ s/(\\)?\n+\s+/ /g;
    -        $self->{OBJECT} = $self->wraplist(
    -            map $self->fixpath($_,0), split /,?\s+/, $self->{OBJECT}
    -        );
    -    }
    -
    -    $self->{LDFROM} = $self->wraplist(
    -        map $self->fixpath($_,0), split /,?\s+/, $self->{LDFROM}
    -    );
    -}
    -
    -
    -=item init_platform (override)
    -
    -Add PERL_VMS, MM_VMS_REVISION and MM_VMS_VERSION.
    -
    -MM_VMS_REVISION is for backwards compatibility before MM_VMS had a
    -$VERSION.
    -
    -=cut
    -
    -sub init_platform {
    -    my($self) = shift;
    -
    -    $self->{MM_VMS_REVISION} = $Revision;
    -    $self->{MM_VMS_VERSION}  = $VERSION;
    -    $self->{PERL_VMS} = $self->catdir($self->{PERL_SRC}, 'VMS')
    -      if $self->{PERL_SRC};
    -}
    -
    -
    -=item platform_constants
    -
    -=cut
    -
    -sub platform_constants {
    -    my($self) = shift;
    -    my $make_frag = '';
    -
    -    foreach my $macro (qw(PERL_VMS MM_VMS_REVISION MM_VMS_VERSION))
    -    {
    -        next unless defined $self->{$macro};
    -        $make_frag .= "$macro = $self->{$macro}\n";
    -    }
    -
    -    return $make_frag;
    -}
    -
    -
    -=item init_VERSION (override)
    -
    -Override the *DEFINE_VERSION macros with VMS semantics.  Translate the
    -MAKEMAKER filepath to VMS style.
    -
    -=cut
    -
    -sub init_VERSION {
    -    my $self = shift;
    -
    -    $self->SUPER::init_VERSION;
    -
    -    $self->{DEFINE_VERSION}    = '"$(VERSION_MACRO)=""$(VERSION)"""';
    -    $self->{XS_DEFINE_VERSION} = '"$(XS_VERSION_MACRO)=""$(XS_VERSION)"""';
    -    $self->{MAKEMAKER} = vmsify($INC{'ExtUtils/MakeMaker.pm'});
    -}
    -
    -
    -=item constants (override)
    -
    -Fixes up numerous file and directory macros to insure VMS syntax
    -regardless of input syntax.  Also makes lists of files
    -comma-separated.
    -
    -=cut
    -
    -sub constants {
    -    my($self) = @_;
    -
    -    # Be kind about case for pollution
    -    for (@ARGV) { $_ = uc($_) if /POLLUTE/i; }
    -
    -    # Cleanup paths for directories in MMS macros.
    -    foreach my $macro ( qw [
    -            INST_BIN INST_SCRIPT INST_LIB INST_ARCHLIB 
    -            PERL_LIB PERL_ARCHLIB
    -            PERL_INC PERL_SRC ],
    -                        (map { 'INSTALL'.$_ } $self->installvars)
    -                      ) 
    -    {
    -        next unless defined $self->{$macro};
    -        next if $macro =~ /MAN/ && $self->{$macro} eq 'none';
    -        $self->{$macro} = $self->fixpath($self->{$macro},1);
    -    }
    -
    -    # Cleanup paths for files in MMS macros.
    -    foreach my $macro ( qw[LIBPERL_A FIRST_MAKEFILE MAKEFILE_OLD 
    -                           MAKE_APERL_FILE MYEXTLIB] ) 
    -    {
    -        next unless defined $self->{$macro};
    -        $self->{$macro} = $self->fixpath($self->{$macro},0);
    -    }
    -
    -    # Fixup files for MMS macros
    -    # XXX is this list complete?
    -    for my $macro (qw/
    -                   FULLEXT VERSION_FROM OBJECT LDFROM
    -	      /	) {
    -        next unless defined $self->{$macro};
    -        $self->{$macro} = $self->fixpath($self->{$macro},0);
    -    }
    -
    -
    -    for my $macro (qw/ XS MAN1PODS MAN3PODS PM /) {
    -        # Where is the space coming from? --jhi
    -        next unless $self ne " " && defined $self->{$macro};
    -        my %tmp = ();
    -        for my $key (keys %{$self->{$macro}}) {
    -            $tmp{$self->fixpath($key,0)} = 
    -                                     $self->fixpath($self->{$macro}{$key},0);
    -        }
    -        $self->{$macro} = \%tmp;
    -    }
    -
    -    for my $macro (qw/ C O_FILES H /) {
    -        next unless defined $self->{$macro};
    -        my @tmp = ();
    -        for my $val (@{$self->{$macro}}) {
    -            push(@tmp,$self->fixpath($val,0));
    -        }
    -        $self->{$macro} = \@tmp;
    -    }
    -
    -    # mms/k does not define a $(MAKE) macro.
    -    $self->{MAKE} = '$(MMS)$(MMSQUALIFIERS)';
    -
    -    return $self->SUPER::constants;
    -}
    -
    -
    -=item special_targets
    -
    -Clear the default .SUFFIXES and put in our own list.
    -
    -=cut
    -
    -sub special_targets {
    -    my $self = shift;
    -
    -    my $make_frag .= <<'MAKE_FRAG';
    -.SUFFIXES :
    -.SUFFIXES : $(OBJ_EXT) .c .cpp .cxx .xs
    -
    -MAKE_FRAG
    -
    -    return $make_frag;
    -}
    -
    -=item cflags (override)
    -
    -Bypass shell script and produce qualifiers for CC directly (but warn
    -user if a shell script for this extension exists).  Fold multiple
    -/Defines into one, since some C compilers pay attention to only one
    -instance of this qualifier on the command line.
    -
    -=cut
    -
    -sub cflags {
    -    my($self,$libperl) = @_;
    -    my($quals) = $self->{CCFLAGS} || $Config{'ccflags'};
    -    my($definestr,$undefstr,$flagoptstr) = ('','','');
    -    my($incstr) = '/Include=($(PERL_INC)';
    -    my($name,$sys,@m);
    -
    -    ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ;
    -    print STDOUT "Unix shell script ".$Config{"$self->{'BASEEXT'}_cflags"}.
    -         " required to modify CC command for $self->{'BASEEXT'}\n"
    -    if ($Config{$name});
    -
    -    if ($quals =~ / -[DIUOg]/) {
    -	while ($quals =~ / -([Og])(\d*)\b/) {
    -	    my($type,$lvl) = ($1,$2);
    -	    $quals =~ s/ -$type$lvl\b\s*//;
    -	    if ($type eq 'g') { $flagoptstr = '/NoOptimize'; }
    -	    else { $flagoptstr = '/Optimize' . (defined($lvl) ? "=$lvl" : ''); }
    -	}
    -	while ($quals =~ / -([DIU])(\S+)/) {
    -	    my($type,$def) = ($1,$2);
    -	    $quals =~ s/ -$type$def\s*//;
    -	    $def =~ s/"/""/g;
    -	    if    ($type eq 'D') { $definestr .= qq["$def",]; }
    -	    elsif ($type eq 'I') { $incstr .= ',' . $self->fixpath($def,1); }
    -	    else                 { $undefstr  .= qq["$def",]; }
    -	}
    -    }
    -    if (length $quals and $quals !~ m!/!) {
    -	warn "MM_VMS: Ignoring unrecognized CCFLAGS elements \"$quals\"\n";
    -	$quals = '';
    -    }
    -    $definestr .= q["PERL_POLLUTE",] if $self->{POLLUTE};
    -    if (length $definestr) { chop($definestr); $quals .= "/Define=($definestr)"; }
    -    if (length $undefstr)  { chop($undefstr);  $quals .= "/Undef=($undefstr)";   }
    -    # Deal with $self->{DEFINE} here since some C compilers pay attention
    -    # to only one /Define clause on command line, so we have to
    -    # conflate the ones from $Config{'ccflags'} and $self->{DEFINE}
    -    # ($self->{DEFINE} has already been VMSified in constants() above)
    -    if ($self->{DEFINE}) { $quals .= $self->{DEFINE}; }
    -    for my $type (qw(Def Undef)) {
    -	my(@terms);
    -	while ($quals =~ m:/${type}i?n?e?=([^/]+):ig) {
    -		my $term = $1;
    -		$term =~ s:^\((.+)\)$:$1:;
    -		push @terms, $term;
    -	    }
    -	if ($type eq 'Def') {
    -	    push @terms, qw[ $(DEFINE_VERSION) $(XS_DEFINE_VERSION) ];
    -	}
    -	if (@terms) {
    -	    $quals =~ s:/${type}i?n?e?=[^/]+::ig;
    -	    $quals .= "/${type}ine=(" . join(',',@terms) . ')';
    -	}
    -    }
    -
    -    $libperl or $libperl = $self->{LIBPERL_A} || "libperl.olb";
    -
    -    # Likewise with $self->{INC} and /Include
    -    if ($self->{'INC'}) {
    -	my(@includes) = split(/\s+/,$self->{INC});
    -	foreach (@includes) {
    -	    s/^-I//;
    -	    $incstr .= ','.$self->fixpath($_,1);
    -	}
    -    }
    -    $quals .= "$incstr)";
    -#    $quals =~ s/,,/,/g; $quals =~ s/\(,/(/g;
    -    $self->{CCFLAGS} = $quals;
    -
    -    $self->{PERLTYPE} ||= '';
    -
    -    $self->{OPTIMIZE} ||= $flagoptstr || $Config{'optimize'};
    -    if ($self->{OPTIMIZE} !~ m!/!) {
    -	if    ($self->{OPTIMIZE} =~ m!-g!) { $self->{OPTIMIZE} = '/Debug/NoOptimize' }
    -	elsif ($self->{OPTIMIZE} =~ /-O(\d*)/) {
    -	    $self->{OPTIMIZE} = '/Optimize' . (defined($1) ? "=$1" : '');
    -	}
    -	else {
    -	    warn "MM_VMS: Can't parse OPTIMIZE \"$self->{OPTIMIZE}\"; using default\n" if length $self->{OPTIMIZE};
    -	    $self->{OPTIMIZE} = '/Optimize';
    -	}
    -    }
    -
    -    return $self->{CFLAGS} = qq{
    -CCFLAGS = $self->{CCFLAGS}
    -OPTIMIZE = $self->{OPTIMIZE}
    -PERLTYPE = $self->{PERLTYPE}
    -};
    -}
    -
    -=item const_cccmd (override)
    -
    -Adds directives to point C preprocessor to the right place when
    -handling #include Esys/foo.hE directives.  Also constructs CC
    -command line a bit differently than MM_Unix method.
    -
    -=cut
    -
    -sub const_cccmd {
    -    my($self,$libperl) = @_;
    -    my(@m);
    -
    -    return $self->{CONST_CCCMD} if $self->{CONST_CCCMD};
    -    return '' unless $self->needs_linking();
    -    if ($Config{'vms_cc_type'} eq 'gcc') {
    -        push @m,'
    -.FIRST
    -	',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" Then Define/NoLog SYS GNU_CC_Include:[VMS]';
    -    }
    -    elsif ($Config{'vms_cc_type'} eq 'vaxc') {
    -        push @m,'
    -.FIRST
    -	',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").eqs."" Then Define/NoLog SYS Sys$Library
    -	',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").nes."" Then Define/NoLog SYS VAXC$Include';
    -    }
    -    else {
    -        push @m,'
    -.FIRST
    -	',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").eqs."" Then Define/NoLog SYS ',
    -		($Config{'archname'} eq 'VMS_AXP' ? 'Sys$Library' : 'DECC$Library_Include'),'
    -	',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").nes."" Then Define/NoLog SYS DECC$System_Include';
    -    }
    -
    -    push(@m, "\n\nCCCMD = $Config{'cc'} \$(CCFLAGS)\$(OPTIMIZE)\n");
    -
    -    $self->{CONST_CCCMD} = join('',@m);
    -}
    -
    -
    -=item tools_other (override)
    -
    -Throw in some dubious extra macros for Makefile args.
    -
    -Also keep around the old $(SAY) macro in case somebody's using it.
    -
    -=cut
    -
    -sub tools_other {
    -    my($self) = @_;
    -
    -    # XXX Are these necessary?  Does anyone override them?  They're longer
    -    # than just typing the literal string.
    -    my $extra_tools = <<'EXTRA_TOOLS';
    -
    -# Just in case anyone is using the old macro.
    -USEMACROS = $(MACROSTART)
    -SAY = $(ECHO)
    -
    -EXTRA_TOOLS
    -
    -    return $self->SUPER::tools_other . $extra_tools;
    -}
    -
    -=item init_dist (override)
    -
    -VMSish defaults for some values.
    -
    -  macro         description                     default
    -
    -  ZIPFLAGS      flags to pass to ZIP            -Vu
    -
    -  COMPRESS      compression command to          gzip
    -                use for tarfiles
    -  SUFFIX        suffix to put on                -gz 
    -                compressed files
    -
    -  SHAR          shar command to use             vms_share
    -
    -  DIST_DEFAULT  default target to use to        tardist
    -                create a distribution
    -
    -  DISTVNAME     Use VERSION_SYM instead of      $(DISTNAME)-$(VERSION_SYM)
    -                VERSION for the name
    -
    -=cut
    -
    -sub init_dist {
    -    my($self) = @_;
    -    $self->{ZIPFLAGS}     ||= '-Vu';
    -    $self->{COMPRESS}     ||= 'gzip';
    -    $self->{SUFFIX}       ||= '-gz';
    -    $self->{SHAR}         ||= 'vms_share';
    -    $self->{DIST_DEFAULT} ||= 'zipdist';
    -
    -    $self->SUPER::init_dist;
    -
    -    $self->{DISTVNAME}    = "$self->{DISTNAME}-$self->{VERSION_SYM}";
    -}
    -
    -=item c_o (override)
    -
    -Use VMS syntax on command line.  In particular, $(DEFINE) and
    -$(PERL_INC) have been pulled into $(CCCMD).  Also use MM[SK] macros.
    -
    -=cut
    -
    -sub c_o {
    -    my($self) = @_;
    -    return '' unless $self->needs_linking();
    -    '
    -.c$(OBJ_EXT) :
    -	$(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
    -
    -.cpp$(OBJ_EXT) :
    -	$(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cpp
    -
    -.cxx$(OBJ_EXT) :
    -	$(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cxx
    -
    -';
    -}
    -
    -=item xs_c (override)
    -
    -Use MM[SK] macros.
    -
    -=cut
    -
    -sub xs_c {
    -    my($self) = @_;
    -    return '' unless $self->needs_linking();
    -    '
    -.xs.c :
    -	$(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET)
    -';
    -}
    -
    -=item xs_o (override)
    -
    -Use MM[SK] macros, and VMS command line for C compiler.
    -
    -=cut
    -
    -sub xs_o {	# many makes are too dumb to use xs_c then c_o
    -    my($self) = @_;
    -    return '' unless $self->needs_linking();
    -    '
    -.xs$(OBJ_EXT) :
    -	$(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET_NAME).c
    -	$(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c
    -';
    -}
    -
    -
    -=item dlsyms (override)
    -
    -Create VMS linker options files specifying universal symbols for this
    -extension's shareable image, and listing other shareable images or 
    -libraries to which it should be linked.
    -
    -=cut
    -
    -sub dlsyms {
    -    my($self,%attribs) = @_;
    -
    -    return '' unless $self->needs_linking();
    -
    -    my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
    -    my($vars)  = $attribs{DL_VARS}  || $self->{DL_VARS}  || [];
    -    my($funclist)  = $attribs{FUNCLIST}  || $self->{FUNCLIST}  || [];
    -    my(@m);
    -
    -    unless ($self->{SKIPHASH}{'dynamic'}) {
    -	push(@m,'
    -dynamic :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
    -	$(NOECHO) $(NOOP)
    -');
    -    }
    -
    -    push(@m,'
    -static :: $(INST_ARCHAUTODIR)$(BASEEXT).opt
    -	$(NOECHO) $(NOOP)
    -') unless $self->{SKIPHASH}{'static'};
    -
    -    push @m,'
    -$(INST_ARCHAUTODIR)$(BASEEXT).opt : $(BASEEXT).opt
    -	$(CP) $(MMS$SOURCE) $(MMS$TARGET)
    -
    -$(BASEEXT).opt : Makefile.PL
    -	$(PERLRUN) -e "use ExtUtils::Mksymlists;" -
    -	',qq[-e "Mksymlists('NAME' => '$self->{NAME}', 'DL_FUNCS' => ],
    -	neatvalue($funcs),q[, 'DL_VARS' => ],neatvalue($vars),
    -	q[, 'FUNCLIST' => ],neatvalue($funclist),qq[)"\n];
    -
    -    push @m, '	$(PERL) -e "print ""$(INST_STATIC)/Include=';
    -    if ($self->{OBJECT} =~ /\bBASEEXT\b/ or
    -        $self->{OBJECT} =~ /\b$self->{BASEEXT}\b/i) { 
    -        push @m, ($Config{d_vms_case_sensitive_symbols}
    -	           ? uc($self->{BASEEXT}) :'$(BASEEXT)');
    -    }
    -    else {  # We don't have a "main" object file, so pull 'em all in
    -       # Upcase module names if linker is being case-sensitive
    -       my($upcase) = $Config{d_vms_case_sensitive_symbols};
    -	my(@omods) = map { s/\.[^.]*$//;         # Trim off file type
    -	                   s[\$\(\w+_EXT\)][];   # even as a macro
    -	                   s/.*[:>\/\]]//;       # Trim off dir spec
    -			   $upcase ? uc($_) : $_;
    -	                 } split ' ', $self->eliminate_macros($self->{OBJECT});
    -        my($tmp,@lines,$elt) = '';
    -	$tmp = shift @omods;
    -	foreach $elt (@omods) {
    -	    $tmp .= ",$elt";
    -		if (length($tmp) > 80) { push @lines, $tmp;  $tmp = ''; }
    -	}
    -	push @lines, $tmp;
    -	push @m, '(', join( qq[, -\\n\\t"";" >>\$(MMS\$TARGET)\n\t\$(PERL) -e "print ""], @lines),')';
    -    }
    -	push @m, '\n$(INST_STATIC)/Library\n"";" >>$(MMS$TARGET)',"\n";
    -
    -    if (length $self->{LDLOADLIBS}) {
    -	my($lib); my($line) = '';
    -	foreach $lib (split ' ', $self->{LDLOADLIBS}) {
    -	    $lib =~ s%\$%\\\$%g;  # Escape '$' in VMS filespecs
    -	    if (length($line) + length($lib) > 160) {
    -		push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n";
    -		$line = $lib . '\n';
    -	    }
    -	    else { $line .= $lib . '\n'; }
    -	}
    -	push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n" if $line;
    -    }
    -
    -    join('',@m);
    -
    -}
    -
    -=item dynamic_lib (override)
    -
    -Use VMS Link command.
    -
    -=cut
    -
    -sub dynamic_lib {
    -    my($self, %attribs) = @_;
    -    return '' unless $self->needs_linking(); #might be because of a subdir
    -
    -    return '' unless $self->has_link_code();
    -
    -    my($otherldflags) = $attribs{OTHERLDFLAGS} || "";
    -    my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
    -    my $shr = $Config{'dbgprefix'} . 'PerlShr';
    -    my(@m);
    -    push @m,"
    -
    -OTHERLDFLAGS = $otherldflags
    -INST_DYNAMIC_DEP = $inst_dynamic_dep
    -
    -";
    -    push @m, '
    -$(INST_DYNAMIC) : $(INST_STATIC) $(PERL_INC)perlshr_attr.opt $(INST_ARCHAUTODIR)$(DFSEP).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
    -	If F$TrnLNm("',$shr,'").eqs."" Then Define/NoLog/User ',"$shr Sys\$Share:$shr.$Config{'dlext'}",'
    -	Link $(LDFLAGS) /Shareable=$(MMS$TARGET)$(OTHERLDFLAGS) $(BASEEXT).opt/Option,$(PERL_INC)perlshr_attr.opt/Option
    -';
    -
    -    join('',@m);
    -}
    -
    -
    -=item static_lib (override)
    -
    -Use VMS commands to manipulate object library.
    -
    -=cut
    -
    -sub static_lib {
    -    my($self) = @_;
    -    return '' unless $self->needs_linking();
    -
    -    return '
    -$(INST_STATIC) :
    -	$(NOECHO) $(NOOP)
    -' unless ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB});
    -
    -    my(@m,$lib);
    -    push @m,'
    -# Rely on suffix rule for update action
    -$(OBJECT) : $(INST_ARCHAUTODIR)$(DFSEP).exists
    -
    -$(INST_STATIC) : $(OBJECT) $(MYEXTLIB)
    -';
    -    # If this extension has its own library (eg SDBM_File)
    -    # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
    -    push(@m, "\t",'$(CP) $(MYEXTLIB) $(MMS$TARGET)',"\n") if $self->{MYEXTLIB};
    -
    -    push(@m,"\t",'If F$Search("$(MMS$TARGET)").eqs."" Then Library/Object/Create $(MMS$TARGET)',"\n");
    -
    -    # if there was a library to copy, then we can't use MMS$SOURCE_LIST,
    -    # 'cause it's a library and you can't stick them in other libraries.
    -    # In that case, we use $OBJECT instead and hope for the best
    -    if ($self->{MYEXTLIB}) {
    -      push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(OBJECT)',"\n");
    -    } else {
    -      push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(MMS$SOURCE_LIST)',"\n");
    -    }
    -    
    -    push @m, "\t\$(NOECHO) \$(PERL) -e 1 >\$(INST_ARCHAUTODIR)extralibs.ld\n";
    -    foreach $lib (split ' ', $self->{EXTRALIBS}) {
    -      push(@m,"\t",'$(NOECHO) $(PERL) -e "print qq{',$lib,'\n}" >>$(INST_ARCHAUTODIR)extralibs.ld',"\n");
    -    }
    -    join('',@m);
    -}
    -
    -
    -=item extra_clean_files
    -
    -Clean up some OS specific files.  Plus the temp file used to shorten
    -a lot of commands.
    -
    -=cut
    -
    -sub extra_clean_files {
    -    return qw(
    -              *.Map *.Dmp *.Lis *.cpp *.$(DLEXT) *.Opt $(BASEEXT).bso
    -              .MM_Tmp
    -             );
    -}
    -
    -
    -=item zipfile_target
    -
    -=item tarfile_target
    -
    -=item shdist_target
    -
    -Syntax for invoking shar, tar and zip differs from that for Unix.
    -
    -=cut
    -
    -sub zipfile_target {
    -    my($self) = shift;
    -
    -    return <<'MAKE_FRAG';
    -$(DISTVNAME).zip : distdir
    -	$(PREOP)
    -	$(ZIP) "$(ZIPFLAGS)" $(MMS$TARGET) [.$(DISTVNAME)...]*.*;
    -	$(RM_RF) $(DISTVNAME)
    -	$(POSTOP)
    -MAKE_FRAG
    -}
    -
    -sub tarfile_target {
    -    my($self) = shift;
    -
    -    return <<'MAKE_FRAG';
    -$(DISTVNAME).tar$(SUFFIX) : distdir
    -	$(PREOP)
    -	$(TO_UNIX)
    -        $(TAR) "$(TARFLAGS)" $(DISTVNAME).tar [.$(DISTVNAME)...]
    -	$(RM_RF) $(DISTVNAME)
    -	$(COMPRESS) $(DISTVNAME).tar
    -	$(POSTOP)
    -MAKE_FRAG
    -}
    -
    -sub shdist_target {
    -    my($self) = shift;
    -
    -    return <<'MAKE_FRAG';
    -shdist : distdir
    -	$(PREOP)
    -	$(SHAR) [.$(DISTVNAME)...]*.*; $(DISTVNAME).share
    -	$(RM_RF) $(DISTVNAME)
    -	$(POSTOP)
    -MAKE_FRAG
    -}
    -
    -
    -# --- Test and Installation Sections ---
    -
    -=item install (override)
    -
    -Work around DCL's 255 character limit several times,and use
    -VMS-style command line quoting in a few cases.
    -
    -=cut
    -
    -sub install {
    -    my($self, %attribs) = @_;
    -    my(@m);
    -
    -    push @m, q[
    -install :: all pure_install doc_install
    -	$(NOECHO) $(NOOP)
    -
    -install_perl :: all pure_perl_install doc_perl_install
    -	$(NOECHO) $(NOOP)
    -
    -install_site :: all pure_site_install doc_site_install
    -	$(NOECHO) $(NOOP)
    -
    -pure_install :: pure_$(INSTALLDIRS)_install
    -	$(NOECHO) $(NOOP)
    -
    -doc_install :: doc_$(INSTALLDIRS)_install
    -        $(NOECHO) $(NOOP)
    -
    -pure__install : pure_site_install
    -	$(NOECHO) $(ECHO) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
    -
    -doc__install : doc_site_install
    -	$(NOECHO) $(ECHO) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site"
    -
    -# This hack brought to you by DCL's 255-character command line limit
    -pure_perl_install ::
    -	$(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp
    -	$(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(DESTINSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp
    -	$(NOECHO) $(ECHO_N) "$(INST_LIB) $(DESTINSTALLPRIVLIB) " >>.MM_tmp
    -	$(NOECHO) $(ECHO_N) "$(INST_ARCHLIB) $(DESTINSTALLARCHLIB) " >>.MM_tmp
    -	$(NOECHO) $(ECHO_N) "$(INST_BIN) $(DESTINSTALLBIN) " >>.MM_tmp
    -	$(NOECHO) $(ECHO_N) "$(INST_SCRIPT) $(DESTINSTALLSCRIPT) " >>.MM_tmp
    -	$(NOECHO) $(ECHO_N) "$(INST_MAN1DIR) $(DESTINSTALLMAN1DIR) " >>.MM_tmp
    -	$(NOECHO) $(ECHO_N) "$(INST_MAN3DIR) $(DESTINSTALLMAN3DIR) " >>.MM_tmp
    -	$(NOECHO) $(MOD_INSTALL) <.MM_tmp
    -	$(NOECHO) $(RM_F) .MM_tmp
    -	$(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist').q[
    -
    -# Likewise
    -pure_site_install ::
    -	$(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp
    -	$(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(DESTINSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp
    -	$(NOECHO) $(ECHO_N) "$(INST_LIB) $(DESTINSTALLSITELIB) " >>.MM_tmp
    -	$(NOECHO) $(ECHO_N) "$(INST_ARCHLIB) $(DESTINSTALLSITEARCH) " >>.MM_tmp
    -	$(NOECHO) $(ECHO_N) "$(INST_BIN) $(DESTINSTALLSITEBIN) " >>.MM_tmp
    -	$(NOECHO) $(ECHO_N) "$(INST_SCRIPT) $(DESTINSTALLSCRIPT) " >>.MM_tmp
    -	$(NOECHO) $(ECHO_N) "$(INST_MAN1DIR) $(DESTINSTALLSITEMAN1DIR) " >>.MM_tmp
    -	$(NOECHO) $(ECHO_N) "$(INST_MAN3DIR) $(DESTINSTALLSITEMAN3DIR) " >>.MM_tmp
    -	$(NOECHO) $(MOD_INSTALL) <.MM_tmp
    -	$(NOECHO) $(RM_F) .MM_tmp
    -	$(NOECHO) $(WARN_IF_OLD_PACKLIST) ].$self->catfile($self->{PERL_ARCHLIB},'auto',$self->{FULLEXT},'.packlist').q[
    -
    -pure_vendor_install ::
    -	$(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read '.File::Spec->catfile('$(VENDORARCHEXP)','auto','$(FULLEXT)','.packlist').' '" >.MM_tmp
    -	$(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write '.File::Spec->catfile('$(DESTINSTALLVENDORARCH)','auto','$(FULLEXT)','.packlist').' '" >>.MM_tmp
    -	$(NOECHO) $(ECHO_N) "$(INST_LIB) $(DESTINSTALLVENDORLIB) " >>.MM_tmp
    -	$(NOECHO) $(ECHO_N) "$(INST_ARCHLIB) $(DESTINSTALLVENDORARCH) " >>.MM_tmp
    -	$(NOECHO) $(ECHO_N) "$(INST_BIN) $(DESTINSTALLVENDORBIN) " >>.MM_tmp
    -	$(NOECHO) $(ECHO_N) "$(INST_SCRIPT) $(DESTINSTALLSCRIPT) " >>.MM_tmp
    -	$(NOECHO) $(ECHO_N) "$(INST_MAN1DIR) $(DESTINSTALLVENDORMAN1DIR) " >>.MM_tmp
    -	$(NOECHO) $(ECHO_N) "$(INST_MAN3DIR) $(DESTINSTALLVENDORMAN3DIR) " >>.MM_tmp
    -	$(NOECHO) $(MOD_INSTALL) <.MM_tmp
    -	$(NOECHO) $(RM_F) .MM_tmp
    -
    -# Ditto
    -doc_perl_install ::
    -	$(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{DESTINSTALLARCHLIB}, 'perllocal.pod').q["
    -	$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
    -	$(NOECHO) $(ECHO_N) "installed into|$(INSTALLPRIVLIB)|" >.MM_tmp
    -	$(NOECHO) $(ECHO_N) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp
    -	$(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{DESTINSTALLARCHLIB},'perllocal.pod').q[
    -	$(NOECHO) $(RM_F) .MM_tmp
    -
    -# And again
    -doc_site_install ::
    -	$(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{DESTINSTALLARCHLIB}, 'perllocal.pod').q["
    -	$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
    -	$(NOECHO) $(ECHO_N) "installed into|$(INSTALLSITELIB)|" >.MM_tmp
    -	$(NOECHO) $(ECHO_N) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp
    -	$(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{DESTINSTALLARCHLIB},'perllocal.pod').q[
    -	$(NOECHO) $(RM_F) .MM_tmp
    -
    -doc_vendor_install ::
    -	$(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{DESTINSTALLARCHLIB}, 'perllocal.pod').q["
    -	$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
    -	$(NOECHO) $(ECHO_N) "installed into|$(INSTALLVENDORLIB)|" >.MM_tmp
    -	$(NOECHO) $(ECHO_N) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp
    -	$(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{DESTINSTALLARCHLIB},'perllocal.pod').q[
    -	$(NOECHO) $(RM_F) .MM_tmp
    -
    -];
    -
    -    push @m, q[
    -uninstall :: uninstall_from_$(INSTALLDIRS)dirs
    -	$(NOECHO) $(NOOP)
    -
    -uninstall_from_perldirs ::
    -	$(NOECHO) $(UNINSTALL) ].$self->catfile($self->{PERL_ARCHLIB},'auto',$self->{FULLEXT},'.packlist').q[
    -	$(NOECHO) $(ECHO) "Uninstall is now deprecated and makes no actual changes."
    -	$(NOECHO) $(ECHO) "Please check the list above carefully for errors, and manually remove"
    -	$(NOECHO) $(ECHO) "the appropriate files.  Sorry for the inconvenience."
    -
    -uninstall_from_sitedirs ::
    -	$(NOECHO) $(UNINSTALL) ].$self->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist').q[
    -	$(NOECHO) $(ECHO) "Uninstall is now deprecated and makes no actual changes."
    -	$(NOECHO) $(ECHO) "Please check the list above carefully for errors, and manually remove"
    -	$(NOECHO) $(ECHO) "the appropriate files.  Sorry for the inconvenience."
    -];
    -
    -    join('',@m);
    -}
    -
    -=item perldepend (override)
    -
    -Use VMS-style syntax for files; it's cheaper to just do it directly here
    -than to have the MM_Unix method call C repeatedly.  Also, if
    -we have to rebuild Config.pm, use MM[SK] to do it.
    -
    -=cut
    -
    -sub perldepend {
    -    my($self) = @_;
    -    my(@m);
    -
    -    push @m, '
    -$(OBJECT) : $(PERL_INC)EXTERN.h, $(PERL_INC)INTERN.h, $(PERL_INC)XSUB.h
    -$(OBJECT) : $(PERL_INC)av.h, $(PERL_INC)cc_runtime.h, $(PERL_INC)config.h
    -$(OBJECT) : $(PERL_INC)cop.h, $(PERL_INC)cv.h, $(PERL_INC)embed.h
    -$(OBJECT) : $(PERL_INC)embedvar.h, $(PERL_INC)form.h
    -$(OBJECT) : $(PERL_INC)gv.h, $(PERL_INC)handy.h, $(PERL_INC)hv.h
    -$(OBJECT) : $(PERL_INC)intrpvar.h, $(PERL_INC)iperlsys.h, $(PERL_INC)keywords.h
    -$(OBJECT) : $(PERL_INC)mg.h, $(PERL_INC)nostdio.h, $(PERL_INC)op.h
    -$(OBJECT) : $(PERL_INC)opcode.h, $(PERL_INC)patchlevel.h
    -$(OBJECT) : $(PERL_INC)perl.h, $(PERL_INC)perlio.h
    -$(OBJECT) : $(PERL_INC)perlsdio.h, $(PERL_INC)perlvars.h
    -$(OBJECT) : $(PERL_INC)perly.h, $(PERL_INC)pp.h, $(PERL_INC)pp_proto.h
    -$(OBJECT) : $(PERL_INC)proto.h, $(PERL_INC)regcomp.h, $(PERL_INC)regexp.h
    -$(OBJECT) : $(PERL_INC)regnodes.h, $(PERL_INC)scope.h, $(PERL_INC)sv.h
    -$(OBJECT) : $(PERL_INC)thrdvar.h, $(PERL_INC)thread.h
    -$(OBJECT) : $(PERL_INC)util.h, $(PERL_INC)vmsish.h
    -
    -' if $self->{OBJECT}; 
    -
    -    if ($self->{PERL_SRC}) {
    -	my(@macros);
    -	my($mmsquals) = '$(USEMAKEFILE)[.vms]$(FIRST_MAKEFILE)';
    -	push(@macros,'__AXP__=1') if $Config{'archname'} eq 'VMS_AXP';
    -	push(@macros,'DECC=1')    if $Config{'vms_cc_type'} eq 'decc';
    -	push(@macros,'GNUC=1')    if $Config{'vms_cc_type'} eq 'gcc';
    -	push(@macros,'SOCKET=1')  if $Config{'d_has_sockets'};
    -	push(@macros,qq["CC=$Config{'cc'}"])  if $Config{'cc'} =~ m!/!;
    -	$mmsquals .= '$(USEMACROS)' . join(',',@macros) . '$(MACROEND)' if @macros;
    -	push(@m,q[
    -# Check for unpropagated config.sh changes. Should never happen.
    -# We do NOT just update config.h because that is not sufficient.
    -# An out of date config.h is not fatal but complains loudly!
    -$(PERL_INC)config.h : $(PERL_SRC)config.sh
    -	$(NOOP)
    -
    -$(PERL_ARCHLIB)Config.pm : $(PERL_SRC)config.sh
    -	$(NOECHO) Write Sys$Error "$(PERL_ARCHLIB)Config.pm may be out of date with config.h or genconfig.pl"
    -	olddef = F$Environment("Default")
    -	Set Default $(PERL_SRC)
    -	$(MMS)],$mmsquals,);
    -	if ($self->{PERL_ARCHLIB} =~ m|\[-| && $self->{PERL_SRC} =~ m|(\[-+)|) {
    -	    my($prefix,$target) = ($1,$self->fixpath('$(PERL_ARCHLIB)Config.pm',0));
    -	    $target =~ s/\Q$prefix/[/;
    -	    push(@m," $target");
    -	}
    -	else { push(@m,' $(MMS$TARGET)'); }
    -	push(@m,q[
    -	Set Default 'olddef'
    -]);
    -    }
    -
    -    push(@m, join(" ", map($self->fixpath($_,0),values %{$self->{XS}}))." : \$(XSUBPPDEPS)\n")
    -      if %{$self->{XS}};
    -
    -    join('',@m);
    -}
    -
    -
    -=item makeaperl (override)
    -
    -Undertake to build a new set of Perl images using VMS commands.  Since
    -VMS does dynamic loading, it's not necessary to statically link each
    -extension into the Perl image, so this isn't the normal build path.
    -Consequently, it hasn't really been tested, and may well be incomplete.
    -
    -=cut
    -
    -use vars qw(%olbs);
    -
    -sub makeaperl {
    -    my($self, %attribs) = @_;
    -    my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmpdir, $libperl) = 
    -      @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)};
    -    my(@m);
    -    push @m, "
    -# --- MakeMaker makeaperl section ---
    -MAP_TARGET    = $target
    -";
    -    return join '', @m if $self->{PARENT};
    -
    -    my($dir) = join ":", @{$self->{DIR}};
    -
    -    unless ($self->{MAKEAPERL}) {
    -	push @m, q{
    -$(MAKE_APERL_FILE) : $(FIRST_MAKEFILE)
    -	$(NOECHO) $(ECHO) "Writing ""$(MMS$TARGET)"" for this $(MAP_TARGET)"
    -	$(NOECHO) $(PERLRUNINST) \
    -		Makefile.PL DIR=}, $dir, q{ \
    -		FIRST_MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \
    -		MAKEAPERL=1 NORECURS=1 };
    -
    -	push @m, map(q[ \\\n\t\t"$_"], @ARGV),q{
    -
    -$(MAP_TARGET) :: $(MAKE_APERL_FILE)
    -	$(MAKE)$(USEMAKEFILE)$(MAKE_APERL_FILE) static $(MMS$TARGET)
    -};
    -	push @m, "\n";
    -
    -	return join '', @m;
    -    }
    -
    -
    -    my($linkcmd,@optlibs,@staticpkgs,$extralist,$targdir,$libperldir,%libseen);
    -    local($_);
    -
    -    # The front matter of the linkcommand...
    -    $linkcmd = join ' ', $Config{'ld'},
    -	    grep($_, @Config{qw(large split ldflags ccdlflags)});
    -    $linkcmd =~ s/\s+/ /g;
    -
    -    # Which *.olb files could we make use of...
    -    local(%olbs);       # XXX can this be lexical?
    -    $olbs{$self->{INST_ARCHAUTODIR}} = "$self->{BASEEXT}\$(LIB_EXT)";
    -    require File::Find;
    -    File::Find::find(sub {
    -	return unless m/\Q$self->{LIB_EXT}\E$/;
    -	return if m/^libperl/;
    -
    -	if( exists $self->{INCLUDE_EXT} ){
    -		my $found = 0;
    -		my $incl;
    -		my $xx;
    -
    -		($xx = $File::Find::name) =~ s,.*?/auto/,,;
    -		$xx =~ s,/?$_,,;
    -		$xx =~ s,/,::,g;
    -
    -		# Throw away anything not explicitly marked for inclusion.
    -		# DynaLoader is implied.
    -		foreach $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){
    -			if( $xx eq $incl ){
    -				$found++;
    -				last;
    -			}
    -		}
    -		return unless $found;
    -	}
    -	elsif( exists $self->{EXCLUDE_EXT} ){
    -		my $excl;
    -		my $xx;
    -
    -		($xx = $File::Find::name) =~ s,.*?/auto/,,;
    -		$xx =~ s,/?$_,,;
    -		$xx =~ s,/,::,g;
    -
    -		# Throw away anything explicitly marked for exclusion
    -		foreach $excl (@{$self->{EXCLUDE_EXT}}){
    -			return if( $xx eq $excl );
    -		}
    -	}
    -
    -	$olbs{$ENV{DEFAULT}} = $_;
    -    }, grep( -d $_, @{$searchdirs || []}));
    -
    -    # We trust that what has been handed in as argument will be buildable
    -    $static = [] unless $static;
    -    @olbs{@{$static}} = (1) x @{$static};
    - 
    -    $extra = [] unless $extra && ref $extra eq 'ARRAY';
    -    # Sort the object libraries in inverse order of
    -    # filespec length to try to insure that dependent extensions
    -    # will appear before their parents, so the linker will
    -    # search the parent library to resolve references.
    -    # (e.g. Intuit::DWIM will precede Intuit, so unresolved
    -    # references from [.intuit.dwim]dwim.obj can be found
    -    # in [.intuit]intuit.olb).
    -    for (sort { length($a) <=> length($b) } keys %olbs) {
    -	next unless $olbs{$_} =~ /\Q$self->{LIB_EXT}\E$/;
    -	my($dir) = $self->fixpath($_,1);
    -	my($extralibs) = $dir . "extralibs.ld";
    -	my($extopt) = $dir . $olbs{$_};
    -	$extopt =~ s/$self->{LIB_EXT}$/.opt/;
    -	push @optlibs, "$dir$olbs{$_}";
    -	# Get external libraries this extension will need
    -	if (-f $extralibs ) {
    -	    my %seenthis;
    -	    open LIST,$extralibs or warn $!,next;
    -	    while () {
    -		chomp;
    -		# Include a library in the link only once, unless it's mentioned
    -		# multiple times within a single extension's options file, in which
    -		# case we assume the builder needed to search it again later in the
    -		# link.
    -		my $skip = exists($libseen{$_}) && !exists($seenthis{$_});
    -		$libseen{$_}++;  $seenthis{$_}++;
    -		next if $skip;
    -		push @$extra,$_;
    -	    }
    -	    close LIST;
    -	}
    -	# Get full name of extension for ExtUtils::Miniperl
    -	if (-f $extopt) {
    -	    open OPT,$extopt or die $!;
    -	    while () {
    -		next unless /(?:UNIVERSAL|VECTOR)=boot_([\w_]+)/;
    -		my $pkg = $1;
    -		$pkg =~ s#__*#::#g;
    -		push @staticpkgs,$pkg;
    -	    }
    -	}
    -    }
    -    # Place all of the external libraries after all of the Perl extension
    -    # libraries in the final link, in order to maximize the opportunity
    -    # for XS code from multiple extensions to resolve symbols against the
    -    # same external library while only including that library once.
    -    push @optlibs, @$extra;
    -
    -    $target = "Perl$Config{'exe_ext'}" unless $target;
    -    my $shrtarget;
    -    ($shrtarget,$targdir) = fileparse($target);
    -    $shrtarget =~ s/^([^.]*)/$1Shr/;
    -    $shrtarget = $targdir . $shrtarget;
    -    $target = "Perlshr.$Config{'dlext'}" unless $target;
    -    $tmpdir = "[]" unless $tmpdir;
    -    $tmpdir = $self->fixpath($tmpdir,1);
    -    if (@optlibs) { $extralist = join(' ',@optlibs); }
    -    else          { $extralist = ''; }
    -    # Let ExtUtils::Liblist find the necessary libs for us (but skip PerlShr)
    -    # that's what we're building here).
    -    push @optlibs, grep { !/PerlShr/i } split ' ', +($self->ext())[2];
    -    if ($libperl) {
    -	unless (-f $libperl || -f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',$libperl))) {
    -	    print STDOUT "Warning: $libperl not found\n";
    -	    undef $libperl;
    -	}
    -    }
    -    unless ($libperl) {
    -	if (defined $self->{PERL_SRC}) {
    -	    $libperl = $self->catfile($self->{PERL_SRC},"libperl$self->{LIB_EXT}");
    -	} elsif (-f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',"libperl$self->{LIB_EXT}")) ) {
    -	} else {
    -	    print STDOUT "Warning: $libperl not found
    -    If you're going to build a static perl binary, make sure perl is installed
    -    otherwise ignore this warning\n";
    -	}
    -    }
    -    $libperldir = $self->fixpath((fileparse($libperl))[1],1);
    -
    -    push @m, '
    -# Fill in the target you want to produce if it\'s not perl
    -MAP_TARGET    = ',$self->fixpath($target,0),'
    -MAP_SHRTARGET = ',$self->fixpath($shrtarget,0),"
    -MAP_LINKCMD   = $linkcmd
    -MAP_PERLINC   = ", $perlinc ? map('"$_" ',@{$perlinc}) : '',"
    -MAP_EXTRA     = $extralist
    -MAP_LIBPERL = ",$self->fixpath($libperl,0),'
    -';
    -
    -
    -    push @m,"\n${tmpdir}Makeaperl.Opt : \$(MAP_EXTRA)\n";
    -    foreach (@optlibs) {
    -	push @m,'	$(NOECHO) $(PERL) -e "print q{',$_,'}" >>$(MMS$TARGET)',"\n";
    -    }
    -    push @m,"\n${tmpdir}PerlShr.Opt :\n\t";
    -    push @m,'$(NOECHO) $(PERL) -e "print q{$(MAP_SHRTARGET)}" >$(MMS$TARGET)',"\n";
    -
    -    push @m,'
    -$(MAP_SHRTARGET) : $(MAP_LIBPERL) Makeaperl.Opt ',"${libperldir}Perlshr_Attr.Opt",'
    -	$(MAP_LINKCMD)/Shareable=$(MMS$TARGET) $(MAP_LIBPERL), Makeaperl.Opt/Option ',"${libperldir}Perlshr_Attr.Opt/Option",'
    -$(MAP_TARGET) : $(MAP_SHRTARGET) ',"${tmpdir}perlmain\$(OBJ_EXT) ${tmpdir}PerlShr.Opt",'
    -	$(MAP_LINKCMD) ',"${tmpdir}perlmain\$(OBJ_EXT)",', PerlShr.Opt/Option
    -	$(NOECHO) $(ECHO) "To install the new ""$(MAP_TARGET)"" binary, say"
    -	$(NOECHO) $(ECHO) "    $(MAKE)$(USEMAKEFILE)$(FIRST_MAKEFILE) inst_perl $(USEMACROS)MAP_TARGET=$(MAP_TARGET)$(ENDMACRO)"
    -	$(NOECHO) $(ECHO) "To remove the intermediate files, say
    -	$(NOECHO) $(ECHO) "    $(MAKE)$(USEMAKEFILE)$(FIRST_MAKEFILE) map_clean"
    -';
    -    push @m,"\n${tmpdir}perlmain.c : \$(FIRST_MAKEFILE)\n\t\$(NOECHO) \$(PERL) -e 1 >${tmpdir}Writemain.tmp\n";
    -    push @m, "# More from the 255-char line length limit\n";
    -    foreach (@staticpkgs) {
    -	push @m,'	$(NOECHO) $(PERL) -e "print q{',$_,qq[}" >>${tmpdir}Writemain.tmp\n];
    -    }
    -
    -    push @m, sprintf <<'MAKE_FRAG', $tmpdir, $tmpdir;
    -	$(NOECHO) $(PERL) $(MAP_PERLINC) -ane "use ExtUtils::Miniperl; writemain(@F)" %sWritemain.tmp >$(MMS$TARGET)
    -	$(NOECHO) $(RM_F) %sWritemain.tmp
    -MAKE_FRAG
    -
    -    push @m, q[
    -# Still more from the 255-char line length limit
    -doc_inst_perl :
    -	$(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB)
    -	$(NOECHO) $(ECHO) "Perl binary $(MAP_TARGET)|" >.MM_tmp
    -	$(NOECHO) $(ECHO) "MAP_STATIC|$(MAP_STATIC)|" >>.MM_tmp
    -	$(NOECHO) $(PERL) -pl040 -e " " ].$self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'),q[ >>.MM_tmp
    -	$(NOECHO) $(ECHO) -e "MAP_LIBPERL|$(MAP_LIBPERL)|" >>.MM_tmp
    -	$(NOECHO) $(DOC_INSTALL) <.MM_tmp >>].$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q[
    -	$(NOECHO) $(RM_F) .MM_tmp
    -];
    -
    -    push @m, "
    -inst_perl : pure_inst_perl doc_inst_perl
    -	\$(NOECHO) \$(NOOP)
    -
    -pure_inst_perl : \$(MAP_TARGET)
    -	$self->{CP} \$(MAP_SHRTARGET) ",$self->fixpath($Config{'installbin'},1),"
    -	$self->{CP} \$(MAP_TARGET) ",$self->fixpath($Config{'installbin'},1),"
    -
    -clean :: map_clean
    -	\$(NOECHO) \$(NOOP)
    -
    -map_clean :
    -	\$(RM_F) ${tmpdir}perlmain\$(OBJ_EXT) ${tmpdir}perlmain.c \$(FIRST_MAKEFILE)
    -	\$(RM_F) ${tmpdir}Makeaperl.Opt ${tmpdir}PerlShr.Opt \$(MAP_TARGET)
    -";
    -
    -    join '', @m;
    -}
    -  
    -# --- Output postprocessing section ---
    -
    -=item nicetext (override)
    -
    -Insure that colons marking targets are preceded by space, in order
    -to distinguish the target delimiter from a colon appearing as
    -part of a filespec.
    -
    -=cut
    -
    -sub nicetext {
    -    my($self,$text) = @_;
    -    return $text if $text =~ m/^\w+\s*=/; # leave macro defs alone
    -    $text =~ s/([^\s:])(:+\s)/$1 $2/gs;
    -    $text;
    -}
    -
    -=item prefixify (override)
    -
    -prefixifying on VMS is simple.  Each should simply be:
    -
    -    perl_root:[some.dir]
    -
    -which can just be converted to:
    -
    -    volume:[your.prefix.some.dir]
    -
    -otherwise you get the default layout.
    -
    -In effect, your search prefix is ignored and $Config{vms_prefix} is
    -used instead.
    -
    -=cut
    -
    -sub prefixify {
    -    my($self, $var, $sprefix, $rprefix, $default) = @_;
    -
    -    # Translate $(PERLPREFIX) to a real path.
    -    $rprefix = $self->eliminate_macros($rprefix);
    -    $rprefix = VMS::Filespec::vmspath($rprefix) if $rprefix;
    -    $sprefix = VMS::Filespec::vmspath($sprefix) if $sprefix;
    -
    -    $default = VMS::Filespec::vmsify($default) 
    -      unless $default =~ /\[.*\]/;
    -
    -    (my $var_no_install = $var) =~ s/^install//;
    -    my $path = $self->{uc $var} || 
    -               $ExtUtils::MM_Unix::Config_Override{lc $var} || 
    -               $Config{lc $var} || $Config{lc $var_no_install};
    -
    -    if( !$path ) {
    -        print STDERR "  no Config found for $var.\n" if $Verbose >= 2;
    -        $path = $self->_prefixify_default($rprefix, $default);
    -    }
    -    elsif( !$self->{ARGS}{PREFIX} || !$self->file_name_is_absolute($path) ) {
    -        # do nothing if there's no prefix or if its relative
    -    }
    -    elsif( $sprefix eq $rprefix ) {
    -        print STDERR "  no new prefix.\n" if $Verbose >= 2;
    -    }
    -    else {
    -
    -        print STDERR "  prefixify $var => $path\n"     if $Verbose >= 2;
    -        print STDERR "    from $sprefix to $rprefix\n" if $Verbose >= 2;
    -
    -        my($path_vol, $path_dirs) = $self->splitpath( $path );
    -        if( $path_vol eq $Config{vms_prefix}.':' ) {
    -            print STDERR "  $Config{vms_prefix}: seen\n" if $Verbose >= 2;
    -
    -            $path_dirs =~ s{^\[}{\[.} unless $path_dirs =~ m{^\[\.};
    -            $path = $self->_catprefix($rprefix, $path_dirs);
    -        }
    -        else {
    -            $path = $self->_prefixify_default($rprefix, $default);
    -        }
    -    }
    -
    -    print "    now $path\n" if $Verbose >= 2;
    -    return $self->{uc $var} = $path;
    -}
    -
    -
    -sub _prefixify_default {
    -    my($self, $rprefix, $default) = @_;
    -
    -    print STDERR "  cannot prefix, using default.\n" if $Verbose >= 2;
    -
    -    if( !$default ) {
    -        print STDERR "No default!\n" if $Verbose >= 1;
    -        return;
    -    }
    -    if( !$rprefix ) {
    -        print STDERR "No replacement prefix!\n" if $Verbose >= 1;
    -        return '';
    -    }
    -
    -    return $self->_catprefix($rprefix, $default);
    -}
    -
    -sub _catprefix {
    -    my($self, $rprefix, $default) = @_;
    -
    -    my($rvol, $rdirs) = $self->splitpath($rprefix);
    -    if( $rvol ) {
    -        return $self->catpath($rvol,
    -                                   $self->catdir($rdirs, $default),
    -                                   ''
    -                                  )
    -    }
    -    else {
    -        return $self->catdir($rdirs, $default);
    -    }
    -}
    -
    -
    -=item cd
    -
    -=cut
    -
    -sub cd {
    -    my($self, $dir, @cmds) = @_;
    -
    -    $dir = vmspath($dir);
    -
    -    my $cmd = join "\n\t", map "$_", @cmds;
    -
    -    # No leading tab makes it look right when embedded
    -    my $make_frag = sprintf <<'MAKE_FRAG', $dir, $cmd;
    -startdir = F$Environment("Default")
    -	Set Default %s
    -	%s
    -	Set Default 'startdir'
    -MAKE_FRAG
    -
    -    # No trailing newline makes this easier to embed
    -    chomp $make_frag;
    -
    -    return $make_frag;
    -}
    -
    -
    -=item oneliner
    -
    -=cut
    -
    -sub oneliner {
    -    my($self, $cmd, $switches) = @_;
    -    $switches = [] unless defined $switches;
    -
    -    # Strip leading and trailing newlines
    -    $cmd =~ s{^\n+}{};
    -    $cmd =~ s{\n+$}{};
    -
    -    $cmd = $self->quote_literal($cmd);
    -    $cmd = $self->escape_newlines($cmd);
    -
    -    # Switches must be quoted else they will be lowercased.
    -    $switches = join ' ', map { qq{"$_"} } @$switches;
    -
    -    return qq{\$(ABSPERLRUN) $switches -e $cmd};
    -}
    -
    -
    -=item B
    -
    -perl trips up on "" thinking it's an input redirect.  So we use the
    -native Write command instead.  Besides, its faster.
    -
    -=cut
    -
    -sub echo {
    -    my($self, $text, $file, $appending) = @_;
    -    $appending ||= 0;
    -
    -    my $opencmd = $appending ? 'Open/Append' : 'Open/Write';
    -
    -    my @cmds = ("\$(NOECHO) $opencmd MMECHOFILE $file ");
    -    push @cmds, map { '$(NOECHO) Write MMECHOFILE '.$self->quote_literal($_) } 
    -                split /\n/, $text;
    -    push @cmds, '$(NOECHO) Close MMECHOFILE';
    -    return @cmds;
    -}
    -
    -
    -=item quote_literal
    -
    -=cut
    -
    -sub quote_literal {
    -    my($self, $text) = @_;
    -
    -    # I believe this is all we should need.
    -    $text =~ s{"}{""}g;
    -
    -    return qq{"$text"};
    -}
    -
    -=item escape_newlines
    -
    -=cut
    -
    -sub escape_newlines {
    -    my($self, $text) = @_;
    -
    -    $text =~ s{\n}{-\n}g;
    -
    -    return $text;
    -}
    -
    -=item max_exec_len
    -
    -256 characters.
    -
    -=cut
    -
    -sub max_exec_len {
    -    my $self = shift;
    -
    -    return $self->{_MAX_EXEC_LEN} ||= 256;
    -}
    -
    -=item init_linker
    -
    -=cut
    -
    -sub init_linker {
    -    my $self = shift;
    -    $self->{EXPORT_LIST} ||= '$(BASEEXT).opt';
    -
    -    my $shr = $Config{dbgprefix} . 'PERLSHR';
    -    if ($self->{PERL_SRC}) {
    -        $self->{PERL_ARCHIVE} ||=
    -          $self->catfile($self->{PERL_SRC}, "$shr.$Config{'dlext'}");
    -    }
    -    else {
    -        $self->{PERL_ARCHIVE} ||=
    -          $ENV{$shr} ? $ENV{$shr} : "Sys\$Share:$shr.$Config{'dlext'}";
    -    }
    -
    -    $self->{PERL_ARCHIVE_AFTER} ||= '';
    -}
    -
    -=item eliminate_macros
    -
    -Expands MM[KS]/Make macros in a text string, using the contents of
    -identically named elements of C<%$self>, and returns the result
    -as a file specification in Unix syntax.
    -
    -NOTE:  This is the canonical version of the method.  The version in
    -File::Spec::VMS is deprecated.
    -
    -=cut
    -
    -sub eliminate_macros {
    -    my($self,$path) = @_;
    -    return '' unless $path;
    -    $self = {} unless ref $self;
    -
    -    if ($path =~ /\s/) {
    -      return join ' ', map { $self->eliminate_macros($_) } split /\s+/, $path;
    -    }
    -
    -    my($npath) = unixify($path);
    -    # sometimes unixify will return a string with an off-by-one trailing null
    -    $npath =~ s{\0$}{};
    -
    -    my($complex) = 0;
    -    my($head,$macro,$tail);
    -
    -    # perform m##g in scalar context so it acts as an iterator
    -    while ($npath =~ m#(.*?)\$\((\S+?)\)(.*)#gs) { 
    -        if (defined $self->{$2}) {
    -            ($head,$macro,$tail) = ($1,$2,$3);
    -            if (ref $self->{$macro}) {
    -                if (ref $self->{$macro} eq 'ARRAY') {
    -                    $macro = join ' ', @{$self->{$macro}};
    -                }
    -                else {
    -                    print "Note: can't expand macro \$($macro) containing ",ref($self->{$macro}),
    -                          "\n\t(using MMK-specific deferred substitutuon; MMS will break)\n";
    -                    $macro = "\cB$macro\cB";
    -                    $complex = 1;
    -                }
    -            }
    -            else { ($macro = unixify($self->{$macro})) =~ s#/\Z(?!\n)##; }
    -            $npath = "$head$macro$tail";
    -        }
    -    }
    -    if ($complex) { $npath =~ s#\cB(.*?)\cB#\${$1}#gs; }
    -    $npath;
    -}
    -
    -=item fixpath
    -
    -   my $path = $mm->fixpath($path);
    -   my $path = $mm->fixpath($path, $is_dir);
    -
    -Catchall routine to clean up problem MM[SK]/Make macros.  Expands macros
    -in any directory specification, in order to avoid juxtaposing two
    -VMS-syntax directories when MM[SK] is run.  Also expands expressions which
    -are all macro, so that we can tell how long the expansion is, and avoid
    -overrunning DCL's command buffer when MM[KS] is running.
    -
    -fixpath() checks to see whether the result matches the name of a
    -directory in the current default directory and returns a directory or
    -file specification accordingly.  C<$is_dir> can be set to true to
    -force fixpath() to consider the path to be a directory or false to force
    -it to be a file.
    -
    -NOTE:  This is the canonical version of the method.  The version in
    -File::Spec::VMS is deprecated.
    -
    -=cut
    -
    -sub fixpath {
    -    my($self,$path,$force_path) = @_;
    -    return '' unless $path;
    -    $self = bless {} unless ref $self;
    -    my($fixedpath,$prefix,$name);
    -
    -    if ($path =~ /[ \t]/) {
    -      return join ' ',
    -             map { $self->fixpath($_,$force_path) }
    -	     split /[ \t]+/, $path;
    -    }
    -
    -    if ($path =~ m#^\$\([^\)]+\)\Z(?!\n)#s || $path =~ m#[/:>\]]#) { 
    -        if ($force_path or $path =~ /(?:DIR\)|\])\Z(?!\n)/) {
    -            $fixedpath = vmspath($self->eliminate_macros($path));
    -        }
    -        else {
    -            $fixedpath = vmsify($self->eliminate_macros($path));
    -        }
    -    }
    -    elsif ((($prefix,$name) = ($path =~ m#^\$\(([^\)]+)\)(.+)#s)) && $self->{$prefix}) {
    -        my($vmspre) = $self->eliminate_macros("\$($prefix)");
    -        # is it a dir or just a name?
    -        $vmspre = ($vmspre =~ m|/| or $prefix =~ /DIR\Z(?!\n)/) ? vmspath($vmspre) : '';
    -        $fixedpath = ($vmspre ? $vmspre : $self->{$prefix}) . $name;
    -        $fixedpath = vmspath($fixedpath) if $force_path;
    -    }
    -    else {
    -        $fixedpath = $path;
    -        $fixedpath = vmspath($fixedpath) if $force_path;
    -    }
    -    # No hints, so we try to guess
    -    if (!defined($force_path) and $fixedpath !~ /[:>(.\]]/) {
    -        $fixedpath = vmspath($fixedpath) if -d $fixedpath;
    -    }
    -
    -    # Trim off root dirname if it's had other dirs inserted in front of it.
    -    $fixedpath =~ s/\.000000([\]>])/$1/;
    -    # Special case for VMS absolute directory specs: these will have had device
    -    # prepended during trip through Unix syntax in eliminate_macros(), since
    -    # Unix syntax has no way to express "absolute from the top of this device's
    -    # directory tree".
    -    if ($path =~ /^[\[>][^.\-]/) { $fixedpath =~ s/^[^\[<]+//; }
    -
    -    return $fixedpath;
    -}
    -
    -
    -=item os_flavor
    -
    -VMS is VMS.
    -
    -=cut
    -
    -sub os_flavor {
    -    return('VMS');
    -}
    -
    -=back
    -
    -
    -=head1 AUTHOR
    -
    -Original author Charles Bailey F
    -
    -Maintained by Michael G Schwern F
    -
    -See L for patching and contact information.
    -
    -
    -=cut
    -
    -1;
    -
    diff --git a/lib/perl5/5.8.8/ExtUtils/MM_VOS.pm b/lib/perl5/5.8.8/ExtUtils/MM_VOS.pm
    deleted file mode 100644
    index 82f71ca2..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/MM_VOS.pm
    +++ /dev/null
    @@ -1,51 +0,0 @@
    -package ExtUtils::MM_VOS;
    -
    -use strict;
    -use vars qw($VERSION @ISA);
    -$VERSION = '0.02';
    -
    -require ExtUtils::MM_Unix;
    -@ISA = qw(ExtUtils::MM_Unix);
    -
    -
    -=head1 NAME
    -
    -ExtUtils::MM_VOS - VOS specific subclass of ExtUtils::MM_Unix
    -
    -=head1 SYNOPSIS
    -
    -  Don't use this module directly.
    -  Use ExtUtils::MM and let it choose.
    -
    -=head1 DESCRIPTION
    -
    -This is a subclass of ExtUtils::MM_Unix which contains functionality for
    -VOS.
    -
    -Unless otherwise stated it works just like ExtUtils::MM_Unix
    -
    -=head2 Overridden methods
    -
    -=head3 extra_clean_files
    -
    -Cleanup VOS core files
    -
    -=cut
    -
    -sub extra_clean_files {
    -    return qw(*.kp);
    -}
    -
    -
    -=head1 AUTHOR
    -
    -Michael G Schwern  with code from ExtUtils::MM_Unix
    -
    -=head1 SEE ALSO
    -
    -L
    -
    -=cut
    -
    -
    -1;
    diff --git a/lib/perl5/5.8.8/ExtUtils/MM_Win32.pm b/lib/perl5/5.8.8/ExtUtils/MM_Win32.pm
    deleted file mode 100644
    index 4998c74f..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/MM_Win32.pm
    +++ /dev/null
    @@ -1,537 +0,0 @@
    -package ExtUtils::MM_Win32;
    -
    -use strict;
    -
    -
    -=head1 NAME
    -
    -ExtUtils::MM_Win32 - methods to override UN*X behaviour in ExtUtils::MakeMaker
    -
    -=head1 SYNOPSIS
    -
    - use ExtUtils::MM_Win32; # Done internally by ExtUtils::MakeMaker if needed
    -
    -=head1 DESCRIPTION
    -
    -See ExtUtils::MM_Unix for a documentation of the methods provided
    -there. This package overrides the implementation of these methods, not
    -the semantics.
    -
    -=cut 
    -
    -use ExtUtils::MakeMaker::Config;
    -use File::Basename;
    -use File::Spec;
    -use ExtUtils::MakeMaker qw( neatvalue );
    -
    -use vars qw(@ISA $VERSION $BORLAND $GCC $DMAKE $NMAKE);
    -
    -require ExtUtils::MM_Any;
    -require ExtUtils::MM_Unix;
    -@ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix );
    -$VERSION = '1.12';
    -
    -$ENV{EMXSHELL} = 'sh'; # to run `commands`
    -
    -$BORLAND = 1 if $Config{'cc'} =~ /^bcc/i;
    -$GCC     = 1 if $Config{'cc'} =~ /^gcc/i;
    -$DMAKE = 1 if $Config{'make'} =~ /^dmake/i;
    -$NMAKE = 1 if $Config{'make'} =~ /^nmake/i;
    -
    -
    -=head2 Overridden methods
    -
    -=over 4
    -
    -=item B
    -
    -=cut
    -
    -sub dlsyms {
    -    my($self,%attribs) = @_;
    -
    -    my($funcs) = $attribs{DL_FUNCS} || $self->{DL_FUNCS} || {};
    -    my($vars)  = $attribs{DL_VARS} || $self->{DL_VARS} || [];
    -    my($funclist) = $attribs{FUNCLIST} || $self->{FUNCLIST} || [];
    -    my($imports)  = $attribs{IMPORTS} || $self->{IMPORTS} || {};
    -    my(@m);
    -
    -    if (not $self->{SKIPHASH}{'dynamic'}) {
    -	push(@m,"
    -$self->{BASEEXT}.def: Makefile.PL
    -",
    -     q!	$(PERLRUN) -MExtUtils::Mksymlists \\
    -     -e "Mksymlists('NAME'=>\"!, $self->{NAME},
    -     q!\", 'DLBASE' => '!,$self->{DLBASE},
    -     # The above two lines quoted differently to work around
    -     # a bug in the 4DOS/4NT command line interpreter.  The visible
    -     # result of the bug was files named q('extension_name',) *with the
    -     # single quotes and the comma* in the extension build directories.
    -     q!', 'DL_FUNCS' => !,neatvalue($funcs),
    -     q!, 'FUNCLIST' => !,neatvalue($funclist),
    -     q!, 'IMPORTS' => !,neatvalue($imports),
    -     q!, 'DL_VARS' => !, neatvalue($vars), q!);"
    -!);
    -    }
    -    join('',@m);
    -}
    -
    -=item replace_manpage_separator
    -
    -Changes the path separator with .
    -
    -=cut
    -
    -sub replace_manpage_separator {
    -    my($self,$man) = @_;
    -    $man =~ s,/+,.,g;
    -    $man;
    -}
    -
    -
    -=item B
    -
    -Since Windows has nothing as simple as an executable bit, we check the
    -file extension.
    -
    -The PATHEXT env variable will be used to get a list of extensions that
    -might indicate a command, otherwise .com, .exe, .bat and .cmd will be
    -used by default.
    -
    -=cut
    -
    -sub maybe_command {
    -    my($self,$file) = @_;
    -    my @e = exists($ENV{'PATHEXT'})
    -          ? split(/;/, $ENV{PATHEXT})
    -	  : qw(.com .exe .bat .cmd);
    -    my $e = '';
    -    for (@e) { $e .= "\Q$_\E|" }
    -    chop $e;
    -    # see if file ends in one of the known extensions
    -    if ($file =~ /($e)$/i) {
    -	return $file if -e $file;
    -    }
    -    else {
    -	for (@e) {
    -	    return "$file$_" if -e "$file$_";
    -	}
    -    }
    -    return;
    -}
    -
    -
    -=item B
    -
    -Using \ for Windows.
    -
    -=cut
    -
    -sub init_DIRFILESEP {
    -    my($self) = shift;
    -
    -    # The ^ makes sure its not interpreted as an escape in nmake
    -    $self->{DIRFILESEP} = $NMAKE ? '^\\' :
    -                          $DMAKE ? '\\\\'
    -                                 : '\\';
    -}
    -
    -=item B
    -
    -Override some of the Unix specific commands with portable
    -ExtUtils::Command ones.
    -
    -Also provide defaults for LD and AR in case the %Config values aren't
    -set.
    -
    -LDLOADLIBS's default is changed to $Config{libs}.
    -
    -Adjustments are made for Borland's quirks needing -L to come first.
    -
    -=cut
    -
    -sub init_others {
    -    my ($self) = @_;
    -
    -    # Used in favor of echo because echo won't strip quotes. :(
    -    $self->{ECHO}     ||= $self->oneliner('print qq{@ARGV}', ['-l']);
    -    $self->{ECHO_N}   ||= $self->oneliner('print qq{@ARGV}');
    -
    -    $self->{TOUCH}    ||= '$(ABSPERLRUN) -MExtUtils::Command -e touch';
    -    $self->{CHMOD}    ||= '$(ABSPERLRUN) -MExtUtils::Command -e chmod'; 
    -    $self->{CP}       ||= '$(ABSPERLRUN) -MExtUtils::Command -e cp';
    -    $self->{RM_F}     ||= '$(ABSPERLRUN) -MExtUtils::Command -e rm_f';
    -    $self->{RM_RF}    ||= '$(ABSPERLRUN) -MExtUtils::Command -e rm_rf';
    -    $self->{MV}       ||= '$(ABSPERLRUN) -MExtUtils::Command -e mv';
    -    $self->{NOOP}     ||= 'rem';
    -    $self->{TEST_F}   ||= '$(ABSPERLRUN) -MExtUtils::Command -e test_f';
    -    $self->{DEV_NULL} ||= '> NUL';
    -
    -    $self->{FIXIN}    ||= $self->{PERL_CORE} ? 
    -      "\$(PERLRUN) $self->{PERL_SRC}/win32/bin/pl2bat.pl" : 
    -      'pl2bat.bat';
    -
    -    $self->{LD}     ||= $Config{ld} || 'link';
    -    $self->{AR}     ||= $Config{ar} || 'lib';
    -
    -    $self->SUPER::init_others;
    -
    -    # Setting SHELL from $Config{sh} can break dmake.  Its ok without it.
    -    delete $self->{SHELL};
    -
    -    $self->{LDLOADLIBS} ||= $Config{libs};
    -    # -Lfoo must come first for Borland, so we put it in LDDLFLAGS
    -    if ($BORLAND) {
    -        my $libs = $self->{LDLOADLIBS};
    -        my $libpath = '';
    -        while ($libs =~ s/(?:^|\s)(("?)-L.+?\2)(?:\s|$)/ /) {
    -            $libpath .= ' ' if length $libpath;
    -            $libpath .= $1;
    -        }
    -        $self->{LDLOADLIBS} = $libs;
    -        $self->{LDDLFLAGS} ||= $Config{lddlflags};
    -        $self->{LDDLFLAGS} .= " $libpath";
    -    }
    -
    -    return 1;
    -}
    -
    -
    -=item init_platform
    -
    -Add MM_Win32_VERSION.
    -
    -=item platform_constants
    -
    -=cut
    -
    -sub init_platform {
    -    my($self) = shift;
    -
    -    $self->{MM_Win32_VERSION} = $VERSION;
    -}
    -
    -sub platform_constants {
    -    my($self) = shift;
    -    my $make_frag = '';
    -
    -    foreach my $macro (qw(MM_Win32_VERSION))
    -    {
    -        next unless defined $self->{$macro};
    -        $make_frag .= "$macro = $self->{$macro}\n";
    -    }
    -
    -    return $make_frag;
    -}
    -
    -
    -=item special_targets
    -
    -Add .USESHELL target for dmake.
    -
    -=cut
    -
    -sub special_targets {
    -    my($self) = @_;
    -
    -    my $make_frag = $self->SUPER::special_targets;
    -
    -    $make_frag .= <<'MAKE_FRAG' if $DMAKE;
    -.USESHELL :
    -MAKE_FRAG
    -
    -    return $make_frag;
    -}
    -
    -
    -=item static_lib
    -
    -Changes how to run the linker.
    -
    -The rest is duplicate code from MM_Unix.  Should move the linker code
    -to its own method.
    -
    -=cut
    -
    -sub static_lib {
    -    my($self) = @_;
    -    return '' unless $self->has_link_code;
    -
    -    my(@m);
    -    push(@m, <<'END');
    -$(INST_STATIC): $(OBJECT) $(MYEXTLIB) $(INST_ARCHAUTODIR)$(DFSEP).exists
    -	$(RM_RF) $@
    -END
    -
    -    # If this extension has its own library (eg SDBM_File)
    -    # then copy that to $(INST_STATIC) and add $(OBJECT) into it.
    -    push @m, <<'MAKE_FRAG' if $self->{MYEXTLIB};
    -	$(CP) $(MYEXTLIB) $@
    -MAKE_FRAG
    -
    -    push @m,
    -q{	$(AR) }.($BORLAND ? '$@ $(OBJECT:^"+")'
    -			  : ($GCC ? '-ru $@ $(OBJECT)'
    -			          : '-out:$@ $(OBJECT)')).q{
    -	$(CHMOD) $(PERM_RWX) $@
    -	$(NOECHO) $(ECHO) "$(EXTRALIBS)" > $(INST_ARCHAUTODIR)\extralibs.ld
    -};
    -
    -    # Old mechanism - still available:
    -    push @m, <<'MAKE_FRAG' if $self->{PERL_SRC} && $self->{EXTRALIBS};
    -	$(NOECHO) $(ECHO) "$(EXTRALIBS)" >> $(PERL_SRC)\ext.libs
    -MAKE_FRAG
    -
    -    join('', @m);
    -}
    -
    -
    -=item dynamic_lib
    -
    -Complicated stuff for Win32 that I don't understand. :(
    -
    -=cut
    -
    -sub dynamic_lib {
    -    my($self, %attribs) = @_;
    -    return '' unless $self->needs_linking(); #might be because of a subdir
    -
    -    return '' unless $self->has_link_code;
    -
    -    my($otherldflags) = $attribs{OTHERLDFLAGS} || ($BORLAND ? 'c0d32.obj': '');
    -    my($inst_dynamic_dep) = $attribs{INST_DYNAMIC_DEP} || "";
    -    my($ldfrom) = '$(LDFROM)';
    -    my(@m);
    -
    -# one thing for GCC/Mingw32:
    -# we try to overcome non-relocateable-DLL problems by generating
    -#    a (hopefully unique) image-base from the dll's name
    -# -- BKS, 10-19-1999
    -    if ($GCC) { 
    -	my $dllname = $self->{BASEEXT} . "." . $self->{DLEXT};
    -	$dllname =~ /(....)(.{0,4})/;
    -	my $baseaddr = unpack("n", $1 ^ $2);
    -	$otherldflags .= sprintf("-Wl,--image-base,0x%x0000 ", $baseaddr);
    -    }
    -
    -    push(@m,'
    -# This section creates the dynamically loadable $(INST_DYNAMIC)
    -# from $(OBJECT) and possibly $(MYEXTLIB).
    -OTHERLDFLAGS = '.$otherldflags.'
    -INST_DYNAMIC_DEP = '.$inst_dynamic_dep.'
    -
    -$(INST_DYNAMIC): $(OBJECT) $(MYEXTLIB) $(BOOTSTRAP) $(INST_ARCHAUTODIR)$(DFSEP).exists $(EXPORT_LIST) $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP)
    -');
    -    if ($GCC) {
    -      push(@m,  
    -       q{	dlltool --def $(EXPORT_LIST) --output-exp dll.exp
    -	$(LD) -o $@ -Wl,--base-file -Wl,dll.base $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) dll.exp
    -	dlltool --def $(EXPORT_LIST) --base-file dll.base --output-exp dll.exp
    -	$(LD) -o $@ $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) dll.exp });
    -    } elsif ($BORLAND) {
    -      push(@m,
    -       q{	$(LD) $(LDDLFLAGS) $(OTHERLDFLAGS) }.$ldfrom.q{,$@,,}
    -       .($DMAKE ? q{$(PERL_ARCHIVE:s,/,\,) $(LDLOADLIBS:s,/,\,) }
    -		 .q{$(MYEXTLIB:s,/,\,),$(EXPORT_LIST:s,/,\,)}
    -		: q{$(subst /,\,$(PERL_ARCHIVE)) $(subst /,\,$(LDLOADLIBS)) }
    -		 .q{$(subst /,\,$(MYEXTLIB)),$(subst /,\,$(EXPORT_LIST))})
    -       .q{,$(RESFILES)});
    -    } else {	# VC
    -      push(@m,
    -       q{	$(LD) -out:$@ $(LDDLFLAGS) }.$ldfrom.q{ $(OTHERLDFLAGS) }
    -      .q{$(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) -def:$(EXPORT_LIST)});
    -    }
    -    push @m, '
    -	$(CHMOD) $(PERM_RWX) $@
    -';
    -
    -    join('',@m);
    -}
    -
    -=item extra_clean_files
    -
    -Clean out some extra dll.{base,exp} files which might be generated by
    -gcc.  Otherwise, take out all *.pdb files.
    -
    -=cut
    -
    -sub extra_clean_files {
    -    my $self = shift;
    -
    -    return $GCC ? (qw(dll.base dll.exp)) : ('*.pdb');
    -}
    -
    -=item init_linker
    -
    -=cut
    -
    -sub init_linker {
    -    my $self = shift;
    -
    -    $self->{PERL_ARCHIVE}       = "\$(PERL_INC)\\$Config{libperl}";
    -    $self->{PERL_ARCHIVE_AFTER} = '';
    -    $self->{EXPORT_LIST}        = '$(BASEEXT).def';
    -}
    -
    -
    -=item perl_script
    -
    -Checks for the perl program under several common perl extensions.
    -
    -=cut
    -
    -sub perl_script {
    -    my($self,$file) = @_;
    -    return $file if -r $file && -f _;
    -    return "$file.pl"  if -r "$file.pl" && -f _;
    -    return "$file.plx" if -r "$file.plx" && -f _;
    -    return "$file.bat" if -r "$file.bat" && -f _;
    -    return;
    -}
    -
    -
    -=item xs_o
    -
    -This target is stubbed out.  Not sure why.
    -
    -=cut
    -
    -sub xs_o {
    -    return ''
    -}
    -
    -
    -=item pasthru
    -
    -All we send is -nologo to nmake to prevent it from printing its damned
    -banner.
    -
    -=cut
    -
    -sub pasthru {
    -    my($self) = shift;
    -    return "PASTHRU = " . ($NMAKE ? "-nologo" : "");
    -}
    -
    -
    -=item oneliner
    -
    -These are based on what command.com does on Win98.  They may be wrong
    -for other Windows shells, I don't know.
    -
    -=cut
    -
    -sub oneliner {
    -    my($self, $cmd, $switches) = @_;
    -    $switches = [] unless defined $switches;
    -
    -    # Strip leading and trailing newlines
    -    $cmd =~ s{^\n+}{};
    -    $cmd =~ s{\n+$}{};
    -
    -    $cmd = $self->quote_literal($cmd);
    -    $cmd = $self->escape_newlines($cmd);
    -
    -    $switches = join ' ', @$switches;
    -
    -    return qq{\$(ABSPERLRUN) $switches -e $cmd};
    -}
    -
    -
    -sub quote_literal {
    -    my($self, $text) = @_;
    -
    -    # I don't know if this is correct, but it seems to work on
    -    # Win98's command.com
    -    $text =~ s{"}{\\"}g;
    -
    -    # dmake eats '{' inside double quotes and leaves alone { outside double
    -    # quotes; however it transforms {{ into { either inside and outside double
    -    # quotes.  It also translates }} into }.  The escaping below is not
    -    # 100% correct.
    -    if( $DMAKE ) {
    -        $text =~ s/{/{{/g;
    -        $text =~ s/}}/}}}/g;
    -    }
    -
    -    return qq{"$text"};
    -}
    -
    -
    -sub escape_newlines {
    -    my($self, $text) = @_;
    -
    -    # Escape newlines
    -    $text =~ s{\n}{\\\n}g;
    -
    -    return $text;
    -}
    -
    -
    -=item cd
    -
    -dmake can handle Unix style cd'ing but nmake (at least 1.5) cannot.  It
    -wants:
    -
    -    cd dir
    -    command
    -    another_command
    -    cd ..
    -
    -B This cd can only go one level down.  So far this sufficient for
    -what MakeMaker needs.
    -
    -=cut
    -
    -sub cd {
    -    my($self, $dir, @cmds) = @_;
    -
    -    return $self->SUPER::cd($dir, @cmds) unless $NMAKE;
    -
    -    my $cmd = join "\n\t", map "$_", @cmds;
    -
    -    # No leading tab and no trailing newline makes for easier embedding.
    -    my $make_frag = sprintf <<'MAKE_FRAG', $dir, $cmd;
    -cd %s
    -	%s
    -	cd ..
    -MAKE_FRAG
    -
    -    chomp $make_frag;
    -
    -    return $make_frag;
    -}
    -
    -
    -=item max_exec_len
    -
    -nmake 1.50 limits command length to 2048 characters.
    -
    -=cut
    -
    -sub max_exec_len {
    -    my $self = shift;
    -
    -    return $self->{_MAX_EXEC_LEN} ||= 2 * 1024;
    -}
    -
    -
    -=item os_flavor
    -
    -Windows is Win32.
    -
    -=cut
    -
    -sub os_flavor {
    -    return('Win32');
    -}
    -
    -
    -1;
    -__END__
    -
    -=back
    -
    -=cut 
    -
    -
    diff --git a/lib/perl5/5.8.8/ExtUtils/MM_Win95.pm b/lib/perl5/5.8.8/ExtUtils/MM_Win95.pm
    deleted file mode 100644
    index d0e2cb2a..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/MM_Win95.pm
    +++ /dev/null
    @@ -1,123 +0,0 @@
    -package ExtUtils::MM_Win95;
    -
    -use vars qw($VERSION @ISA);
    -$VERSION = '0.04';
    -
    -require ExtUtils::MM_Win32;
    -@ISA = qw(ExtUtils::MM_Win32);
    -
    -use ExtUtils::MakeMaker::Config;
    -
    -
    -=head1 NAME
    -
    -ExtUtils::MM_Win95 - method to customize MakeMaker for Win9X
    -
    -=head1 SYNOPSIS
    -
    -  You should not be using this module directly.
    -
    -=head1 DESCRIPTION
    -
    -This is a subclass of ExtUtils::MM_Win32 containing changes necessary
    -to get MakeMaker playing nice with command.com and other Win9Xisms.
    -
    -=head2 Overriden methods
    -
    -Most of these make up for limitations in the Win9x/nmake command shell.
    -Mostly its lack of &&.
    -
    -=over 4
    -
    -
    -=item xs_c
    -
    -The && problem.
    -
    -=cut
    -
    -sub xs_c {
    -    my($self) = shift;
    -    return '' unless $self->needs_linking();
    -    '
    -.xs.c:
    -	$(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.c
    -	'
    -}
    -
    -
    -=item xs_cpp
    -
    -The && problem
    -
    -=cut
    -
    -sub xs_cpp {
    -    my($self) = shift;
    -    return '' unless $self->needs_linking();
    -    '
    -.xs.cpp:
    -	$(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.cpp
    -	';
    -}
    -
    -=item xs_o 
    -
    -The && problem.
    -
    -=cut
    -
    -sub xs_o {
    -    my($self) = shift;
    -    return '' unless $self->needs_linking();
    -    '
    -.xs$(OBJ_EXT):
    -	$(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.c
    -	$(CCCMD) $(CCCDLFLAGS) -I$(PERL_INC) $(DEFINE) $*.c
    -	';
    -}
    -
    -
    -=item max_exec_len
    -
    -Win98 chokes on things like Encode if we set the max length to nmake's max
    -of 2K.  So we go for a more conservative value of 1K.
    -
    -=cut
    -
    -sub max_exec_len {
    -    my $self = shift;
    -
    -    return $self->{_MAX_EXEC_LEN} ||= 1024;
    -}
    -
    -
    -=item os_flavor
    -
    -Win95 and Win98 and WinME are collectively Win9x and Win32
    -
    -=cut
    -
    -sub os_flavor {
    -    my $self = shift;
    -    return ($self->SUPER::os_flavor, 'Win9x');
    -}
    -
    -
    -=back
    -
    -
    -=head1 AUTHOR
    -
    -Code originally inside MM_Win32.  Original author unknown.
    -
    -Currently maintained by Michael G Schwern C.
    -
    -Send patches and ideas to C.
    -
    -See http://www.makemaker.org.
    -
    -=cut
    -
    -
    -1;
    diff --git a/lib/perl5/5.8.8/ExtUtils/MY.pm b/lib/perl5/5.8.8/ExtUtils/MY.pm
    deleted file mode 100644
    index 97ef42a1..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/MY.pm
    +++ /dev/null
    @@ -1,42 +0,0 @@
    -package ExtUtils::MY;
    -
    -use strict;
    -require ExtUtils::MM;
    -
    -use vars qw(@ISA $VERSION);
    -$VERSION = 0.01;
    -@ISA = qw(ExtUtils::MM);
    -
    -{
    -    package MY;
    -    use vars qw(@ISA);
    -    @ISA = qw(ExtUtils::MY);
    -}
    -
    -sub DESTROY {}
    -
    -
    -=head1 NAME
    -
    -ExtUtils::MY - ExtUtils::MakeMaker subclass for customization
    -
    -=head1 SYNOPSIS
    -
    -  # in your Makefile.PL
    -  sub MY::whatever {
    -      ...
    -  }
    -
    -=head1 DESCRIPTION
    -
    -B
    -
    -ExtUtils::MY is a subclass of ExtUtils::MM.  Its provided in your
    -Makefile.PL for you to add and override MakeMaker functionality.
    -
    -It also provides a convenient alias via the MY class.
    -
    -ExtUtils::MY might turn out to be a temporary solution, but MY won't
    -go away.
    -
    -=cut
    diff --git a/lib/perl5/5.8.8/ExtUtils/MakeMaker.pm b/lib/perl5/5.8.8/ExtUtils/MakeMaker.pm
    deleted file mode 100644
    index 0e651511..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/MakeMaker.pm
    +++ /dev/null
    @@ -1,2519 +0,0 @@
    -# $Id: /local/schwern.org/CPAN/ExtUtils-MakeMaker/trunk/lib/ExtUtils/MakeMaker.pm 4535 2005-05-20T23:08:34.937906Z schwern  $
    -package ExtUtils::MakeMaker;
    -
    -BEGIN {require 5.005_03;}
    -
    -require Exporter;
    -use ExtUtils::MakeMaker::Config;
    -use Carp ();
    -use File::Path;
    -
    -use vars qw(
    -            @ISA @EXPORT @EXPORT_OK
    -            $VERSION $Verbose %Config 
    -            @Prepend_parent @Parent
    -            %Recognized_Att_Keys @Get_from_Config @MM_Sections @Overridable 
    -            $Filename
    -           );
    -
    -# Has to be on its own line with no $ after it to avoid being noticed by
    -# the version control system
    -use vars qw($Revision);
    -use strict;
    -
    -$VERSION = '6.30';
    -($Revision = q$Revision: 4535 $) =~ /Revision:\s+(\S+)/;
    -
    -@ISA = qw(Exporter);
    -@EXPORT = qw(&WriteMakefile &writeMakefile $Verbose &prompt);
    -@EXPORT_OK = qw($VERSION &neatvalue &mkbootstrap &mksymlists);
    -
    -# These will go away once the last of the Win32 & VMS specific code is 
    -# purged.
    -my $Is_VMS     = $^O eq 'VMS';
    -my $Is_Win32   = $^O eq 'MSWin32';
    -
    -# Our filename for diagnostic and debugging purposes.  More reliable
    -# than %INC (think caseless filesystems)
    -$Filename = __FILE__;
    -
    -full_setup();
    -
    -require ExtUtils::MM;  # Things like CPAN assume loading ExtUtils::MakeMaker
    -                       # will give them MM.
    -
    -require ExtUtils::MY;  # XXX pre-5.8 versions of ExtUtils::Embed expect
    -                       # loading ExtUtils::MakeMaker will give them MY.
    -                       # This will go when Embed is it's own CPAN module.
    -
    -
    -sub WriteMakefile {
    -    Carp::croak "WriteMakefile: Need even number of args" if @_ % 2;
    -
    -    require ExtUtils::MY;
    -    my %att = @_;
    -
    -    _verify_att(\%att);
    -
    -    my $mm = MM->new(\%att);
    -    $mm->flush;
    -
    -    return $mm;
    -}
    -
    -
    -# Basic signatures of the attributes WriteMakefile takes.  Each is the
    -# reference type.  Empty value indicate it takes a non-reference
    -# scalar.
    -my %Att_Sigs;
    -my %Special_Sigs = (
    - C                  => 'array',
    - CONFIG             => 'array',
    - CONFIGURE          => 'code',
    - DIR                => 'array',
    - DL_FUNCS           => 'hash',
    - DL_VARS            => 'array',
    - EXCLUDE_EXT        => 'array',
    - EXE_FILES          => 'array',
    - FUNCLIST           => 'array',
    - H                  => 'array',
    - IMPORTS            => 'hash',
    - INCLUDE_EXT        => 'array',
    - LIBS               => ['array',''],
    - MAN1PODS           => 'hash',
    - MAN3PODS           => 'hash',
    - PL_FILES           => 'hash',
    - PM                 => 'hash',
    - PMLIBDIRS          => 'array',
    - PREREQ_PM          => 'hash',
    - SKIP               => 'array',
    - TYPEMAPS           => 'array',
    - XS                 => 'hash',
    - _KEEP_AFTER_FLUSH  => '',
    -
    - clean      => 'hash',
    - depend     => 'hash',
    - dist       => 'hash',
    - dynamic_lib=> 'hash',
    - linkext    => 'hash',
    - macro      => 'hash',
    - postamble  => 'hash',
    - realclean  => 'hash',
    - test       => 'hash',
    - tool_autosplit => 'hash',
    -);
    -
    -@Att_Sigs{keys %Recognized_Att_Keys} = ('') x keys %Recognized_Att_Keys;
    -@Att_Sigs{keys %Special_Sigs} = values %Special_Sigs;
    -
    -
    -sub _verify_att {
    -    my($att) = @_;
    -
    -    while( my($key, $val) = each %$att ) {
    -        my $sig = $Att_Sigs{$key};
    -        unless( defined $sig ) {
    -            warn "WARNING: $key is not a known parameter.\n";
    -            next;
    -        }
    -
    -        my @sigs   = ref $sig ? @$sig : $sig;
    -        my $given = lc ref $val;
    -        unless( grep $given eq $_, @sigs ) {
    -            my $takes = join " or ", map { $_ ne '' ? "$_ reference"
    -                                                    : "string/number"
    -                                         } @sigs;
    -            my $has   = $given ne '' ? "$given reference"
    -                                     : "string/number";
    -            warn "WARNING: $key takes a $takes not a $has.\n".
    -                 "         Please inform the author.\n";
    -        }
    -    }
    -}
    -
    -sub prompt ($;$) {
    -    my($mess, $def) = @_;
    -    Carp::confess("prompt function called without an argument") 
    -        unless defined $mess;
    -
    -    my $isa_tty = -t STDIN && (-t STDOUT || !(-f STDOUT || -c STDOUT)) ;
    -
    -    my $dispdef = defined $def ? "[$def] " : " ";
    -    $def = defined $def ? $def : "";
    -
    -    local $|=1;
    -    local $\;
    -    print "$mess $dispdef";
    -
    -    my $ans;
    -    if ($ENV{PERL_MM_USE_DEFAULT} || (!$isa_tty && eof STDIN)) {
    -        print "$def\n";
    -    }
    -    else {
    -        $ans = ;
    -        if( defined $ans ) {
    -            chomp $ans;
    -        }
    -        else { # user hit ctrl-D
    -            print "\n";
    -        }
    -    }
    -
    -    return (!defined $ans || $ans eq '') ? $def : $ans;
    -}
    -
    -sub eval_in_subdirs {
    -    my($self) = @_;
    -    use Cwd qw(cwd abs_path);
    -    my $pwd = cwd() || die "Can't figure out your cwd!";
    -
    -    local @INC = map eval {abs_path($_) if -e} || $_, @INC;
    -    push @INC, '.';     # '.' has to always be at the end of @INC
    -
    -    foreach my $dir (@{$self->{DIR}}){
    -        my($abs) = $self->catdir($pwd,$dir);
    -        eval { $self->eval_in_x($abs); };
    -        last if $@;
    -    }
    -    chdir $pwd;
    -    die $@ if $@;
    -}
    -
    -sub eval_in_x {
    -    my($self,$dir) = @_;
    -    chdir $dir or Carp::carp("Couldn't change to directory $dir: $!");
    -
    -    {
    -        package main;
    -        do './Makefile.PL';
    -    };
    -    if ($@) {
    -#         if ($@ =~ /prerequisites/) {
    -#             die "MakeMaker WARNING: $@";
    -#         } else {
    -#             warn "WARNING from evaluation of $dir/Makefile.PL: $@";
    -#         }
    -        die "ERROR from evaluation of $dir/Makefile.PL: $@";
    -    }
    -}
    -
    -
    -# package name for the classes into which the first object will be blessed
    -my $PACKNAME = 'PACK000';
    -
    -sub full_setup {
    -    $Verbose ||= 0;
    -
    -    my @attrib_help = qw/
    -
    -    AUTHOR ABSTRACT ABSTRACT_FROM BINARY_LOCATION
    -    C CAPI CCFLAGS CONFIG CONFIGURE DEFINE DIR DISTNAME DL_FUNCS DL_VARS
    -    EXCLUDE_EXT EXE_FILES FIRST_MAKEFILE
    -    FULLPERL FULLPERLRUN FULLPERLRUNINST
    -    FUNCLIST H IMPORTS
    -
    -    INST_ARCHLIB INST_SCRIPT INST_BIN INST_LIB INST_MAN1DIR INST_MAN3DIR
    -    INSTALLDIRS
    -    DESTDIR PREFIX INSTALLBASE
    -    PERLPREFIX      SITEPREFIX      VENDORPREFIX
    -    INSTALLPRIVLIB  INSTALLSITELIB  INSTALLVENDORLIB
    -    INSTALLARCHLIB  INSTALLSITEARCH INSTALLVENDORARCH
    -    INSTALLBIN      INSTALLSITEBIN  INSTALLVENDORBIN
    -    INSTALLMAN1DIR          INSTALLMAN3DIR
    -    INSTALLSITEMAN1DIR      INSTALLSITEMAN3DIR
    -    INSTALLVENDORMAN1DIR    INSTALLVENDORMAN3DIR
    -    INSTALLSCRIPT 
    -    PERL_LIB        PERL_ARCHLIB 
    -    SITELIBEXP      SITEARCHEXP 
    -
    -    INC INCLUDE_EXT LDFROM LIB LIBPERL_A LIBS
    -    LINKTYPE MAKEAPERL MAKEFILE MAKEFILE_OLD MAN1PODS MAN3PODS MAP_TARGET 
    -    MYEXTLIB NAME NEEDS_LINKING NOECHO NO_META NORECURS NO_VC OBJECT OPTIMIZE 
    -    PERL_MALLOC_OK PERL PERLMAINCC PERLRUN PERLRUNINST PERL_CORE
    -    PERL_SRC PERM_RW PERM_RWX
    -    PL_FILES PM PM_FILTER PMLIBDIRS POLLUTE PPM_INSTALL_EXEC
    -    PPM_INSTALL_SCRIPT PREREQ_FATAL PREREQ_PM PREREQ_PRINT PRINT_PREREQ
    -    SIGN SKIP TYPEMAPS VERSION VERSION_FROM XS XSOPT XSPROTOARG
    -    XS_VERSION clean depend dist dynamic_lib linkext macro realclean
    -    tool_autosplit
    -
    -    MACPERL_SRC MACPERL_LIB MACLIBS_68K MACLIBS_PPC MACLIBS_SC MACLIBS_MRC
    -    MACLIBS_ALL_68K MACLIBS_ALL_PPC MACLIBS_SHARED
    -        /;
    -
    -    # IMPORTS is used under OS/2 and Win32
    -
    -    # @Overridable is close to @MM_Sections but not identical.  The
    -    # order is important. Many subroutines declare macros. These
    -    # depend on each other. Let's try to collect the macros up front,
    -    # then pasthru, then the rules.
    -
    -    # MM_Sections are the sections we have to call explicitly
    -    # in Overridable we have subroutines that are used indirectly
    -
    -
    -    @MM_Sections = 
    -        qw(
    -
    - post_initialize const_config constants platform_constants 
    - tool_autosplit tool_xsubpp tools_other 
    -
    - makemakerdflt
    -
    - dist macro depend cflags const_loadlibs const_cccmd
    - post_constants
    -
    - pasthru
    -
    - special_targets
    - c_o xs_c xs_o
    - top_targets blibdirs linkext dlsyms dynamic dynamic_bs
    - dynamic_lib static static_lib manifypods processPL
    - installbin subdirs
    - clean_subdirs clean realclean_subdirs realclean 
    - metafile signature
    - dist_basics dist_core distdir dist_test dist_ci distmeta distsignature
    - install force perldepend makefile staticmake test ppd
    -
    -          ); # loses section ordering
    -
    -    @Overridable = @MM_Sections;
    -    push @Overridable, qw[
    -
    - libscan makeaperl needs_linking perm_rw perm_rwx
    - subdir_x test_via_harness test_via_script init_PERL
    -                         ];
    -
    -    push @MM_Sections, qw[
    -
    - pm_to_blib selfdocument
    -
    -                         ];
    -
    -    # Postamble needs to be the last that was always the case
    -    push @MM_Sections, "postamble";
    -    push @Overridable, "postamble";
    -
    -    # All sections are valid keys.
    -    @Recognized_Att_Keys{@MM_Sections} = (1) x @MM_Sections;
    -
    -    # we will use all these variables in the Makefile
    -    @Get_from_Config = 
    -        qw(
    -           ar cc cccdlflags ccdlflags dlext dlsrc ld lddlflags ldflags libc
    -           lib_ext obj_ext osname osvers ranlib sitelibexp sitearchexp so
    -           exe_ext full_ar
    -          );
    -
    -    # 5.5.3 doesn't have any concept of vendor libs
    -    push @Get_from_Config, qw( vendorarchexp vendorlibexp ) if $] >= 5.006;
    -
    -    foreach my $item (@attrib_help){
    -        $Recognized_Att_Keys{$item} = 1;
    -    }
    -    foreach my $item (@Get_from_Config) {
    -        $Recognized_Att_Keys{uc $item} = $Config{$item};
    -        print "Attribute '\U$item\E' => '$Config{$item}'\n"
    -            if ($Verbose >= 2);
    -    }
    -
    -    #
    -    # When we eval a Makefile.PL in a subdirectory, that one will ask
    -    # us (the parent) for the values and will prepend "..", so that
    -    # all files to be installed end up below OUR ./blib
    -    #
    -    @Prepend_parent = qw(
    -           INST_BIN INST_LIB INST_ARCHLIB INST_SCRIPT
    -           MAP_TARGET INST_MAN1DIR INST_MAN3DIR PERL_SRC
    -           PERL FULLPERL
    -    );
    -}
    -
    -sub writeMakefile {
    -    die <{ARGS}{$k} = $self->{$k};
    -    }
    -
    -    if ("@ARGV" =~ /\bPREREQ_PRINT\b/) {
    -        require Data::Dumper;
    -        print Data::Dumper->Dump([$self->{PREREQ_PM}], [qw(PREREQ_PM)]);
    -        exit 0;
    -    }
    -
    -    # PRINT_PREREQ is RedHatism.
    -    if ("@ARGV" =~ /\bPRINT_PREREQ\b/) {
    -        print join(" ", map { "perl($_)>=$self->{PREREQ_PM}->{$_} " } 
    -                        sort keys %{$self->{PREREQ_PM}}), "\n";
    -        exit 0;
    -   }
    -
    -    print STDOUT "MakeMaker (v$VERSION)\n" if $Verbose;
    -    if (-f "MANIFEST" && ! -f "Makefile"){
    -        check_manifest();
    -    }
    -
    -    $self = {} unless (defined $self);
    -
    -    check_hints($self);
    -
    -    my %configure_att;         # record &{$self->{CONFIGURE}} attributes
    -    my(%initial_att) = %$self; # record initial attributes
    -
    -    my(%unsatisfied) = ();
    -    foreach my $prereq (sort keys %{$self->{PREREQ_PM}}) {
    -        # 5.8.0 has a bug with require Foo::Bar alone in an eval, so an
    -        # extra statement is a workaround.
    -        my $file = "$prereq.pm";
    -        $file =~ s{::}{/}g;
    -        eval { require $file };
    -
    -        my $pr_version = $prereq->VERSION || 0;
    -
    -        # convert X.Y_Z alpha version #s to X.YZ for easier comparisons
    -        $pr_version =~ s/(\d+)\.(\d+)_(\d+)/$1.$2$3/;
    -
    -        if ($@) {
    -            warn sprintf "Warning: prerequisite %s %s not found.\n", 
    -              $prereq, $self->{PREREQ_PM}{$prereq} 
    -                   unless $self->{PREREQ_FATAL};
    -            $unsatisfied{$prereq} = 'not installed';
    -        } elsif ($pr_version < $self->{PREREQ_PM}->{$prereq} ){
    -            warn sprintf "Warning: prerequisite %s %s not found. We have %s.\n",
    -              $prereq, $self->{PREREQ_PM}{$prereq}, 
    -                ($pr_version || 'unknown version') 
    -                  unless $self->{PREREQ_FATAL};
    -            $unsatisfied{$prereq} = $self->{PREREQ_PM}->{$prereq} ? 
    -              $self->{PREREQ_PM}->{$prereq} : 'unknown version' ;
    -        }
    -    }
    -    if (%unsatisfied && $self->{PREREQ_FATAL}){
    -        my $failedprereqs = join ', ', map {"$_ $unsatisfied{$_}"} 
    -                            keys %unsatisfied;
    -        die qq{MakeMaker FATAL: prerequisites not found ($failedprereqs)\n
    -               Please install these modules first and rerun 'perl Makefile.PL'.\n};
    -    }
    -
    -    if (defined $self->{CONFIGURE}) {
    -        if (ref $self->{CONFIGURE} eq 'CODE') {
    -            %configure_att = %{&{$self->{CONFIGURE}}};
    -            $self = { %$self, %configure_att };
    -        } else {
    -            Carp::croak "Attribute 'CONFIGURE' to WriteMakefile() not a code reference\n";
    -        }
    -    }
    -
    -    # This is for old Makefiles written pre 5.00, will go away
    -    if ( Carp::longmess("") =~ /runsubdirpl/s ){
    -        Carp::carp("WARNING: Please rerun 'perl Makefile.PL' to regenerate your Makefiles\n");
    -    }
    -
    -    my $newclass = ++$PACKNAME;
    -    local @Parent = @Parent;    # Protect against non-local exits
    -    {
    -        no strict 'refs';
    -        print "Blessing Object into class [$newclass]\n" if $Verbose>=2;
    -        mv_all_methods("MY",$newclass);
    -        bless $self, $newclass;
    -        push @Parent, $self;
    -        require ExtUtils::MY;
    -        @{"$newclass\:\:ISA"} = 'MM';
    -    }
    -
    -    if (defined $Parent[-2]){
    -        $self->{PARENT} = $Parent[-2];
    -        my $key;
    -        for $key (@Prepend_parent) {
    -            next unless defined $self->{PARENT}{$key};
    -
    -            # Don't stomp on WriteMakefile() args.
    -            next if defined $self->{ARGS}{$key} and
    -                    $self->{ARGS}{$key} eq $self->{$key};
    -
    -            $self->{$key} = $self->{PARENT}{$key};
    -
    -            unless ($Is_VMS && $key =~ /PERL$/) {
    -                $self->{$key} = $self->catdir("..",$self->{$key})
    -                  unless $self->file_name_is_absolute($self->{$key});
    -            } else {
    -                # PERL or FULLPERL will be a command verb or even a
    -                # command with an argument instead of a full file
    -                # specification under VMS.  So, don't turn the command
    -                # into a filespec, but do add a level to the path of
    -                # the argument if not already absolute.
    -                my @cmd = split /\s+/, $self->{$key};
    -                $cmd[1] = $self->catfile('[-]',$cmd[1])
    -                  unless (@cmd < 2) || $self->file_name_is_absolute($cmd[1]);
    -                $self->{$key} = join(' ', @cmd);
    -            }
    -        }
    -        if ($self->{PARENT}) {
    -            $self->{PARENT}->{CHILDREN}->{$newclass} = $self;
    -            foreach my $opt (qw(POLLUTE PERL_CORE)) {
    -                if (exists $self->{PARENT}->{$opt}
    -                    and not exists $self->{$opt})
    -                    {
    -                        # inherit, but only if already unspecified
    -                        $self->{$opt} = $self->{PARENT}->{$opt};
    -                    }
    -            }
    -        }
    -        my @fm = grep /^FIRST_MAKEFILE=/, @ARGV;
    -        parse_args($self,@fm) if @fm;
    -    } else {
    -        parse_args($self,split(' ', $ENV{PERL_MM_OPT} || ''),@ARGV);
    -    }
    -
    -    $self->{NAME} ||= $self->guess_name;
    -
    -    ($self->{NAME_SYM} = $self->{NAME}) =~ s/\W+/_/g;
    -
    -    $self->init_main;
    -    $self->init_VERSION;
    -    $self->init_dist;
    -    $self->init_INST;
    -    $self->init_INSTALL;
    -    $self->init_DEST;
    -    $self->init_dirscan;
    -    $self->init_xs;
    -    $self->init_PERL;
    -    $self->init_DIRFILESEP;
    -    $self->init_linker;
    -
    -    if (! $self->{PERL_SRC} ) {
    -        require VMS::Filespec if $Is_VMS;
    -        my($pthinks) = $self->canonpath($INC{'Config.pm'});
    -        my($cthinks) = $self->catfile($Config{'archlibexp'},'Config.pm');
    -        $pthinks = VMS::Filespec::vmsify($pthinks) if $Is_VMS;
    -        if ($pthinks ne $cthinks &&
    -            !($Is_Win32 and lc($pthinks) eq lc($cthinks))) {
    -            print "Have $pthinks expected $cthinks\n";
    -            if ($Is_Win32) {
    -                $pthinks =~ s![/\\]Config\.pm$!!i; $pthinks =~ s!.*[/\\]!!;
    -            }
    -            else {
    -                $pthinks =~ s!/Config\.pm$!!; $pthinks =~ s!.*/!!;
    -            }
    -            print STDOUT <{UNINSTALLED_PERL};
    -Your perl and your Config.pm seem to have different ideas about the 
    -architecture they are running on.
    -Perl thinks: [$pthinks]
    -Config says: [$Config{archname}]
    -This may or may not cause problems. Please check your installation of perl 
    -if you have problems building this extension.
    -END
    -        }
    -    }
    -
    -    $self->init_others();
    -    $self->init_platform();
    -    $self->init_PERM();
    -    my($argv) = neatvalue(\@ARGV);
    -    $argv =~ s/^\[/(/;
    -    $argv =~ s/\]$/)/;
    -
    -    push @{$self->{RESULT}}, <{NAME} extension to perl.
    -#
    -# It was generated automatically by MakeMaker version
    -# $VERSION (Revision: $Revision) from the contents of
    -# Makefile.PL. Don't edit this file, edit Makefile.PL instead.
    -#
    -#       ANY CHANGES MADE HERE WILL BE LOST!
    -#
    -#   MakeMaker ARGV: $argv
    -#
    -#   MakeMaker Parameters:
    -END
    -
    -    foreach my $key (sort keys %initial_att){
    -        next if $key eq 'ARGS';
    -
    -        my($v) = neatvalue($initial_att{$key});
    -        $v =~ s/(CODE|HASH|ARRAY|SCALAR)\([\dxa-f]+\)/$1\(...\)/;
    -        $v =~ tr/\n/ /s;
    -        push @{$self->{RESULT}}, "#     $key => $v";
    -    }
    -    undef %initial_att;        # free memory
    -
    -    if (defined $self->{CONFIGURE}) {
    -       push @{$self->{RESULT}}, < 0) {
    -            foreach my $key (sort keys %configure_att){
    -               next if $key eq 'ARGS';
    -               my($v) = neatvalue($configure_att{$key});
    -               $v =~ s/(CODE|HASH|ARRAY|SCALAR)\([\dxa-f]+\)/$1\(...\)/;
    -               $v =~ tr/\n/ /s;
    -               push @{$self->{RESULT}}, "#     $key => $v";
    -            }
    -        }
    -        else
    -        {
    -           push @{$self->{RESULT}}, "# no values returned";
    -        }
    -        undef %configure_att;  # free memory
    -    }
    -
    -    # turn the SKIP array into a SKIPHASH hash
    -    my (%skip,$skip);
    -    for $skip (@{$self->{SKIP} || []}) {
    -        $self->{SKIPHASH}{$skip} = 1;
    -    }
    -    delete $self->{SKIP}; # free memory
    -
    -    if ($self->{PARENT}) {
    -        for (qw/install dist dist_basics dist_core distdir dist_test dist_ci/) {
    -            $self->{SKIPHASH}{$_} = 1;
    -        }
    -    }
    -
    -    # We run all the subdirectories now. They don't have much to query
    -    # from the parent, but the parent has to query them: if they need linking!
    -    unless ($self->{NORECURS}) {
    -        $self->eval_in_subdirs if @{$self->{DIR}};
    -    }
    -
    -    foreach my $section ( @MM_Sections ){
    -        # Support for new foo_target() methods.
    -        my $method = $section;
    -        $method .= '_target' unless $self->can($method);
    -
    -        print "Processing Makefile '$section' section\n" if ($Verbose >= 2);
    -        my($skipit) = $self->skipcheck($section);
    -        if ($skipit){
    -            push @{$self->{RESULT}}, "\n# --- MakeMaker $section section $skipit.";
    -        } else {
    -            my(%a) = %{$self->{$section} || {}};
    -            push @{$self->{RESULT}}, "\n# --- MakeMaker $section section:";
    -            push @{$self->{RESULT}}, "# " . join ", ", %a if $Verbose && %a;
    -            push @{$self->{RESULT}}, $self->nicetext($self->$method( %a ));
    -        }
    -    }
    -
    -    push @{$self->{RESULT}}, "\n# End.";
    -
    -    $self;
    -}
    -
    -sub WriteEmptyMakefile {
    -    Carp::croak "WriteEmptyMakefile: Need even number of args" if @_ % 2;
    -
    -    my %att = @_;
    -    my $self = MM->new(\%att);
    -    if (-f $self->{MAKEFILE_OLD}) {
    -      _unlink($self->{MAKEFILE_OLD}) or 
    -        warn "unlink $self->{MAKEFILE_OLD}: $!";
    -    }
    -    if ( -f $self->{MAKEFILE} ) {
    -        _rename($self->{MAKEFILE}, $self->{MAKEFILE_OLD}) or
    -          warn "rename $self->{MAKEFILE} => $self->{MAKEFILE_OLD}: $!"
    -    }
    -    open MF, '>'.$self->{MAKEFILE} or die "open $self->{MAKEFILE} for write: $!";
    -    print MF <<'EOP';
    -all:
    -
    -clean:
    -
    -install:
    -
    -makemakerdflt:
    -
    -test:
    -
    -EOP
    -    close MF or die "close $self->{MAKEFILE} for write: $!";
    -}
    -
    -sub check_manifest {
    -    print STDOUT "Checking if your kit is complete...\n";
    -    require ExtUtils::Manifest;
    -    # avoid warning
    -    $ExtUtils::Manifest::Quiet = $ExtUtils::Manifest::Quiet = 1;
    -    my(@missed) = ExtUtils::Manifest::manicheck();
    -    if (@missed) {
    -        print STDOUT "Warning: the following files are missing in your kit:\n";
    -        print "\t", join "\n\t", @missed;
    -        print STDOUT "\n";
    -        print STDOUT "Please inform the author.\n";
    -    } else {
    -        print STDOUT "Looks good\n";
    -    }
    -}
    -
    -sub parse_args{
    -    my($self, @args) = @_;
    -    foreach (@args) {
    -        unless (m/(.*?)=(.*)/) {
    -            ++$Verbose if m/^verb/;
    -            next;
    -        }
    -        my($name, $value) = ($1, $2);
    -        if ($value =~ m/^~(\w+)?/) { # tilde with optional username
    -            $value =~ s [^~(\w*)]
    -                [$1 ?
    -                 ((getpwnam($1))[7] || "~$1") :
    -                 (getpwuid($>))[7]
    -                 ]ex;
    -        }
    -
    -        # Remember the original args passed it.  It will be useful later.
    -        $self->{ARGS}{uc $name} = $self->{uc $name} = $value;
    -    }
    -
    -    # catch old-style 'potential_libs' and inform user how to 'upgrade'
    -    if (defined $self->{potential_libs}){
    -        my($msg)="'potential_libs' => '$self->{potential_libs}' should be";
    -        if ($self->{potential_libs}){
    -            print STDOUT "$msg changed to:\n\t'LIBS' => ['$self->{potential_libs}']\n";
    -        } else {
    -            print STDOUT "$msg deleted.\n";
    -        }
    -        $self->{LIBS} = [$self->{potential_libs}];
    -        delete $self->{potential_libs};
    -    }
    -    # catch old-style 'ARMAYBE' and inform user how to 'upgrade'
    -    if (defined $self->{ARMAYBE}){
    -        my($armaybe) = $self->{ARMAYBE};
    -        print STDOUT "ARMAYBE => '$armaybe' should be changed to:\n",
    -                        "\t'dynamic_lib' => {ARMAYBE => '$armaybe'}\n";
    -        my(%dl) = %{$self->{dynamic_lib} || {}};
    -        $self->{dynamic_lib} = { %dl, ARMAYBE => $armaybe};
    -        delete $self->{ARMAYBE};
    -    }
    -    if (defined $self->{LDTARGET}){
    -        print STDOUT "LDTARGET should be changed to LDFROM\n";
    -        $self->{LDFROM} = $self->{LDTARGET};
    -        delete $self->{LDTARGET};
    -    }
    -    # Turn a DIR argument on the command line into an array
    -    if (defined $self->{DIR} && ref \$self->{DIR} eq 'SCALAR') {
    -        # So they can choose from the command line, which extensions they want
    -        # the grep enables them to have some colons too much in case they
    -        # have to build a list with the shell
    -        $self->{DIR} = [grep $_, split ":", $self->{DIR}];
    -    }
    -    # Turn a INCLUDE_EXT argument on the command line into an array
    -    if (defined $self->{INCLUDE_EXT} && ref \$self->{INCLUDE_EXT} eq 'SCALAR') {
    -        $self->{INCLUDE_EXT} = [grep $_, split '\s+', $self->{INCLUDE_EXT}];
    -    }
    -    # Turn a EXCLUDE_EXT argument on the command line into an array
    -    if (defined $self->{EXCLUDE_EXT} && ref \$self->{EXCLUDE_EXT} eq 'SCALAR') {
    -        $self->{EXCLUDE_EXT} = [grep $_, split '\s+', $self->{EXCLUDE_EXT}];
    -    }
    -
    -    foreach my $mmkey (sort keys %$self){
    -        next if $mmkey eq 'ARGS';
    -        print STDOUT "  $mmkey => ", neatvalue($self->{$mmkey}), "\n" if $Verbose;
    -        print STDOUT "'$mmkey' is not a known MakeMaker parameter name.\n"
    -            unless exists $Recognized_Att_Keys{$mmkey};
    -    }
    -    $| = 1 if $Verbose;
    -}
    -
    -sub check_hints {
    -    my($self) = @_;
    -    # We allow extension-specific hints files.
    -
    -    require File::Spec;
    -    my $curdir = File::Spec->curdir;
    -
    -    my $hint_dir = File::Spec->catdir($curdir, "hints");
    -    return unless -d $hint_dir;
    -
    -    # First we look for the best hintsfile we have
    -    my($hint)="${^O}_$Config{osvers}";
    -    $hint =~ s/\./_/g;
    -    $hint =~ s/_$//;
    -    return unless $hint;
    -
    -    # Also try without trailing minor version numbers.
    -    while (1) {
    -        last if -f File::Spec->catfile($hint_dir, "$hint.pl");  # found
    -    } continue {
    -        last unless $hint =~ s/_[^_]*$//; # nothing to cut off
    -    }
    -    my $hint_file = File::Spec->catfile($hint_dir, "$hint.pl");
    -
    -    return unless -f $hint_file;    # really there
    -
    -    _run_hintfile($self, $hint_file);
    -}
    -
    -sub _run_hintfile {
    -    no strict 'vars';
    -    local($self) = shift;       # make $self available to the hint file.
    -    my($hint_file) = shift;
    -
    -    local($@, $!);
    -    print STDERR "Processing hints file $hint_file\n";
    -
    -    # Just in case the ./ isn't on the hint file, which File::Spec can
    -    # often strip off, we bung the curdir into @INC
    -    local @INC = (File::Spec->curdir, @INC);
    -    my $ret = do $hint_file;
    -    if( !defined $ret ) {
    -        my $error = $@ || $!;
    -        print STDERR $error;
    -    }
    -}
    -
    -sub mv_all_methods {
    -    my($from,$to) = @_;
    -    no strict 'refs';
    -    my($symtab) = \%{"${from}::"};
    -
    -    # Here you see the *current* list of methods that are overridable
    -    # from Makefile.PL via MY:: subroutines. As of VERSION 5.07 I'm
    -    # still trying to reduce the list to some reasonable minimum --
    -    # because I want to make it easier for the user. A.K.
    -
    -    local $SIG{__WARN__} = sub { 
    -        # can't use 'no warnings redefined', 5.6 only
    -        warn @_ unless $_[0] =~ /^Subroutine .* redefined/ 
    -    };
    -    foreach my $method (@Overridable) {
    -
    -        # We cannot say "next" here. Nick might call MY->makeaperl
    -        # which isn't defined right now
    -
    -        # Above statement was written at 4.23 time when Tk-b8 was
    -        # around. As Tk-b9 only builds with 5.002something and MM 5 is
    -        # standard, we try to enable the next line again. It was
    -        # commented out until MM 5.23
    -
    -        next unless defined &{"${from}::$method"};
    -
    -        *{"${to}::$method"} = \&{"${from}::$method"};
    -
    -        # delete would do, if we were sure, nobody ever called
    -        # MY->makeaperl directly
    -
    -        # delete $symtab->{$method};
    -
    -        # If we delete a method, then it will be undefined and cannot
    -        # be called.  But as long as we have Makefile.PLs that rely on
    -        # %MY:: being intact, we have to fill the hole with an
    -        # inheriting method:
    -
    -        eval "package MY; sub $method { shift->SUPER::$method(\@_); }";
    -    }
    -
    -    # We have to clean out %INC also, because the current directory is
    -    # changed frequently and Graham Barr prefers to get his version
    -    # out of a History.pl file which is "required" so woudn't get
    -    # loaded again in another extension requiring a History.pl
    -
    -    # With perl5.002_01 the deletion of entries in %INC caused Tk-b11
    -    # to core dump in the middle of a require statement. The required
    -    # file was Tk/MMutil.pm.  The consequence is, we have to be
    -    # extremely careful when we try to give perl a reason to reload a
    -    # library with same name.  The workaround prefers to drop nothing
    -    # from %INC and teach the writers not to use such libraries.
    -
    -#    my $inc;
    -#    foreach $inc (keys %INC) {
    -#       #warn "***$inc*** deleted";
    -#       delete $INC{$inc};
    -#    }
    -}
    -
    -sub skipcheck {
    -    my($self) = shift;
    -    my($section) = @_;
    -    if ($section eq 'dynamic') {
    -        print STDOUT "Warning (non-fatal): Target 'dynamic' depends on targets ",
    -        "in skipped section 'dynamic_bs'\n"
    -            if $self->{SKIPHASH}{dynamic_bs} && $Verbose;
    -        print STDOUT "Warning (non-fatal): Target 'dynamic' depends on targets ",
    -        "in skipped section 'dynamic_lib'\n"
    -            if $self->{SKIPHASH}{dynamic_lib} && $Verbose;
    -    }
    -    if ($section eq 'dynamic_lib') {
    -        print STDOUT "Warning (non-fatal): Target '\$(INST_DYNAMIC)' depends on ",
    -        "targets in skipped section 'dynamic_bs'\n"
    -            if $self->{SKIPHASH}{dynamic_bs} && $Verbose;
    -    }
    -    if ($section eq 'static') {
    -        print STDOUT "Warning (non-fatal): Target 'static' depends on targets ",
    -        "in skipped section 'static_lib'\n"
    -            if $self->{SKIPHASH}{static_lib} && $Verbose;
    -    }
    -    return 'skipped' if $self->{SKIPHASH}{$section};
    -    return '';
    -}
    -
    -sub flush {
    -    my $self = shift;
    -    my($chunk);
    -    local *FH;
    -    print STDOUT "Writing $self->{MAKEFILE} for $self->{NAME}\n";
    -
    -    unlink($self->{MAKEFILE}, "MakeMaker.tmp", $Is_VMS ? 'Descrip.MMS' : '');
    -    open(FH,">MakeMaker.tmp") or die "Unable to open MakeMaker.tmp: $!";
    -
    -    for $chunk (@{$self->{RESULT}}) {
    -        print FH "$chunk\n";
    -    }
    -
    -    close FH;
    -    my($finalname) = $self->{MAKEFILE};
    -    _rename("MakeMaker.tmp", $finalname) or
    -      warn "rename MakeMaker.tmp => $finalname: $!";
    -    chmod 0644, $finalname unless $Is_VMS;
    -
    -    my %keep = map { ($_ => 1) } qw(NEEDS_LINKING HAS_LINK_CODE);
    -
    -    if ($self->{PARENT} && !$self->{_KEEP_AFTER_FLUSH}) {
    -        foreach (keys %$self) { # safe memory
    -            delete $self->{$_} unless $keep{$_};
    -        }
    -    }
    -
    -    system("$Config::Config{eunicefix} $finalname") unless $Config::Config{eunicefix} eq ":";
    -}
    -
    -
    -# This is a rename for OS's where the target must be unlinked first.
    -sub _rename {
    -    my($src, $dest) = @_;
    -    chmod 0666, $dest;
    -    unlink $dest;
    -    return rename $src, $dest;
    -}
    -
    -# This is an unlink for OS's where the target must be writable first.
    -sub _unlink {
    -    my @files = @_;
    -    chmod 0666, @files;
    -    return unlink @files;
    -}
    -
    -
    -# The following mkbootstrap() is only for installations that are calling
    -# the pre-4.1 mkbootstrap() from their old Makefiles. This MakeMaker
    -# writes Makefiles, that use ExtUtils::Mkbootstrap directly.
    -sub mkbootstrap {
    -    die <".neatvalue($val)) ;
    -    }
    -    return "{ ".join(', ',@m)." }";
    -}
    -
    -sub selfdocument {
    -    my($self) = @_;
    -    my(@m);
    -    if ($Verbose){
    -        push @m, "\n# Full list of MakeMaker attribute values:";
    -        foreach my $key (sort keys %$self){
    -            next if $key eq 'RESULT' || $key =~ /^[A-Z][a-z]/;
    -            my($v) = neatvalue($self->{$key});
    -            $v =~ s/(CODE|HASH|ARRAY|SCALAR)\([\dxa-f]+\)/$1\(...\)/;
    -            $v =~ tr/\n/ /s;
    -            push @m, "# $key => $v";
    -        }
    -    }
    -    join "\n", @m;
    -}
    -
    -1;
    -
    -__END__
    -
    -=head1 NAME
    -
    -ExtUtils::MakeMaker - Create a module Makefile
    -
    -=head1 SYNOPSIS
    -
    -  use ExtUtils::MakeMaker;
    -
    -  WriteMakefile( ATTRIBUTE => VALUE [, ...] );
    -
    -=head1 DESCRIPTION
    -
    -This utility is designed to write a Makefile for an extension module
    -from a Makefile.PL. It is based on the Makefile.SH model provided by
    -Andy Dougherty and the perl5-porters.
    -
    -It splits the task of generating the Makefile into several subroutines
    -that can be individually overridden.  Each subroutine returns the text
    -it wishes to have written to the Makefile.
    -
    -MakeMaker is object oriented. Each directory below the current
    -directory that contains a Makefile.PL is treated as a separate
    -object. This makes it possible to write an unlimited number of
    -Makefiles with a single invocation of WriteMakefile().
    -
    -=head2 How To Write A Makefile.PL
    -
    -See ExtUtils::MakeMaker::Tutorial.
    -
    -The long answer is the rest of the manpage :-)
    -
    -=head2 Default Makefile Behaviour
    -
    -The generated Makefile enables the user of the extension to invoke
    -
    -  perl Makefile.PL # optionally "perl Makefile.PL verbose"
    -  make
    -  make test        # optionally set TEST_VERBOSE=1
    -  make install     # See below
    -
    -The Makefile to be produced may be altered by adding arguments of the
    -form C. E.g.
    -
    -  perl Makefile.PL PREFIX=~
    -
    -Other interesting targets in the generated Makefile are
    -
    -  make config     # to check if the Makefile is up-to-date
    -  make clean      # delete local temp files (Makefile gets renamed)
    -  make realclean  # delete derived files (including ./blib)
    -  make ci         # check in all the files in the MANIFEST file
    -  make dist       # see below the Distribution Support section
    -
    -=head2 make test
    -
    -MakeMaker checks for the existence of a file named F in the
    -current directory and if it exists it execute the script with the
    -proper set of perl C<-I> options.
    -
    -MakeMaker also checks for any files matching glob("t/*.t"). It will
    -execute all matching files in alphabetical order via the
    -L module with the C<-I> switches set correctly.
    -
    -If you'd like to see the raw output of your tests, set the
    -C variable to true.
    -
    -  make test TEST_VERBOSE=1
    -
    -=head2 make testdb
    -
    -A useful variation of the above is the target C. It runs the
    -test under the Perl debugger (see L). If the file
    -F exists in the current directory, it is used for the test.
    -
    -If you want to debug some other testfile, set the C variable
    -thusly:
    -
    -  make testdb TEST_FILE=t/mytest.t
    -
    -By default the debugger is called using C<-d> option to perl. If you
    -want to specify some other option, set the C variable:
    -
    -  make testdb TESTDB_SW=-Dx
    -
    -=head2 make install
    -
    -make alone puts all relevant files into directories that are named by
    -the macros INST_LIB, INST_ARCHLIB, INST_SCRIPT, INST_MAN1DIR and
    -INST_MAN3DIR.  All these default to something below ./blib if you are
    -I building below the perl source directory. If you I
    -building below the perl source, INST_LIB and INST_ARCHLIB default to
    -../../lib, and INST_SCRIPT is not defined.
    -
    -The I target of the generated Makefile copies the files found
    -below each of the INST_* directories to their INSTALL*
    -counterparts. Which counterparts are chosen depends on the setting of
    -INSTALLDIRS according to the following table:
    -
    -                                 INSTALLDIRS set to
    -                           perl        site          vendor
    -
    -                 PERLPREFIX      SITEPREFIX          VENDORPREFIX
    -  INST_ARCHLIB   INSTALLARCHLIB  INSTALLSITEARCH     INSTALLVENDORARCH
    -  INST_LIB       INSTALLPRIVLIB  INSTALLSITELIB      INSTALLVENDORLIB
    -  INST_BIN       INSTALLBIN      INSTALLSITEBIN      INSTALLVENDORBIN
    -  INST_SCRIPT    INSTALLSCRIPT   INSTALLSCRIPT       INSTALLSCRIPT
    -  INST_MAN1DIR   INSTALLMAN1DIR  INSTALLSITEMAN1DIR  INSTALLVENDORMAN1DIR
    -  INST_MAN3DIR   INSTALLMAN3DIR  INSTALLSITEMAN3DIR  INSTALLVENDORMAN3DIR
    -
    -The INSTALL... macros in turn default to their %Config
    -($Config{installprivlib}, $Config{installarchlib}, etc.) counterparts.
    -
    -You can check the values of these variables on your system with
    -
    -    perl '-V:install.*'
    -
    -And to check the sequence in which the library directories are
    -searched by perl, run
    -
    -    perl -le 'print join $/, @INC'
    -
    -Sometimes older versions of the module you're installing live in other
    -directories in @INC.  Because Perl loads the first version of a module it 
    -finds, not the newest, you might accidentally get one of these older
    -versions even after installing a brand new version.  To delete I (not simply older ones) set the
    -C variable.
    -
    -    make install UNINST=1
    -
    -
    -=head2 PREFIX and LIB attribute
    -
    -PREFIX and LIB can be used to set several INSTALL* attributes in one
    -go. The quickest way to install a module in a non-standard place might
    -be
    -
    -    perl Makefile.PL PREFIX=~
    -
    -This will install all files in the module under your home directory,
    -with man pages and libraries going into an appropriate place (usually
    -~/man and ~/lib).
    -
    -Another way to specify many INSTALL directories with a single
    -parameter is LIB.
    -
    -    perl Makefile.PL LIB=~/lib
    -
    -This will install the module's architecture-independent files into
    -~/lib, the architecture-dependent files into ~/lib/$archname.
    -
    -Note, that in both cases the tilde expansion is done by MakeMaker, not
    -by perl by default, nor by make.
    -
    -Conflicts between parameters LIB, PREFIX and the various INSTALL*
    -arguments are resolved so that:
    -
    -=over 4
    -
    -=item *
    -
    -setting LIB overrides any setting of INSTALLPRIVLIB, INSTALLARCHLIB,
    -INSTALLSITELIB, INSTALLSITEARCH (and they are not affected by PREFIX);
    -
    -=item *
    -
    -without LIB, setting PREFIX replaces the initial C<$Config{prefix}>
    -part of those INSTALL* arguments, even if the latter are explicitly
    -set (but are set to still start with C<$Config{prefix}>).
    -
    -=back
    -
    -If the user has superuser privileges, and is not working on AFS or
    -relatives, then the defaults for INSTALLPRIVLIB, INSTALLARCHLIB,
    -INSTALLSCRIPT, etc. will be appropriate, and this incantation will be
    -the best:
    -
    -    perl Makefile.PL; 
    -    make; 
    -    make test
    -    make install
    -
    -make install per default writes some documentation of what has been
    -done into the file C<$(INSTALLARCHLIB)/perllocal.pod>. This feature
    -can be bypassed by calling make pure_install.
    -
    -=head2 AFS users
    -
    -will have to specify the installation directories as these most
    -probably have changed since perl itself has been installed. They will
    -have to do this by calling
    -
    -    perl Makefile.PL INSTALLSITELIB=/afs/here/today \
    -        INSTALLSCRIPT=/afs/there/now INSTALLMAN3DIR=/afs/for/manpages
    -    make
    -
    -Be careful to repeat this procedure every time you recompile an
    -extension, unless you are sure the AFS installation directories are
    -still valid.
    -
    -=head2 Static Linking of a new Perl Binary
    -
    -An extension that is built with the above steps is ready to use on
    -systems supporting dynamic loading. On systems that do not support
    -dynamic loading, any newly created extension has to be linked together
    -with the available resources. MakeMaker supports the linking process
    -by creating appropriate targets in the Makefile whenever an extension
    -is built. You can invoke the corresponding section of the makefile with
    -
    -    make perl
    -
    -That produces a new perl binary in the current directory with all
    -extensions linked in that can be found in INST_ARCHLIB, SITELIBEXP,
    -and PERL_ARCHLIB. To do that, MakeMaker writes a new Makefile, on
    -UNIX, this is called Makefile.aperl (may be system dependent). If you
    -want to force the creation of a new perl, it is recommended, that you
    -delete this Makefile.aperl, so the directories are searched-through
    -for linkable libraries again.
    -
    -The binary can be installed into the directory where perl normally
    -resides on your machine with
    -
    -    make inst_perl
    -
    -To produce a perl binary with a different name than C, either say
    -
    -    perl Makefile.PL MAP_TARGET=myperl
    -    make myperl
    -    make inst_perl
    -
    -or say
    -
    -    perl Makefile.PL
    -    make myperl MAP_TARGET=myperl
    -    make inst_perl MAP_TARGET=myperl
    -
    -In any case you will be prompted with the correct invocation of the
    -C target that installs the new binary into INSTALLBIN.
    -
    -make inst_perl per default writes some documentation of what has been
    -done into the file C<$(INSTALLARCHLIB)/perllocal.pod>. This
    -can be bypassed by calling make pure_inst_perl.
    -
    -Warning: the inst_perl: target will most probably overwrite your
    -existing perl binary. Use with care!
    -
    -Sometimes you might want to build a statically linked perl although
    -your system supports dynamic loading. In this case you may explicitly
    -set the linktype with the invocation of the Makefile.PL or make:
    -
    -    perl Makefile.PL LINKTYPE=static    # recommended
    -
    -or
    -
    -    make LINKTYPE=static                # works on most systems
    -
    -=head2 Determination of Perl Library and Installation Locations
    -
    -MakeMaker needs to know, or to guess, where certain things are
    -located.  Especially INST_LIB and INST_ARCHLIB (where to put the files
    -during the make(1) run), PERL_LIB and PERL_ARCHLIB (where to read
    -existing modules from), and PERL_INC (header files and C).
    -
    -Extensions may be built either using the contents of the perl source
    -directory tree or from the installed perl library. The recommended way
    -is to build extensions after you have run 'make install' on perl
    -itself. You can do that in any directory on your hard disk that is not
    -below the perl source tree. The support for extensions below the ext
    -directory of the perl distribution is only good for the standard
    -extensions that come with perl.
    -
    -If an extension is being built below the C directory of the perl
    -source then MakeMaker will set PERL_SRC automatically (e.g.,
    -C<../..>).  If PERL_SRC is defined and the extension is recognized as
    -a standard extension, then other variables default to the following:
    -
    -  PERL_INC     = PERL_SRC
    -  PERL_LIB     = PERL_SRC/lib
    -  PERL_ARCHLIB = PERL_SRC/lib
    -  INST_LIB     = PERL_LIB
    -  INST_ARCHLIB = PERL_ARCHLIB
    -
    -If an extension is being built away from the perl source then MakeMaker
    -will leave PERL_SRC undefined and default to using the installed copy
    -of the perl library. The other variables default to the following:
    -
    -  PERL_INC     = $archlibexp/CORE
    -  PERL_LIB     = $privlibexp
    -  PERL_ARCHLIB = $archlibexp
    -  INST_LIB     = ./blib/lib
    -  INST_ARCHLIB = ./blib/arch
    -
    -If perl has not yet been installed then PERL_SRC can be defined on the
    -command line as shown in the previous section.
    -
    -
    -=head2 Which architecture dependent directory?
    -
    -If you don't want to keep the defaults for the INSTALL* macros,
    -MakeMaker helps you to minimize the typing needed: the usual
    -relationship between INSTALLPRIVLIB and INSTALLARCHLIB is determined
    -by Configure at perl compilation time. MakeMaker supports the user who
    -sets INSTALLPRIVLIB. If INSTALLPRIVLIB is set, but INSTALLARCHLIB not,
    -then MakeMaker defaults the latter to be the same subdirectory of
    -INSTALLPRIVLIB as Configure decided for the counterparts in %Config ,
    -otherwise it defaults to INSTALLPRIVLIB. The same relationship holds
    -for INSTALLSITELIB and INSTALLSITEARCH.
    -
    -MakeMaker gives you much more freedom than needed to configure
    -internal variables and get different results. It is worth to mention,
    -that make(1) also lets you configure most of the variables that are
    -used in the Makefile. But in the majority of situations this will not
    -be necessary, and should only be done if the author of a package
    -recommends it (or you know what you're doing).
    -
    -=head2 Using Attributes and Parameters
    -
    -The following attributes may be specified as arguments to WriteMakefile()
    -or as NAME=VALUE pairs on the command line.
    -
    -=over 2
    -
    -=item ABSTRACT
    -
    -One line description of the module. Will be included in PPD file.
    -
    -=item ABSTRACT_FROM
    -
    -Name of the file that contains the package description. MakeMaker looks
    -for a line in the POD matching /^($package\s-\s)(.*)/. This is typically
    -the first line in the "=head1 NAME" section. $2 becomes the abstract.
    -
    -=item AUTHOR
    -
    -String containing name (and email address) of package author(s). Is used
    -in PPD (Perl Package Description) files for PPM (Perl Package Manager).
    -
    -=item BINARY_LOCATION
    -
    -Used when creating PPD files for binary packages.  It can be set to a
    -full or relative path or URL to the binary archive for a particular
    -architecture.  For example:
    -
    -        perl Makefile.PL BINARY_LOCATION=x86/Agent.tar.gz
    -
    -builds a PPD package that references a binary of the C package,
    -located in the C directory relative to the PPD itself.
    -
    -=item C
    -
    -Ref to array of *.c file names. Initialised from a directory scan
    -and the values portion of the XS attribute hash. This is not
    -currently used by MakeMaker but may be handy in Makefile.PLs.
    -
    -=item CCFLAGS
    -
    -String that will be included in the compiler call command line between
    -the arguments INC and OPTIMIZE.
    -
    -=item CONFIG
    -
    -Arrayref. E.g. [qw(archname manext)] defines ARCHNAME & MANEXT from
    -config.sh. MakeMaker will add to CONFIG the following values anyway:
    -ar
    -cc
    -cccdlflags
    -ccdlflags
    -dlext
    -dlsrc
    -ld
    -lddlflags
    -ldflags
    -libc
    -lib_ext
    -obj_ext
    -ranlib
    -sitelibexp
    -sitearchexp
    -so
    -
    -=item CONFIGURE
    -
    -CODE reference. The subroutine should return a hash reference. The
    -hash may contain further attributes, e.g. {LIBS =E ...}, that have to
    -be determined by some evaluation method.
    -
    -=item DEFINE
    -
    -Something like C<"-DHAVE_UNISTD_H">
    -
    -=item DESTDIR
    -
    -This is the root directory into which the code will be installed.  It
    -I.  For example, if your code
    -would normally go into F you could set DESTDIR=~/tmp/
    -and installation would go into F<~/tmp/usr/local/lib/perl>.
    -
    -This is primarily of use for people who repackage Perl modules.
    -
    -NOTE: Due to the nature of make, it is important that you put the trailing
    -slash on your DESTDIR.  F<~/tmp/> not F<~/tmp>.
    -
    -=item DIR
    -
    -Ref to array of subdirectories containing Makefile.PLs e.g. [ 'sdbm'
    -] in ext/SDBM_File
    -
    -=item DISTNAME
    -
    -A safe filename for the package. 
    -
    -Defaults to NAME above but with :: replaced with -.
    -
    -For example, Foo::Bar becomes Foo-Bar.
    -
    -=item DISTVNAME
    -
    -Your name for distributing the package with the version number
    -included.  This is used by 'make dist' to name the resulting archive
    -file.
    -
    -Defaults to DISTNAME-VERSION.
    -
    -For example, version 1.04 of Foo::Bar becomes Foo-Bar-1.04.
    -
    -On some OS's where . has special meaning VERSION_SYM may be used in
    -place of VERSION.
    -
    -=item DL_FUNCS
    -
    -Hashref of symbol names for routines to be made available as universal
    -symbols.  Each key/value pair consists of the package name and an
    -array of routine names in that package.  Used only under AIX, OS/2,
    -VMS and Win32 at present.  The routine names supplied will be expanded
    -in the same way as XSUB names are expanded by the XS() macro.
    -Defaults to
    -
    -  {"$(NAME)" => ["boot_$(NAME)" ] }
    -
    -e.g.
    -
    -  {"RPC" => [qw( boot_rpcb rpcb_gettime getnetconfigent )],
    -   "NetconfigPtr" => [ 'DESTROY'] }
    -
    -Please see the L documentation for more information
    -about the DL_FUNCS, DL_VARS and FUNCLIST attributes.
    -
    -=item DL_VARS
    -
    -Array of symbol names for variables to be made available as universal symbols.
    -Used only under AIX, OS/2, VMS and Win32 at present.  Defaults to [].
    -(e.g. [ qw(Foo_version Foo_numstreams Foo_tree ) ])
    -
    -=item EXCLUDE_EXT
    -
    -Array of extension names to exclude when doing a static build.  This
    -is ignored if INCLUDE_EXT is present.  Consult INCLUDE_EXT for more
    -details.  (e.g.  [ qw( Socket POSIX ) ] )
    -
    -This attribute may be most useful when specified as a string on the
    -command line:  perl Makefile.PL EXCLUDE_EXT='Socket Safe'
    -
    -=item EXE_FILES
    -
    -Ref to array of executable files. The files will be copied to the
    -INST_SCRIPT directory. Make realclean will delete them from there
    -again.
    -
    -If your executables start with something like #!perl or
    -#!/usr/bin/perl MakeMaker will change this to the path of the perl
    -'Makefile.PL' was invoked with so the programs will be sure to run
    -properly even if perl is not in /usr/bin/perl.
    -
    -=item FIRST_MAKEFILE
    -
    -The name of the Makefile to be produced.  This is used for the second
    -Makefile that will be produced for the MAP_TARGET.
    -
    -Defaults to 'Makefile' or 'Descrip.MMS' on VMS.
    -
    -(Note: we couldn't use MAKEFILE because dmake uses this for something
    -else).
    -
    -=item FULLPERL
    -
    -Perl binary able to run this extension, load XS modules, etc...
    -
    -=item FULLPERLRUN
    -
    -Like PERLRUN, except it uses FULLPERL.
    -
    -=item FULLPERLRUNINST
    -
    -Like PERLRUNINST, except it uses FULLPERL.
    -
    -=item FUNCLIST
    -
    -This provides an alternate means to specify function names to be
    -exported from the extension.  Its value is a reference to an
    -array of function names to be exported by the extension.  These
    -names are passed through unaltered to the linker options file.
    -
    -=item H
    -
    -Ref to array of *.h file names. Similar to C.
    -
    -=item IMPORTS
    -
    -This attribute is used to specify names to be imported into the
    -extension. Takes a hash ref.
    -
    -It is only used on OS/2 and Win32.
    -
    -=item INC
    -
    -Include file dirs eg: C<"-I/usr/5include -I/path/to/inc">
    -
    -=item INCLUDE_EXT
    -
    -Array of extension names to be included when doing a static build.
    -MakeMaker will normally build with all of the installed extensions when
    -doing a static build, and that is usually the desired behavior.  If
    -INCLUDE_EXT is present then MakeMaker will build only with those extensions
    -which are explicitly mentioned. (e.g.  [ qw( Socket POSIX ) ])
    -
    -It is not necessary to mention DynaLoader or the current extension when
    -filling in INCLUDE_EXT.  If the INCLUDE_EXT is mentioned but is empty then
    -only DynaLoader and the current extension will be included in the build.
    -
    -This attribute may be most useful when specified as a string on the
    -command line:  perl Makefile.PL INCLUDE_EXT='POSIX Socket Devel::Peek'
    -
    -=item INSTALLARCHLIB
    -
    -Used by 'make install', which copies files from INST_ARCHLIB to this
    -directory if INSTALLDIRS is set to perl.
    -
    -=item INSTALLBIN
    -
    -Directory to install binary files (e.g. tkperl) into if
    -INSTALLDIRS=perl.
    -
    -=item INSTALLDIRS
    -
    -Determines which of the sets of installation directories to choose:
    -perl, site or vendor.  Defaults to site.
    -
    -=item INSTALLMAN1DIR
    -
    -=item INSTALLMAN3DIR
    -
    -These directories get the man pages at 'make install' time if
    -INSTALLDIRS=perl.  Defaults to $Config{installman*dir}.
    -
    -If set to 'none', no man pages will be installed.
    -
    -=item INSTALLPRIVLIB
    -
    -Used by 'make install', which copies files from INST_LIB to this
    -directory if INSTALLDIRS is set to perl.
    -
    -Defaults to $Config{installprivlib}.
    -
    -=item INSTALLSCRIPT
    -
    -Used by 'make install' which copies files from INST_SCRIPT to this
    -directory.
    -
    -=item INSTALLSITEARCH
    -
    -Used by 'make install', which copies files from INST_ARCHLIB to this
    -directory if INSTALLDIRS is set to site (default).
    -
    -=item INSTALLSITEBIN
    -
    -Used by 'make install', which copies files from INST_BIN to this
    -directory if INSTALLDIRS is set to site (default).
    -
    -=item INSTALLSITELIB
    -
    -Used by 'make install', which copies files from INST_LIB to this
    -directory if INSTALLDIRS is set to site (default).
    -
    -=item INSTALLSITEMAN1DIR
    -
    -=item INSTALLSITEMAN3DIR
    -
    -These directories get the man pages at 'make install' time if
    -INSTALLDIRS=site (default).  Defaults to 
    -$(SITEPREFIX)/man/man$(MAN*EXT).
    -
    -If set to 'none', no man pages will be installed.
    -
    -=item INSTALLVENDORARCH
    -
    -Used by 'make install', which copies files from INST_ARCHLIB to this
    -directory if INSTALLDIRS is set to vendor.
    -
    -=item INSTALLVENDORBIN
    -
    -Used by 'make install', which copies files from INST_BIN to this
    -directory if INSTALLDIRS is set to vendor.
    -
    -=item INSTALLVENDORLIB
    -
    -Used by 'make install', which copies files from INST_LIB to this
    -directory if INSTALLDIRS is set to vendor.
    -
    -=item INSTALLVENDORMAN1DIR
    -
    -=item INSTALLVENDORMAN3DIR
    -
    -These directories get the man pages at 'make install' time if
    -INSTALLDIRS=vendor.  Defaults to $(VENDORPREFIX)/man/man$(MAN*EXT).
    -
    -If set to 'none', no man pages will be installed.
    -
    -=item INST_ARCHLIB
    -
    -Same as INST_LIB for architecture dependent files.
    -
    -=item INST_BIN
    -
    -Directory to put real binary files during 'make'. These will be copied
    -to INSTALLBIN during 'make install'
    -
    -=item INST_LIB
    -
    -Directory where we put library files of this extension while building
    -it.
    -
    -=item INST_MAN1DIR
    -
    -Directory to hold the man pages at 'make' time
    -
    -=item INST_MAN3DIR
    -
    -Directory to hold the man pages at 'make' time
    -
    -=item INST_SCRIPT
    -
    -Directory, where executable files should be installed during
    -'make'. Defaults to "./blib/script", just to have a dummy location during
    -testing. make install will copy the files in INST_SCRIPT to
    -INSTALLSCRIPT.
    -
    -=item LD
    -
    -Program to be used to link libraries for dynamic loading.
    -
    -Defaults to $Config{ld}.
    -
    -=item LDDLFLAGS
    -
    -Any special flags that might need to be passed to ld to create a
    -shared library suitable for dynamic loading.  It is up to the makefile
    -to use it.  (See L)
    -
    -Defaults to $Config{lddlflags}.
    -
    -=item LDFROM
    -
    -Defaults to "$(OBJECT)" and is used in the ld command to specify
    -what files to link/load from (also see dynamic_lib below for how to
    -specify ld flags)
    -
    -=item LIB
    -
    -LIB should only be set at C time but is allowed as a
    -MakeMaker argument. It has the effect of setting both INSTALLPRIVLIB
    -and INSTALLSITELIB to that value regardless any explicit setting of
    -those arguments (or of PREFIX).  INSTALLARCHLIB and INSTALLSITEARCH
    -are set to the corresponding architecture subdirectory.
    -
    -=item LIBPERL_A
    -
    -The filename of the perllibrary that will be used together with this
    -extension. Defaults to libperl.a.
    -
    -=item LIBS
    -
    -An anonymous array of alternative library
    -specifications to be searched for (in order) until
    -at least one library is found. E.g.
    -
    -  'LIBS' => ["-lgdbm", "-ldbm -lfoo", "-L/path -ldbm.nfs"]
    -
    -Mind, that any element of the array
    -contains a complete set of arguments for the ld
    -command. So do not specify
    -
    -  'LIBS' => ["-ltcl", "-ltk", "-lX11"]
    -
    -See ODBM_File/Makefile.PL for an example, where an array is needed. If
    -you specify a scalar as in
    -
    -  'LIBS' => "-ltcl -ltk -lX11"
    -
    -MakeMaker will turn it into an array with one element.
    -
    -=item LINKTYPE
    -
    -'static' or 'dynamic' (default unless usedl=undef in
    -config.sh). Should only be used to force static linking (also see
    -linkext below).
    -
    -=item MAKEAPERL
    -
    -Boolean which tells MakeMaker, that it should include the rules to
    -make a perl. This is handled automatically as a switch by
    -MakeMaker. The user normally does not need it.
    -
    -=item MAKEFILE_OLD
    -
    -When 'make clean' or similar is run, the $(FIRST_MAKEFILE) will be
    -backed up at this location.
    -
    -Defaults to $(FIRST_MAKEFILE).old or $(FIRST_MAKEFILE)_old on VMS.
    -
    -=item MAN1PODS
    -
    -Hashref of pod-containing files. MakeMaker will default this to all
    -EXE_FILES files that include POD directives. The files listed
    -here will be converted to man pages and installed as was requested
    -at Configure time.
    -
    -=item MAN3PODS
    -
    -Hashref that assigns to *.pm and *.pod files the files into which the
    -manpages are to be written. MakeMaker parses all *.pod and *.pm files
    -for POD directives. Files that contain POD will be the default keys of
    -the MAN3PODS hashref. These will then be converted to man pages during
    -C and will be installed during C.
    -
    -=item MAP_TARGET
    -
    -If it is intended, that a new perl binary be produced, this variable
    -may hold a name for that binary. Defaults to perl
    -
    -=item MYEXTLIB
    -
    -If the extension links to a library that it builds set this to the
    -name of the library (see SDBM_File)
    -
    -=item NAME
    -
    -Perl module name for this extension (DBD::Oracle). This will default
    -to the directory name but should be explicitly defined in the
    -Makefile.PL.
    -
    -=item NEEDS_LINKING
    -
    -MakeMaker will figure out if an extension contains linkable code
    -anywhere down the directory tree, and will set this variable
    -accordingly, but you can speed it up a very little bit if you define
    -this boolean variable yourself.
    -
    -=item NOECHO
    -
    -Command so make does not print the literal commands its running.
    -
    -By setting it to an empty string you can generate a Makefile that
    -prints all commands. Mainly used in debugging MakeMaker itself.
    -
    -Defaults to C<@>.
    -
    -=item NORECURS
    -
    -Boolean.  Attribute to inhibit descending into subdirectories.
    -
    -=item NO_META
    -
    -When true, suppresses the generation and addition to the MANIFEST of
    -the META.yml module meta-data file during 'make distdir'.
    -
    -Defaults to false.
    -
    -=item NO_VC
    -
    -In general, any generated Makefile checks for the current version of
    -MakeMaker and the version the Makefile was built under. If NO_VC is
    -set, the version check is neglected. Do not write this into your
    -Makefile.PL, use it interactively instead.
    -
    -=item OBJECT
    -
    -List of object files, defaults to '$(BASEEXT)$(OBJ_EXT)', but can be a long
    -string containing all object files, e.g. "tkpBind.o
    -tkpButton.o tkpCanvas.o"
    -
    -(Where BASEEXT is the last component of NAME, and OBJ_EXT is $Config{obj_ext}.)
    -
    -=item OPTIMIZE
    -
    -Defaults to C<-O>. Set it to C<-g> to turn debugging on. The flag is
    -passed to subdirectory makes.
    -
    -=item PERL
    -
    -Perl binary for tasks that can be done by miniperl
    -
    -=item PERL_CORE
    -
    -Set only when MakeMaker is building the extensions of the Perl core
    -distribution.
    -
    -=item PERLMAINCC
    -
    -The call to the program that is able to compile perlmain.c. Defaults
    -to $(CC).
    -
    -=item PERL_ARCHLIB
    -
    -Same as for PERL_LIB, but for architecture dependent files.
    -
    -Used only when MakeMaker is building the extensions of the Perl core
    -distribution (because normally $(PERL_ARCHLIB) is automatically in @INC,
    -and adding it would get in the way of PERL5LIB).
    -
    -=item PERL_LIB
    -
    -Directory containing the Perl library to use.
    -
    -Used only when MakeMaker is building the extensions of the Perl core
    -distribution (because normally $(PERL_LIB) is automatically in @INC,
    -and adding it would get in the way of PERL5LIB).
    -
    -=item PERL_MALLOC_OK
    -
    -defaults to 0.  Should be set to TRUE if the extension can work with
    -the memory allocation routines substituted by the Perl malloc() subsystem.
    -This should be applicable to most extensions with exceptions of those
    -
    -=over 4
    -
    -=item *
    -
    -with bugs in memory allocations which are caught by Perl's malloc();
    -
    -=item *
    -
    -which interact with the memory allocator in other ways than via
    -malloc(), realloc(), free(), calloc(), sbrk() and brk();
    -
    -=item *
    -
    -which rely on special alignment which is not provided by Perl's malloc().
    -
    -=back
    -
    -B  Negligence to set this flag in I of loaded extension
    -nullifies many advantages of Perl's malloc(), such as better usage of
    -system resources, error detection, memory usage reporting, catchable failure
    -of memory allocations, etc.
    -
    -=item PERLPREFIX
    -
    -Directory under which core modules are to be installed.
    -
    -Defaults to $Config{installprefixexp} falling back to
    -$Config{installprefix}, $Config{prefixexp} or $Config{prefix} should
    -$Config{installprefixexp} not exist.
    -
    -Overridden by PREFIX.
    -
    -=item PERLRUN
    -
    -Use this instead of $(PERL) when you wish to run perl.  It will set up
    -extra necessary flags for you.
    -
    -=item PERLRUNINST
    -
    -Use this instead of $(PERL) when you wish to run perl to work with
    -modules.  It will add things like -I$(INST_ARCH) and other necessary
    -flags so perl can see the modules you're about to install.
    -
    -=item PERL_SRC
    -
    -Directory containing the Perl source code (use of this should be
    -avoided, it may be undefined)
    -
    -=item PERM_RW
    -
    -Desired permission for read/writable files. Defaults to C<644>.
    -See also L.
    -
    -=item PERM_RWX
    -
    -Desired permission for executable files. Defaults to C<755>.
    -See also L.
    -
    -=item PL_FILES
    -
    -MakeMaker can run programs to generate files for you at build time.
    -By default any file named *.PL (except Makefile.PL and Build.PL) in
    -the top level directory will be assumed to be a Perl program and run
    -passing its own basename in as an argument.  For example...
    -
    -    perl foo.PL foo
    -
    -This behavior can be overridden by supplying your own set of files to
    -search.  PL_FILES accepts a hash ref, the key being the file to run
    -and the value is passed in as the first argument when the PL file is run.
    -
    -    PL_FILES => {'bin/foobar.PL' => 'bin/foobar'}
    -
    -Would run bin/foobar.PL like this:
    -
    -    perl bin/foobar.PL bin/foobar
    -
    -If multiple files from one program are desired an array ref can be used.
    -
    -    PL_FILES => {'bin/foobar.PL' => [qw(bin/foobar1 bin/foobar2)]}
    -
    -In this case the program will be run multiple times using each target file.
    -
    -    perl bin/foobar.PL bin/foobar1
    -    perl bin/foobar.PL bin/foobar2
    -
    -PL files are normally run B pm_to_blib and include INST_LIB and
    -INST_ARCH in its C<@INC> so the just built modules can be
    -accessed... unless the PL file is making a module (or anything else in
    -PM) in which case it is run B pm_to_blib and does not include
    -INST_LIB and INST_ARCH in its C<@INC>.  This apparently odd behavior
    -is there for backwards compatibility (and its somewhat DWIM).
    -
    -
    -=item PM
    -
    -Hashref of .pm files and *.pl files to be installed.  e.g.
    -
    -  {'name_of_file.pm' => '$(INST_LIBDIR)/install_as.pm'}
    -
    -By default this will include *.pm and *.pl and the files found in
    -the PMLIBDIRS directories.  Defining PM in the
    -Makefile.PL will override PMLIBDIRS.
    -
    -=item PMLIBDIRS
    -
    -Ref to array of subdirectories containing library files.  Defaults to
    -[ 'lib', $(BASEEXT) ]. The directories will be scanned and I files
    -they contain will be installed in the corresponding location in the
    -library.  A libscan() method can be used to alter the behaviour.
    -Defining PM in the Makefile.PL will override PMLIBDIRS.
    -
    -(Where BASEEXT is the last component of NAME.)
    -
    -=item PM_FILTER
    -
    -A filter program, in the traditional Unix sense (input from stdin, output
    -to stdout) that is passed on each .pm file during the build (in the
    -pm_to_blib() phase).  It is empty by default, meaning no filtering is done.
    -
    -Great care is necessary when defining the command if quoting needs to be
    -done.  For instance, you would need to say:
    -
    -  {'PM_FILTER' => 'grep -v \\"^\\#\\"'}
    -
    -to remove all the leading coments on the fly during the build.  The
    -extra \\ are necessary, unfortunately, because this variable is interpolated
    -within the context of a Perl program built on the command line, and double
    -quotes are what is used with the -e switch to build that command line.  The
    -# is escaped for the Makefile, since what is going to be generated will then
    -be:
    -
    -  PM_FILTER = grep -v \"^\#\"
    -
    -Without the \\ before the #, we'd have the start of a Makefile comment,
    -and the macro would be incorrectly defined.
    -
    -=item POLLUTE
    -
    -Release 5.005 grandfathered old global symbol names by providing preprocessor
    -macros for extension source compatibility.  As of release 5.6, these
    -preprocessor definitions are not available by default.  The POLLUTE flag
    -specifies that the old names should still be defined:
    -
    -  perl Makefile.PL POLLUTE=1
    -
    -Please inform the module author if this is necessary to successfully install
    -a module under 5.6 or later.
    -
    -=item PPM_INSTALL_EXEC
    -
    -Name of the executable used to run C below. (e.g. perl)
    -
    -=item PPM_INSTALL_SCRIPT
    -
    -Name of the script that gets executed by the Perl Package Manager after
    -the installation of a package.
    -
    -=item PREFIX
    -
    -This overrides all the default install locations.  Man pages,
    -libraries, scripts, etc...  MakeMaker will try to make an educated
    -guess about where to place things under the new PREFIX based on your
    -Config defaults.  Failing that, it will fall back to a structure
    -which should be sensible for your platform.
    -
    -If you specify LIB or any INSTALL* variables they will not be effected
    -by the PREFIX.
    -
    -=item PREREQ_FATAL
    -
    -Bool. If this parameter is true, failing to have the required modules
    -(or the right versions thereof) will be fatal. perl Makefile.PL will die
    -with the proper message.
    -
    -Note: see L for a shortcut for stopping tests early if
    -you are missing dependencies.
    -
    -Do I use this parameter for simple requirements, which could be resolved
    -at a later time, e.g. after an unsuccessful B of your module.
    -
    -It is I rare to have to use C at all!
    -
    -=item PREREQ_PM
    -
    -Hashref: Names of modules that need to be available to run this
    -extension (e.g. Fcntl for SDBM_File) are the keys of the hash and the
    -desired version is the value. If the required version number is 0, we
    -only check if any version is installed already.
    -
    -=item PREREQ_PRINT
    -
    -Bool.  If this parameter is true, the prerequisites will be printed to
    -stdout and MakeMaker will exit.  The output format is an evalable hash
    -ref.
    -
    -$PREREQ_PM = {
    -               'A::B' => Vers1,
    -               'C::D' => Vers2,
    -               ...
    -             };
    -
    -=item PRINT_PREREQ
    -
    -RedHatism for C.  The output format is different, though:
    -
    -    perl(A::B)>=Vers1 perl(C::D)>=Vers2 ...
    -
    -=item SITEPREFIX
    -
    -Like PERLPREFIX, but only for the site install locations.
    -
    -Defaults to $Config{siteprefixexp}.  Perls prior to 5.6.0 didn't have
    -an explicit siteprefix in the Config.  In those cases
    -$Config{installprefix} will be used.
    -
    -Overridable by PREFIX
    -
    -=item SIGN
    -
    -When true, perform the generation and addition to the MANIFEST of the
    -SIGNATURE file in the distdir during 'make distdir', via 'cpansign
    --s'.
    -
    -Note that you need to install the Module::Signature module to
    -perform this operation.
    -
    -Defaults to false.
    -
    -=item SKIP
    -
    -Arrayref. E.g. [qw(name1 name2)] skip (do not write) sections of the
    -Makefile. Caution! Do not use the SKIP attribute for the negligible
    -speedup. It may seriously damage the resulting Makefile. Only use it
    -if you really need it.
    -
    -=item TYPEMAPS
    -
    -Ref to array of typemap file names.  Use this when the typemaps are
    -in some directory other than the current directory or when they are
    -not named B.  The last typemap in the list takes
    -precedence.  A typemap in the current directory has highest
    -precedence, even if it isn't listed in TYPEMAPS.  The default system
    -typemap has lowest precedence.
    -
    -=item VENDORPREFIX
    -
    -Like PERLPREFIX, but only for the vendor install locations.
    -
    -Defaults to $Config{vendorprefixexp}.
    -
    -Overridable by PREFIX
    -
    -=item VERBINST
    -
    -If true, make install will be verbose
    -
    -=item VERSION
    -
    -Your version number for distributing the package.  This defaults to
    -0.1.
    -
    -=item VERSION_FROM
    -
    -Instead of specifying the VERSION in the Makefile.PL you can let
    -MakeMaker parse a file to determine the version number. The parsing
    -routine requires that the file named by VERSION_FROM contains one
    -single line to compute the version number. The first line in the file
    -that contains the regular expression
    -
    -    /([\$*])(([\w\:\']*)\bVERSION)\b.*\=/
    -
    -will be evaluated with eval() and the value of the named variable
    -B the eval() will be assigned to the VERSION attribute of the
    -MakeMaker object. The following lines will be parsed o.k.:
    -
    -    $VERSION = '1.00';
    -    *VERSION = \'1.01';
    -    $VERSION = sprintf "%d.%03d", q$Revision: 4535 $ =~ /(\d+)/g;
    -    $FOO::VERSION = '1.10';
    -    *FOO::VERSION = \'1.11';
    -    our $VERSION = 1.2.3;       # new for perl5.6.0 
    -
    -but these will fail:
    -
    -    my $VERSION = '1.01';
    -    local $VERSION = '1.02';
    -    local $FOO::VERSION = '1.30';
    -
    -(Putting C or C on the preceding line will work o.k.)
    -
    -The file named in VERSION_FROM is not added as a dependency to
    -Makefile. This is not really correct, but it would be a major pain
    -during development to have to rewrite the Makefile for any smallish
    -change in that file. If you want to make sure that the Makefile
    -contains the correct VERSION macro after any change of the file, you
    -would have to do something like
    -
    -    depend => { Makefile => '$(VERSION_FROM)' }
    -
    -See attribute C below.
    -
    -=item VERSION_SYM
    -
    -A sanitized VERSION with . replaced by _.  For places where . has
    -special meaning (some filesystems, RCS labels, etc...)
    -
    -=item XS
    -
    -Hashref of .xs files. MakeMaker will default this.  e.g.
    -
    -  {'name_of_file.xs' => 'name_of_file.c'}
    -
    -The .c files will automatically be included in the list of files
    -deleted by a make clean.
    -
    -=item XSOPT
    -
    -String of options to pass to xsubpp.  This might include C<-C++> or
    -C<-extern>.  Do not include typemaps here; the TYPEMAP parameter exists for
    -that purpose.
    -
    -=item XSPROTOARG
    -
    -May be set to an empty string, which is identical to C<-prototypes>, or
    -C<-noprototypes>. See the xsubpp documentation for details. MakeMaker
    -defaults to the empty string.
    -
    -=item XS_VERSION
    -
    -Your version number for the .xs file of this package.  This defaults
    -to the value of the VERSION attribute.
    -
    -=back
    -
    -=head2 Additional lowercase attributes
    -
    -can be used to pass parameters to the methods which implement that
    -part of the Makefile.  Parameters are specified as a hash ref but are
    -passed to the method as a hash.
    -
    -=over 2
    -
    -=item clean
    -
    -  {FILES => "*.xyz foo"}
    -
    -=item depend
    -
    -  {ANY_TARGET => ANY_DEPENDECY, ...}
    -
    -(ANY_TARGET must not be given a double-colon rule by MakeMaker.)
    -
    -=item dist
    -
    -  {TARFLAGS => 'cvfF', COMPRESS => 'gzip', SUFFIX => '.gz',
    -  SHAR => 'shar -m', DIST_CP => 'ln', ZIP => '/bin/zip',
    -  ZIPFLAGS => '-rl', DIST_DEFAULT => 'private tardist' }
    -
    -If you specify COMPRESS, then SUFFIX should also be altered, as it is
    -needed to tell make the target file of the compression. Setting
    -DIST_CP to ln can be useful, if you need to preserve the timestamps on
    -your files. DIST_CP can take the values 'cp', which copies the file,
    -'ln', which links the file, and 'best' which copies symbolic links and
    -links the rest. Default is 'best'.
    -
    -=item dynamic_lib
    -
    -  {ARMAYBE => 'ar', OTHERLDFLAGS => '...', INST_DYNAMIC_DEP => '...'}
    -
    -=item linkext
    -
    -  {LINKTYPE => 'static', 'dynamic' or ''}
    -
    -NB: Extensions that have nothing but *.pm files had to say
    -
    -  {LINKTYPE => ''}
    -
    -with Pre-5.0 MakeMakers. Since version 5.00 of MakeMaker such a line
    -can be deleted safely. MakeMaker recognizes when there's nothing to
    -be linked.
    -
    -=item macro
    -
    -  {ANY_MACRO => ANY_VALUE, ...}
    -
    -=item postamble
    -
    -Anything put here will be passed to MY::postamble() if you have one.
    -
    -=item realclean
    -
    -  {FILES => '$(INST_ARCHAUTODIR)/*.xyz'}
    -
    -=item test
    -
    -  {TESTS => 't/*.t'}
    -
    -=item tool_autosplit
    -
    -  {MAXLEN => 8}
    -
    -=back
    -
    -=head2 Overriding MakeMaker Methods
    -
    -If you cannot achieve the desired Makefile behaviour by specifying
    -attributes you may define private subroutines in the Makefile.PL.
    -Each subroutine returns the text it wishes to have written to
    -the Makefile. To override a section of the Makefile you can
    -either say:
    -
    -        sub MY::c_o { "new literal text" }
    -
    -or you can edit the default by saying something like:
    -
    -        package MY; # so that "SUPER" works right
    -        sub c_o {
    -            my $inherited = shift->SUPER::c_o(@_);
    -            $inherited =~ s/old text/new text/;
    -            $inherited;
    -        }
    -
    -If you are running experiments with embedding perl as a library into
    -other applications, you might find MakeMaker is not sufficient. You'd
    -better have a look at ExtUtils::Embed which is a collection of utilities
    -for embedding.
    -
    -If you still need a different solution, try to develop another
    -subroutine that fits your needs and submit the diffs to
    -C
    -
    -For a complete description of all MakeMaker methods see
    -L.
    -
    -Here is a simple example of how to add a new target to the generated
    -Makefile:
    -
    -    sub MY::postamble {
    -        return <<'MAKE_FRAG';
    -    $(MYEXTLIB): sdbm/Makefile
    -            cd sdbm && $(MAKE) all
    -
    -    MAKE_FRAG
    -    }
    -
    -=head2 The End Of Cargo Cult Programming
    -
    -WriteMakefile() now does some basic sanity checks on its parameters to
    -protect against typos and malformatted values.  This means some things
    -which happened to work in the past will now throw warnings and
    -possibly produce internal errors.
    -
    -Some of the most common mistakes:
    -
    -=over 2
    -
    -=item C<< MAN3PODS => ' ' >>
    -
    -This is commonly used to supress the creation of man pages.  MAN3PODS
    -takes a hash ref not a string, but the above worked by accident in old
    -versions of MakeMaker.
    -
    -The correct code is C<< MAN3PODS => { } >>.
    -
    -=back
    -
    -
    -=head2 Hintsfile support
    -
    -MakeMaker.pm uses the architecture specific information from
    -Config.pm. In addition it evaluates architecture specific hints files
    -in a C directory. The hints files are expected to be named
    -like their counterparts in C, but with an C<.pl> file
    -name extension (eg. C). They are simply Ced by
    -MakeMaker within the WriteMakefile() subroutine, and can be used to
    -execute commands as well as to include special variables. The rules
    -which hintsfile is chosen are the same as in Configure.
    -
    -The hintsfile is eval()ed immediately after the arguments given to
    -WriteMakefile are stuffed into a hash reference $self but before this
    -reference becomes blessed. So if you want to do the equivalent to
    -override or create an attribute you would say something like
    -
    -    $self->{LIBS} = ['-ldbm -lucb -lc'];
    -
    -=head2 Distribution Support
    -
    -For authors of extensions MakeMaker provides several Makefile
    -targets. Most of the support comes from the ExtUtils::Manifest module,
    -where additional documentation can be found.
    -
    -=over 4
    -
    -=item    make distcheck
    -
    -reports which files are below the build directory but not in the
    -MANIFEST file and vice versa. (See ExtUtils::Manifest::fullcheck() for
    -details)
    -
    -=item    make skipcheck
    -
    -reports which files are skipped due to the entries in the
    -C file (See ExtUtils::Manifest::skipcheck() for
    -details)
    -
    -=item    make distclean
    -
    -does a realclean first and then the distcheck. Note that this is not
    -needed to build a new distribution as long as you are sure that the
    -MANIFEST file is ok.
    -
    -=item    make manifest
    -
    -rewrites the MANIFEST file, adding all remaining files found (See
    -ExtUtils::Manifest::mkmanifest() for details)
    -
    -=item    make distdir
    -
    -Copies all the files that are in the MANIFEST file to a newly created
    -directory with the name C<$(DISTNAME)-$(VERSION)>. If that directory
    -exists, it will be removed first.
    -
    -Additionally, it will create a META.yml module meta-data file in the
    -distdir and add this to the distdir's MANFIEST.  You can shut this
    -behavior off with the NO_META flag.
    -
    -=item   make disttest
    -
    -Makes a distdir first, and runs a C, a make, and
    -a make test in that directory.
    -
    -=item    make tardist
    -
    -First does a distdir. Then a command $(PREOP) which defaults to a null
    -command, followed by $(TOUNIX), which defaults to a null command under
    -UNIX, and will convert files in distribution directory to UNIX format
    -otherwise. Next it runs C on that directory into a tarfile and
    -deletes the directory. Finishes with a command $(POSTOP) which
    -defaults to a null command.
    -
    -=item    make dist
    -
    -Defaults to $(DIST_DEFAULT) which in turn defaults to tardist.
    -
    -=item    make uutardist
    -
    -Runs a tardist first and uuencodes the tarfile.
    -
    -=item    make shdist
    -
    -First does a distdir. Then a command $(PREOP) which defaults to a null
    -command. Next it runs C on that directory into a sharfile and
    -deletes the intermediate directory again. Finishes with a command
    -$(POSTOP) which defaults to a null command.  Note: For shdist to work
    -properly a C program that can handle directories is mandatory.
    -
    -=item    make zipdist
    -
    -First does a distdir. Then a command $(PREOP) which defaults to a null
    -command. Runs C<$(ZIP) $(ZIPFLAGS)> on that directory into a
    -zipfile. Then deletes that directory. Finishes with a command
    -$(POSTOP) which defaults to a null command.
    -
    -=item    make ci
    -
    -Does a $(CI) and a $(RCS_LABEL) on all files in the MANIFEST file.
    -
    -=back
    -
    -Customization of the dist targets can be done by specifying a hash
    -reference to the dist attribute of the WriteMakefile call. The
    -following parameters are recognized:
    -
    -    CI           ('ci -u')
    -    COMPRESS     ('gzip --best')
    -    POSTOP       ('@ :')
    -    PREOP        ('@ :')
    -    TO_UNIX      (depends on the system)
    -    RCS_LABEL    ('rcs -q -Nv$(VERSION_SYM):')
    -    SHAR         ('shar')
    -    SUFFIX       ('.gz')
    -    TAR          ('tar')
    -    TARFLAGS     ('cvf')
    -    ZIP          ('zip')
    -    ZIPFLAGS     ('-r')
    -
    -An example:
    -
    -    WriteMakefile( 'dist' => { COMPRESS=>"bzip2", SUFFIX=>".bz2" })
    -
    -
    -=head2 Module Meta-Data
    -
    -Long plaguing users of MakeMaker based modules has been the problem of
    -getting basic information about the module out of the sources
    -I running the F and doing a bunch of messy
    -heuristics on the resulting F.  To this end a simple module
    -meta-data file has been introduced, F.
    -
    -F is a YAML document (see http://www.yaml.org) containing
    -basic information about the module (name, version, prerequisites...)
    -in an easy to read format.  The format is developed and defined by the
    -Module::Build developers (see 
    -http://module-build.sourceforge.net/META-spec.html)
    -
    -MakeMaker will automatically generate a F file for you and
    -add it to your F as part of the 'distdir' target (and thus
    -the 'dist' target).  This is intended to seamlessly and rapidly
    -populate CPAN with module meta-data.  If you wish to shut this feature
    -off, set the C C flag to true.
    -
    -
    -=head2 Disabling an extension
    -
    -If some events detected in F imply that there is no way
    -to create the Module, but this is a normal state of things, then you
    -can create a F which does nothing, but succeeds on all the
    -"usual" build targets.  To do so, use
    -
    -   ExtUtils::MakeMaker::WriteEmptyMakefile();
    -
    -instead of WriteMakefile().
    -
    -This may be useful if other modules expect this module to be I
    -OK, as opposed to I OK (say, this system-dependent module builds
    -in a subdirectory of some other distribution, or is listed as a
    -dependency in a CPAN::Bundle, but the functionality is supported by
    -different means on the current architecture).
    -
    -=head2 Other Handy Functions
    -
    -=over 4
    -
    -=item prompt
    -
    -    my $value = prompt($message);
    -    my $value = prompt($message, $default);
    -
    -The C function provides an easy way to request user input
    -used to write a makefile.  It displays the $message as a prompt for
    -input.  If a $default is provided it will be used as a default.  The
    -function returns the $value selected by the user.
    -
    -If C detects that it is not running interactively and there
    -is nothing on STDIN or if the PERL_MM_USE_DEFAULT environment variable
    -is set to true, the $default will be used without prompting.  This
    -prevents automated processes from blocking on user input. 
    -
    -If no $default is provided an empty string will be used instead.
    -
    -=back
    -
    -
    -=head1 ENVIRONMENT
    -
    -=over 4
    -
    -=item PERL_MM_OPT
    -
    -Command line options used by Cnew()>, and thus by
    -C.  The string is split on whitespace, and the result
    -is processed before any actual command line arguments are processed.
    -
    -=item PERL_MM_USE_DEFAULT
    -
    -If set to a true value then MakeMaker's prompt function will
    -always return the default without waiting for user input.
    -
    -=item PERL_CORE
    -
    -Same as the PERL_CORE parameter.  The parameter overrides this.
    -
    -=back
    -
    -=head1 SEE ALSO
    -
    -ExtUtils::MM_Unix, ExtUtils::Manifest ExtUtils::Install,
    -ExtUtils::Embed
    -
    -=head1 AUTHORS
    -
    -Andy Dougherty C, Andreas KEnig
    -C, Tim Bunce C.  VMS
    -support by Charles Bailey C.  OS/2 support
    -by Ilya Zakharevich C.
    -
    -Currently maintained by Michael G Schwern C
    -
    -Send patches and ideas to C.
    -
    -Send bug reports via http://rt.cpan.org/.  Please send your
    -generated Makefile along with your report.
    -
    -For more up-to-date information, see L.
    -
    -=head1 LICENSE
    -
    -This program is free software; you can redistribute it and/or 
    -modify it under the same terms as Perl itself.
    -
    -See L
    -
    -
    -=cut
    diff --git a/lib/perl5/5.8.8/ExtUtils/MakeMaker/Config.pm b/lib/perl5/5.8.8/ExtUtils/MakeMaker/Config.pm
    deleted file mode 100644
    index 52ae800f..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/MakeMaker/Config.pm
    +++ /dev/null
    @@ -1,39 +0,0 @@
    -package ExtUtils::MakeMaker::Config;
    -
    -$VERSION = '0.02';
    -
    -use strict;
    -use Config ();
    -
    -# Give us an overridable config.
    -use vars qw(%Config);
    -%Config = %Config::Config;
    -
    -sub import {
    -    my $caller = caller;
    -
    -    no strict 'refs';
    -    *{$caller.'::Config'} = \%Config;
    -}
    -
    -1;
    -
    -
    -=head1 NAME
    -
    -ExtUtils::MakeMaker::Config - Wrapper around Config.pm
    -
    -
    -=head1 SYNOPSIS
    -
    -  use ExtUtils::MakeMaker::Config;
    -  print $Config{installbin};  # or whatever
    -
    -
    -=head1 DESCRIPTION
    -
    -B
    -
    -A very thin wrapper around Config.pm so MakeMaker is easier to test.
    -
    -=cut
    diff --git a/lib/perl5/5.8.8/ExtUtils/MakeMaker/FAQ.pod b/lib/perl5/5.8.8/ExtUtils/MakeMaker/FAQ.pod
    deleted file mode 100644
    index b64d2483..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/MakeMaker/FAQ.pod
    +++ /dev/null
    @@ -1,300 +0,0 @@
    -package ExtUtils::MakeMaker::FAQ;
    -
    -use vars qw($VERSION);
    -$VERSION = '1.11';
    -
    -1;
    -__END__
    -
    -=head1 NAME
    -
    -ExtUtils::MakeMaker::FAQ - Frequently Asked Questions About MakeMaker
    -
    -=head1 DESCRIPTION
    -
    -FAQs, tricks and tips for C.
    -
    -
    -=head2 Module Installation
    -
    -=over 4
    -
    -=item How do I keep from installing man pages?
    -
    -Recent versions of MakeMaker will only install man pages on Unix like
    -operating systems.
    -
    -For an individual module:
    -
    -        perl Makefile.PL INSTALLMAN1DIR=none INSTALLMAN3DIR=none
    -
    -If you want to suppress man page installation for all modules you have
    -to reconfigure Perl and tell it 'none' when it asks where to install
    -man pages.
    -
    -
    -=item How do I use a module without installing it?
    -
    -Two ways.  One is to build the module normally...
    -
    -        perl Makefile.PL
    -        make
    -
    -...and then set the PERL5LIB environment variable to point at the
    -blib/lib and blib/arch directories.
    -
    -The other is to install the module in a temporary location.
    -
    -        perl Makefile.PL PREFIX=~/tmp LIB=~/tmp/lib/perl
    -
    -And then set PERL5LIB to F<~/tmp/lib/perl>.  This works well when you have
    -multiple modules to work with.  It also ensures that the module goes
    -through its full installation process which may modify it.
    -
    -=back
    -
    -
    -=head2 Philosophy and History
    -
    -=over 4
    -
    -=item Why not just use ?
    -
    -Why did MakeMaker reinvent the build configuration wheel?  Why not
    -just use autoconf or automake or ppm or Ant or ...
    -
    -There are many reasons, but the major one is cross-platform
    -compatibility.
    -
    -Perl is one of the most ported pieces of software ever.  It works on
    -operating systems I've never even heard of (see perlport for details).
    -It needs a build tool that can work on all those platforms and with
    -any wacky C compilers and linkers they might have.
    -
    -No such build tool exists.  Even make itself has wildly different
    -dialects.  So we have to build our own.
    -
    -
    -=item What is Module::Build and how does it relate to MakeMaker?
    -
    -Module::Build is a project by Ken Williams to supplant MakeMaker.
    -Its primary advantages are:
    -
    -=over 8
    -
    -=item * pure perl.  no make, no shell commands
    -
    -=item * easier to customize
    -
    -=item * cleaner internals
    -
    -=item * less cruft
    -
    -=back
    -
    -Module::Build is the official heir apparent to MakeMaker and we
    -encourage people to work on M::B rather than spending time adding features
    -to MakeMaker.
    -
    -=back
    -
    -
    -=head2 Module Writing
    -
    -=over 4
    -
    -=item How do I keep my $VERSION up to date without resetting it manually?
    -
    -Often you want to manually set the $VERSION in the main module
    -distribution because this is the version that everybody sees on CPAN
    -and maybe you want to customize it a bit.  But for all the other
    -modules in your dist, $VERSION is really just bookkeeping and all that's
    -important is it goes up every time the module is changed.  Doing this
    -by hand is a pain and you often forget.
    -
    -Simplest way to do it automatically is to use your version control
    -system's revision number (you are using version control, right?).
    -
    -In CVS, RCS and SVN you use $Revision$ (see the documentation of your
    -version control system for details) writing it like so:
    -
    -    $VERSION = sprintf "%d.%03d", q$Revision$ =~ /(\d+)/g;
    -
    -Every time the file is checked in the $Revision$ will be updated,
    -updating your $VERSION.
    -
    -In CVS version 1.9 is followed by 1.10.  Since CPAN compares version
    -numbers numerically we use a sprintf() to convert 1.9 to 1.009 and
    -1.10 to 1.010 which compare properly.
    -
    -If branches are involved (ie. $Revision: 1.5.3.4$) its a little more
    -complicated.
    -
    -    # must be all on one line or MakeMaker will get confused.
    -    $VERSION = do { my @r = (q$Revision$ =~ /\d+/g); sprintf "%d."."%03d" x $#r, @r };
    -
    -=item What's this F thing and how did it get in my F?!
    -
    -F is a module meta-data file pioneered by Module::Build and
    -automatically generated as part of the 'distdir' target (and thus
    -'dist').  See L.
    -
    -To shut off its generation, pass the C flag to C.
    -
    -=back
    -
    -=head2 XS
    -
    -=over 4
    -
    -=item How to I prevent "object version X.XX does not match bootstrap parameter Y.YY" errors?
    -
    -XS code is very sensitive to the module version number and will
    -complain if the version number in your Perl module doesn't match.  If
    -you change your module's version # without reruning Makefile.PL the old
    -version number will remain in the Makefile causing the XS code to be built
    -with the wrong number.
    -
    -To avoid this, you can force the Makefile to be rebuilt whenever you
    -change the module containing the version number by adding this to your
    -WriteMakefile() arguments.
    -
    -    depend => { '$(FIRST_MAKEFILE)' => '$(VERSION_FROM)' }
    -
    -
    -=item How do I make two or more XS files coexist in the same directory?
    -
    -Sometimes you need to have two and more XS files in the same package.
    -One way to go is to put them into separate directories, but sometimes
    -this is not the most suitable solution. The following technique allows
    -you to put two (and more) XS files in the same directory.
    -
    -Let's assume that we have a package C, which includes
    -C and C modules each having a separate XS
    -file. First we use the following I:
    -
    -  use ExtUtils::MakeMaker;
    -
    -  WriteMakefile(
    -      NAME		=> 'Cool::Foo',
    -      VERSION_FROM	=> 'Foo.pm',
    -      OBJECT              => q/$(O_FILES)/,
    -      # ... other attrs ...
    -  );
    -
    -Notice the C attribute. MakeMaker generates the following
    -variables in I:
    -
    -  # Handy lists of source code files:
    -  XS_FILES= Bar.xs \
    -  	Foo.xs
    -  C_FILES = Bar.c \
    -  	Foo.c
    -  O_FILES = Bar.o \
    -  	Foo.o
    -
    -Therefore we can use the C variable to tell MakeMaker to use
    -these objects into the shared library.
    -
    -That's pretty much it. Now write I and I, I
    -and I, where I bootstraps the shared library and
    -I simply loading I.
    -
    -The only issue left is to how to bootstrap I. This is done
    -from I:
    -
    -  MODULE = Cool::Foo PACKAGE = Cool::Foo
    -
    -  BOOT:
    -  # boot the second XS file
    -  boot_Cool__Bar(aTHX_ cv);
    -
    -If you have more than two files, this is the place where you should
    -boot extra XS files from.
    -
    -The following four files sum up all the details discussed so far.
    -
    -  Foo.pm:
    -  -------
    -  package Cool::Foo;
    -
    -  require DynaLoader;
    -
    -  our @ISA = qw(DynaLoader);
    -  our $VERSION = '0.01';
    -  bootstrap Cool::Foo $VERSION;
    -
    -  1;
    -
    -  Bar.pm:
    -  -------
    -  package Cool::Bar;
    -
    -  use Cool::Foo; # bootstraps Bar.xs
    -
    -  1;
    -
    -  Foo.xs:
    -  -------
    -  #include "EXTERN.h"
    -  #include "perl.h"
    -  #include "XSUB.h"
    -
    -  MODULE = Cool::Foo  PACKAGE = Cool::Foo
    -
    -  BOOT:
    -  # boot the second XS file
    -  boot_Cool__Bar(aTHX_ cv);
    -
    -  MODULE = Cool::Foo  PACKAGE = Cool::Foo  PREFIX = cool_foo_
    -
    -  void
    -  cool_foo_perl_rules()
    -
    -      CODE:
    -      fprintf(stderr, "Cool::Foo says: Perl Rules\n");
    -
    -  Bar.xs:
    -  -------
    -  #include "EXTERN.h"
    -  #include "perl.h"
    -  #include "XSUB.h"
    -
    -  MODULE = Cool::Bar  PACKAGE = Cool::Bar PREFIX = cool_bar_
    -
    -  void
    -  cool_bar_perl_rules()
    -
    -      CODE:
    -      fprintf(stderr, "Cool::Bar says: Perl Rules\n");
    -
    -And of course a very basic test:
    -
    -  test.pl:
    -  --------
    -  use Test;
    -  BEGIN { plan tests => 1 };
    -  use Cool::Foo;
    -  use Cool::Bar;
    -  Cool::Foo::perl_rules();
    -  Cool::Bar::perl_rules();
    -  ok 1;
    -
    -This tip has been brought to you by Nick Ing-Simmons and Stas Bekman.
    -
    -=back
    -
    -=head1 PATCHING
    -
    -If you have a question you'd like to see added to the FAQ (whether or
    -not you have the answer) please send it to makemaker@perl.org.
    -
    -=head1 AUTHOR
    -
    -The denizens of makemaker@perl.org.
    -
    -=head1 SEE ALSO
    -
    -L
    -
    -=cut
    diff --git a/lib/perl5/5.8.8/ExtUtils/MakeMaker/Tutorial.pod b/lib/perl5/5.8.8/ExtUtils/MakeMaker/Tutorial.pod
    deleted file mode 100644
    index a4aae73e..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/MakeMaker/Tutorial.pod
    +++ /dev/null
    @@ -1,181 +0,0 @@
    -package ExtUtils::MakeMaker::Tutorial;
    -
    -use vars qw($VERSION);
    -$VERSION = 0.02;
    -
    -
    -=head1 NAME
    -
    -ExtUtils::MakeMaker::Tutorial - Writing a module with MakeMaker
    -
    -=head1 SYNOPSIS
    -
    -    use ExtUtils::MakeMaker;
    -
    -    WriteMakefile(
    -        NAME            => 'Your::Module',
    -        VERSION_FROM    => 'lib/Your/Module.pm'
    -    );
    -
    -=head1 DESCRIPTION
    -
    -This is a short tutorial on writing a simple module with MakeMaker.
    -Its really not that hard.
    -
    -
    -=head2 The Mantra
    -
    -MakeMaker modules are installed using this simple mantra
    -
    -        perl Makefile.PL
    -        make
    -        make test
    -        make install
    -
    -There are lots more commands and options, but the above will do it.
    -
    -
    -=head2 The Layout
    -
    -The basic files in a module look something like this.
    -
    -        Makefile.PL
    -        MANIFEST
    -        lib/Your/Module.pm
    -
    -That's all that's strictly necessary.  There's additional files you might
    -want:
    -
    -        lib/Your/Other/Module.pm
    -        t/some_test.t
    -        t/some_other_test.t
    -        Changes
    -        README
    -        INSTALL
    -        MANIFEST.SKIP
    -        bin/some_program
    -
    -=over 4
    -
    -=item Makefile.PL
    -
    -When you run Makefile.PL, it makes a Makefile.  That's the whole point of
    -MakeMaker.  The Makefile.PL is a simple program which loads
    -ExtUtils::MakeMaker and runs the WriteMakefile() function to generate a
    -Makefile.
    -
    -Here's an example of what you need for a simple module:
    -
    -    use ExtUtils::MakeMaker;
    -
    -    WriteMakefile(
    -        NAME            => 'Your::Module',
    -        VERSION_FROM    => 'lib/Your/Module.pm'
    -    );
    -
    -NAME is the top-level namespace of your module.  VERSION_FROM is the file
    -which contains the $VERSION variable for the entire distribution.  Typically
    -this is the same as your top-level module.
    -
    -
    -=item MANIFEST
    -
    -A simple listing of all the files in your distribution.
    -
    -        Makefile.PL
    -        MANIFEST
    -        lib/Your/Module.pm
    -
    -File paths in a MANIFEST always use Unix conventions (ie. /) even if you're
    -not on Unix.
    -
    -You can write this by hand or generate it with 'make manifest'.
    -
    -See L for more details.
    -
    -
    -=item lib/
    -
    -This is the directory where your .pm and .pod files you wish to have
    -installed go.  They are layed out according to namespace.  So Foo::Bar
    -is F.
    -
    -
    -=item t/
    -
    -Tests for your modules go here.  Each test filename ends with a .t.
    -So F/  'make test' will run these tests.  The directory is flat,
    -you cannot, for example, have t/foo/bar.t run by 'make test'.
    -
    -Tests are run from the top level of your distribution.  So inside a test
    -you would refer to ./lib to enter the lib directory, for example.
    -
    -
    -=item Changes
    -
    -A log of changes you've made to this module.  The layout is free-form.
    -Here's an example:
    -
    -    1.01 Fri Apr 11 00:21:25 PDT 2003
    -        - thing() does some stuff now
    -        - fixed the wiggy bug in withit()
    -
    -    1.00 Mon Apr  7 00:57:15 PDT 2003
    -        - "Rain of Frogs" now supported
    -
    -
    -=item README
    -
    -A short description of your module, what it does, why someone would use it
    -and its limitations.  CPAN automatically pulls your README file out of
    -the archive and makes it available to CPAN users, it is the first thing
    -they will read to decide if your module is right for them.
    -
    -
    -=item INSTALL
    -
    -Instructions on how to install your module along with any dependencies.
    -Suggested information to include here:
    -
    -    any extra modules required for use
    -    the minimum version of Perl required
    -    if only works on certain operating systems
    -
    -
    -=item MANIFEST.SKIP
    -
    -A file full of regular expressions to exclude when using 'make
    -manifest' to generate the MANIFEST.  These regular expressions
    -are checked against each file path found in the distribution (so
    -you're matching against "t/foo.t" not "foo.t").
    -
    -Here's a sample:
    -
    -    ~$          # ignore emacs and vim backup files
    -    .bak$       # ignore manual backups
    -    \#          # ignore CVS old revision files and emacs temp files
    -
    -Since # can be used for comments, # must be escaped.
    -
    -MakeMaker comes with a default MANIFEST.SKIP to avoid things like
    -version control directories and backup files.  Specifying your own
    -will override this default.
    -
    -
    -=item bin/
    -
    -
    -=back
    -
    -=head1 SEE ALSO
    -
    -L gives stylistic help writing a module.
    -
    -L gives more information about how to write a module.
    -
    -There are modules to help you through the process of writing a module:
    -L, L, L
    -
    -=cut
    -
    -1;
    diff --git a/lib/perl5/5.8.8/ExtUtils/MakeMaker/bytes.pm b/lib/perl5/5.8.8/ExtUtils/MakeMaker/bytes.pm
    deleted file mode 100644
    index 5a2bf75f..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/MakeMaker/bytes.pm
    +++ /dev/null
    @@ -1,39 +0,0 @@
    -package ExtUtils::MakeMaker::bytes;
    -
    -use vars qw($VERSION);
    -$VERSION = 0.01;
    -
    -my $Have_Bytes = eval q{require bytes; 1;};
    -
    -sub import {
    -    return unless $Have_Bytes;
    -
    -    shift;
    -    unshift @_, 'bytes';
    -
    -    goto &bytes::import;
    -}
    -
    -1;
    -
    -
    -=head1 NAME
    -
    -ExtUtils::MakeMaker::bytes - Version-agnostic bytes.pm
    -
    -=head1 SYNOPSIS
    -
    -  use just like bytes.pm
    -
    -=head1 DESCRIPTION
    -
    -bytes.pm was introduced with 5.6.  This means any code which has 'use
    -bytes' in it won't even compile on 5.5.X.  Since bytes is a lexical
    -pragma and must be used at compile time we can't simply wrap it in
    -a BEGIN { eval 'use bytes' } block.
    -
    -ExtUtils::MakeMaker::bytes is just a very thin wrapper around bytes
    -which works just like it when bytes.pm exists and everywhere else it
    -does nothing.
    -
    -=cut
    diff --git a/lib/perl5/5.8.8/ExtUtils/MakeMaker/vmsish.pm b/lib/perl5/5.8.8/ExtUtils/MakeMaker/vmsish.pm
    deleted file mode 100644
    index 3380956e..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/MakeMaker/vmsish.pm
    +++ /dev/null
    @@ -1,40 +0,0 @@
    -package ExtUtils::MakeMaker::vmsish;
    -
    -use vars qw($VERSION);
    -$VERSION = 0.01;
    -
    -my $IsVMS = $^O eq 'VMS';
    -
    -require vmsish if $IsVMS;
    -
    -
    -sub import {
    -    return unless $IsVMS;
    -
    -    shift;
    -    unshift @_, 'vmsish';
    -
    -    goto &vmsish::import;
    -}
    -
    -1;
    -
    -
    -=head1 NAME
    -
    -ExtUtils::MakeMaker::vmsish - Platform-agnostic vmsish.pm
    -
    -=head1 SYNOPSIS
    -
    -  use just like vmsish.pm
    -
    -=head1 DESCRIPTION
    -
    -Until 5.8.0, vmsish.pm is only installed on VMS.  This means any code
    -which has 'use vmsish' in it won't even compile outside VMS.  This
    -makes ExtUtils::MM_VMS very hard to test.
    -
    -ExtUtils::MakeMaker::vmsish is just a very thin wrapper around vmsish
    -which works just like it on VMS and everywhere else it does nothing.
    -
    -=cut
    diff --git a/lib/perl5/5.8.8/ExtUtils/Manifest.pm b/lib/perl5/5.8.8/ExtUtils/Manifest.pm
    deleted file mode 100644
    index 0c96f63c..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/Manifest.pm
    +++ /dev/null
    @@ -1,708 +0,0 @@
    -package ExtUtils::Manifest;
    -
    -require Exporter;
    -use Config;
    -use File::Basename;
    -use File::Copy 'copy';
    -use File::Find;
    -use File::Spec;
    -use Carp;
    -use strict;
    -
    -use vars qw($VERSION @ISA @EXPORT_OK 
    -          $Is_MacOS $Is_VMS 
    -          $Debug $Verbose $Quiet $MANIFEST $DEFAULT_MSKIP);
    -
    -$VERSION = '1.46';
    -@ISA=('Exporter');
    -@EXPORT_OK = qw(mkmanifest
    -                manicheck  filecheck  fullcheck  skipcheck
    -                manifind   maniread   manicopy   maniadd
    -               );
    -
    -$Is_MacOS = $^O eq 'MacOS';
    -$Is_VMS   = $^O eq 'VMS';
    -require VMS::Filespec if $Is_VMS;
    -
    -$Debug   = $ENV{PERL_MM_MANIFEST_DEBUG} || 0;
    -$Verbose = defined $ENV{PERL_MM_MANIFEST_VERBOSE} ?
    -                   $ENV{PERL_MM_MANIFEST_VERBOSE} : 1;
    -$Quiet = 0;
    -$MANIFEST = 'MANIFEST';
    -
    -$DEFAULT_MSKIP = File::Spec->catfile( dirname(__FILE__), "$MANIFEST.SKIP" );
    -
    -
    -=head1 NAME
    -
    -ExtUtils::Manifest - utilities to write and check a MANIFEST file
    -
    -=head1 SYNOPSIS
    -
    -    use ExtUtils::Manifest qw(...funcs to import...);
    -
    -    mkmanifest();
    -
    -    my @missing_files    = manicheck;
    -    my @skipped          = skipcheck;
    -    my @extra_files      = filecheck;
    -    my($missing, $extra) = fullcheck;
    -
    -    my $found    = manifind();
    -
    -    my $manifest = maniread();
    -
    -    manicopy($read,$target);
    -
    -    maniadd({$file => $comment, ...});
    -
    -
    -=head1 DESCRIPTION
    -
    -=head2 Functions
    -
    -ExtUtils::Manifest exports no functions by default.  The following are
    -exported on request
    -
    -=over 4
    -
    -=item mkmanifest
    -
    -    mkmanifest();
    -
    -Writes all files in and below the current directory to your F.
    -It works similar to
    -
    -    find . > MANIFEST
    -
    -All files that match any regular expression in a file F
    -(if it exists) are ignored.
    -
    -Any existing F file will be saved as F.  Lines
    -from the old F file is preserved, including any comments
    -that are found in the existing F file in the new one.
    -
    -=cut
    -
    -sub _sort {
    -    return sort { lc $a cmp lc $b } @_;
    -}
    -
    -sub mkmanifest {
    -    my $manimiss = 0;
    -    my $read = (-r 'MANIFEST' && maniread()) or $manimiss++;
    -    $read = {} if $manimiss;
    -    local *M;
    -    rename $MANIFEST, "$MANIFEST.bak" unless $manimiss;
    -    open M, ">$MANIFEST" or die "Could not open $MANIFEST: $!";
    -    my $skip = _maniskip();
    -    my $found = manifind();
    -    my($key,$val,$file,%all);
    -    %all = (%$found, %$read);
    -    $all{$MANIFEST} = ($Is_VMS ? "$MANIFEST\t\t" : '') . 'This list of files'
    -        if $manimiss; # add new MANIFEST to known file list
    -    foreach $file (_sort keys %all) {
    -	if ($skip->($file)) {
    -	    # Policy: only remove files if they're listed in MANIFEST.SKIP.
    -	    # Don't remove files just because they don't exist.
    -	    warn "Removed from $MANIFEST: $file\n" if $Verbose and exists $read->{$file};
    -	    next;
    -	}
    -	if ($Verbose){
    -	    warn "Added to $MANIFEST: $file\n" unless exists $read->{$file};
    -	}
    -	my $text = $all{$file};
    -	($file,$text) = split(/\s+/,$text,2) if $Is_VMS && $text;
    -	$file = _unmacify($file);
    -	my $tabs = (5 - (length($file)+1)/8);
    -	$tabs = 1 if $tabs < 1;
    -	$tabs = 0 unless $text;
    -	print M $file, "\t" x $tabs, $text, "\n";
    -    }
    -    close M;
    -}
    -
    -# Geez, shouldn't this use File::Spec or File::Basename or something?  
    -# Why so careful about dependencies?
    -sub clean_up_filename {
    -  my $filename = shift;
    -  $filename =~ s|^\./||;
    -  $filename =~ s/^:([^:]+)$/$1/ if $Is_MacOS;
    -  return $filename;
    -}
    -
    -
    -=item manifind
    -
    -    my $found = manifind();
    -
    -returns a hash reference. The keys of the hash are the files found
    -below the current directory.
    -
    -=cut
    -
    -sub manifind {
    -    my $p = shift || {};
    -    my $found = {};
    -
    -    my $wanted = sub {
    -	my $name = clean_up_filename($File::Find::name);
    -	warn "Debug: diskfile $name\n" if $Debug;
    -	return if -d $_;
    -	
    -        if( $Is_VMS ) {
    -            $name =~ s#(.*)\.$#\L$1#;
    -            $name = uc($name) if $name =~ /^MANIFEST(\.SKIP)?$/i;
    -        }
    -	$found->{$name} = "";
    -    };
    -
    -    # We have to use "$File::Find::dir/$_" in preprocess, because 
    -    # $File::Find::name is unavailable.
    -    # Also, it's okay to use / here, because MANIFEST files use Unix-style 
    -    # paths.
    -    find({wanted => $wanted},
    -	 $Is_MacOS ? ":" : ".");
    -
    -    return $found;
    -}
    -
    -
    -=item manicheck
    -
    -    my @missing_files = manicheck();
    -
    -checks if all the files within a C in the current directory
    -really do exist. If C and the tree below the current
    -directory are in sync it silently returns an empty list.
    -Otherwise it returns a list of files which are listed in the
    -C but missing from the directory, and by default also
    -outputs these names to STDERR.
    -
    -=cut
    -
    -sub manicheck {
    -    return _check_files();
    -}
    -
    -
    -=item filecheck
    -
    -    my @extra_files = filecheck();
    -
    -finds files below the current directory that are not mentioned in the
    -C file. An optional file C will be
    -consulted. Any file matching a regular expression in such a file will
    -not be reported as missing in the C file. The list of any
    -extraneous files found is returned, and by default also reported to
    -STDERR.
    -
    -=cut
    -
    -sub filecheck {
    -    return _check_manifest();
    -}
    -
    -
    -=item fullcheck
    -
    -    my($missing, $extra) = fullcheck();
    -
    -does both a manicheck() and a filecheck(), returning then as two array
    -refs.
    -
    -=cut
    -
    -sub fullcheck {
    -    return [_check_files()], [_check_manifest()];
    -}
    -
    -
    -=item skipcheck
    -
    -    my @skipped = skipcheck();
    -
    -lists all the files that are skipped due to your C
    -file.
    -
    -=cut
    -
    -sub skipcheck {
    -    my($p) = @_;
    -    my $found = manifind();
    -    my $matches = _maniskip();
    -
    -    my @skipped = ();
    -    foreach my $file (_sort keys %$found){
    -        if (&$matches($file)){
    -            warn "Skipping $file\n";
    -            push @skipped, $file;
    -            next;
    -        }
    -    }
    -
    -    return @skipped;
    -}
    -
    -
    -sub _check_files {
    -    my $p = shift;
    -    my $dosnames=(defined(&Dos::UseLFN) && Dos::UseLFN()==0);
    -    my $read = maniread() || {};
    -    my $found = manifind($p);
    -
    -    my(@missfile) = ();
    -    foreach my $file (_sort keys %$read){
    -        warn "Debug: manicheck checking from $MANIFEST $file\n" if $Debug;
    -        if ($dosnames){
    -            $file = lc $file;
    -            $file =~ s=(\.(\w|-)+)=substr ($1,0,4)=ge;
    -            $file =~ s=((\w|-)+)=substr ($1,0,8)=ge;
    -        }
    -        unless ( exists $found->{$file} ) {
    -            warn "No such file: $file\n" unless $Quiet;
    -            push @missfile, $file;
    -        }
    -    }
    -
    -    return @missfile;
    -}
    -
    -
    -sub _check_manifest {
    -    my($p) = @_;
    -    my $read = maniread() || {};
    -    my $found = manifind($p);
    -    my $skip  = _maniskip();
    -
    -    my @missentry = ();
    -    foreach my $file (_sort keys %$found){
    -        next if $skip->($file);
    -        warn "Debug: manicheck checking from disk $file\n" if $Debug;
    -        unless ( exists $read->{$file} ) {
    -            my $canon = $Is_MacOS ? "\t" . _unmacify($file) : '';
    -            warn "Not in $MANIFEST: $file$canon\n" unless $Quiet;
    -            push @missentry, $file;
    -        }
    -    }
    -
    -    return @missentry;
    -}
    -
    -
    -=item maniread
    -
    -    my $manifest = maniread();
    -    my $manifest = maniread($manifest_file);
    -
    -reads a named C file (defaults to C in the current
    -directory) and returns a HASH reference with files being the keys and
    -comments being the values of the HASH.  Blank lines and lines which
    -start with C<#> in the C file are discarded.
    -
    -=cut
    -
    -sub maniread {
    -    my ($mfile) = @_;
    -    $mfile ||= $MANIFEST;
    -    my $read = {};
    -    local *M;
    -    unless (open M, $mfile){
    -        warn "$mfile: $!";
    -        return $read;
    -    }
    -    local $_;
    -    while (){
    -        chomp;
    -        next if /^\s*#/;
    -
    -        my($file, $comment) = /^(\S+)\s*(.*)/;
    -        next unless $file;
    -
    -        if ($Is_MacOS) {
    -            $file = _macify($file);
    -            $file =~ s/\\([0-3][0-7][0-7])/sprintf("%c", oct($1))/ge;
    -        }
    -        elsif ($Is_VMS) {
    -            require File::Basename;
    -            my($base,$dir) = File::Basename::fileparse($file);
    -            # Resolve illegal file specifications in the same way as tar
    -            $dir =~ tr/./_/;
    -            my(@pieces) = split(/\./,$base);
    -            if (@pieces > 2) { $base = shift(@pieces) . '.' . join('_',@pieces); }
    -            my $okfile = "$dir$base";
    -            warn "Debug: Illegal name $file changed to $okfile\n" if $Debug;
    -            $file = $okfile;
    -            $file = lc($file) unless $file =~ /^MANIFEST(\.SKIP)?$/;
    -        }
    -
    -        $read->{$file} = $comment;
    -    }
    -    close M;
    -    $read;
    -}
    -
    -# returns an anonymous sub that decides if an argument matches
    -sub _maniskip {
    -    my @skip ;
    -    my $mfile = "$MANIFEST.SKIP";
    -    local(*M,$_);
    -    open M, $mfile or open M, $DEFAULT_MSKIP or return sub {0};
    -    while (){
    -	chomp;
    -	next if /^#/;
    -	next if /^\s*$/;
    -	push @skip, _macify($_);
    -    }
    -    close M;
    -    my $opts = $Is_VMS ? '(?i)' : '';
    -
    -    # Make sure each entry is isolated in its own parentheses, in case
    -    # any of them contain alternations
    -    my $regex = join '|', map "(?:$_)", @skip;
    -
    -    return sub { $_[0] =~ qr{$opts$regex} };
    -}
    -
    -=item manicopy
    -
    -    manicopy(\%src, $dest_dir);
    -    manicopy(\%src, $dest_dir, $how);
    -
    -Copies the files that are the keys in %src to the $dest_dir.  %src is
    -typically returned by the maniread() function.
    -
    -    manicopy( maniread(), $dest_dir );
    -
    -This function is useful for producing a directory tree identical to the 
    -intended distribution tree. 
    -
    -$how can be used to specify a different methods of "copying".  Valid
    -values are C, which actually copies the files, C which creates
    -hard links, and C which mostly links the files but copies any
    -symbolic link to make a tree without any symbolic link.  C is the 
    -default.
    -
    -=cut
    -
    -sub manicopy {
    -    my($read,$target,$how)=@_;
    -    croak "manicopy() called without target argument" unless defined $target;
    -    $how ||= 'cp';
    -    require File::Path;
    -    require File::Basename;
    -
    -    $target = VMS::Filespec::unixify($target) if $Is_VMS;
    -    File::Path::mkpath([ $target ],! $Quiet,$Is_VMS ? undef : 0755);
    -    foreach my $file (keys %$read){
    -    	if ($Is_MacOS) {
    -	    if ($file =~ m!:!) { 
    -	   	my $dir = _maccat($target, $file);
    -		$dir =~ s/[^:]+$//;
    -	    	File::Path::mkpath($dir,1,0755);
    -	    }
    -	    cp_if_diff($file, _maccat($target, $file), $how);
    -	} else {
    -	    $file = VMS::Filespec::unixify($file) if $Is_VMS;
    -	    if ($file =~ m!/!) { # Ilya, that hurts, I fear, or maybe not?
    -		my $dir = File::Basename::dirname($file);
    -		$dir = VMS::Filespec::unixify($dir) if $Is_VMS;
    -		File::Path::mkpath(["$target/$dir"],! $Quiet,$Is_VMS ? undef : 0755);
    -	    }
    -	    cp_if_diff($file, "$target/$file", $how);
    -	}
    -    }
    -}
    -
    -sub cp_if_diff {
    -    my($from, $to, $how)=@_;
    -    -f $from or carp "$0: $from not found";
    -    my($diff) = 0;
    -    local(*F,*T);
    -    open(F,"< $from\0") or die "Can't read $from: $!\n";
    -    if (open(T,"< $to\0")) {
    -        local $_;
    -	while () { $diff++,last if $_ ne ; }
    -	$diff++ unless eof(T);
    -	close T;
    -    }
    -    else { $diff++; }
    -    close F;
    -    if ($diff) {
    -	if (-e $to) {
    -	    unlink($to) or confess "unlink $to: $!";
    -	}
    -        STRICT_SWITCH: {
    -	    best($from,$to), last STRICT_SWITCH if $how eq 'best';
    -	    cp($from,$to), last STRICT_SWITCH if $how eq 'cp';
    -	    ln($from,$to), last STRICT_SWITCH if $how eq 'ln';
    -	    croak("ExtUtils::Manifest::cp_if_diff " .
    -		  "called with illegal how argument [$how]. " .
    -		  "Legal values are 'best', 'cp', and 'ln'.");
    -	}
    -    }
    -}
    -
    -sub cp {
    -    my ($srcFile, $dstFile) = @_;
    -    my ($access,$mod) = (stat $srcFile)[8,9];
    -
    -    copy($srcFile,$dstFile);
    -    utime $access, $mod + ($Is_VMS ? 1 : 0), $dstFile;
    -    _manicopy_chmod($dstFile);
    -}
    -
    -
    -sub ln {
    -    my ($srcFile, $dstFile) = @_;
    -    return &cp if $Is_VMS or ($^O eq 'MSWin32' and Win32::IsWin95());
    -    link($srcFile, $dstFile);
    -
    -    unless( _manicopy_chmod($dstFile) ) {
    -        unlink $dstFile;
    -        return;
    -    }
    -    1;
    -}
    -
    -# 1) Strip off all group and world permissions.
    -# 2) Let everyone read it.
    -# 3) If the owner can execute it, everyone can.
    -sub _manicopy_chmod {
    -    my($file) = shift;
    -
    -    my $perm = 0444 | (stat $file)[2] & 0700;
    -    chmod( $perm | ( $perm & 0100 ? 0111 : 0 ), $file );
    -}
    -
    -# Files that are often modified in the distdir.  Don't hard link them.
    -my @Exceptions = qw(MANIFEST META.yml SIGNATURE);
    -sub best {
    -    my ($srcFile, $dstFile) = @_;
    -
    -    my $is_exception = grep $srcFile =~ /$_/, @Exceptions;
    -    if ($is_exception or !$Config{d_link} or -l $srcFile) {
    -	cp($srcFile, $dstFile);
    -    } else {
    -	ln($srcFile, $dstFile) or cp($srcFile, $dstFile);
    -    }
    -}
    -
    -sub _macify {
    -    my($file) = @_;
    -
    -    return $file unless $Is_MacOS;
    -
    -    $file =~ s|^\./||;
    -    if ($file =~ m|/|) {
    -	$file =~ s|/+|:|g;
    -	$file = ":$file";
    -    }
    -
    -    $file;
    -}
    -
    -sub _maccat {
    -    my($f1, $f2) = @_;
    -
    -    return "$f1/$f2" unless $Is_MacOS;
    -
    -    $f1 .= ":$f2";
    -    $f1 =~ s/([^:]:):/$1/g;
    -    return $f1;
    -}
    -
    -sub _unmacify {
    -    my($file) = @_;
    -
    -    return $file unless $Is_MacOS;
    -
    -    $file =~ s|^:||;
    -    $file =~ s|([/ \n])|sprintf("\\%03o", unpack("c", $1))|ge;
    -    $file =~ y|:|/|;
    -
    -    $file;
    -}
    -
    -
    -=item maniadd
    -
    -  maniadd({ $file => $comment, ...});
    -
    -Adds an entry to an existing F unless its already there.
    -
    -$file will be normalized (ie. Unixified).  B
    -
    -=cut
    -
    -sub maniadd {
    -    my($additions) = shift;
    -
    -    _normalize($additions);
    -    _fix_manifest($MANIFEST);
    -
    -    my $manifest = maniread();
    -    my @needed = grep { !exists $manifest->{$_} } keys %$additions;
    -    return 1 unless @needed;
    -
    -    open(MANIFEST, ">>$MANIFEST") or 
    -      die "maniadd() could not open $MANIFEST: $!";
    -
    -    foreach my $file (_sort @needed) {
    -        my $comment = $additions->{$file} || '';
    -        printf MANIFEST "%-40s %s\n", $file, $comment;
    -    }
    -    close MANIFEST or die "Error closing $MANIFEST: $!";
    -
    -    return 1;
    -}
    -
    -
    -# Sometimes MANIFESTs are missing a trailing newline.  Fix this.
    -sub _fix_manifest {
    -    my $manifest_file = shift;
    -
    -    open MANIFEST, $MANIFEST or die "Could not open $MANIFEST: $!";
    -
    -    # Yes, we should be using seek(), but I'd like to avoid loading POSIX
    -    # to get SEEK_*
    -    my @manifest = ;
    -    close MANIFEST;
    -
    -    unless( $manifest[-1] =~ /\n\z/ ) {
    -        open MANIFEST, ">>$MANIFEST" or die "Could not open $MANIFEST: $!";
    -        print MANIFEST "\n";
    -        close MANIFEST;
    -    }
    -}
    -
    -
    -# UNIMPLEMENTED
    -sub _normalize {
    -    return;
    -}
    -
    -
    -=back
    -
    -=head2 MANIFEST
    -
    -A list of files in the distribution, one file per line.  The MANIFEST
    -always uses Unix filepath conventions even if you're not on Unix.  This
    -means F style not F.
    -
    -Anything between white space and an end of line within a C
    -file is considered to be a comment.  Any line beginning with # is also
    -a comment.
    -
    -    # this a comment
    -    some/file
    -    some/other/file            comment about some/file
    -
    -
    -=head2 MANIFEST.SKIP
    -
    -The file MANIFEST.SKIP may contain regular expressions of files that
    -should be ignored by mkmanifest() and filecheck(). The regular
    -expressions should appear one on each line. Blank lines and lines
    -which start with C<#> are skipped.  Use C<\#> if you need a regular
    -expression to start with a C<#>.
    -
    -For example:
    -
    -    # Version control files and dirs.
    -    \bRCS\b
    -    \bCVS\b
    -    ,v$
    -    \B\.svn\b
    -
    -    # Makemaker generated files and dirs.
    -    ^MANIFEST\.
    -    ^Makefile$
    -    ^blib/
    -    ^MakeMaker-\d
    -
    -    # Temp, old and emacs backup files.
    -    ~$
    -    \.old$
    -    ^#.*#$
    -    ^\.#
    -
    -If no MANIFEST.SKIP file is found, a default set of skips will be
    -used, similar to the example above.  If you want nothing skipped,
    -simply make an empty MANIFEST.SKIP file.
    -
    -
    -=head2 EXPORT_OK
    -
    -C<&mkmanifest>, C<&manicheck>, C<&filecheck>, C<&fullcheck>,
    -C<&maniread>, and C<&manicopy> are exportable.
    -
    -=head2 GLOBAL VARIABLES
    -
    -C<$ExtUtils::Manifest::MANIFEST> defaults to C. Changing it
    -results in both a different C and a different
    -C file. This is useful if you want to maintain
    -different distributions for different audiences (say a user version
    -and a developer version including RCS).
    -
    -C<$ExtUtils::Manifest::Quiet> defaults to 0. If set to a true value,
    -all functions act silently.
    -
    -C<$ExtUtils::Manifest::Debug> defaults to 0.  If set to a true value,
    -or if PERL_MM_MANIFEST_DEBUG is true, debugging output will be
    -produced.
    -
    -=head1 DIAGNOSTICS
    -
    -All diagnostic output is sent to C.
    -
    -=over 4
    -
    -=item C I
    -
    -is reported if a file is found which is not in C.
    -
    -=item C I
    -
    -is reported if a file is skipped due to an entry in C.
    -
    -=item C I
    -
    -is reported if a file mentioned in a C file does not
    -exist.
    -
    -=item C I<$!>
    -
    -is reported if C could not be opened.
    -
    -=item C I
    -
    -is reported by mkmanifest() if $Verbose is set and a file is added
    -to MANIFEST. $Verbose is set to 1 by default.
    -
    -=back
    -
    -=head1 ENVIRONMENT
    -
    -=over 4
    -
    -=item B
    -
    -Turns on debugging
    -
    -=back
    -
    -=head1 SEE ALSO
    -
    -L which has handy targets for most of the functionality.
    -
    -=head1 AUTHOR
    -
    -Andreas Koenig C
    -
    -Currently maintained by Michael G Schwern C
    -
    -=cut
    -
    -1;
    diff --git a/lib/perl5/5.8.8/ExtUtils/Miniperl.pm b/lib/perl5/5.8.8/ExtUtils/Miniperl.pm
    deleted file mode 100644
    index d703372b..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/Miniperl.pm
    +++ /dev/null
    @@ -1,235 +0,0 @@
    -# This File keeps the contents of miniperlmain.c.
    -#
    -# It was generated automatically by minimod.PL from the contents
    -# of miniperlmain.c. Don't edit this file!
    -#
    -#       ANY CHANGES MADE HERE WILL BE LOST! 
    -#
    -
    -
    -package ExtUtils::Miniperl;
    -require Exporter;
    -@ISA = qw(Exporter);
    -@EXPORT = qw(&writemain);
    -
    -$head= <<'EOF!HEAD';
    -/*    miniperlmain.c
    - *
    - *    Copyright (C) 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2003,
    - *    2004, 2005 by Larry Wall and others
    - *
    - *    You may distribute under the terms of either the GNU General Public
    - *    License or the Artistic License, as specified in the README file.
    - *
    - */
    -
    -/*
    - * "The Road goes ever on and on, down from the door where it began."
    - */
    -
    -/* This file contains the main() function for the perl interpreter.
    - * Note that miniperlmain.c contains main() for the 'miniperl' binary,
    - * while perlmain.c contains main() for the 'perl' binary.
    - *
    - * Miniperl is like perl except that it does not support dynamic loading,
    - * and in fact is used to build the dynamic modules needed for the 'real'
    - * perl executable.
    - */
    -
    -#ifdef OEMVS
    -#ifdef MYMALLOC
    -/* sbrk is limited to first heap segment so make it big */
    -#pragma runopts(HEAP(8M,500K,ANYWHERE,KEEP,8K,4K) STACK(,,ANY,) ALL31(ON))
    -#else
    -#pragma runopts(HEAP(2M,500K,ANYWHERE,KEEP,8K,4K) STACK(,,ANY,) ALL31(ON))
    -#endif
    -#endif
    -
    -
    -#include "EXTERN.h"
    -#define PERL_IN_MINIPERLMAIN_C
    -#include "perl.h"
    -
    -static void xs_init (pTHX);
    -static PerlInterpreter *my_perl;
    -
    -#if defined (__MINT__) || defined (atarist)
    -/* The Atari operating system doesn't have a dynamic stack.  The
    -   stack size is determined from this value.  */
    -long _stksize = 64 * 1024;
    -#endif
    -
    -int
    -main(int argc, char **argv, char **env)
    -{
    -    int exitstatus;
    -    (void)env;
    -#ifndef PERL_USE_SAFE_PUTENV
    -    PL_use_safe_putenv = 0;
    -#endif /* PERL_USE_SAFE_PUTENV */
    -
    -#ifdef PERL_GLOBAL_STRUCT
    -#define PERLVAR(var,type) /**/
    -#define PERLVARA(var,type) /**/
    -#define PERLVARI(var,type,init) PL_Vars.var = init;
    -#define PERLVARIC(var,type,init) PL_Vars.var = init;
    -#include "perlvars.h"
    -#undef PERLVAR
    -#undef PERLVARA
    -#undef PERLVARI
    -#undef PERLVARIC
    -#endif
    -
    -    /* if user wants control of gprof profiling off by default */
    -    /* noop unless Configure is given -Accflags=-DPERL_GPROF_CONTROL */
    -    PERL_GPROF_MONCONTROL(0);
    -
    -    PERL_SYS_INIT3(&argc,&argv,&env);
    -
    -#if defined(USE_5005THREADS) || defined(USE_ITHREADS)
    -    /* XXX Ideally, this should really be happening in perl_alloc() or
    -     * perl_construct() to keep libperl.a transparently fork()-safe.
    -     * It is currently done here only because Apache/mod_perl have
    -     * problems due to lack of a call to cancel pthread_atfork()
    -     * handlers when shared objects that contain the handlers may
    -     * be dlclose()d.  This forces applications that embed perl to
    -     * call PTHREAD_ATFORK() explicitly, but if and only if it hasn't
    -     * been called at least once before in the current process.
    -     * --GSAR 2001-07-20 */
    -    PTHREAD_ATFORK(Perl_atfork_lock,
    -                   Perl_atfork_unlock,
    -                   Perl_atfork_unlock);
    -#endif
    -
    -    if (!PL_do_undump) {
    -	my_perl = perl_alloc();
    -	if (!my_perl)
    -	    exit(1);
    -	perl_construct(my_perl);
    -	PL_perl_destruct_level = 0;
    -    }
    -    PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
    -    exitstatus = perl_parse(my_perl, xs_init, argc, argv, (char **)NULL);
    -    if (!exitstatus)
    -        perl_run(my_perl);
    -      
    -    exitstatus = perl_destruct(my_perl);
    -
    -    perl_free(my_perl);
    -
    -    PERL_SYS_TERM();
    -
    -    exit(exitstatus);
    -    return exitstatus;
    -}
    -
    -/* Register any extra external extensions */
    -
    -EOF!HEAD
    -$tail=<<'EOF!TAIL';
    -
    -static void
    -xs_init(pTHX)
    -{
    -}
    -
    -/*
    - * Local variables:
    - * c-indentation-style: bsd
    - * c-basic-offset: 4
    - * indent-tabs-mode: t
    - * End:
    - *
    - * ex: set ts=8 sts=4 sw=4 noet:
    - */
    -EOF!TAIL
    -
    -sub writemain{
    -    my(@exts) = @_;
    -
    -    my($pname);
    -    my($dl) = canon('/','DynaLoader');
    -    print $head;
    -
    -    foreach $_ (@exts){
    -	my($pname) = canon('/', $_);
    -	my($mname, $cname);
    -	($mname = $pname) =~ s!/!::!g;
    -	($cname = $pname) =~ s!/!__!g;
    -        print "EXTERN_C void boot_${cname} (pTHX_ CV* cv);\n";
    -    }
    -
    -    my ($tail1,$tail2) = ( $tail =~ /\A(.*\n)(\s*\}.*)\Z/s );
    -    print $tail1;
    -
    -    print "\tconst char file[] = __FILE__;\n";
    -    print "\tdXSUB_SYS;\n" if $] > 5.002;
    -
    -    foreach $_ (@exts){
    -	my($pname) = canon('/', $_);
    -	my($mname, $cname, $ccode);
    -	($mname = $pname) =~ s!/!::!g;
    -	($cname = $pname) =~ s!/!__!g;
    -	print "\t{\n";
    -	if ($pname eq $dl){
    -	    # Must NOT install 'DynaLoader::boot_DynaLoader' as 'bootstrap'!
    -	    # boot_DynaLoader is called directly in DynaLoader.pm
    -	    $ccode = "\t/* DynaLoader is a special case */\n
    -\tnewXS(\"${mname}::boot_${cname}\", boot_${cname}, file);\n";
    -	    print $ccode unless $SEEN{$ccode}++;
    -	} else {
    -	    $ccode = "\tnewXS(\"${mname}::bootstrap\", boot_${cname}, file);\n";
    -	    print $ccode unless $SEEN{$ccode}++;
    -	}
    -	print "\t}\n";
    -    }
    -    print $tail2;
    -}
    -
    -sub canon{
    -    my($as, @ext) = @_;
    -	foreach(@ext){
    -	    # might be X::Y or lib/auto/X/Y/Y.a
    -		next if s!::!/!g;
    -	    s:^(lib|ext)/(auto/)?::;
    -	    s:/\w+\.\w+$::;
    -	}
    -	grep(s:/:$as:, @ext) if ($as ne '/');
    -	@ext;
    -}
    -
    -1;
    -__END__
    -
    -=head1 NAME
    -
    -ExtUtils::Miniperl, writemain - write the C code for perlmain.c
    -
    -=head1 SYNOPSIS
    -
    -C
    -
    -C
    -
    -=head1 DESCRIPTION
    -
    -This whole module is written when perl itself is built from a script
    -called minimod.PL. In case you want to patch it, please patch
    -minimod.PL in the perl distribution instead.
    -
    -writemain() takes an argument list of directories containing archive
    -libraries that relate to perl modules and should be linked into a new
    -perl binary. It writes to STDOUT a corresponding perlmain.c file that
    -is a plain C file containing all the bootstrap code to make the
    -modules associated with the libraries available from within perl.
    -
    -The typical usage is from within a Makefile generated by
    -ExtUtils::MakeMaker. So under normal circumstances you won't have to
    -deal with this module directly.
    -
    -=head1 SEE ALSO
    -
    -L
    -
    -=cut
    -
    diff --git a/lib/perl5/5.8.8/ExtUtils/Mkbootstrap.pm b/lib/perl5/5.8.8/ExtUtils/Mkbootstrap.pm
    deleted file mode 100644
    index ba452fe7..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/Mkbootstrap.pm
    +++ /dev/null
    @@ -1,102 +0,0 @@
    -package ExtUtils::Mkbootstrap;
    -
    -$VERSION = 1.15;
    -
    -use Config;
    -use Exporter;
    -@ISA=('Exporter');
    -@EXPORT='&Mkbootstrap';
    -
    -sub Mkbootstrap {
    -    my($baseext, @bsloadlibs)=@_;
    -    @bsloadlibs = grep($_, @bsloadlibs); # strip empty libs
    -
    -    print STDOUT "	bsloadlibs=@bsloadlibs\n" if $Verbose;
    -
    -    # We need DynaLoader here because we and/or the *_BS file may
    -    # call dl_findfile(). We don't say `use' here because when
    -    # first building perl extensions the DynaLoader will not have
    -    # been built when MakeMaker gets first used.
    -    require DynaLoader;
    -
    -    rename "$baseext.bs", "$baseext.bso"
    -      if -s "$baseext.bs";
    -
    -    if (-f "${baseext}_BS"){
    -	$_ = "${baseext}_BS";
    -	package DynaLoader; # execute code as if in DynaLoader
    -	local($osname, $dlsrc) = (); # avoid warnings
    -	($osname, $dlsrc) = @Config::Config{qw(osname dlsrc)};
    -	$bscode = "";
    -	unshift @INC, ".";
    -	require $_;
    -	shift @INC;
    -    }
    -
    -    if ($Config{'dlsrc'} =~ /^dl_dld/){
    -	package DynaLoader;
    -	push(@dl_resolve_using, dl_findfile('-lc'));
    -    }
    -
    -    my(@all) = (@bsloadlibs, @DynaLoader::dl_resolve_using);
    -    my($method) = '';
    -    if (@all){
    -	open BS, ">$baseext.bs"
    -		or die "Unable to open $baseext.bs: $!";
    -	print STDOUT "Writing $baseext.bs\n";
    -	print STDOUT "	containing: @all" if $Verbose;
    -	print BS "# $baseext DynaLoader bootstrap file for $^O architecture.\n";
    -	print BS "# Do not edit this file, changes will be lost.\n";
    -	print BS "# This file was automatically generated by the\n";
    -	print BS "# Mkbootstrap routine in ExtUtils::Mkbootstrap (v$VERSION).\n";
    -	print BS "\@DynaLoader::dl_resolve_using = ";
    -	# If @all contains names in the form -lxxx or -Lxxx then it's asking for
    -	# runtime library location so we automatically add a call to dl_findfile()
    -	if (" @all" =~ m/ -[lLR]/){
    -	    print BS "  dl_findfile(qw(\n  @all\n  ));\n";
    -	}else{
    -	    print BS "  qw(@all);\n";
    -	}
    -	# write extra code if *_BS says so
    -	print BS $DynaLoader::bscode if $DynaLoader::bscode;
    -	print BS "\n1;\n";
    -	close BS;
    -    }
    -}
    -
    -1;
    -
    -__END__
    -
    -=head1 NAME
    -
    -ExtUtils::Mkbootstrap - make a bootstrap file for use by DynaLoader
    -
    -=head1 SYNOPSIS
    -
    -C
    -
    -=head1 DESCRIPTION
    -
    -Mkbootstrap typically gets called from an extension Makefile.
    -
    -There is no C<*.bs> file supplied with the extension. Instead, there may
    -be a C<*_BS> file which has code for the special cases, like posix for
    -berkeley db on the NeXT.
    -
    -This file will get parsed, and produce a maybe empty
    -C<@DynaLoader::dl_resolve_using> array for the current architecture.
    -That will be extended by $BSLOADLIBS, which was computed by
    -ExtUtils::Liblist::ext(). If this array still is empty, we do nothing,
    -else we write a .bs file with an C<@DynaLoader::dl_resolve_using>
    -array.
    -
    -The C<*_BS> file can put some code into the generated C<*.bs> file by
    -placing it in C<$bscode>. This is a handy 'escape' mechanism that may
    -prove useful in complex situations.
    -
    -If @DynaLoader::dl_resolve_using contains C<-L*> or C<-l*> entries then
    -Mkbootstrap will automatically add a dl_findfile() call to the
    -generated C<*.bs> file.
    -
    -=cut
    diff --git a/lib/perl5/5.8.8/ExtUtils/Mksymlists.pm b/lib/perl5/5.8.8/ExtUtils/Mksymlists.pm
    deleted file mode 100644
    index 85922abc..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/Mksymlists.pm
    +++ /dev/null
    @@ -1,309 +0,0 @@
    -package ExtUtils::Mksymlists;
    -
    -use 5.00503;
    -use strict qw[ subs refs ];
    -# no strict 'vars';  # until filehandles are exempted
    -
    -use Carp;
    -use Exporter;
    -use Config;
    -
    -use vars qw(@ISA @EXPORT $VERSION);
    -@ISA = 'Exporter';
    -@EXPORT = '&Mksymlists';
    -$VERSION = 1.19;
    -
    -sub Mksymlists {
    -    my(%spec) = @_;
    -    my($osname) = $^O;
    -
    -    croak("Insufficient information specified to Mksymlists")
    -        unless ( $spec{NAME} or
    -                 ($spec{FILE} and ($spec{DL_FUNCS} or $spec{FUNCLIST})) );
    -
    -    $spec{DL_VARS} = [] unless $spec{DL_VARS};
    -    ($spec{FILE} = $spec{NAME}) =~ s/.*::// unless $spec{FILE};
    -    $spec{FUNCLIST} = [] unless $spec{FUNCLIST};
    -    $spec{DL_FUNCS} = { $spec{NAME} => [] }
    -        unless ( ($spec{DL_FUNCS} and keys %{$spec{DL_FUNCS}}) or
    -                 @{$spec{FUNCLIST}});
    -    if (defined $spec{DL_FUNCS}) {
    -        my($package);
    -        foreach $package (keys %{$spec{DL_FUNCS}}) {
    -            my($packprefix,$sym,$bootseen);
    -            ($packprefix = $package) =~ s/\W/_/g;
    -            foreach $sym (@{$spec{DL_FUNCS}->{$package}}) {
    -                if ($sym =~ /^boot_/) {
    -                    push(@{$spec{FUNCLIST}},$sym);
    -                    $bootseen++;
    -                }
    -                else { push(@{$spec{FUNCLIST}},"XS_${packprefix}_$sym"); }
    -            }
    -            push(@{$spec{FUNCLIST}},"boot_$packprefix") unless $bootseen;
    -        }
    -    }
    -
    -#    We'll need this if we ever add any OS which uses mod2fname
    -#    not as pseudo-builtin.
    -#    require DynaLoader;
    -    if (defined &DynaLoader::mod2fname and not $spec{DLBASE}) {
    -        $spec{DLBASE} = DynaLoader::mod2fname([ split(/::/,$spec{NAME}) ]);
    -    }
    -
    -    if    ($osname eq 'aix') { _write_aix(\%spec); }
    -    elsif ($osname eq 'MacOS'){ _write_aix(\%spec) }
    -    elsif ($osname eq 'VMS') { _write_vms(\%spec) }
    -    elsif ($osname eq 'os2') { _write_os2(\%spec) }
    -    elsif ($osname eq 'MSWin32') { _write_win32(\%spec) }
    -    else { croak("Don't know how to create linker option file for $osname\n"); }
    -}
    -
    -
    -sub _write_aix {
    -    my($data) = @_;
    -
    -    rename "$data->{FILE}.exp", "$data->{FILE}.exp_old";
    -
    -    open(EXP,">$data->{FILE}.exp")
    -        or croak("Can't create $data->{FILE}.exp: $!\n");
    -    print EXP join("\n",@{$data->{DL_VARS}}, "\n") if @{$data->{DL_VARS}};
    -    print EXP join("\n",@{$data->{FUNCLIST}}, "\n") if @{$data->{FUNCLIST}};
    -    close EXP;
    -}
    -
    -
    -sub _write_os2 {
    -    my($data) = @_;
    -    require Config;
    -    my $threaded = ($Config::Config{archname} =~ /-thread/ ? " threaded" : "");
    -
    -    if (not $data->{DLBASE}) {
    -        ($data->{DLBASE} = $data->{NAME}) =~ s/.*:://;
    -        $data->{DLBASE} = substr($data->{DLBASE},0,7) . '_';
    -    }
    -    my $distname = $data->{DISTNAME} || $data->{NAME};
    -    $distname = "Distribution $distname";
    -    my $patchlevel = " pl$Config{perl_patchlevel}" || '';
    -    my $comment = sprintf "Perl (v%s%s%s) module %s", 
    -      $Config::Config{version}, $threaded, $patchlevel, $data->{NAME};
    -    chomp $comment;
    -    if ($data->{INSTALLDIRS} and $data->{INSTALLDIRS} eq 'perl') {
    -	$distname = 'perl5-porters@perl.org';
    -	$comment = "Core $comment";
    -    }
    -    $comment = "$comment (Perl-config: $Config{config_args})";
    -    $comment = substr($comment, 0, 200) . "...)" if length $comment > 203;
    -    rename "$data->{FILE}.def", "$data->{FILE}_def.old";
    -
    -    open(DEF,">$data->{FILE}.def")
    -        or croak("Can't create $data->{FILE}.def: $!\n");
    -    print DEF "LIBRARY '$data->{DLBASE}' INITINSTANCE TERMINSTANCE\n";
    -    print DEF "DESCRIPTION '\@#$distname:$data->{VERSION}#\@ $comment'\n";
    -    print DEF "CODE LOADONCALL\n";
    -    print DEF "DATA LOADONCALL NONSHARED MULTIPLE\n";
    -    print DEF "EXPORTS\n  ";
    -    print DEF join("\n  ",@{$data->{DL_VARS}}, "\n") if @{$data->{DL_VARS}};
    -    print DEF join("\n  ",@{$data->{FUNCLIST}}, "\n") if @{$data->{FUNCLIST}};
    -    if (%{$data->{IMPORTS}}) {
    -        print DEF "IMPORTS\n";
    -	my ($name, $exp);
    -	while (($name, $exp)= each %{$data->{IMPORTS}}) {
    -	    print DEF "  $name=$exp\n";
    -	}
    -    }
    -    close DEF;
    -}
    -
    -sub _write_win32 {
    -    my($data) = @_;
    -
    -    require Config;
    -    if (not $data->{DLBASE}) {
    -        ($data->{DLBASE} = $data->{NAME}) =~ s/.*:://;
    -        $data->{DLBASE} = substr($data->{DLBASE},0,7) . '_';
    -    }
    -    rename "$data->{FILE}.def", "$data->{FILE}_def.old";
    -
    -    open(DEF,">$data->{FILE}.def")
    -        or croak("Can't create $data->{FILE}.def: $!\n");
    -    # put library name in quotes (it could be a keyword, like 'Alias')
    -    if ($Config::Config{'cc'} !~ /^gcc/i) {
    -      print DEF "LIBRARY \"$data->{DLBASE}\"\n";
    -    }
    -    print DEF "EXPORTS\n  ";
    -    my @syms;
    -    # Export public symbols both with and without underscores to
    -    # ensure compatibility between DLLs from different compilers
    -    # NOTE: DynaLoader itself only uses the names without underscores,
    -    # so this is only to cover the case when the extension DLL may be
    -    # linked to directly from C. GSAR 97-07-10
    -    if ($Config::Config{'cc'} =~ /^bcc/i) {
    -	for (@{$data->{DL_VARS}}, @{$data->{FUNCLIST}}) {
    -	    push @syms, "_$_", "$_ = _$_";
    -	}
    -    }
    -    else {
    -	for (@{$data->{DL_VARS}}, @{$data->{FUNCLIST}}) {
    -	    push @syms, "$_", "_$_ = $_";
    -	}
    -    }
    -    print DEF join("\n  ",@syms, "\n") if @syms;
    -    if (%{$data->{IMPORTS}}) {
    -        print DEF "IMPORTS\n";
    -        my ($name, $exp);
    -        while (($name, $exp)= each %{$data->{IMPORTS}}) {
    -            print DEF "  $name=$exp\n";
    -        }
    -    }
    -    close DEF;
    -}
    -
    -
    -sub _write_vms {
    -    my($data) = @_;
    -
    -    require Config; # a reminder for once we do $^O
    -    require ExtUtils::XSSymSet;
    -
    -    my($isvax) = $Config::Config{'archname'} =~ /VAX/i;
    -    my($set) = new ExtUtils::XSSymSet;
    -    my($sym);
    -
    -    rename "$data->{FILE}.opt", "$data->{FILE}.opt_old";
    -
    -    open(OPT,">$data->{FILE}.opt")
    -        or croak("Can't create $data->{FILE}.opt: $!\n");
    -
    -    # Options file declaring universal symbols
    -    # Used when linking shareable image for dynamic extension,
    -    # or when linking PerlShr into which we've added this package
    -    # as a static extension
    -    # We don't do anything to preserve order, so we won't relax
    -    # the GSMATCH criteria for a dynamic extension
    -
    -    print OPT "case_sensitive=yes\n"
    -        if $Config::Config{d_vms_case_sensitive_symbols};
    -    foreach $sym (@{$data->{FUNCLIST}}) {
    -        my $safe = $set->addsym($sym);
    -        if ($isvax) { print OPT "UNIVERSAL=$safe\n" }
    -        else        { print OPT "SYMBOL_VECTOR=($safe=PROCEDURE)\n"; }
    -    }
    -    foreach $sym (@{$data->{DL_VARS}}) {
    -        my $safe = $set->addsym($sym);
    -        print OPT "PSECT_ATTR=${sym},PIC,OVR,RD,NOEXE,WRT,NOSHR\n";
    -        if ($isvax) { print OPT "UNIVERSAL=$safe\n" }
    -        else        { print OPT "SYMBOL_VECTOR=($safe=DATA)\n"; }
    -    }
    -    close OPT;
    -
    -}
    -
    -1;
    -
    -__END__
    -
    -=head1 NAME
    -
    -ExtUtils::Mksymlists - write linker options files for dynamic extension
    -
    -=head1 SYNOPSIS
    -
    -    use ExtUtils::Mksymlists;
    -    Mksymlists({ NAME     => $name ,
    -                 DL_VARS  => [ $var1, $var2, $var3 ],
    -                 DL_FUNCS => { $pkg1 => [ $func1, $func2 ],
    -                               $pkg2 => [ $func3 ] });
    -
    -=head1 DESCRIPTION
    -
    -C produces files used by the linker under some OSs
    -during the creation of shared libraries for dynamic extensions.  It is
    -normally called from a MakeMaker-generated Makefile when the extension
    -is built.  The linker option file is generated by calling the function
    -C, which is exported by default from C.
    -It takes one argument, a list of key-value pairs, in which the following
    -keys are recognized:
    -
    -=over 4
    -
    -=item DLBASE
    -
    -This item specifies the name by which the linker knows the
    -extension, which may be different from the name of the
    -extension itself (for instance, some linkers add an '_' to the
    -name of the extension).  If it is not specified, it is derived
    -from the NAME attribute.  It is presently used only by OS2 and Win32.
    -
    -=item DL_FUNCS
    -
    -This is identical to the DL_FUNCS attribute available via MakeMaker,
    -from which it is usually taken.  Its value is a reference to an
    -associative array, in which each key is the name of a package, and
    -each value is an a reference to an array of function names which
    -should be exported by the extension.  For instance, one might say
    -C { Homer::Iliad =E [ qw(trojans greeks) ],
    -Homer::Odyssey =E [ qw(travellers family suitors) ] }>.  The
    -function names should be identical to those in the XSUB code;
    -C will alter the names written to the linker option
    -file to match the changes made by F.  In addition, if
    -none of the functions in a list begin with the string B,
    -C will add a bootstrap function for that package,
    -just as xsubpp does.  (If a BpkgE> function is
    -present in the list, it is passed through unchanged.)  If
    -DL_FUNCS is not specified, it defaults to the bootstrap
    -function for the extension specified in NAME.
    -
    -=item DL_VARS
    -
    -This is identical to the DL_VARS attribute available via MakeMaker,
    -and, like DL_FUNCS, it is usually specified via MakeMaker.  Its
    -value is a reference to an array of variable names which should
    -be exported by the extension.
    -
    -=item FILE
    -
    -This key can be used to specify the name of the linker option file
    -(minus the OS-specific extension), if for some reason you do not
    -want to use the default value, which is the last word of the NAME
    -attribute (I for C, FILE defaults to C).
    -
    -=item FUNCLIST
    -
    -This provides an alternate means to specify function names to be
    -exported from the extension.  Its value is a reference to an
    -array of function names to be exported by the extension.  These
    -names are passed through unaltered to the linker options file.
    -Specifying a value for the FUNCLIST attribute suppresses automatic
    -generation of the bootstrap function for the package. To still create
    -the bootstrap name you have to specify the package name in the
    -DL_FUNCS hash:
    -
    -    Mksymlists({ NAME     => $name ,
    -		 FUNCLIST => [ $func1, $func2 ],
    -                 DL_FUNCS => { $pkg => [] } });
    -
    -
    -=item IMPORTS
    -
    -This attribute is used to specify names to be imported into the
    -extension. It is currently only used by OS/2 and Win32.
    -
    -=item NAME
    -
    -This gives the name of the extension (I C) for which
    -the linker option file will be produced.
    -
    -=back
    -
    -When calling C, one should always specify the NAME
    -attribute.  In most cases, this is all that's necessary.  In
    -the case of unusual extensions, however, the other attributes
    -can be used to provide additional information to the linker.
    -
    -=head1 AUTHOR
    -
    -Charles Bailey Ibailey@newman.upenn.eduE>
    -
    -=head1 REVISION
    -
    -Last revised 14-Feb-1996, for Perl 5.002.
    diff --git a/lib/perl5/5.8.8/ExtUtils/NOTES b/lib/perl5/5.8.8/ExtUtils/NOTES
    deleted file mode 100644
    index cb29aecd..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/NOTES
    +++ /dev/null
    @@ -1,96 +0,0 @@
    -The Simplified MakeMaker class hierarchy
    -****************************************
    -
    -What most people need to know.
    -
    -(Subclasses on top.)
    -
    -               MY
    -                |
    -        ExtUtils::MakeMaker
    -                |
    -        ExtUtils::MM_{Current OS}
    -                |
    -        ExtUtils::MM_Unix
    -                |
    -        ExtUtils::MM_Any
    -
    -The object actually used is of the class MY which allows you to
    -override bits of MakeMaker inside your Makefile.PL by declaring
    -MY::foo() methods.
    -
    -
    -The Real MakeMaker class hierarchy
    -**********************************
    -
    -You wish it was that simple.
    -
    -Here's how it really works.
    -
    -               PACK### (created each call to ExtUtils::MakeMaker->new)
    -                    .                       |
    -                 (mixin)                    |
    -                    .                       |
    -        MY (created by ExtUtils::MY)        |
    -        |                                   |
    -        ExtUtils::MY         MM (created by ExtUtils::MM)
    -                   |          |
    -                   ExtUtils::MM
    -                    |     |   |-----------------------
    -                    |     |                          |   
    -    ExtUtils::Liblist     ExtUtils::MakeMaker        |
    -          |                                          |
    -    ExtUtils::Liblist::Kid                           |
    -                                                     |
    -                                                     |
    -                                                     |
    -                                    ExtUtils::MM_{Current OS} (if necessary)
    -                                            |
    -                                    ExtUtils::MM_Unix
    -                                            |
    -                                    ExtUtils::MM_Any
    -
    -
    -NOTE: Yes, this is a mess.  See
    -http://archive.develooper.com/makemaker@perl.org/msg00134.html
    -for some history.
    -
    -NOTE: When ExtUtils::MM is loaded it chooses a superclass for MM from
    -amongst the ExtUtils::MM_* modules based on the current operating
    -system.
    -
    -NOTE: ExtUtils::MM_{Current OS} represents one of the ExtUtils::MM_*
    -modules except ExtUtils::MM_Any chosen based on your operating system.
    -
    -NOTE: The main object used by MakeMaker is a PACK### object, *not*
    -ExtUtils::MakeMaker.  It is, effectively, a subclass of MY,
    -ExtUtils::Makemaker, ExtUtils::Liblist and ExtUtils::MM_{Current OS}
    -
    -NOTE: The methods in MY are simply copied into PACK### rather than
    -MY being a superclass of PACK###.  I don't remember the rationale.
    -
    -NOTE: ExtUtils::Liblist should be removed from the inheritence hiearchy
    -and simply be called as functions.
    -
    -NOTE: Modules like File::Spec and Exporter have been omitted for clarity.
    -
    -
    -The MM_* hierarchy
    -******************
    -
    -                               MM_Win95   MM_NW5
    -                                    \      /
    -MM_BeOS  MM_Cygwin  MM_OS2  MM_VMS  MM_Win32  MM_DOS  MM_UWIN
    -      \        |      |         |        /      /      /
    -       ------------------------------------------------
    -                           |       |
    -                        MM_Unix    |
    -                              |    |
    -                              MM_Any
    -
    -NOTE: Each direct MM_Unix subclass is also an MM_Any subclass.  This
    -is a temporary hack because MM_Unix overrides some MM_Any methods with
    -Unix specific code.  It allows the non-Unix modules to see the
    -original MM_Any implementations.
    -
    -NOTE: Modules like File::Spec and Exporter have been omitted for clarity.
    diff --git a/lib/perl5/5.8.8/ExtUtils/PATCHING b/lib/perl5/5.8.8/ExtUtils/PATCHING
    deleted file mode 100644
    index 30cb21f0..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/PATCHING
    +++ /dev/null
    @@ -1,199 +0,0 @@
    -This is a short set of guidelines for those patching
    -ExtUtils::MakeMaker.  Its not an iron-clad set of rules, but just
    -things which make life easier when reading and integrating a patch.
    -
    -Lots of information can be found in makemaker.org.
    -
    -MakerMaker is being maintained until something else can replace it.
    -Bugs will be fixed and compatibility improved, but I would like to
    -avoid new features.  If you want to add something to MakeMaker,
    -consider instead working on Module::Build, MakeMaker's heir apparent.
    -
    -
    -Reporting bugs
    -
    -- Often the only information we have for fixing a bug is contained in your
    -  report.  So...
    -
    -- Please report your bugs via http://rt.cpan.org or by mailing to
    -  makemaker@perl.org.  RT is preferred.
    -
    -- Please report your bug immediately upon encountering it.  Do not wait
    -  until you have a patch to fix the bug.  Patches are good, but not at
    -  the expense of timely bug reports.
    -
    -- Please be as verbose as possible.  Include the complete output of
    -  your 'make test' or even 'make test TEST_VERBOSE=1' and a copy of the 
    -  generated Makefile.  Err on the side of verbosity.  The more data we
    -  have to work with, the faster we can diagnose the problem.
    -
    -- If you find an undocumented feature, or if a feature has changed/been
    -  added which causes a problem, report it.  Do not assume it was done
    -  deliberately.  Even if it was done deliberately, we still want to hear
    -  if it caused problems.
    -
    -- If you're testing MakeMaker against a development version of Perl,
    -  please also check it against the latest stable version.  This makes it
    -  easier to figure out if its MakeMaker or Perl at fault.
    -
    -
    -Patching details
    -
    -- Please use unified diffs.  (diff -u)
    -
    -- Patches against the latest development snapshot from makemaker.org are 
    -  preferred.  Patches against the latest CPAN version are ok, too.
    -
    -- Post your patch to makemaker@perl.org.
    -
    -
    -Code formatting
    -
    -- No literal tabs (except where necessary inside Makefile code, obviously).
    -
    -- 4 character indentation.
    -
    -- this_style is prefered instead of studlyCaps.
    -
    -- Private subroutine names (ie. those used only in the same package
    -  they're declared in) should start with an underscore (_sekret_method).
    -
    -- Protected subroutines (ie. ones intended to be used by other modules in
    -  ExtUtils::*) should be named normally (no leading underscore) but
    -  documented as protected (see Documentation below).
    -
    -- Do not use indirect object syntax (ie. new Foo::Bar (@args))
    -
    -- make variables use dollar signs like Perl scalars.  This causes problems
    -  when you have to mix them both in a string.  If you find yourself
    -  backwacking lots of dollar signs because you have one interpolated
    -  perl variable, like this:
    -
    -    return <_foo_bar
    -
    -    Blah blah blah
    -
    -    =end private
    -
    -    =cut
    -
    -    sub _foo_bar {
    -       ...
    -
    -- If you're overriding a method, document that its an override and
    -  *why* its being overridden.  Don't repeat the original documentation.
    diff --git a/lib/perl5/5.8.8/ExtUtils/Packlist.pm b/lib/perl5/5.8.8/ExtUtils/Packlist.pm
    deleted file mode 100644
    index 11ab6371..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/Packlist.pm
    +++ /dev/null
    @@ -1,295 +0,0 @@
    -package ExtUtils::Packlist;
    -
    -use 5.00503;
    -use strict;
    -use Carp qw();
    -use vars qw($VERSION);
    -$VERSION = '0.04';
    -
    -# Used for generating filehandle globs.  IO::File might not be available!
    -my $fhname = "FH1";
    -
    -sub mkfh()
    -{
    -no strict;
    -my $fh = \*{$fhname++};
    -use strict;
    -return($fh);
    -}
    -
    -sub new($$)
    -{
    -my ($class, $packfile) = @_;
    -$class = ref($class) || $class;
    -my %self;
    -tie(%self, $class, $packfile);
    -return(bless(\%self, $class));
    -}
    -
    -sub TIEHASH
    -{
    -my ($class, $packfile) = @_;
    -my $self = { packfile => $packfile };
    -bless($self, $class);
    -$self->read($packfile) if (defined($packfile) && -f $packfile);
    -return($self);
    -}
    -
    -sub STORE
    -{
    -$_[0]->{data}->{$_[1]} = $_[2];
    -}
    -
    -sub FETCH
    -{
    -return($_[0]->{data}->{$_[1]});
    -}
    -
    -sub FIRSTKEY
    -{
    -my $reset = scalar(keys(%{$_[0]->{data}}));
    -return(each(%{$_[0]->{data}}));
    -}
    -
    -sub NEXTKEY
    -{
    -return(each(%{$_[0]->{data}}));
    -}
    -
    -sub EXISTS
    -{
    -return(exists($_[0]->{data}->{$_[1]}));
    -}
    -
    -sub DELETE
    -{
    -return(delete($_[0]->{data}->{$_[1]}));
    -}
    -
    -sub CLEAR
    -{
    -%{$_[0]->{data}} = ();
    -}
    -
    -sub DESTROY
    -{
    -}
    -
    -sub read($;$)
    -{
    -my ($self, $packfile) = @_;
    -$self = tied(%$self) || $self;
    -
    -if (defined($packfile)) { $self->{packfile} = $packfile; }
    -else { $packfile = $self->{packfile}; }
    -Carp::croak("No packlist filename specified") if (! defined($packfile));
    -my $fh = mkfh();
    -open($fh, "<$packfile") || Carp::croak("Can't open file $packfile: $!");
    -$self->{data} = {};
    -my ($line);
    -while (defined($line = <$fh>))
    -   {
    -   chomp $line;
    -   my ($key, @kvs) = $line;
    -   if ($key =~ /^(.*?)( \w+=.*)$/)
    -      {
    -      $key = $1;
    -      @kvs = split(' ', $2);
    -      }
    -   $key =~ s!/\./!/!g;   # Some .packlists have spurious '/./' bits in the paths
    -   if (! @kvs)
    -      {
    -      $self->{data}->{$key} = undef;
    -      }
    -   else
    -      {
    -      my ($data) = {};
    -      foreach my $kv (@kvs)
    -         {
    -         my ($k, $v) = split('=', $kv);
    -         $data->{$k} = $v;
    -         }
    -      $self->{data}->{$key} = $data;
    -      }
    -   }
    -close($fh);
    -}
    -
    -sub write($;$)
    -{
    -my ($self, $packfile) = @_;
    -$self = tied(%$self) || $self;
    -if (defined($packfile)) { $self->{packfile} = $packfile; }
    -else { $packfile = $self->{packfile}; }
    -Carp::croak("No packlist filename specified") if (! defined($packfile));
    -my $fh = mkfh();
    -open($fh, ">$packfile") || Carp::croak("Can't open file $packfile: $!");
    -foreach my $key (sort(keys(%{$self->{data}})))
    -   {
    -   print $fh ("$key");
    -   if (ref($self->{data}->{$key}))
    -      {
    -      my $data = $self->{data}->{$key};
    -      foreach my $k (sort(keys(%$data)))
    -         {
    -         print $fh (" $k=$data->{$k}");
    -         }
    -      }
    -   print $fh ("\n");
    -   }
    -close($fh);
    -}
    -
    -sub validate($;$)
    -{
    -my ($self, $remove) = @_;
    -$self = tied(%$self) || $self;
    -my @missing;
    -foreach my $key (sort(keys(%{$self->{data}})))
    -   {
    -   if (! -e $key)
    -      {
    -      push(@missing, $key);
    -      delete($self->{data}{$key}) if ($remove);
    -      }
    -   }
    -return(@missing);
    -}
    -
    -sub packlist_file($)
    -{
    -my ($self) = @_;
    -$self = tied(%$self) || $self;
    -return($self->{packfile});
    -}
    -
    -1;
    -
    -__END__
    -
    -=head1 NAME
    -
    -ExtUtils::Packlist - manage .packlist files
    -
    -=head1 SYNOPSIS
    -
    -   use ExtUtils::Packlist;
    -   my ($pl) = ExtUtils::Packlist->new('.packlist');
    -   $pl->read('/an/old/.packlist');
    -   my @missing_files = $pl->validate();
    -   $pl->write('/a/new/.packlist');
    -
    -   $pl->{'/some/file/name'}++;
    -      or
    -   $pl->{'/some/other/file/name'} = { type => 'file',
    -                                      from => '/some/file' };
    -
    -=head1 DESCRIPTION
    -
    -ExtUtils::Packlist provides a standard way to manage .packlist files.
    -Functions are provided to read and write .packlist files.  The original
    -.packlist format is a simple list of absolute pathnames, one per line.  In
    -addition, this package supports an extended format, where as well as a filename
    -each line may contain a list of attributes in the form of a space separated
    -list of key=value pairs.  This is used by the installperl script to
    -differentiate between files and links, for example.
    -
    -=head1 USAGE
    -
    -The hash reference returned by the new() function can be used to examine and
    -modify the contents of the .packlist.  Items may be added/deleted from the
    -.packlist by modifying the hash.  If the value associated with a hash key is a
    -scalar, the entry written to the .packlist by any subsequent write() will be a
    -simple filename.  If the value is a hash, the entry written will be the
    -filename followed by the key=value pairs from the hash.  Reading back the
    -.packlist will recreate the original entries.
    -
    -=head1 FUNCTIONS
    -
    -=over 4
    -
    -=item new()
    -
    -This takes an optional parameter, the name of a .packlist.  If the file exists,
    -it will be opened and the contents of the file will be read.  The new() method
    -returns a reference to a hash.  This hash holds an entry for each line in the
    -.packlist.  In the case of old-style .packlists, the value associated with each
    -key is undef.  In the case of new-style .packlists, the value associated with
    -each key is a hash containing the key=value pairs following the filename in the
    -.packlist.
    -
    -=item read()
    -
    -This takes an optional parameter, the name of the .packlist to be read.  If
    -no file is specified, the .packlist specified to new() will be read.  If the
    -.packlist does not exist, Carp::croak will be called.
    -
    -=item write()
    -
    -This takes an optional parameter, the name of the .packlist to be written.  If
    -no file is specified, the .packlist specified to new() will be overwritten.
    -
    -=item validate()
    -
    -This checks that every file listed in the .packlist actually exists.  If an
    -argument which evaluates to true is given, any missing files will be removed
    -from the internal hash.  The return value is a list of the missing files, which
    -will be empty if they all exist.
    -
    -=item packlist_file()
    -
    -This returns the name of the associated .packlist file
    -
    -=back
    -
    -=head1 EXAMPLE
    -
    -Here's C, a little utility to cleanly remove an installed module.
    -
    -    #!/usr/local/bin/perl -w
    -
    -    use strict;
    -    use IO::Dir;
    -    use ExtUtils::Packlist;
    -    use ExtUtils::Installed;
    -
    -    sub emptydir($) {
    -	my ($dir) = @_;
    -	my $dh = IO::Dir->new($dir) || return(0);
    -	my @count = $dh->read();
    -	$dh->close();
    -	return(@count == 2 ? 1 : 0);
    -    }
    -
    -    # Find all the installed packages
    -    print("Finding all installed modules...\n");
    -    my $installed = ExtUtils::Installed->new();
    -
    -    foreach my $module (grep(!/^Perl$/, $installed->modules())) {
    -       my $version = $installed->version($module) || "???";
    -       print("Found module $module Version $version\n");
    -       print("Do you want to delete $module? [n] ");
    -       my $r = ; chomp($r);
    -       if ($r && $r =~ /^y/i) {
    -	  # Remove all the files
    -	  foreach my $file (sort($installed->files($module))) {
    -	     print("rm $file\n");
    -	     unlink($file);
    -	  }
    -	  my $pf = $installed->packlist($module)->packlist_file();
    -	  print("rm $pf\n");
    -	  unlink($pf);
    -	  foreach my $dir (sort($installed->directory_tree($module))) {
    -	     if (emptydir($dir)) {
    -		print("rmdir $dir\n");
    -		rmdir($dir);
    -	     }
    -	  }
    -       }
    -    }
    -
    -=head1 AUTHOR
    -
    -Alan Burlison 
    -
    -=cut
    diff --git a/lib/perl5/5.8.8/ExtUtils/testlib.pm b/lib/perl5/5.8.8/ExtUtils/testlib.pm
    deleted file mode 100644
    index 043a6d40..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/testlib.pm
    +++ /dev/null
    @@ -1,37 +0,0 @@
    -package ExtUtils::testlib;
    -$VERSION = 1.15;
    -
    -use Cwd;
    -use File::Spec;
    -
    -# So the tests can chdir around and not break @INC.
    -# We use getcwd() because otherwise rel2abs will blow up under taint
    -# mode pre-5.8.  We detaint is so @INC won't be tainted.  This is
    -# no worse, and probably better, than just shoving an untainted, 
    -# relative "blib/lib" onto @INC.
    -my $cwd;
    -BEGIN {
    -    ($cwd) = getcwd() =~ /(.*)/;
    -}
    -use lib map File::Spec->rel2abs($_, $cwd), qw(blib/arch blib/lib);
    -1;
    -__END__
    -
    -=head1 NAME
    -
    -ExtUtils::testlib - add blib/* directories to @INC
    -
    -=head1 SYNOPSIS
    -
    -  use ExtUtils::testlib;
    -
    -=head1 DESCRIPTION
    -
    -After an extension has been built and before it is installed it may be
    -desirable to test it bypassing C. By adding
    -
    -    use ExtUtils::testlib;
    -
    -to a test program the intermediate directories used by C are
    -added to @INC.
    -
    diff --git a/lib/perl5/5.8.8/ExtUtils/typemap b/lib/perl5/5.8.8/ExtUtils/typemap
    deleted file mode 100644
    index 2a53b62a..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/typemap
    +++ /dev/null
    @@ -1,314 +0,0 @@
    -# basic C types
    -int			T_IV
    -unsigned		T_UV
    -unsigned int		T_UV
    -long			T_IV
    -unsigned long		T_UV
    -short			T_IV
    -unsigned short		T_UV
    -char			T_CHAR
    -unsigned char		T_U_CHAR
    -char *			T_PV
    -unsigned char *		T_PV
    -const char *		T_PV
    -caddr_t			T_PV
    -wchar_t *		T_PV
    -wchar_t			T_IV
    -# bool_t is defined in 
    -bool_t			T_IV
    -size_t			T_UV
    -ssize_t			T_IV
    -time_t			T_NV
    -unsigned long *		T_OPAQUEPTR
    -char **			T_PACKEDARRAY
    -void *			T_PTR
    -Time_t *		T_PV
    -SV *			T_SV
    -SVREF			T_SVREF
    -AV *			T_AVREF
    -HV *			T_HVREF
    -CV *			T_CVREF
    -
    -IV			T_IV
    -UV			T_UV
    -NV                      T_NV
    -I32			T_IV
    -I16			T_IV
    -I8			T_IV
    -STRLEN			T_UV
    -U32			T_U_LONG
    -U16			T_U_SHORT
    -U8			T_UV
    -Result			T_U_CHAR
    -Boolean			T_BOOL
    -float                   T_FLOAT
    -double			T_DOUBLE
    -SysRet			T_SYSRET
    -SysRetLong		T_SYSRET
    -FILE *			T_STDIO
    -PerlIO *		T_INOUT
    -FileHandle		T_PTROBJ
    -InputStream		T_IN
    -InOutStream		T_INOUT
    -OutputStream		T_OUT
    -bool			T_BOOL
    -
    -#############################################################################
    -INPUT
    -T_SV
    -	$var = $arg
    -T_SVREF
    -	if (SvROK($arg))
    -	    $var = (SV*)SvRV($arg);
    -	else
    -	    Perl_croak(aTHX_ \"$var is not a reference\")
    -T_AVREF
    -	if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV)
    -	    $var = (AV*)SvRV($arg);
    -	else
    -	    Perl_croak(aTHX_ \"$var is not an array reference\")
    -T_HVREF
    -	if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVHV)
    -	    $var = (HV*)SvRV($arg);
    -	else
    -	    Perl_croak(aTHX_ \"$var is not a hash reference\")
    -T_CVREF
    -	if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVCV)
    -	    $var = (CV*)SvRV($arg);
    -	else
    -	    Perl_croak(aTHX_ \"$var is not a code reference\")
    -T_SYSRET
    -	$var NOT IMPLEMENTED
    -T_UV
    -	$var = ($type)SvUV($arg)
    -T_IV
    -	$var = ($type)SvIV($arg)
    -T_INT
    -	$var = (int)SvIV($arg)
    -T_ENUM
    -	$var = ($type)SvIV($arg)
    -T_BOOL
    -	$var = (bool)SvTRUE($arg)
    -T_U_INT
    -	$var = (unsigned int)SvUV($arg)
    -T_SHORT
    -	$var = (short)SvIV($arg)
    -T_U_SHORT
    -	$var = (unsigned short)SvUV($arg)
    -T_LONG
    -	$var = (long)SvIV($arg)
    -T_U_LONG
    -	$var = (unsigned long)SvUV($arg)
    -T_CHAR
    -	$var = (char)*SvPV_nolen($arg)
    -T_U_CHAR
    -	$var = (unsigned char)SvUV($arg)
    -T_FLOAT
    -	$var = (float)SvNV($arg)
    -T_NV
    -	$var = ($type)SvNV($arg)
    -T_DOUBLE
    -	$var = (double)SvNV($arg)
    -T_PV
    -	$var = ($type)SvPV_nolen($arg)
    -T_PTR
    -	$var = INT2PTR($type,SvIV($arg))
    -T_PTRREF
    -	if (SvROK($arg)) {
    -	    IV tmp = SvIV((SV*)SvRV($arg));
    -	    $var = INT2PTR($type,tmp);
    -	}
    -	else
    -	    Perl_croak(aTHX_ \"$var is not a reference\")
    -T_REF_IV_REF
    -	if (sv_isa($arg, \"${ntype}\")) {
    -	    IV tmp = SvIV((SV*)SvRV($arg));
    -	    $var = *INT2PTR($type *, tmp);
    -	}
    -	else
    -	    Perl_croak(aTHX_ \"$var is not of type ${ntype}\")
    -T_REF_IV_PTR
    -	if (sv_isa($arg, \"${ntype}\")) {
    -	    IV tmp = SvIV((SV*)SvRV($arg));
    -	    $var = INT2PTR($type, tmp);
    -	}
    -	else
    -	    Perl_croak(aTHX_ \"$var is not of type ${ntype}\")
    -T_PTROBJ
    -	if (sv_derived_from($arg, \"${ntype}\")) {
    -	    IV tmp = SvIV((SV*)SvRV($arg));
    -	    $var = INT2PTR($type,tmp);
    -	}
    -	else
    -	    Perl_croak(aTHX_ \"$var is not of type ${ntype}\")
    -T_PTRDESC
    -	if (sv_isa($arg, \"${ntype}\")) {
    -	    IV tmp = SvIV((SV*)SvRV($arg));
    -	    ${type}_desc = (\U${type}_DESC\E*) tmp;
    -	    $var = ${type}_desc->ptr;
    -	}
    -	else
    -	    Perl_croak(aTHX_ \"$var is not of type ${ntype}\")
    -T_REFREF
    -	if (SvROK($arg)) {
    -	    IV tmp = SvIV((SV*)SvRV($arg));
    -	    $var = *INT2PTR($type,tmp);
    -	}
    -	else
    -	    Perl_croak(aTHX_ \"$var is not a reference\")
    -T_REFOBJ
    -	if (sv_isa($arg, \"${ntype}\")) {
    -	    IV tmp = SvIV((SV*)SvRV($arg));
    -	    $var = *INT2PTR($type,tmp);
    -	}
    -	else
    -	    Perl_croak(aTHX_ \"$var is not of type ${ntype}\")
    -T_OPAQUE
    -	$var = *($type *)SvPV_nolen($arg)
    -T_OPAQUEPTR
    -	$var = ($type)SvPV_nolen($arg)
    -T_PACKED
    -	$var = XS_unpack_$ntype($arg)
    -T_PACKEDARRAY
    -	$var = XS_unpack_$ntype($arg)
    -T_CALLBACK
    -	$var = make_perl_cb_$type($arg)
    -T_ARRAY
    -	U32 ix_$var = $argoff;
    -	$var = $ntype(items -= $argoff);
    -	while (items--) {
    -	    DO_ARRAY_ELEM;
    -	    ix_$var++;
    -	}
    -        /* this is the number of elements in the array */
    -        ix_$var -= $argoff
    -T_STDIO
    -	$var = PerlIO_findFILE(IoIFP(sv_2io($arg)))
    -T_IN
    -	$var = IoIFP(sv_2io($arg))
    -T_INOUT
    -	$var = IoIFP(sv_2io($arg))
    -T_OUT
    -	$var = IoOFP(sv_2io($arg))
    -#############################################################################
    -OUTPUT
    -T_SV
    -	$arg = $var;
    -T_SVREF
    -	$arg = newRV((SV*)$var);
    -T_AVREF
    -	$arg = newRV((SV*)$var);
    -T_HVREF
    -	$arg = newRV((SV*)$var);
    -T_CVREF
    -	$arg = newRV((SV*)$var);
    -T_IV
    -	sv_setiv($arg, (IV)$var);
    -T_UV
    -	sv_setuv($arg, (UV)$var);
    -T_INT
    -	sv_setiv($arg, (IV)$var);
    -T_SYSRET
    -	if ($var != -1) {
    -	    if ($var == 0)
    -		sv_setpvn($arg, "0 but true", 10);
    -	    else
    -		sv_setiv($arg, (IV)$var);
    -	}
    -T_ENUM
    -	sv_setiv($arg, (IV)$var);
    -T_BOOL
    -	$arg = boolSV($var);
    -T_U_INT
    -	sv_setuv($arg, (UV)$var);
    -T_SHORT
    -	sv_setiv($arg, (IV)$var);
    -T_U_SHORT
    -	sv_setuv($arg, (UV)$var);
    -T_LONG
    -	sv_setiv($arg, (IV)$var);
    -T_U_LONG
    -	sv_setuv($arg, (UV)$var);
    -T_CHAR
    -	sv_setpvn($arg, (char *)&$var, 1);
    -T_U_CHAR
    -	sv_setuv($arg, (UV)$var);
    -T_FLOAT
    -	sv_setnv($arg, (double)$var);
    -T_NV
    -	sv_setnv($arg, (NV)$var);
    -T_DOUBLE
    -	sv_setnv($arg, (double)$var);
    -T_PV
    -	sv_setpv((SV*)$arg, $var);
    -T_PTR
    -	sv_setiv($arg, PTR2IV($var));
    -T_PTRREF
    -	sv_setref_pv($arg, Nullch, (void*)$var);
    -T_REF_IV_REF
    -	sv_setref_pv($arg, \"${ntype}\", (void*)new $ntype($var));
    -T_REF_IV_PTR
    -	sv_setref_pv($arg, \"${ntype}\", (void*)$var);
    -T_PTROBJ
    -	sv_setref_pv($arg, \"${ntype}\", (void*)$var);
    -T_PTRDESC
    -	sv_setref_pv($arg, \"${ntype}\", (void*)new\U${type}_DESC\E($var));
    -T_REFREF
    -	NOT_IMPLEMENTED
    -T_REFOBJ
    -	NOT IMPLEMENTED
    -T_OPAQUE
    -	sv_setpvn($arg, (char *)&$var, sizeof($var));
    -T_OPAQUEPTR
    -	sv_setpvn($arg, (char *)$var, sizeof(*$var));
    -T_PACKED
    -	XS_pack_$ntype($arg, $var);
    -T_PACKEDARRAY
    -	XS_pack_$ntype($arg, $var, count_$ntype);
    -T_DATAUNIT	
    -	sv_setpvn($arg, $var.chp(), $var.size());
    -T_CALLBACK
    -	sv_setpvn($arg, $var.context.value().chp(),
    -		$var.context.value().size());
    -T_ARRAY
    -        {
    -	    U32 ix_$var;
    -	    EXTEND(SP,size_$var);
    -	    for (ix_$var = 0; ix_$var < size_$var; ix_$var++) {
    -		ST(ix_$var) = sv_newmortal();
    -	DO_ARRAY_ELEM
    -	    }
    -        }
    -T_STDIO
    -	{
    -	    GV *gv = newGVgen("$Package");
    -	    PerlIO *fp = PerlIO_importFILE($var,0);
    -	    if ( fp && do_open(gv, "+<&", 3, FALSE, 0, 0, fp) )
    -		sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
    -	    else
    -		$arg = &PL_sv_undef;
    -	}
    -T_IN
    -	{
    -	    GV *gv = newGVgen("$Package");
    -	    if ( do_open(gv, "<&", 2, FALSE, 0, 0, $var) )
    -		sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
    -	    else
    -		$arg = &PL_sv_undef;
    -	}
    -T_INOUT
    -	{
    -	    GV *gv = newGVgen("$Package");
    -	    if ( do_open(gv, "+<&", 3, FALSE, 0, 0, $var) )
    -		sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
    -	    else
    -		$arg = &PL_sv_undef;
    -	}
    -T_OUT
    -	{
    -	    GV *gv = newGVgen("$Package");
    -	    if ( do_open(gv, "+>&", 3, FALSE, 0, 0, $var) )
    -		sv_setsv($arg, sv_bless(newRV((SV*)gv), gv_stashpv("$Package",1)));
    -	    else
    -		$arg = &PL_sv_undef;
    -	}
    diff --git a/lib/perl5/5.8.8/ExtUtils/xsubpp b/lib/perl5/5.8.8/ExtUtils/xsubpp
    deleted file mode 100644
    index 9be40e64..00000000
    --- a/lib/perl5/5.8.8/ExtUtils/xsubpp
    +++ /dev/null
    @@ -1,1908 +0,0 @@
    -#!./miniperl
    -
    -=head1 NAME
    -
    -xsubpp - compiler to convert Perl XS code into C code
    -
    -=head1 SYNOPSIS
    -
    -B [B<-v>] [B<-C++>] [B<-csuffix csuffix>] [B<-except>] [B<-s pattern>] [B<-prototypes>] [B<-noversioncheck>] [B<-nolinenumbers>] [B<-nooptimize>] [B<-typemap typemap>] ... file.xs
    -
    -=head1 DESCRIPTION
    -
    -This compiler is typically run by the makefiles created by L.
    -
    -I will compile XS code into C code by embedding the constructs
    -necessary to let C functions manipulate Perl values and creates the glue
    -necessary to let Perl access those functions.  The compiler uses typemaps to
    -determine how to map C function parameters and variables to Perl values.
    -
    -The compiler will search for typemap files called I.  It will use
    -the following search path to find default typemaps, with the rightmost
    -typemap taking precedence.
    -
    -	../../../typemap:../../typemap:../typemap:typemap
    -
    -=head1 OPTIONS
    -
    -Note that the C MakeMaker option may be used to add these options to
    -any makefiles generated by MakeMaker.
    -
    -=over 5
    -
    -=item B<-C++>
    -
    -Adds ``extern "C"'' to the C code.
    -
    -=item B<-csuffix csuffix>
    -
    -Set the suffix used for the generated C or C++ code.  Defaults to '.c'
    -(even with B<-C++>), but some platforms might want to have e.g. '.cpp'.
    -Don't forget the '.' from the front.
    -
    -=item B<-hiertype>
    -
    -Retains '::' in type names so that C++ hierachical types can be mapped.
    -
    -=item B<-except>
    -
    -Adds exception handling stubs to the C code.
    -
    -=item B<-typemap typemap>
    -
    -Indicates that a user-supplied typemap should take precedence over the
    -default typemaps.  This option may be used multiple times, with the last
    -typemap having the highest precedence.
    -
    -=item B<-v>
    -
    -Prints the I version number to standard output, then exits.
    -
    -=item B<-prototypes>
    -
    -By default I will not automatically generate prototype code for
    -all xsubs. This flag will enable prototypes.
    -
    -=item B<-noversioncheck>
    -
    -Disables the run time test that determines if the object file (derived
    -from the C<.xs> file) and the C<.pm> files have the same version
    -number.
    -
    -=item B<-nolinenumbers>
    -
    -Prevents the inclusion of `#line' directives in the output.
    -
    -=item B<-nooptimize>
    -
    -Disables certain optimizations.  The only optimization that is currently
    -affected is the use of Is by the output C code (see L).
    -This may significantly slow down the generated code, but this is the way
    -B of 5.005 and earlier operated.
    -
    -=item B<-noinout>
    -
    -Disable recognition of C, C and C declarations.
    -
    -=item B<-noargtypes>
    -
    -Disable recognition of ANSI-like descriptions of function signature.
    -
    -=back
    -
    -=head1 ENVIRONMENT
    -
    -No environment variables are used.
    -
    -=head1 AUTHOR
    -
    -Larry Wall
    -
    -=head1 MODIFICATION HISTORY
    -
    -See the file F.
    -
    -=head1 SEE ALSO
    -
    -perl(1), perlxs(1), perlxstut(1)
    -
    -=cut
    -
    -require 5.002;
    -use Cwd;
    -use vars qw($cplusplus $hiertype);
    -use vars '%v';
    -
    -use Config;
    -
    -sub Q ;
    -
    -# Global Constants
    -
    -$XSUBPP_version = "1.9508";
    -
    -my ($Is_VMS, $SymSet);
    -if ($^O eq 'VMS') {
    -    $Is_VMS = 1;
    -    # Establish set of global symbols with max length 28, since xsubpp
    -    # will later add the 'XS_' prefix.
    -    require ExtUtils::XSSymSet;
    -    $SymSet = new ExtUtils::XSSymSet 28;
    -}
    -
    -$FH = 'File0000' ;
    -
    -$usage = "Usage: xsubpp [-v] [-C++] [-csuffix csuffix] [-except] [-prototypes] [-noversioncheck] [-nolinenumbers] [-nooptimize] [-noinout] [-noargtypes] [-s pattern] [-typemap typemap]... file.xs\n";
    -
    -$proto_re = "[" . quotemeta('\$%&*@;[]') . "]" ;
    -
    -$except = "";
    -$WantPrototypes = -1 ;
    -$WantVersionChk = 1 ;
    -$ProtoUsed = 0 ;
    -$WantLineNumbers = 1 ;
    -$WantOptimize = 1 ;
    -$Overload = 0;
    -$Fallback = 'PL_sv_undef';
    -
    -my $process_inout = 1;
    -my $process_argtypes = 1;
    -my $csuffix = '.c';
    -
    -SWITCH: while (@ARGV and $ARGV[0] =~ /^-./) {
    -    $flag = shift @ARGV;
    -    $flag =~ s/^-// ;
    -    $spat = quotemeta shift,	next SWITCH	if $flag eq 's';
    -    $cplusplus = 1,	next SWITCH	if $flag eq 'C++';
    -    $csuffix   = shift,	next SWITCH	if $flag eq 'csuffix';
    -    $hiertype  = 1,	next SWITCH	if $flag eq 'hiertype';
    -    $WantPrototypes = 0, next SWITCH	if $flag eq 'noprototypes';
    -    $WantPrototypes = 1, next SWITCH	if $flag eq 'prototypes';
    -    $WantVersionChk = 0, next SWITCH	if $flag eq 'noversioncheck';
    -    $WantVersionChk = 1, next SWITCH	if $flag eq 'versioncheck';
    -    # XXX left this in for compat
    -    next SWITCH                         if $flag eq 'object_capi';
    -    $except = " TRY",	next SWITCH	if $flag eq 'except';
    -    push(@tm,shift),	next SWITCH	if $flag eq 'typemap';
    -    $WantLineNumbers = 0, next SWITCH	if $flag eq 'nolinenumbers';
    -    $WantLineNumbers = 1, next SWITCH	if $flag eq 'linenumbers';
    -    $WantOptimize = 0, next SWITCH	if $flag eq 'nooptimize';
    -    $WantOptimize = 1, next SWITCH	if $flag eq 'optimize';
    -    $process_inout = 0, next SWITCH	if $flag eq 'noinout';
    -    $process_inout = 1, next SWITCH	if $flag eq 'inout';
    -    $process_argtypes = 0, next SWITCH	if $flag eq 'noargtypes';
    -    $process_argtypes = 1, next SWITCH	if $flag eq 'argtypes';
    -    (print "xsubpp version $XSUBPP_version\n"), exit
    -	if $flag eq 'v';
    -    die $usage;
    -}
    -if ($WantPrototypes == -1)
    -  { $WantPrototypes = 0}
    -else
    -  { $ProtoUsed = 1 }
    -
    -
    -@ARGV == 1 or die $usage;
    -($dir, $filename) = $ARGV[0] =~ m#(.*)/(.*)#
    -	or ($dir, $filename) = $ARGV[0] =~ m#(.*)\\(.*)#
    -	or ($dir, $filename) = $ARGV[0] =~ m#(.*[>\]])(.*)#
    -	or ($dir, $filename) = ('.', $ARGV[0]);
    -chdir($dir);
    -$pwd = cwd();
    -
    -++ $IncludedFiles{$ARGV[0]} ;
    -
    -my(@XSStack) = ({type => 'none'});	# Stack of conditionals and INCLUDEs
    -my($XSS_work_idx, $cpp_next_tmp) = (0, "XSubPPtmpAAAA");
    -
    -
    -sub TrimWhitespace
    -{
    -    $_[0] =~ s/^\s+|\s+$//go ;
    -}
    -
    -sub TidyType
    -{
    -    local ($_) = @_ ;
    -
    -    # rationalise any '*' by joining them into bunches and removing whitespace
    -    s#\s*(\*+)\s*#$1#g;
    -    s#(\*+)# $1 #g ;
    -
    -    # change multiple whitespace into a single space
    -    s/\s+/ /g ;
    -
    -    # trim leading & trailing whitespace
    -    TrimWhitespace($_) ;
    -
    -    $_ ;
    -}
    -
    -$typemap = shift @ARGV;
    -foreach $typemap (@tm) {
    -    die "Can't find $typemap in $pwd\n" unless -r $typemap;
    -}
    -unshift @tm, qw(../../../../lib/ExtUtils/typemap ../../../lib/ExtUtils/typemap
    -                ../../lib/ExtUtils/typemap ../../../typemap ../../typemap
    -                ../typemap typemap);
    -foreach $typemap (@tm) {
    -    next unless -f $typemap ;
    -    # skip directories, binary files etc.
    -    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;
    -    $mode = 'Typemap';
    -    $junk = "" ;
    -    $current = \$junk;
    -    while () {
    -	next if /^\s*#/;
    -        my $line_no = $. + 1;
    -	if (/^INPUT\s*$/)   { $mode = 'Input';   $current = \$junk;  next; }
    -	if (/^OUTPUT\s*$/)  { $mode = 'Output';  $current = \$junk;  next; }
    -	if (/^TYPEMAP\s*$/) { $mode = 'Typemap'; $current = \$junk;  next; }
    -	if ($mode eq 'Typemap') {
    -	    chomp;
    -	    my $line = $_ ;
    -            TrimWhitespace($_) ;
    -	    # skip blank lines and comment lines
    -	    next if /^$/ or /^#/ ;
    -	    my($type,$kind, $proto) = /^\s*(.*?\S)\s+(\S+)\s*($proto_re*)\s*$/ or
    -		warn("Warning: File '$typemap' Line $. '$line' TYPEMAP entry needs 2 or 3 columns\n"), next;
    -            $type = TidyType($type) ;
    -	    $type_kind{$type} = $kind ;
    -            # prototype defaults to '$'
    -            $proto = "\$" unless $proto ;
    -            warn("Warning: File '$typemap' Line $. '$line' Invalid prototype '$proto'\n")
    -                unless ValidProtoString($proto) ;
    -            $proto_letter{$type} = C_string($proto) ;
    -	}
    -	elsif (/^\s/) {
    -	    $$current .= $_;
    -	}
    -	elsif ($mode eq 'Input') {
    -	    s/\s+$//;
    -	    $input_expr{$_} = '';
    -	    $current = \$input_expr{$_};
    -	}
    -	else {
    -	    s/\s+$//;
    -	    $output_expr{$_} = '';
    -	    $current = \$output_expr{$_};
    -	}
    -    }
    -    close(TYPEMAP);
    -}
    -
    -foreach $key (keys %input_expr) {
    -    $input_expr{$key} =~ s/;*\s+\z//;
    -}
    -
    -$bal = qr[(?:(?>[^()]+)|\((??{ $bal })\))*];	# ()-balanced
    -$cast = qr[(?:\(\s*SV\s*\*\s*\)\s*)?];		# Optional (SV*) cast
    -$size = qr[,\s* (??{ $bal }) ]x;		# Third arg (to setpvn)
    -
    -foreach $key (keys %output_expr) {
    -    use re 'eval';
    -
    -    my ($t, $with_size, $arg, $sarg) =
    -      ($output_expr{$key} =~
    -	 m[^ \s+ sv_set ( [iunp] ) v (n)? 	# Type, is_setpvn
    -	     \s* \( \s* $cast \$arg \s* ,
    -	     \s* ( (??{ $bal }) )		# Set from
    -	     ( (??{ $size }) )?			# Possible sizeof set-from
    -	     \) \s* ; \s* $
    -	  ]x);
    -    $targetable{$key} = [$t, $with_size, $arg, $sarg] if $t;
    -}
    -
    -$END = "!End!\n\n";		# "impossible" keyword (multiple newline)
    -
    -# Match an XS keyword
    -$BLOCK_re= '\s*(' . join('|', qw(
    -	REQUIRE BOOT CASE PREINIT INPUT INIT CODE PPCODE OUTPUT
    -	CLEANUP ALIAS ATTRS PROTOTYPES PROTOTYPE VERSIONCHECK INCLUDE
    -	SCOPE INTERFACE INTERFACE_MACRO C_ARGS POSTCALL OVERLOAD FALLBACK
    -	)) . "|$END)\\s*:";
    -
    -# Input:  ($_, @line) == unparsed input.
    -# Output: ($_, @line) == (rest of line, following lines).
    -# Return: the matched keyword if found, otherwise 0
    -sub check_keyword {
    -	$_ = shift(@line) while !/\S/ && @line;
    -	s/^(\s*)($_[0])\s*:\s*(?:#.*)?/$1/s && $2;
    -}
    -
    -my ($C_group_rex, $C_arg);
    -# Group in C (no support for comments or literals)
    -$C_group_rex = qr/ [({\[]
    -		   (?: (?> [^()\[\]{}]+ ) | (??{ $C_group_rex }) )*
    -		   [)}\]] /x ;
    -# Chunk in C without comma at toplevel (no comments):
    -$C_arg = qr/ (?: (?> [^()\[\]{},"']+ )
    -	     |   (??{ $C_group_rex })
    -	     |   " (?: (?> [^\\"]+ )
    -		   |   \\.
    -		   )* "		# String literal
    -	     |   ' (?: (?> [^\\']+ ) | \\. )* ' # Char literal
    -	     )* /xs;
    -
    -if ($WantLineNumbers) {
    -    {
    -	package xsubpp::counter;
    -	sub TIEHANDLE {
    -	    my ($class, $cfile) = @_;
    -	    my $buf = "";
    -	    $SECTION_END_MARKER = "#line --- \"$cfile\"";
    -	    $line_no = 1;
    -	    bless \$buf;
    -	}
    -
    -	sub PRINT {
    -	    my $self = shift;
    -	    for (@_) {
    -		$$self .= $_;
    -		while ($$self =~ s/^([^\n]*\n)//) {
    -		    my $line = $1;
    -		    ++ $line_no;
    -		    $line =~ s|^\#line\s+---(?=\s)|#line $line_no|;
    -		    print STDOUT $line;
    -		}
    -	    }
    -	}
    -
    -	sub PRINTF {
    -	    my $self = shift;
    -	    my $fmt = shift;
    -	    $self->PRINT(sprintf($fmt, @_));
    -	}
    -
    -	sub DESTROY {
    -	    # Not necessary if we're careful to end with a "\n"
    -	    my $self = shift;
    -	    print STDOUT $$self;
    -	}
    -    }
    -
    -    my $cfile = $filename;
    -    $cfile =~ s/\.xs$/$csuffix/i or $cfile .= $csuffix;
    -    tie(*PSEUDO_STDOUT, 'xsubpp::counter', $cfile);
    -    select PSEUDO_STDOUT;
    -}
    -
    -sub print_section {
    -    # the "do" is required for right semantics
    -    do { $_ = shift(@line) } while !/\S/ && @line;
    -
    -    print("#line ", $line_no[@line_no - @line -1], " \"$filename\"\n")
    -	if $WantLineNumbers && !/^\s*#\s*line\b/ && !/^#if XSubPPtmp/;
    -    for (;  defined($_) && !/^$BLOCK_re/o;  $_ = shift(@line)) {
    -	print "$_\n";
    -    }
    -    print "$xsubpp::counter::SECTION_END_MARKER\n" if $WantLineNumbers;
    -}
    -
    -sub merge_section {
    -    my $in = '';
    -
    -    while (!/\S/ && @line) {
    -        $_ = shift(@line);
    -    }
    -
    -    for (;  defined($_) && !/^$BLOCK_re/o;  $_ = shift(@line)) {
    -	$in .= "$_\n";
    -    }
    -    chomp $in;
    -    return $in;
    -}
    -
    -sub process_keyword($)
    -{
    -    my($pattern) = @_ ;
    -    my $kwd ;
    -
    -    &{"${kwd}_handler"}()
    -        while $kwd = check_keyword($pattern) ;
    -}
    -
    -sub CASE_handler {
    -    blurt ("Error: `CASE:' after unconditional `CASE:'")
    -	if $condnum && $cond eq '';
    -    $cond = $_;
    -    TrimWhitespace($cond);
    -    print "   ", ($condnum++ ? " else" : ""), ($cond ? " if ($cond)\n" : "\n");
    -    $_ = '' ;
    -}
    -
    -sub INPUT_handler {
    -    for (;  !/^$BLOCK_re/o;  $_ = shift(@line)) {
    -	last if /^\s*NOT_IMPLEMENTED_YET/;
    -	next unless /\S/;	# skip blank lines
    -
    -	TrimWhitespace($_) ;
    -	my $line = $_ ;
    -
    -	# remove trailing semicolon if no initialisation
    -	s/\s*;$//g unless /[=;+].*\S/ ;
    -
    -	# Process the length(foo) declarations
    -	if (s/^([^=]*)\blength\(\s*(\w+)\s*\)\s*$/$1 XSauto_length_of_$2=NO_INIT/x) {
    -	  print "\tSTRLEN\tSTRLEN_length_of_$2;\n";
    -	  $lengthof{$2} = $name;
    -	  # $islengthof{$name} = $1;
    -	  $deferred .= "\n\tXSauto_length_of_$2 = STRLEN_length_of_$2;";
    -	}
    -
    -	# check for optional initialisation code
    -	my $var_init = '' ;
    -	$var_init = $1 if s/\s*([=;+].*)$//s ;
    -	$var_init =~ s/"/\\"/g;
    -
    -	s/\s+/ /g;
    -	my ($var_type, $var_addr, $var_name) = /^(.*?[^&\s])\s*(\&?)\s*\b(\w+)$/s
    -	    or blurt("Error: invalid argument declaration '$line'"), next;
    -
    -	# Check for duplicate definitions
    -	blurt ("Error: duplicate definition of argument '$var_name' ignored"), next
    -	    if $arg_list{$var_name}++
    -	      or defined $argtype_seen{$var_name} and not $processing_arg_with_types;
    -
    -	$thisdone |= $var_name eq "THIS";
    -	$retvaldone |= $var_name eq "RETVAL";
    -	$var_types{$var_name} = $var_type;
    -	# XXXX This check is a safeguard against the unfinished conversion of
    -	# generate_init().  When generate_init() is fixed,
    -	# one can use 2-args map_type() unconditionally.
    -	if ($var_type =~ / \( \s* \* \s* \) /x) {
    -	  # Function pointers are not yet supported with &output_init!
    -	  print "\t" . &map_type($var_type, $var_name);
    -	  $name_printed = 1;
    -	} else {
    -	  print "\t" . &map_type($var_type);
    -	  $name_printed = 0;
    -	}
    -	$var_num = $args_match{$var_name};
    -
    -        $proto_arg[$var_num] = ProtoString($var_type)
    -	    if $var_num ;
    -	$func_args =~ s/\b($var_name)\b/&$1/ if $var_addr;
    -	if ($var_init =~ /^[=;]\s*NO_INIT\s*;?\s*$/
    -	    or $in_out{$var_name} and $in_out{$var_name} =~ /^OUT/
    -	    and $var_init !~ /\S/) {
    -	  if ($name_printed) {
    -	    print ";\n";
    -	  } else {
    -	    print "\t$var_name;\n";
    -	  }
    -	} elsif ($var_init =~ /\S/) {
    -	    &output_init($var_type, $var_num, $var_name, $var_init, $name_printed);
    -	} elsif ($var_num) {
    -	    # generate initialization code
    -	    &generate_init($var_type, $var_num, $var_name, $name_printed);
    -	} else {
    -	    print ";\n";
    -	}
    -    }
    -}
    -
    -sub OUTPUT_handler {
    -    for (;  !/^$BLOCK_re/o;  $_ = shift(@line)) {
    -	next unless /\S/;
    -	if (/^\s*SETMAGIC\s*:\s*(ENABLE|DISABLE)\s*/) {
    -	    $DoSetMagic = ($1 eq "ENABLE" ? 1 : 0);
    -	    next;
    -	}
    -	my ($outarg, $outcode) = /^\s*(\S+)\s*(.*?)\s*$/s ;
    -	blurt ("Error: duplicate OUTPUT argument '$outarg' ignored"), next
    -	    if $outargs{$outarg} ++ ;
    -	if (!$gotRETVAL and $outarg eq 'RETVAL') {
    -	    # deal with RETVAL last
    -	    $RETVAL_code = $outcode ;
    -	    $gotRETVAL = 1 ;
    -	    next ;
    -	}
    -	blurt ("Error: OUTPUT $outarg not an argument"), next
    -	    unless defined($args_match{$outarg});
    -	blurt("Error: No input definition for OUTPUT argument '$outarg' - ignored"), next
    -	    unless defined $var_types{$outarg} ;
    -	$var_num = $args_match{$outarg};
    -	if ($outcode) {
    -	    print "\t$outcode\n";
    -	    print "\tSvSETMAGIC(ST(" , $var_num-1 , "));\n" if $DoSetMagic;
    -	} else {
    -	    &generate_output($var_types{$outarg}, $var_num, $outarg, $DoSetMagic);
    -	}
    -	delete $in_out{$outarg} 	# No need to auto-OUTPUT
    -	  if exists $in_out{$outarg} and $in_out{$outarg} =~ /OUT$/;
    -    }
    -}
    -
    -sub C_ARGS_handler() {
    -    my $in = merge_section();
    -
    -    TrimWhitespace($in);
    -    $func_args = $in;
    -}
    -
    -sub INTERFACE_MACRO_handler() {
    -    my $in = merge_section();
    -
    -    TrimWhitespace($in);
    -    if ($in =~ /\s/) {		# two
    -        ($interface_macro, $interface_macro_set) = split ' ', $in;
    -    } else {
    -        $interface_macro = $in;
    -	$interface_macro_set = 'UNKNOWN_CVT'; # catch later
    -    }
    -    $interface = 1;		# local
    -    $Interfaces = 1;		# global
    -}
    -
    -sub INTERFACE_handler() {
    -    my $in = merge_section();
    -
    -    TrimWhitespace($in);
    -
    -    foreach (split /[\s,]+/, $in) {
    -        $Interfaces{$_} = $_;
    -    }
    -    print Q<<"EOF";
    -#	XSFUNCTION = $interface_macro($ret_type,cv,XSANY.any_dptr);
    -EOF
    -    $interface = 1;		# local
    -    $Interfaces = 1;		# global
    -}
    -
    -sub CLEANUP_handler() { print_section() }
    -sub PREINIT_handler() { print_section() }
    -sub POSTCALL_handler() { print_section() }
    -sub INIT_handler()    { print_section() }
    -
    -sub GetAliases
    -{
    -    my ($line) = @_ ;
    -    my ($orig) = $line ;
    -    my ($alias) ;
    -    my ($value) ;
    -
    -    # Parse alias definitions
    -    # format is
    -    #    alias = value alias = value ...
    -
    -    while ($line =~ s/^\s*([\w:]+)\s*=\s*(\w+)\s*//) {
    -        $alias = $1 ;
    -        $orig_alias = $alias ;
    -        $value = $2 ;
    -
    -        # check for optional package definition in the alias
    -	$alias = $Packprefix . $alias if $alias !~ /::/ ;
    -
    -        # check for duplicate alias name & duplicate value
    -	Warn("Warning: Ignoring duplicate alias '$orig_alias'")
    -	    if defined $XsubAliases{$alias} ;
    -
    -	Warn("Warning: Aliases '$orig_alias' and '$XsubAliasValues{$value}' have identical values")
    -	    if $XsubAliasValues{$value} ;
    -
    -	$XsubAliases = 1;
    -	$XsubAliases{$alias} = $value ;
    -	$XsubAliasValues{$value} = $orig_alias ;
    -    }
    -
    -    blurt("Error: Cannot parse ALIAS definitions from '$orig'")
    -        if $line ;
    -}
    -
    -sub ATTRS_handler ()
    -{
    -    for (;  !/^$BLOCK_re/o;  $_ = shift(@line)) {
    -	next unless /\S/;
    -	TrimWhitespace($_) ;
    -        push @Attributes, $_;
    -    }
    -}
    -
    -sub ALIAS_handler ()
    -{
    -    for (;  !/^$BLOCK_re/o;  $_ = shift(@line)) {
    -	next unless /\S/;
    -	TrimWhitespace($_) ;
    -        GetAliases($_) if $_ ;
    -    }
    -}
    -
    -sub OVERLOAD_handler()
    -{
    -    for (;  !/^$BLOCK_re/o;  $_ = shift(@line)) {
    -	next unless /\S/;
    -	TrimWhitespace($_) ;
    -        while ( s/^\s*([\w:"\\)\+\-\*\/\%\<\>\.\&\|\^\!\~\{\}\=]+)\s*//) {
    -	    $Overload = 1 unless $Overload;
    -	    my $overload = "$Package\::(".$1 ;
    -            push(@InitFileCode,
    -    	     "        newXS(\"$overload\", XS_$Full_func_name, file$proto);\n");
    -        }
    -    }
    -
    -}
    -
    -sub FALLBACK_handler()
    -{
    -    # the rest of the current line should contain either TRUE, 
    -    # FALSE or UNDEF
    -
    -    TrimWhitespace($_) ;
    -    my %map = (
    -	TRUE => "PL_sv_yes", 1 => "PL_sv_yes",
    -	FALSE => "PL_sv_no", 0 => "PL_sv_no",
    -	UNDEF => "PL_sv_undef",
    -    ) ;
    -
    -    # check for valid FALLBACK value
    -    death ("Error: FALLBACK: TRUE/FALSE/UNDEF") unless exists $map{uc $_} ;
    -
    -    $Fallback = $map{uc $_} ;
    -}
    -
    -sub REQUIRE_handler ()
    -{
    -    # the rest of the current line should contain a version number
    -    my ($Ver) = $_ ;
    -
    -    TrimWhitespace($Ver) ;
    -
    -    death ("Error: REQUIRE expects a version number")
    -	unless $Ver ;
    -
    -    # check that the version number is of the form n.n
    -    death ("Error: REQUIRE: expected a number, got '$Ver'")
    -	unless $Ver =~ /^\d+(\.\d*)?/ ;
    -
    -    death ("Error: xsubpp $Ver (or better) required--this is only $XSUBPP_version.")
    -        unless $XSUBPP_version >= $Ver ;
    -}
    -
    -sub VERSIONCHECK_handler ()
    -{
    -    # the rest of the current line should contain either ENABLE or
    -    # DISABLE
    -
    -    TrimWhitespace($_) ;
    -
    -    # check for ENABLE/DISABLE
    -    death ("Error: VERSIONCHECK: ENABLE/DISABLE")
    -        unless /^(ENABLE|DISABLE)/i ;
    -
    -    $WantVersionChk = 1 if $1 eq 'ENABLE' ;
    -    $WantVersionChk = 0 if $1 eq 'DISABLE' ;
    -
    -}
    -
    -sub PROTOTYPE_handler ()
    -{
    -    my $specified ;
    -
    -    death("Error: Only 1 PROTOTYPE definition allowed per xsub")
    -        if $proto_in_this_xsub ++ ;
    -
    -    for (;  !/^$BLOCK_re/o;  $_ = shift(@line)) {
    -	next unless /\S/;
    -	$specified = 1 ;
    -	TrimWhitespace($_) ;
    -        if ($_ eq 'DISABLE') {
    -	   $ProtoThisXSUB = 0
    -        }
    -        elsif ($_ eq 'ENABLE') {
    -	   $ProtoThisXSUB = 1
    -        }
    -        else {
    -            # remove any whitespace
    -            s/\s+//g ;
    -            death("Error: Invalid prototype '$_'")
    -                unless ValidProtoString($_) ;
    -            $ProtoThisXSUB = C_string($_) ;
    -        }
    -    }
    -
    -    # If no prototype specified, then assume empty prototype ""
    -    $ProtoThisXSUB = 2 unless $specified ;
    -
    -    $ProtoUsed = 1 ;
    -
    -}
    -
    -sub SCOPE_handler ()
    -{
    -    death("Error: Only 1 SCOPE declaration allowed per xsub")
    -        if $scope_in_this_xsub ++ ;
    -
    -    for (;  !/^$BLOCK_re/o;  $_ = shift(@line)) {
    -		next unless /\S/;
    -		TrimWhitespace($_) ;
    -        if ($_ =~ /^DISABLE/i) {
    -		   $ScopeThisXSUB = 0
    -        }
    -        elsif ($_ =~ /^ENABLE/i) {
    -		   $ScopeThisXSUB = 1
    -        }
    -    }
    -
    -}
    -
    -sub PROTOTYPES_handler ()
    -{
    -    # the rest of the current line should contain either ENABLE or
    -    # DISABLE
    -
    -    TrimWhitespace($_) ;
    -
    -    # check for ENABLE/DISABLE
    -    death ("Error: PROTOTYPES: ENABLE/DISABLE")
    -        unless /^(ENABLE|DISABLE)/i ;
    -
    -    $WantPrototypes = 1 if $1 eq 'ENABLE' ;
    -    $WantPrototypes = 0 if $1 eq 'DISABLE' ;
    -    $ProtoUsed = 1 ;
    -
    -}
    -
    -sub INCLUDE_handler ()
    -{
    -    # the rest of the current line should contain a valid filename
    -
    -    TrimWhitespace($_) ;
    -
    -    death("INCLUDE: filename missing")
    -        unless $_ ;
    -
    -    death("INCLUDE: output pipe is illegal")
    -        if /^\s*\|/ ;
    -
    -    # simple minded recursion detector
    -    death("INCLUDE loop detected")
    -        if $IncludedFiles{$_} ;
    -
    -    ++ $IncludedFiles{$_} unless /\|\s*$/ ;
    -
    -    # Save the current file context.
    -    push(@XSStack, {
    -	type		=> 'file',
    -        LastLine        => $lastline,
    -        LastLineNo      => $lastline_no,
    -        Line            => \@line,
    -        LineNo          => \@line_no,
    -        Filename        => $filename,
    -        Handle          => $FH,
    -        }) ;
    -
    -    ++ $FH ;
    -
    -    # open the new file
    -    open ($FH, "$_") or death("Cannot open '$_': $!") ;
    -
    -    print Q<<"EOF" ;
    -#
    -#/* INCLUDE:  Including '$_' from '$filename' */
    -#
    -EOF
    -
    -    $filename = $_ ;
    -
    -    # Prime the pump by reading the first
    -    # non-blank line
    -
    -    # skip leading blank lines
    -    while (<$FH>) {
    -        last unless /^\s*$/ ;
    -    }
    -
    -    $lastline = $_ ;
    -    $lastline_no = $. ;
    -
    -}
    -
    -sub PopFile()
    -{
    -    return 0 unless $XSStack[-1]{type} eq 'file' ;
    -
    -    my $data     = pop @XSStack ;
    -    my $ThisFile = $filename ;
    -    my $isPipe   = ($filename =~ /\|\s*$/) ;
    -
    -    -- $IncludedFiles{$filename}
    -        unless $isPipe ;
    -
    -    close $FH ;
    -
    -    $FH         = $data->{Handle} ;
    -    $filename   = $data->{Filename} ;
    -    $lastline   = $data->{LastLine} ;
    -    $lastline_no = $data->{LastLineNo} ;
    -    @line       = @{ $data->{Line} } ;
    -    @line_no    = @{ $data->{LineNo} } ;
    -
    -    if ($isPipe and $? ) {
    -        -- $lastline_no ;
    -        print STDERR "Error reading from pipe '$ThisFile': $! in $filename, line $lastline_no\n"  ;
    -        exit 1 ;
    -    }
    -
    -    print Q<<"EOF" ;
    -#
    -#/* INCLUDE: Returning to '$filename' from '$ThisFile' */
    -#
    -EOF
    -
    -    return 1 ;
    -}
    -
    -sub ValidProtoString ($)
    -{
    -    my($string) = @_ ;
    -
    -    if ( $string =~ /^$proto_re+$/ ) {
    -        return $string ;
    -    }
    -
    -    return 0 ;
    -}
    -
    -sub C_string ($)
    -{
    -    my($string) = @_ ;
    -
    -    $string =~ s[\\][\\\\]g ;
    -    $string ;
    -}
    -
    -sub ProtoString ($)
    -{
    -    my ($type) = @_ ;
    -
    -    $proto_letter{$type} or "\$" ;
    -}
    -
    -sub check_cpp {
    -    my @cpp = grep(/^\#\s*(?:if|e\w+)/, @line);
    -    if (@cpp) {
    -	my ($cpp, $cpplevel);
    -	for $cpp (@cpp) {
    -	    if ($cpp =~ /^\#\s*if/) {
    -		$cpplevel++;
    -	    } elsif (!$cpplevel) {
    -		Warn("Warning: #else/elif/endif without #if in this function");
    -		print STDERR "    (precede it with a blank line if the matching #if is outside the function)\n"
    -		    if $XSStack[-1]{type} eq 'if';
    -		return;
    -	    } elsif ($cpp =~ /^\#\s*endif/) {
    -		$cpplevel--;
    -	    }
    -	}
    -	Warn("Warning: #if without #endif in this function") if $cpplevel;
    -    }
    -}
    -
    -
    -sub Q {
    -    my($text) = @_;
    -    $text =~ s/^#//gm;
    -    $text =~ s/\[\[/{/g;
    -    $text =~ s/\]\]/}/g;
    -    $text;
    -}
    -
    -open($FH, $filename) or die "cannot open $filename: $!\n";
    -
    -# Identify the version of xsubpp used
    -print <) {
    -    if (/^=/) {
    -        my $podstartline = $.;
    -    	do {
    -	    if (/^=cut\s*$/) {
    -		# We can't just write out a /* */ comment, as our embedded
    -		# POD might itself be in a comment. We can't put a /**/
    -		# comment inside #if 0, as the C standard says that the source
    -		# file is decomposed into preprocessing characters in the stage
    -		# before preprocessing commands are executed.
    -		# I don't want to leave the text as barewords, because the spec
    -		# isn't clear whether macros are expanded before or after
    -		# preprocessing commands are executed, and someone pathological
    -		# may just have defined one of the 3 words as a macro that does
    -		# something strange. Multiline strings are illegal in C, so
    -		# the "" we write must be a string literal. And they aren't
    -		# concatenated until 2 steps later, so we are safe.
    -		print("#if 0\n  \"Skipped embedded POD.\"\n#endif\n");
    -		printf("#line %d \"$filename\"\n", $. + 1)
    -		  if $WantLineNumbers;
    -		next firstmodule
    -	    }
    -
    -	} while (<$FH>);
    -	# At this point $. is at end of file so die won't state the start
    -	# of the problem, and as we haven't yet read any lines &death won't
    -	# show the correct line in the message either.
    -	die ("Error: Unterminated pod in $filename, line $podstartline\n")
    -	  unless $lastline;
    -    }
    -    last if ($Module, $Package, $Prefix) =
    -	/^MODULE\s*=\s*([\w:]+)(?:\s+PACKAGE\s*=\s*([\w:]+))?(?:\s+PREFIX\s*=\s*(\S+))?\s*$/;
    -
    -    print $_;
    -}
    -&Exit unless defined $_;
    -
    -print "$xsubpp::counter::SECTION_END_MARKER\n" if $WantLineNumbers;
    -
    -$lastline    = $_;
    -$lastline_no = $.;
    -
    -# Read next xsub into @line from ($lastline, <$FH>).
    -sub fetch_para {
    -    # parse paragraph
    -    death ("Error: Unterminated `#if/#ifdef/#ifndef'")
    -	if !defined $lastline && $XSStack[-1]{type} eq 'if';
    -    @line = ();
    -    @line_no = () ;
    -    return PopFile() if !defined $lastline;
    -
    -    if ($lastline =~
    -	/^MODULE\s*=\s*([\w:]+)(?:\s+PACKAGE\s*=\s*([\w:]+))?(?:\s+PREFIX\s*=\s*(\S+))?\s*$/) {
    -	$Module = $1;
    -	$Package = defined($2) ? $2 : '';	# keep -w happy
    -	$Prefix  = defined($3) ? $3 : '';	# keep -w happy
    -	$Prefix = quotemeta $Prefix ;
    -	($Module_cname = $Module) =~ s/\W/_/g;
    -	($Packid = $Package) =~ tr/:/_/;
    -	$Packprefix = $Package;
    -	$Packprefix .= "::" if $Packprefix ne "";
    -	$lastline = "";
    -    }
    -
    -    for(;;) {
    -	# Skip embedded PODs
    -	while ($lastline =~ /^=/) {
    -    	    while ($lastline = <$FH>) {
    -	    	last if ($lastline =~ /^=cut\s*$/);
    -	    }
    -	    death ("Error: Unterminated pod") unless $lastline;
    -	    $lastline = <$FH>;
    -	    chomp $lastline;
    -	    $lastline =~ s/^\s+$//;
    -	}
    -	if ($lastline !~ /^\s*#/ ||
    -	    # CPP directives:
    -	    #	ANSI:	if ifdef ifndef elif else endif define undef
    -	    #		line error pragma
    -	    #	gcc:	warning include_next
    -	    #   obj-c:	import
    -	    #   others:	ident (gcc notes that some cpps have this one)
    -	    $lastline =~ /^#[ \t]*(?:(?:if|ifn?def|elif|else|endif|define|undef|pragma|error|warning|line\s+\d+|ident)\b|(?:include(?:_next)?|import)\s*["<].*[>"])/) {
    -	    last if $lastline =~ /^\S/ && @line && $line[-1] eq "";
    -	    push(@line, $lastline);
    -	    push(@line_no, $lastline_no) ;
    -	}
    -
    -	# Read next line and continuation lines
    -	last unless defined($lastline = <$FH>);
    -	$lastline_no = $.;
    -	my $tmp_line;
    -	$lastline .= $tmp_line
    -	    while ($lastline =~ /\\$/ && defined($tmp_line = <$FH>));
    -
    -	chomp $lastline;
    -	$lastline =~ s/^\s+$//;
    -    }
    -    pop(@line), pop(@line_no) while @line && $line[-1] eq "";
    -    1;
    -}
    -
    -PARAGRAPH:
    -while (fetch_para()) {
    -    # Print initial preprocessor statements and blank lines
    -    while (@line && $line[0] !~ /^[^\#]/) {
    -	my $line = shift(@line);
    -	print $line, "\n";
    -	next unless $line =~ /^\#\s*((if)(?:n?def)?|elsif|else|endif)\b/;
    -	my $statement = $+;
    -	if ($statement eq 'if') {
    -	    $XSS_work_idx = @XSStack;
    -	    push(@XSStack, {type => 'if'});
    -	} else {
    -	    death ("Error: `$statement' with no matching `if'")
    -		if $XSStack[-1]{type} ne 'if';
    -	    if ($XSStack[-1]{varname}) {
    -		push(@InitFileCode, "#endif\n");
    -		push(@BootCode,     "#endif");
    -	    }
    -
    -	    my(@fns) = keys %{$XSStack[-1]{functions}};
    -	    if ($statement ne 'endif') {
    -		# Hide the functions defined in other #if branches, and reset.
    -		@{$XSStack[-1]{other_functions}}{@fns} = (1) x @fns;
    -		@{$XSStack[-1]}{qw(varname functions)} = ('', {});
    -	    } else {
    -		my($tmp) = pop(@XSStack);
    -		0 while (--$XSS_work_idx
    -			 && $XSStack[$XSS_work_idx]{type} ne 'if');
    -		# Keep all new defined functions
    -		push(@fns, keys %{$tmp->{other_functions}});
    -		@{$XSStack[$XSS_work_idx]{functions}}{@fns} = (1) x @fns;
    -	    }
    -	}
    -    }
    -
    -    next PARAGRAPH unless @line;
    -
    -    if ($XSS_work_idx && !$XSStack[$XSS_work_idx]{varname}) {
    -	# We are inside an #if, but have not yet #defined its xsubpp variable.
    -	print "#define $cpp_next_tmp 1\n\n";
    -	push(@InitFileCode, "#if $cpp_next_tmp\n");
    -	push(@BootCode,     "#if $cpp_next_tmp");
    -	$XSStack[$XSS_work_idx]{varname} = $cpp_next_tmp++;
    -    }
    -
    -    death ("Code is not inside a function"
    -	   ." (maybe last function was ended by a blank line "
    -	   ." followed by a statement on column one?)")
    -	if $line[0] =~ /^\s/;
    -
    -    # initialize info arrays
    -    undef(%args_match);
    -    undef(%var_types);
    -    undef(%defaults);
    -    undef($class);
    -    undef($externC);
    -    undef($static);
    -    undef($elipsis);
    -    undef($wantRETVAL) ;
    -    undef($RETVAL_no_return) ;
    -    undef(%arg_list) ;
    -    undef(@proto_arg) ;
    -    undef(@fake_INPUT_pre) ;	# For length(s) generated variables
    -    undef(@fake_INPUT) ;
    -    undef($processing_arg_with_types) ;
    -    undef(%argtype_seen) ;
    -    undef(@outlist) ;
    -    undef(%in_out) ;
    -    undef(%lengthof) ;
    -    # undef(%islengthof) ;
    -    undef($proto_in_this_xsub) ;
    -    undef($scope_in_this_xsub) ;
    -    undef($interface);
    -    undef($prepush_done);
    -    $interface_macro = 'XSINTERFACE_FUNC' ;
    -    $interface_macro_set = 'XSINTERFACE_FUNC_SET' ;
    -    $ProtoThisXSUB = $WantPrototypes ;
    -    $ScopeThisXSUB = 0;
    -    $xsreturn = 0;
    -
    -    $_ = shift(@line);
    -    while ($kwd = check_keyword("REQUIRE|PROTOTYPES|FALLBACK|VERSIONCHECK|INCLUDE")) {
    -        &{"${kwd}_handler"}() ;
    -        next PARAGRAPH unless @line ;
    -        $_ = shift(@line);
    -    }
    -
    -    if (check_keyword("BOOT")) {
    -	&check_cpp;
    -	push (@BootCode, "#line $line_no[@line_no - @line] \"$filename\"")
    -	  if $WantLineNumbers && $line[0] !~ /^\s*#\s*line\b/;
    -        push (@BootCode, @line, "") ;
    -        next PARAGRAPH ;
    -    }
    -
    -
    -    # extract return type, function name and arguments
    -    ($ret_type) = TidyType($_);
    -    $RETVAL_no_return = 1 if $ret_type =~ s/^NO_OUTPUT\s+//;
    -
    -    # Allow one-line ANSI-like declaration
    -    unshift @line, $2
    -      if $process_argtypes
    -	and $ret_type =~ s/^(.*?\w.*?)\s*\b(\w+\s*\(.*)/$1/s;
    -
    -    # a function definition needs at least 2 lines
    -    blurt ("Error: Function definition too short '$ret_type'"), next PARAGRAPH
    -	unless @line ;
    -
    -    $externC = 1 if $ret_type =~ s/^extern "C"\s+//;
    -    $static  = 1 if $ret_type =~ s/^static\s+//;
    -
    -    $func_header = shift(@line);
    -    blurt ("Error: Cannot parse function definition from '$func_header'"), next PARAGRAPH
    -	unless $func_header =~ /^(?:([\w:]*)::)?(\w+)\s*\(\s*(.*?)\s*\)\s*(const)?\s*(;\s*)?$/s;
    -
    -    ($class, $func_name, $orig_args) =  ($1, $2, $3) ;
    -    $class = "$4 $class" if $4;
    -    ($pname = $func_name) =~ s/^($Prefix)?/$Packprefix/;
    -    ($clean_func_name = $func_name) =~ s/^$Prefix//;
    -    $Full_func_name = "${Packid}_$clean_func_name";
    -    if ($Is_VMS) { $Full_func_name = $SymSet->addsym($Full_func_name); }
    -
    -    # Check for duplicate function definition
    -    for $tmp (@XSStack) {
    -	next unless defined $tmp->{functions}{$Full_func_name};
    -	Warn("Warning: duplicate function definition '$clean_func_name' detected");
    -	last;
    -    }
    -    $XSStack[$XSS_work_idx]{functions}{$Full_func_name} ++ ;
    -    %XsubAliases = %XsubAliasValues = %Interfaces = @Attributes = ();
    -    $DoSetMagic = 1;
    -
    -    $orig_args =~ s/\\\s*/ /g;		# process line continuations
    -
    -    my %only_C_inlist;	# Not in the signature of Perl function
    -    if ($process_argtypes and $orig_args =~ /\S/) {
    -	my $args = "$orig_args ,";
    -	if ($args =~ /^( (??{ $C_arg }) , )* $ /x) {
    -	    @args = ($args =~ /\G ( (??{ $C_arg }) ) , /xg);
    -	    for ( @args ) {
    -		s/^\s+//;
    -		s/\s+$//;
    -		my ($arg, $default) = / ( [^=]* ) ( (?: = .* )? ) /x;
    -		my ($pre, $name) = ($arg =~ /(.*?) \s*
    -					     \b ( \w+ | length\( \s*\w+\s* \) )
    -					     \s* $ /x);
    -		next unless length $pre;
    -		my $out_type;
    -		my $inout_var;
    -		if ($process_inout and s/^(IN|IN_OUTLIST|OUTLIST|OUT|IN_OUT)\s+//) {
    -		    my $type = $1;
    -		    $out_type = $type if $type ne 'IN';
    -		    $arg =~ s/^(IN|IN_OUTLIST|OUTLIST|OUT|IN_OUT)\s+//;
    -		    $pre =~ s/^(IN|IN_OUTLIST|OUTLIST|OUT|IN_OUT)\s+//;
    -		}
    -		my $islength;
    -		if ($name =~ /^length\( \s* (\w+) \s* \)\z/x) {
    -		  $name = "XSauto_length_of_$1";
    -		  $islength = 1;
    -		  die "Default value on length() argument: `$_'"
    -		    if length $default;
    -		}
    -		if (length $pre or $islength) {	# Has a type
    -		    if ($islength) {
    -		      push @fake_INPUT_pre, $arg;
    -		    } else {
    -		      push @fake_INPUT, $arg;
    -		    }
    -		    # warn "pushing '$arg'\n";
    -		    $argtype_seen{$name}++;
    -		    $_ = "$name$default"; # Assigns to @args
    -		}
    -		$only_C_inlist{$_} = 1 if $out_type eq "OUTLIST" or $islength;
    -		push @outlist, $name if $out_type =~ /OUTLIST$/;
    -		$in_out{$name} = $out_type if $out_type;
    -	    }
    -	} else {
    -	    @args = split(/\s*,\s*/, $orig_args);
    -	    Warn("Warning: cannot parse argument list '$orig_args', fallback to split");
    -	}
    -    } else {
    -	@args = split(/\s*,\s*/, $orig_args);
    -	for (@args) {
    -	    if ($process_inout and s/^(IN|IN_OUTLIST|OUTLIST|IN_OUT|OUT)\s+//) {
    -		my $out_type = $1;
    -		next if $out_type eq 'IN';
    -		$only_C_inlist{$_} = 1 if $out_type eq "OUTLIST";
    -		push @outlist, $name if $out_type =~ /OUTLIST$/;
    -		$in_out{$_} = $out_type;
    -	    }
    -	}
    -    }
    -    if (defined($class)) {
    -	my $arg0 = ((defined($static) or $func_name eq 'new')
    -		    ? "CLASS" : "THIS");
    -	unshift(@args, $arg0);
    -	($report_args = "$arg0, $report_args") =~ s/^\w+, $/$arg0/;
    -    }
    -    my $extra_args = 0;
    -    @args_num = ();
    -    $num_args = 0;
    -    my $report_args = '';
    -    foreach $i (0 .. $#args) {
    -	    if ($args[$i] =~ s/\.\.\.//) {
    -		    $elipsis = 1;
    -		    if ($args[$i] eq '' && $i == $#args) {
    -		        $report_args .= ", ...";
    -			pop(@args);
    -			last;
    -		    }
    -	    }
    -	    if ($only_C_inlist{$args[$i]}) {
    -		push @args_num, undef;
    -	    } else {
    -		push @args_num, ++$num_args;
    -		$report_args .= ", $args[$i]";
    -	    }
    -	    if ($args[$i] =~ /^([^=]*[^\s=])\s*=\s*(.*)/s) {
    -		    $extra_args++;
    -		    $args[$i] = $1;
    -		    $defaults{$args[$i]} = $2;
    -		    $defaults{$args[$i]} =~ s/"/\\"/g;
    -	    }
    -	    $proto_arg[$i+1] = "\$" ;
    -    }
    -    $min_args = $num_args - $extra_args;
    -    $report_args =~ s/"/\\"/g;
    -    $report_args =~ s/^,\s+//;
    -    my @func_args = @args;
    -    shift @func_args if defined($class);
    -
    -    for (@func_args) {
    -	s/^/&/ if $in_out{$_};
    -    }
    -    $func_args = join(", ", @func_args);
    -    @args_match{@args} = @args_num;
    -
    -    $PPCODE = grep(/^\s*PPCODE\s*:/, @line);
    -    $CODE = grep(/^\s*CODE\s*:/, @line);
    -    # Detect CODE: blocks which use ST(n)= or XST_m*(n,v)
    -    #   to set explicit return values.
    -    $EXPLICIT_RETURN = ($CODE &&
    -		("@line" =~ /(\bST\s*\([^;]*=) | (\bXST_m\w+\s*\()/x ));
    -    $ALIAS  = grep(/^\s*ALIAS\s*:/,  @line);
    -    $INTERFACE  = grep(/^\s*INTERFACE\s*:/,  @line);
    -
    -    $xsreturn = 1 if $EXPLICIT_RETURN;
    -
    -    $externC = $externC ? qq[extern "C"] : "";
    -
    -    # print function header
    -    print Q<<"EOF";
    -#$externC
    -#XS(XS_${Full_func_name}); /* prototype to pass -Wmissing-prototypes */
    -#XS(XS_${Full_func_name})
    -#[[
    -#    dXSARGS;
    -EOF
    -    print Q<<"EOF" if $ALIAS ;
    -#    dXSI32;
    -EOF
    -    print Q<<"EOF" if $INTERFACE ;
    -#    dXSFUNCTION($ret_type);
    -EOF
    -    if ($elipsis) {
    -	$cond = ($min_args ? qq(items < $min_args) : 0);
    -    }
    -    elsif ($min_args == $num_args) {
    -	$cond = qq(items != $min_args);
    -    }
    -    else {
    -	$cond = qq(items < $min_args || items > $num_args);
    -    }
    -
    -    print Q<<"EOF" if $except;
    -#    char errbuf[1024];
    -#    *errbuf = '\0';
    -EOF
    -
    -    if ($ALIAS)
    -      { print Q<<"EOF" if $cond }
    -#    if ($cond)
    -#       Perl_croak(aTHX_ "Usage: %s($report_args)", GvNAME(CvGV(cv)));
    -EOF
    -    else
    -      { print Q<<"EOF" if $cond }
    -#    if ($cond)
    -#	Perl_croak(aTHX_ "Usage: $pname($report_args)");
    -EOF
    -
    -    #gcc -Wall: if an xsub has no arguments and PPCODE is used
    -    #it is likely none of ST, XSRETURN or XSprePUSH macros are used
    -    #hence `ax' (setup by dXSARGS) is unused
    -    #XXX: could breakup the dXSARGS; into dSP;dMARK;dITEMS
    -    #but such a move could break third-party extensions
    -    print Q<<"EOF" if $PPCODE and $num_args == 0;
    -#   PERL_UNUSED_VAR(ax); /* -Wall */
    -EOF
    -
    -    print Q<<"EOF" if $PPCODE;
    -#    SP -= items;
    -EOF
    -
    -    # Now do a block of some sort.
    -
    -    $condnum = 0;
    -    $cond = '';			# last CASE: condidional
    -    push(@line, "$END:");
    -    push(@line_no, $line_no[-1]);
    -    $_ = '';
    -    &check_cpp;
    -    while (@line) {
    -	&CASE_handler if check_keyword("CASE");
    -	print Q<<"EOF";
    -#   $except [[
    -EOF
    -
    -	# do initialization of input variables
    -	$thisdone = 0;
    -	$retvaldone = 0;
    -	$deferred = "";
    -	%arg_list = () ;
    -        $gotRETVAL = 0;
    -
    -	INPUT_handler() ;
    -	process_keyword("INPUT|PREINIT|INTERFACE_MACRO|C_ARGS|ALIAS|ATTRS|PROTOTYPE|SCOPE|OVERLOAD") ;
    -
    -	print Q<<"EOF" if $ScopeThisXSUB;
    -#   ENTER;
    -#   [[
    -EOF
    -	
    -	if (!$thisdone && defined($class)) {
    -	    if (defined($static) or $func_name eq 'new') {
    -		print "\tchar *";
    -		$var_types{"CLASS"} = "char *";
    -		&generate_init("char *", 1, "CLASS");
    -	    }
    -	    else {
    -		print "\t$class *";
    -		$var_types{"THIS"} = "$class *";
    -		&generate_init("$class *", 1, "THIS");
    -	    }
    -	}
    -
    -	# do code
    -	if (/^\s*NOT_IMPLEMENTED_YET/) {
    -		print "\n\tPerl_croak(aTHX_ \"$pname: not implemented yet\");\n";
    -		$_ = '' ;
    -	} else {
    -		if ($ret_type ne "void") {
    -			print "\t" . &map_type($ret_type, 'RETVAL') . ";\n"
    -				if !$retvaldone;
    -			$args_match{"RETVAL"} = 0;
    -			$var_types{"RETVAL"} = $ret_type;
    -			print "\tdXSTARG;\n"
    -				if $WantOptimize and $targetable{$type_kind{$ret_type}};
    -		}
    -
    -		if (@fake_INPUT or @fake_INPUT_pre) {
    -		    unshift @line, @fake_INPUT_pre, @fake_INPUT, $_;
    -		    $_ = "";
    -		    $processing_arg_with_types = 1;
    -		    INPUT_handler() ;
    -		}
    -		print $deferred;
    -
    -        process_keyword("INIT|ALIAS|ATTRS|PROTOTYPE|INTERFACE_MACRO|INTERFACE|C_ARGS|OVERLOAD") ;
    -
    -		if (check_keyword("PPCODE")) {
    -			print_section();
    -			death ("PPCODE must be last thing") if @line;
    -			print "\tLEAVE;\n" if $ScopeThisXSUB;
    -			print "\tPUTBACK;\n\treturn;\n";
    -		} elsif (check_keyword("CODE")) {
    -			print_section() ;
    -		} elsif (defined($class) and $func_name eq "DESTROY") {
    -			print "\n\t";
    -			print "delete THIS;\n";
    -		} else {
    -			print "\n\t";
    -			if ($ret_type ne "void") {
    -				print "RETVAL = ";
    -				$wantRETVAL = 1;
    -			}
    -			if (defined($static)) {
    -			    if ($func_name eq 'new') {
    -				$func_name = "$class";
    -			    } else {
    -				print "${class}::";
    -			    }
    -			} elsif (defined($class)) {
    -			    if ($func_name eq 'new') {
    -				$func_name .= " $class";
    -			    } else {
    -				print "THIS->";
    -			    }
    -			}
    -			$func_name =~ s/^($spat)//
    -			    if defined($spat);
    -			$func_name = 'XSFUNCTION' if $interface;
    -			print "$func_name($func_args);\n";
    -		}
    -	}
    -
    -	# do output variables
    -	$gotRETVAL = 0;		# 1 if RETVAL seen in OUTPUT section;
    -	undef $RETVAL_code ;	# code to set RETVAL (from OUTPUT section);
    -	# $wantRETVAL set if 'RETVAL =' autogenerated
    -	($wantRETVAL, $ret_type) = (0, 'void') if $RETVAL_no_return;
    -	undef %outargs ;
    -	process_keyword("POSTCALL|OUTPUT|ALIAS|ATTRS|PROTOTYPE|OVERLOAD");
    -
    -	&generate_output($var_types{$_}, $args_match{$_}, $_, $DoSetMagic)
    -	  for grep $in_out{$_} =~ /OUT$/, keys %in_out;
    -
    -	# all OUTPUT done, so now push the return value on the stack
    -	if ($gotRETVAL && $RETVAL_code) {
    -	    print "\t$RETVAL_code\n";
    -	} elsif ($gotRETVAL || $wantRETVAL) {
    -	    my $t = $WantOptimize && $targetable{$type_kind{$ret_type}};
    -	    my $var = 'RETVAL';
    -	    my $type = $ret_type;
    -
    -	    # 0: type, 1: with_size, 2: how, 3: how_size
    -	    if ($t and not $t->[1] and $t->[0] eq 'p') {
    -		# PUSHp corresponds to setpvn.  Treate setpv directly
    -		my $what = eval qq("$t->[2]");
    -		warn $@ if $@;
    -
    -		print "\tsv_setpv(TARG, $what); XSprePUSH; PUSHTARG;\n";
    -		$prepush_done = 1;
    -	    }
    -	    elsif ($t) {
    -		my $what = eval qq("$t->[2]");
    -		warn $@ if $@;
    -
    -		my $size = $t->[3];
    -		$size = '' unless defined $size;
    -		$size = eval qq("$size");
    -		warn $@ if $@;
    -		print "\tXSprePUSH; PUSH$t->[0]($what$size);\n";
    -		$prepush_done = 1;
    -	    }
    -	    else {
    -		# RETVAL almost never needs SvSETMAGIC()
    -		&generate_output($ret_type, 0, 'RETVAL', 0);
    -	    }
    -	}
    -
    -	$xsreturn = 1 if $ret_type ne "void";
    -	my $num = $xsreturn;
    -	my $c = @outlist;
    -	# (PP)CODE set different values of SP; reset to PPCODE's with 0 output
    -	print "\tXSprePUSH;"    if $c and not $prepush_done;
    -	# Take into account stuff already put on stack
    -	print "\t++SP;"         if $c and not $prepush_done and $xsreturn;
    -	# Now SP corresponds to ST($xsreturn), so one can combine PUSH and ST()
    -	print "\tEXTEND(SP,$c);\n" if $c;
    -	$xsreturn += $c;
    -	generate_output($var_types{$_}, $num++, $_, 0, 1) for @outlist;
    -
    -	# do cleanup
    -	process_keyword("CLEANUP|ALIAS|ATTRS|PROTOTYPE|OVERLOAD") ;
    -
    -	print Q<<"EOF" if $ScopeThisXSUB;
    -#   ]]
    -EOF
    -	print Q<<"EOF" if $ScopeThisXSUB and not $PPCODE;
    -#   LEAVE;
    -EOF
    -
    -	# print function trailer
    -	print Q<= $num) {\\n$expr;\\n\\t}\\n"/;
    -	    } else {
    -		$deferred .= eval qq/"\\n\\tif (items < $num)\\n\\t    $var = $defaults{$var};\\n\\telse {\\n$expr;\\n\\t}\\n"/;
    -	    }
    -	    warn $@   if  $@;
    -    } elsif ($ScopeThisXSUB or $expr !~ /^\s*\$var =/) {
    -	    if ($name_printed) {
    -	      print ";\n";
    -	    } else {
    -	      eval qq/print "\\t$var;\\n"/;
    -	      warn $@   if  $@;
    -	    }
    -	    $deferred .= eval qq/"\\n$expr;\\n"/;
    -	    warn $@   if  $@;
    -    } else {
    -	    die "panic: do not know how to handle this branch for function pointers"
    -	      if $name_printed;
    -	    eval qq/print "$expr;\\n"/;
    -	    warn $@   if  $@;
    -    }
    -}
    -
    -sub generate_output {
    -    local($type, $num, $var, $do_setmagic, $do_push) = @_;
    -    local($arg) = "ST(" . ($num - ($num != 0)) . ")";
    -    local($argoff) = $num - 1;
    -    local($ntype);
    -
    -    $type = TidyType($type) ;
    -    if ($type =~ /^array\(([^,]*),(.*)\)/) {
    -            print "\t$arg = sv_newmortal();\n";
    -	    print "\tsv_setpvn($arg, (char *)$var, $2 * sizeof($1));\n";
    -	    print "\tSvSETMAGIC($arg);\n" if $do_setmagic;
    -    } else {
    -	    blurt("Error: '$type' not in typemap"), return
    -		unless defined($type_kind{$type});
    -            blurt("Error: No OUTPUT definition for type '$type', typekind '$type_kind{$type}' found"), return
    -                unless defined $output_expr{$type_kind{$type}} ;
    -	    ($ntype = $type) =~ s/\s*\*/Ptr/g;
    -	    $ntype =~ s/\(\)//g;
    -	    ($subtype = $ntype) =~ s/(?:Array)?(?:Ptr)?$//;
    -	    $expr = $output_expr{$type_kind{$type}};
    -	    if ($expr =~ /DO_ARRAY_ELEM/) {
    -	        blurt("Error: '$subtype' not in typemap"), return
    -		    unless defined($type_kind{$subtype});
    -                blurt("Error: No OUTPUT definition for type '$subtype', typekind '$type_kind{$subtype}' found"), return
    -                    unless defined $output_expr{$type_kind{$subtype}} ;
    -		$subexpr = $output_expr{$type_kind{$subtype}};
    -		$subexpr =~ s/ntype/subtype/g;
    -		$subexpr =~ s/\$arg/ST(ix_$var)/g;
    -		$subexpr =~ s/\$var/${var}[ix_$var]/g;
    -		$subexpr =~ s/\n\t/\n\t\t/g;
    -		$expr =~ s/DO_ARRAY_ELEM\n/$subexpr/;
    -		eval "print qq\a$expr\a";
    -		warn $@   if  $@;
    -		print "\t\tSvSETMAGIC(ST(ix_$var));\n" if $do_setmagic;
    -	    }
    -	    elsif ($var eq 'RETVAL') {
    -		if ($expr =~ /^\t\$arg = new/) {
    -		    # We expect that $arg has refcnt 1, so we need to
    -		    # mortalize it.
    -		    eval "print qq\a$expr\a";
    -		    warn $@   if  $@;
    -		    print "\tsv_2mortal(ST($num));\n";
    -		    print "\tSvSETMAGIC(ST($num));\n" if $do_setmagic;
    -		}
    -		elsif ($expr =~ /^\s*\$arg\s*=/) {
    -		    # We expect that $arg has refcnt >=1, so we need
    -		    # to mortalize it!
    -		    eval "print qq\a$expr\a";
    -		    warn $@   if  $@;
    -		    print "\tsv_2mortal(ST(0));\n";
    -		    print "\tSvSETMAGIC(ST(0));\n" if $do_setmagic;
    -		}
    -		else {
    -		    # Just hope that the entry would safely write it
    -		    # over an already mortalized value. By
    -		    # coincidence, something like $arg = &sv_undef
    -		    # works too.
    -		    print "\tST(0) = sv_newmortal();\n";
    -		    eval "print qq\a$expr\a";
    -		    warn $@   if  $@;
    -		    # new mortals don't have set magic
    -		}
    -	    }
    -	    elsif ($do_push) {
    -	        print "\tPUSHs(sv_newmortal());\n";
    -		$arg = "ST($num)";
    -		eval "print qq\a$expr\a";
    -		warn $@   if  $@;
    -		print "\tSvSETMAGIC($arg);\n" if $do_setmagic;
    -	    }
    -	    elsif ($arg =~ /^ST\(\d+\)$/) {
    -		eval "print qq\a$expr\a";
    -		warn $@   if  $@;
    -		print "\tSvSETMAGIC($arg);\n" if $do_setmagic;
    -	    }
    -    }
    -}
    -
    -sub map_type {
    -    my($type, $varname) = @_;
    -
    -    # C++ has :: in types too so skip this
    -    $type =~ tr/:/_/ unless $hiertype;
    -    $type =~ s/^array\(([^,]*),(.*)\).*/$1 */s;
    -    if ($varname) {
    -      if ($varname && $type =~ / \( \s* \* (?= \s* \) ) /xg) {
    -	(substr $type, pos $type, 0) = " $varname ";
    -      } else {
    -	$type .= "\t$varname";
    -      }
    -    }
    -    $type;
    -}
    -
    -
    -sub Exit {
    -# If this is VMS, the exit status has meaning to the shell, so we
    -# use a predictable value (SS$_Normal or SS$_Abort) rather than an
    -# arbitrary number.
    -#    exit ($Is_VMS ? ($errors ? 44 : 1) : $errors) ;
    -    exit ($errors ? 1 : 0);
    -}
    diff --git a/lib/perl5/5.8.8/Locale/Constants.pod b/lib/perl5/5.8.8/Locale/Constants.pod
    deleted file mode 100644
    index ae42abbe..00000000
    --- a/lib/perl5/5.8.8/Locale/Constants.pod
    +++ /dev/null
    @@ -1,76 +0,0 @@
    -
    -=head1 NAME
    -
    -Locale::Constants - constants for Locale codes
    -
    -=head1 SYNOPSIS
    -
    -    use Locale::Constants;
    -    
    -    $codeset = LOCALE_CODE_ALPHA_2;
    -
    -=head1 DESCRIPTION
    -
    -B defines symbols which are used in
    -the four modules from the Locale-Codes distribution:
    -
    -	Locale::Language
    -	Locale::Country
    -	Locale::Currency
    -	Locale::Script
    -
    -B at the moment only Locale::Country and Locale::Script
    -support more than one code set.
    -
    -The symbols defined are used to specify which codes you
    -want to be used:
    -
    -	LOCALE_CODE_ALPHA_2
    -	LOCALE_CODE_ALPHA_3
    -	LOCALE_CODE_NUMERIC
    -
    -You shouldn't have to C this module directly yourself -
    -it is used by the three Locale modules, which in turn export
    -the symbols.
    -
    -=head1 KNOWN BUGS AND LIMITATIONS
    -
    -None at the moment.
    -
    -=head1 SEE ALSO
    -
    -=over 4
    -
    -=item Locale::Language
    -
    -Codes for identification of languages.
    -
    -=item Locale::Country
    -
    -Codes for identification of countries.
    -
    -=item Locale::Script
    -
    -Codes for identification of scripts.
    -
    -=item Locale::Currency
    -
    -Codes for identification of currencies and funds.
    -
    -=back
    -
    -=head1 AUTHOR
    -
    -Neil Bowers Eneil@bowers.comE
    -
    -=head1 COPYRIGHT
    -
    -Copyright (C) 2002-2004, Neil Bowers.
    -
    -Copyright (C) 2001, Canon Research Centre Europe (CRE).
    -
    -This module is free software; you can redistribute it and/or
    -modify it under the same terms as Perl itself.
    -
    -=cut
    -
    diff --git a/lib/perl5/5.8.8/Locale/Country.pod b/lib/perl5/5.8.8/Locale/Country.pod
    deleted file mode 100644
    index b13cd22a..00000000
    --- a/lib/perl5/5.8.8/Locale/Country.pod
    +++ /dev/null
    @@ -1,306 +0,0 @@
    -
    -=head1 NAME
    -
    -Locale::Country - ISO codes for country identification (ISO 3166)
    -
    -=head1 SYNOPSIS
    -
    -    use Locale::Country;
    -    
    -    $country = code2country('jp');        # $country gets 'Japan'
    -    $code    = country2code('Norway');    # $code gets 'no'
    -    
    -    @codes   = all_country_codes();
    -    @names   = all_country_names();
    -    
    -    # semi-private routines
    -    Locale::Country::alias_code('uk' => 'gb');
    -    Locale::Country::rename_country('gb' => 'Great Britain');
    -
    -
    -=head1 DESCRIPTION
    -
    -The C module provides access to the ISO
    -codes for identifying countries, as defined in ISO 3166-1.
    -You can either access the codes via the L
    -(described below), or with the two functions which return lists
    -of all country codes or all country names.
    -
    -There are three different code sets you can use for identifying
    -countries:
    -
    -=over 4
    -
    -=item B
    -
    -Two letter codes, such as 'tv' for Tuvalu.
    -This code set is identified with the symbol C.
    -
    -=item B
    -
    -Three letter codes, such as 'brb' for Barbados.
    -This code set is identified with the symbol C.
    -
    -=item B
    -
    -Numeric codes, such as 064 for Bhutan.
    -This code set is identified with the symbol C.
    -
    -=back
    -
    -All of the routines take an optional additional argument
    -which specifies the code set to use.
    -If not specified, it defaults to the two-letter codes.
    -This is partly for backwards compatibility (previous versions
    -of this module only supported the alpha-2 codes), and
    -partly because they are the most widely used codes.
    -
    -The alpha-2 and alpha-3 codes are not case-dependent,
    -so you can use 'BO', 'Bo', 'bO' or 'bo' for Bolivia.
    -When a code is returned by one of the functions in
    -this module, it will always be lower-case.
    -
    -As of version 2.00, Locale::Country supports variant
    -names for countries. So, for example, the country code for "United States"
    -is "us", so country2code('United States') returns 'us'.
    -Now the following will also return 'us':
    -
    -    country2code('United States of America') 
    -    country2code('USA') 
    -
    -
    -=head1 CONVERSION ROUTINES
    -
    -There are three conversion routines: C, C,
    -and C.
    -
    -=over 4
    -
    -=item code2country( CODE, [ CODESET ] )
    -
    -This function takes a country code and returns a string
    -which contains the name of the country identified.
    -If the code is not a valid country code, as defined by ISO 3166,
    -then C will be returned:
    -
    -    $country = code2country('fi');
    -
    -=item country2code( STRING, [ CODESET ] )
    -
    -This function takes a country name and returns the corresponding
    -country code, if such exists.
    -If the argument could not be identified as a country name,
    -then C will be returned:
    -
    -    $code = country2code('Norway', LOCALE_CODE_ALPHA_3);
    -    # $code will now be 'nor'
    -
    -The case of the country name is not important.
    -See the section L below.
    -
    -=item country_code2code( CODE, CODESET, CODESET )
    -
    -This function takes a country code from one code set,
    -and returns the corresponding code from another code set.
    -
    -    $alpha2 = country_code2code('fin',
    -		 LOCALE_CODE_ALPHA_3, LOCALE_CODE_ALPHA_2);
    -    # $alpha2 will now be 'fi'
    -
    -If the code passed is not a valid country code in
    -the first code set, or if there isn't a code for the
    -corresponding country in the second code set,
    -then C will be returned.
    -
    -=back
    -
    -
    -=head1 QUERY ROUTINES
    -
    -There are two function which can be used to obtain a list of all codes,
    -or all country names:
    -
    -=over 4
    -
    -=item C
    -
    -Returns a list of all two-letter country codes.
    -The codes are guaranteed to be all lower-case,
    -and not in any particular order.
    -
    -=item C
    -
    -Returns a list of all country names for which there is a corresponding
    -country code in the specified code set.
    -The names are capitalised, and not returned in any particular order.
    -
    -Not all countries have alpha-3 and numeric codes -
    -some just have an alpha-2 code,
    -so you'll get a different number of countries
    -depending on which code set you specify.
    -
    -=back
    -
    -
    -=head1 SEMI-PRIVATE ROUTINES
    -
    -Locale::Country provides two semi-private routines for modifying
    -the internal data.
    -Given their status, they aren't exported by default,
    -and so need to be called by prefixing the function name with the
    -package name.
    -
    -=head2 alias_code
    -
    -Define a new code as an alias for an existing code:
    -
    -    Locale::Country::alias_code( ALIAS => CODE [, CODESET ] )
    -
    -This feature was added as a mechanism for handling
    -a "uk" code. The ISO standard says that the two-letter code for
    -"United Kingdom" is "gb", whereas domain names are all .uk.
    -
    -By default the module does not understand "uk", since it is implementing
    -an ISO standard. If you would like 'uk' to work as the two-letter
    -code for United Kingdom, use the following:
    -
    -    Locale::Country::alias_code('uk' => 'gb');
    -
    -With this code, both "uk" and "gb" are valid codes for United Kingdom,
    -with the reverse lookup returning "uk" rather than the usual "gb".
    -
    -B this function was previously called _alias_code,
    -but the leading underscore has been dropped.
    -The old name will be supported for all 2.X releases for
    -backwards compatibility.
    -
    -=head2 rename_country
    -
    -If the official country name just isn't good enough for you,
    -you can rename a country. For example, the official country
    -name for code 'gb' is 'United Kingdom'.
    -If you want to change that, you might call:
    -
    -    Locale::Country::rename_country('gb' => 'Great Britain');
    -
    -This means that calling code2country('gb') will now return
    -'Great Britain' instead of 'United Kingdom'.
    -The original country name is retained as an alias,
    -so for the above example, country2code('United Kingdom')
    -will still return 'gb'.
    -
    -
    -=head1 EXAMPLES
    -
    -The following example illustrates use of the C function.
    -The user is prompted for a country code, and then told the corresponding
    -country name:
    -
    -    $| = 1;   # turn off buffering
    -    
    -    print "Enter country code: ";
    -    chop($code = );
    -    $country = code2country($code, LOCALE_CODE_ALPHA_2);
    -    if (defined $country)
    -    {
    -        print "$code = $country\n";
    -    }
    -    else
    -    {
    -        print "'$code' is not a valid country code!\n";
    -    }
    -
    -=head1 DOMAIN NAMES
    -
    -Most top-level domain names are based on these codes,
    -but there are certain codes which aren't.
    -If you are using this module to identify country from hostname,
    -your best bet is to preprocess the country code.
    -
    -For example, B, B, B and friends would map to B;
    -B would map to B. Any others?
    -
    -=head1 KNOWN BUGS AND LIMITATIONS
    -
    -=over 4
    -
    -=item *
    -
    -When using C, the country name must currently appear
    -exactly as it does in the source of the module. The module now supports
    -a small number of variants.
    -
    -Possible extensions to this are: an interface for getting at the
    -list of variant names, and regular expression matches.
    -
    -=item *
    -
    -In the current implementation, all data is read in when the
    -module is loaded, and then held in memory.
    -A lazy implementation would be more memory friendly.
    -
    -=item *
    -
    -Support for country names in different languages.
    -
    -=back
    -
    -=head1 SEE ALSO
    -
    -=over 4
    -
    -=item Locale::Language
    -
    -ISO two letter codes for identification of language (ISO 639).
    -
    -=item Locale::Script
    -
    -ISO codes for identification of scripts (ISO 15924).
    -
    -=item Locale::Currency
    -
    -ISO three letter codes for identification of currencies
    -and funds (ISO 4217).
    -
    -=item Locale::SubCountry
    -
    -ISO codes for country sub-divisions (states, counties, provinces, etc),
    -as defined in ISO 3166-2.
    -This module is not part of the Locale-Codes distribution,
    -but is available from CPAN in CPAN/modules/by-module/Locale/
    -
    -=item ISO 3166-1
    -
    -The ISO standard which defines these codes.
    -
    -=item http://www.iso.org/iso/en/prods-services/iso3166ma/index.html
    -
    -Official home page for the ISO 3166 maintenance agency.
    -
    -=item http://www.egt.ie/standards/iso3166/iso3166-1-en.html
    -
    -Another useful, but not official, home page.
    -
    -=item http://www.cia.gov/cia/publications/factbook/docs/app-d-1.html
    -
    -An appendix in the CIA world fact book which lists country codes
    -as defined by ISO 3166, FIPS 10-4, and internet domain names.
    -
    -=back
    -
    -
    -=head1 AUTHOR
    -
    -Neil Bowers Eneil@bowers.comE
    -
    -=head1 COPYRIGHT
    -
    -Copyright (C) 2002-2004, Neil Bowers.
    -
    -Copyright (c) 1997-2001 Canon Research Centre Europe (CRE).
    -
    -This module is free software; you can redistribute it and/or
    -modify it under the same terms as Perl itself.
    -
    -=cut
    -
    diff --git a/lib/perl5/5.8.8/Locale/Currency.pod b/lib/perl5/5.8.8/Locale/Currency.pod
    deleted file mode 100644
    index dce32612..00000000
    --- a/lib/perl5/5.8.8/Locale/Currency.pod
    +++ /dev/null
    @@ -1,191 +0,0 @@
    -
    -=head1 NAME
    -
    -Locale::Currency - ISO three letter codes for currency identification (ISO 4217)
    -
    -=head1 SYNOPSIS
    -
    -    use Locale::Currency;
    -
    -    $curr = code2currency('usd');     # $curr gets 'US Dollar'
    -    $code = currency2code('Euro');    # $code gets 'eur'
    -
    -    @codes   = all_currency_codes();
    -    @names   = all_currency_names();
    -
    -
    -=head1 DESCRIPTION
    -
    -The C module provides access to the ISO three-letter
    -codes for identifying currencies and funds, as defined in ISO 4217.
    -You can either access the codes via the L
    -(described below),
    -or with the two functions which return lists of all currency codes or
    -all currency names.
    -
    -There are two special codes defined by the standard which aren't
    -understood by this module:
    -
    -=over 4
    -
    -=item XTS
    -
    -Specifically reserved for testing purposes.
    -
    -=item XXX
    -
    -For transactions where no currency is involved.
    -
    -=back
    -
    -
    -=head1 CONVERSION ROUTINES
    -
    -There are two conversion routines: C and C.
    -
    -=over 4
    -
    -=item code2currency()
    -
    -This function takes a three letter currency code and returns a string
    -which contains the name of the currency identified. If the code is
    -not a valid currency code, as defined by ISO 4217, then C
    -will be returned.
    -
    -    $curr = code2currency($code);
    -
    -=item currency2code()
    -
    -This function takes a currency name and returns the corresponding
    -three letter currency code, if such exists.
    -If the argument could not be identified as a currency name,
    -then C will be returned.
    -
    -    $code = currency2code('French Franc');
    -
    -The case of the currency name is not important.
    -See the section L below.
    -
    -=back
    -
    -
    -=head1 QUERY ROUTINES
    -
    -There are two function which can be used to obtain a list of all
    -currency codes, or all currency names:
    -
    -=over 4
    -
    -=item C
    -
    -Returns a list of all three-letter currency codes.
    -The codes are guaranteed to be all lower-case,
    -and not in any particular order.
    -
    -=item C
    -
    -Returns a list of all currency names for which there is a corresponding
    -three-letter currency code. The names are capitalised, and not returned
    -in any particular order.
    -
    -=back
    -
    -
    -=head1 EXAMPLES
    -
    -The following example illustrates use of the C function.
    -The user is prompted for a currency code, and then told the corresponding
    -currency name:
    -
    -    $| = 1;    # turn off buffering
    -
    -    print "Enter currency code: ";
    -    chop($code = );
    -    $curr = code2currency($code);
    -    if (defined $curr)
    -    {
    -        print "$code = $curr\n";
    -    }
    -    else
    -    {
    -        print "'$code' is not a valid currency code!\n";
    -    }
    -
    -=head1 KNOWN BUGS AND LIMITATIONS
    -
    -=over 4
    -
    -=item *
    -
    -In the current implementation, all data is read in when the
    -module is loaded, and then held in memory.
    -A lazy implementation would be more memory friendly.
    -
    -=item *
    -
    -This module also includes the special codes which are
    -not for a currency, such as Gold, Platinum, etc.
    -This might cause a problem if you're using this module
    -to display a list of currencies.
    -Let Neil know if this does cause a problem, and we can
    -do something about it.
    -
    -=item *
    -
    -ISO 4217 also defines a numeric code for each currency.
    -Currency codes are not currently supported by this module,
    -in the same way Locale::Country supports multiple codesets.
    -
    -=item *
    -
    -There are three cases where there is more than one
    -code for the same currency name.
    -Kwacha has two codes: mwk for Malawi, and zmk for Zambia.
    -The Russian Ruble has two codes: rub and rur.
    -The Belarussian Ruble has two codes: byr and byb.
    -The currency2code() function only returns one code, so
    -you might not get back the code you expected.
    -
    -=back
    -
    -=head1 SEE ALSO
    -
    -=over 4
    -
    -=item Locale::Country
    -
    -ISO codes for identification of country (ISO 3166).
    -
    -=item Locale::Script
    -
    -ISO codes for identification of written scripts (ISO 15924).
    -
    -=item ISO 4217:1995
    -
    -Code for the representation of currencies and funds.
    -
    -=item http://www.bsi-global.com/iso4217currency
    -
    -Official web page for the ISO 4217 maintenance agency.
    -This has the latest list of codes, in MS Word format. Boo.
    -
    -=back
    -
    -=head1 AUTHOR
    -
    -Michael Hennecke Ehennecke@rz.uni-karlsruhe.deE
    -and
    -Neil Bowers Eneil@bowers.comE
    -
    -=head1 COPYRIGHT
    -
    -Copyright (C) 2002-2004, Neil Bowers.
    -
    -Copyright (c) 2001 Michael Hennecke and
    -Canon Research Centre Europe (CRE).
    -
    -This module is free software; you can redistribute it and/or
    -modify it under the same terms as Perl itself.
    -
    -=cut
    -
    diff --git a/lib/perl5/5.8.8/Locale/Language.pod b/lib/perl5/5.8.8/Locale/Language.pod
    deleted file mode 100644
    index ce7b378e..00000000
    --- a/lib/perl5/5.8.8/Locale/Language.pod
    +++ /dev/null
    @@ -1,158 +0,0 @@
    -
    -=head1 NAME
    -
    -Locale::Language - ISO two letter codes for language identification (ISO 639)
    -
    -=head1 SYNOPSIS
    -
    -    use Locale::Language;
    -    
    -    $lang = code2language('en');        # $lang gets 'English'
    -    $code = language2code('French');    # $code gets 'fr'
    -    
    -    @codes   = all_language_codes();
    -    @names   = all_language_names();
    -
    -
    -=head1 DESCRIPTION
    -
    -The C module provides access to the ISO two-letter
    -codes for identifying languages, as defined in ISO 639. You can either
    -access the codes via the L (described below),
    -or via the two functions which return lists of all language codes or
    -all language names.
    -
    -
    -=head1 CONVERSION ROUTINES
    -
    -There are two conversion routines: C and C.
    -
    -=over 4
    -
    -=item code2language()
    -
    -This function takes a two letter language code and returns a string
    -which contains the name of the language identified. If the code is
    -not a valid language code, as defined by ISO 639, then C
    -will be returned.
    -
    -    $lang = code2language($code);
    -
    -=item language2code()
    -
    -This function takes a language name and returns the corresponding
    -two letter language code, if such exists.
    -If the argument could not be identified as a language name,
    -then C will be returned.
    -
    -    $code = language2code('French');
    -
    -The case of the language name is not important.
    -See the section L below.
    -
    -=back
    -
    -
    -=head1 QUERY ROUTINES
    -
    -There are two function which can be used to obtain a list of all
    -language codes, or all language names:
    -
    -=over 4
    -
    -=item C
    -
    -Returns a list of all two-letter language codes.
    -The codes are guaranteed to be all lower-case,
    -and not in any particular order.
    -
    -=item C
    -
    -Returns a list of all language names for which there is a corresponding
    -two-letter language code. The names are capitalised, and not returned
    -in any particular order.
    -
    -=back
    -
    -
    -=head1 EXAMPLES
    -
    -The following example illustrates use of the C function.
    -The user is prompted for a language code, and then told the corresponding
    -language name:
    -
    -    $| = 1;    # turn off buffering
    -    
    -    print "Enter language code: ";
    -    chop($code = );
    -    $lang = code2language($code);
    -    if (defined $lang)
    -    {
    -        print "$code = $lang\n";
    -    }
    -    else
    -    {
    -        print "'$code' is not a valid language code!\n";
    -    }
    -
    -=head1 KNOWN BUGS AND LIMITATIONS
    -
    -=over 4
    -
    -=item *
    -
    -In the current implementation, all data is read in when the
    -module is loaded, and then held in memory.
    -A lazy implementation would be more memory friendly.
    -
    -=item *
    -
    -Currently just supports the two letter language codes -
    -there are also three-letter codes, and numbers.
    -Would these be of any use to anyone?
    -
    -=back
    -
    -=head1 SEE ALSO
    -
    -=over 4
    -
    -=item Locale::Country
    -
    -ISO codes for identification of country (ISO 3166).
    -Supports 2-letter, 3-letter, and numeric country codes.
    -
    -=item Locale::Script
    -
    -ISO codes for identification of written scripts (ISO 15924).
    -
    -=item Locale::Currency
    -
    -ISO three letter codes for identification of currencies and funds (ISO 4217).
    -
    -=item ISO 639:1988 (E/F)
    -
    -Code for the representation of names of languages.
    -
    -=item http://lcweb.loc.gov/standards/iso639-2/langhome.html
    -
    -Home page for ISO 639-2.
    -
    -=back
    -
    -
    -=head1 AUTHOR
    -
    -Neil Bowers Eneil@bowers.comE
    -
    -=head1 COPYRIGHT
    -
    -Copyright (C) 2002-2004, Neil Bowers.
    -
    -Copyright (c) 1997-2001 Canon Research Centre Europe (CRE).
    -
    -This module is free software; you can redistribute it and/or
    -modify it under the same terms as Perl itself.
    -
    -=cut
    -
    diff --git a/lib/perl5/5.8.8/Locale/Maketext.pod b/lib/perl5/5.8.8/Locale/Maketext.pod
    deleted file mode 100644
    index 28518940..00000000
    --- a/lib/perl5/5.8.8/Locale/Maketext.pod
    +++ /dev/null
    @@ -1,1320 +0,0 @@
    -
    -# Time-stamp: "2004-01-11 18:35:34 AST"
    -
    -=head1 NAME
    -
    -Locale::Maketext - framework for localization
    -
    -=head1 SYNOPSIS
    -
    -  package MyProgram;
    -  use strict;
    -  use MyProgram::L10N;
    -   # ...which inherits from Locale::Maketext
    -  my $lh = MyProgram::L10N->get_handle() || die "What language?";
    -  ...
    -  # And then any messages your program emits, like:
    -  warn $lh->maketext( "Can't open file [_1]: [_2]\n", $f, $! );
    -  ...
    -
    -=head1 DESCRIPTION
    -
    -It is a common feature of applications (whether run directly,
    -or via the Web) for them to be "localized" -- i.e., for them
    -to a present an English interface to an English-speaker, a German
    -interface to a German-speaker, and so on for all languages it's
    -programmed with.  Locale::Maketext
    -is a framework for software localization; it provides you with the
    -tools for organizing and accessing the bits of text and text-processing
    -code that you need for producing localized applications.
    -
    -In order to make sense of Maketext and how all its
    -components fit together, you should probably
    -go read L, and
    -I read the following documentation.
    -
    -You may also want to read over the source for C
    -and its constituent modules -- they are a complete (if small)
    -example application that uses Maketext.
    -
    -=head1 QUICK OVERVIEW
    -
    -The basic design of Locale::Maketext is object-oriented, and
    -Locale::Maketext is an abstract base class, from which you
    -derive a "project class".
    -The project class (with a name like "TkBocciBall::Localize",
    -which you then use in your module) is in turn the base class
    -for all the "language classes" for your project
    -(with names "TkBocciBall::Localize::it", 
    -"TkBocciBall::Localize::en",
    -"TkBocciBall::Localize::fr", etc.).
    -
    -A language class is
    -a class containing a lexicon of phrases as class data,
    -and possibly also some methods that are of use in interpreting
    -phrases in the lexicon, or otherwise dealing with text in that
    -language.
    -
    -An object belonging to a language class is called a "language
    -handle"; it's typically a flyweight object.
    -
    -The normal course of action is to call:
    -
    -  use TkBocciBall::Localize;  # the localization project class
    -  $lh = TkBocciBall::Localize->get_handle();
    -   # Depending on the user's locale, etc., this will
    -   # make a language handle from among the classes available,
    -   # and any defaults that you declare.
    -  die "Couldn't make a language handle??" unless $lh;
    -
    -From then on, you use the C function to access
    -entries in whatever lexicon(s) belong to the language handle
    -you got.  So, this:
    -
    -  print $lh->maketext("You won!"), "\n";
    -
    -...emits the right text for this language.  If the object
    -in C<$lh> belongs to class "TkBocciBall::Localize::fr" and
    -%TkBocciBall::Localize::fr::Lexicon contains C<("You won!"
    -=E "Tu as gagnE!")>, then the above
    -code happily tells the user "Tu as gagnE!".
    -
    -=head1 METHODS
    -
    -Locale::Maketext offers a variety of methods, which fall
    -into three categories:
    -
    -=over
    -
    -=item *
    -
    -Methods to do with constructing language handles.
    -
    -=item *
    -
    -C and other methods to do with accessing %Lexicon data
    -for a given language handle.
    -
    -=item *
    -
    -Methods that you may find it handy to use, from routines of
    -yours that you put in %Lexicon entries.
    -
    -=back
    -
    -These are covered in the following section.
    -
    -=head2 Construction Methods
    -
    -These are to do with constructing a language handle:
    -
    -=over
    -
    -=item *
    -
    -$lh = YourProjClass->get_handle( ...langtags... ) || die "lg-handle?";
    -
    -This tries loading classes based on the language-tags you give (like
    -C<("en-US", "sk", "kon", "es-MX", "ja", "i-klingon")>, and for the first class
    -that succeeds, returns YourProjClass::I->new().
    -
    -It runs thru the entire given list of language-tags, and finds no classes
    -for those exact terms, it then tries "superordinate" language classes.
    -So if no "en-US" class (i.e., YourProjClass::en_us)
    -was found, nor classes for anything else in that list, we then try
    -its superordinate, "en" (i.e., YourProjClass::en), and so on thru 
    -the other language-tags in the given list: "es".
    -(The other language-tags in our example list: 
    -happen to have no superordinates.)
    -
    -If none of those language-tags leads to loadable classes, we then
    -try classes derived from YourProjClass->fallback_languages() and
    -then if nothing comes of that, we use classes named by
    -YourProjClass->fallback_language_classes().  Then in the (probably
    -quite unlikely) event that that fails, we just return undef.
    -
    -=item *
    -
    -$lh = YourProjClass->get_handleB<()> || die "lg-handle?";
    -
    -When C is called with an empty parameter list, magic happens:
    -
    -If C senses that it's running in program that was
    -invoked as a CGI, then it tries to get language-tags out of the
    -environment variable "HTTP_ACCEPT_LANGUAGE", and it pretends that
    -those were the languages passed as parameters to C.
    -
    -Otherwise (i.e., if not a CGI), this tries various OS-specific ways
    -to get the language-tags for the current locale/language, and then
    -pretends that those were the value(s) passed to C.
    -
    -Currently this OS-specific stuff consists of looking in the environment
    -variables "LANG" and "LANGUAGE"; and on MSWin machines (where those
    -variables are typically unused), this also tries using
    -the module Win32::Locale to get a language-tag for whatever language/locale
    -is currently selected in the "Regional Settings" (or "International"?)
    -Control Panel.  I welcome further
    -suggestions for making this do the Right Thing under other operating
    -systems that support localization.
    -
    -If you're using localization in an application that keeps a configuration
    -file, you might consider something like this in your project class:
    -
    -  sub get_handle_via_config {
    -    my $class = $_[0];
    -    my $preferred_language = $Config_settings{'language'};
    -    my $lh;
    -    if($preferred_language) {
    -      $lh = $class->get_handle($chosen_language)
    -       || die "No language handle for \"$chosen_language\" or the like";
    -    } else {
    -      # Config file missing, maybe?
    -      $lh = $class->get_handle()
    -       || die "Can't get a language handle";
    -    }
    -    return $lh;
    -  }
    -
    -=item *
    -
    -$lh = YourProjClass::langname->new();
    -
    -This constructs a language handle.  You usually B call this
    -directly, but instead let C find a language class to C
    -and to then call ->new on.
    -
    -=item *
    -
    -$lh->init();
    -
    -This is called by ->new to initialize newly-constructed language handles.
    -If you define an init method in your class, remember that it's usually
    -considered a good idea to call $lh->SUPER::init in it (presumably at the
    -beginning), so that all classes get a chance to initialize a new object
    -however they see fit.
    -
    -=item *
    -
    -YourProjClass->fallback_languages()
    -
    -C appends the return value of this to the end of
    -whatever list of languages you pass C.  Unless
    -you override this method, your project class
    -will inherit Locale::Maketext's C, which
    -currently returns C<('i-default', 'en', 'en-US')>.
    -("i-default" is defined in RFC 2277).
    -
    -This method (by having it return the name
    -of a language-tag that has an existing language class)
    -can be used for making sure that
    -C will always manage to construct a language
    -handle (assuming your language classes are in an appropriate
    -@INC directory).  Or you can use the next method:
    -
    -=item *
    -
    -YourProjClass->fallback_language_classes()
    -
    -C appends the return value of this to the end
    -of the list of classes it will try using.  Unless
    -you override this method, your project class
    -will inherit Locale::Maketext's C,
    -which currently returns an empty list, C<()>.
    -By setting this to some value (namely, the name of a loadable
    -language class), you can be sure that
    -C will always manage to construct a language
    -handle.
    -
    -=back
    -
    -=head2 The "maketext" Method
    -
    -This is the most important method in Locale::Maketext:
    -
    -$text = $lh->maketext(I, ...parameters for this phrase...);
    -
    -This looks in the %Lexicon of the language handle
    -$lh and all its superclasses, looking
    -for an entry whose key is the string I.  Assuming such
    -an entry is found, various things then happen, depending on the
    -value found:
    -
    -If the value is a scalarref, the scalar is dereferenced and returned
    -(and any parameters are ignored).
    -If the value is a coderef, we return &$value($lh, ...parameters...).
    -If the value is a string that I look like it's in Bracket Notation,
    -we return it (after replacing it with a scalarref, in its %Lexicon).
    -If the value I look like it's in Bracket Notation, then we compile
    -it into a sub, replace the string in the %Lexicon with the new coderef,
    -and then we return &$new_sub($lh, ...parameters...).
    -
    -Bracket Notation is discussed in a later section.  Note
    -that trying to compile a string into Bracket Notation can throw
    -an exception if the string is not syntactically valid (say, by not
    -balancing brackets right.)
    -
    -Also, calling &$coderef($lh, ...parameters...) can throw any sort of
    -exception (if, say, code in that sub tries to divide by zero).  But
    -a very common exception occurs when you have Bracket
    -Notation text that says to call a method "foo", but there is no such
    -method.  (E.g., "You have [quaB,_1,ball]." will throw an exception
    -on trying to call $lh->quaB($_[1],'ball') -- you presumably meant
    -"quant".)  C catches these exceptions, but only to make the
    -error message more readable, at which point it rethrows the exception.
    -
    -An exception I be thrown if I is not found in any
    -of $lh's %Lexicon hashes.  What happens if a key is not found,
    -is discussed in a later section, "Controlling Lookup Failure".
    -
    -Note that you might find it useful in some cases to override
    -the C method with an "after method", if you want to
    -translate encodings, or even scripts:
    -
    -    package YrProj::zh_cn; # Chinese with PRC-style glyphs
    -    use base ('YrProj::zh_tw');  # Taiwan-style
    -    sub maketext {
    -      my $self = shift(@_);
    -      my $value = $self->maketext(@_);
    -      return Chineeze::taiwan2mainland($value);
    -    }
    -
    -Or you may want to override it with something that traps
    -any exceptions, if that's critical to your program:
    -
    -  sub maketext {
    -    my($lh, @stuff) = @_;
    -    my $out;
    -    eval { $out = $lh->SUPER::maketext(@stuff) };
    -    return $out unless $@;
    -    ...otherwise deal with the exception...
    -  }
    -
    -Other than those two situations, I don't imagine that
    -it's useful to override the C method.  (If
    -you run into a situation where it is useful, I'd be
    -interested in hearing about it.)
    -
    -=over
    -
    -=item $lh->fail_with I $lh->fail_with(I)
    -
    -=item $lh->failure_handler_auto
    -
    -These two methods are discussed in the section "Controlling
    -Lookup Failure".
    -
    -=back
    -
    -=head2 Utility Methods
    -
    -These are methods that you may find it handy to use, generally
    -from %Lexicon routines of yours (whether expressed as
    -Bracket Notation or not).
    -
    -=over
    -
    -=item $language->quant($number, $singular)
    -
    -=item $language->quant($number, $singular, $plural)
    -
    -=item $language->quant($number, $singular, $plural, $negative)
    -
    -This is generally meant to be called from inside Bracket Notation
    -(which is discussed later), as in 
    -
    -     "Your search matched [quant,_1,document]!"
    -
    -It's for I a noun (i.e., saying how much of it there is,
    -while giving the correct form of it).  The behavior of this method is
    -handy for English and a few other Western European languages, and you
    -should override it for languages where it's not suitable.  You can feel
    -free to read the source, but the current implementation is basically
    -as this pseudocode describes:
    -
    -     if $number is 0 and there's a $negative,
    -        return $negative;
    -     elsif $number is 1,
    -        return "1 $singular";
    -     elsif there's a $plural,
    -        return "$number $plural";
    -     else
    -        return "$number " . $singular . "s";
    -     #
    -     # ...except that we actually call numf to
    -     #  stringify $number before returning it.
    -
    -So for English (with Bracket Notation)
    -C<"...[quant,_1,file]..."> is fine (for 0 it returns "0 files",
    -for 1 it returns "1 file", and for more it returns "2 files", etc.)
    -
    -But for "directory", you'd want C<"[quant,_1,directory,directories]">
    -so that our elementary C method doesn't think that the
    -plural of "directory" is "directorys".  And you might find that the
    -output may sound better if you specify a negative form, as in:
    -
    -     "[quant,_1,file,files,No files] matched your query.\n"
    -
    -Remember to keep in mind verb agreement (or adjectives too, in
    -other languages), as in:
    -
    -     "[quant,_1,document] were matched.\n"
    -
    -Because if _1 is one, you get "1 document B matched".
    -An acceptable hack here is to do something like this:
    -
    -     "[quant,_1,document was, documents were] matched.\n"
    -
    -=item $language->numf($number)
    -
    -This returns the given number formatted nicely according to
    -this language's conventions.  Maketext's default method is
    -mostly to just take the normal string form of the number
    -(applying sprintf "%G" for only very large numbers), and then
    -to add commas as necessary.  (Except that
    -we apply C if $language->{'numf_comma'} is true;
    -that's a bit of a hack that's useful for languages that express
    -two million as "2.000.000" and not as "2,000,000").
    -
    -If you want anything fancier, consider overriding this with something
    -that uses L, or does something else
    -entirely.
    -
    -Note that numf is called by quant for stringifying all quantifying
    -numbers.
    -
    -=item $language->sprintf($format, @items)
    -
    -This is just a wrapper around Perl's normal C function.
    -It's provided so that you can use "sprintf" in Bracket Notation:
    -
    -     "Couldn't access datanode [sprintf,%10x=~[%s~],_1,_2]!\n"
    -
    -returning...
    -
    -     Couldn't access datanode      Stuff=[thangamabob]!
    -
    -=item $language->language_tag()
    -
    -Currently this just takes the last bit of C, turns
    -underscores to dashes, and returns it.  So if $language is
    -an object of class Hee::HOO::Haw::en_us, $language->language_tag()
    -returns "en-us".  (Yes, the usual representation for that language
    -tag is "en-US", but case is I considered meaningful in
    -language-tag comparison.)
    -
    -You may override this as you like; Maketext doesn't use it for
    -anything.
    -
    -=item $language->encoding()
    -
    -Currently this isn't used for anything, but it's provided
    -(with default value of
    -C<(ref($language) && $language-E{'encoding'})) or "iso-8859-1">
    -) as a sort of suggestion that it may be useful/necessary to
    -associate encodings with your language handles (whether on a
    -per-class or even per-handle basis.)
    -
    -=back
    -
    -=head2 Language Handle Attributes and Internals
    -
    -A language handle is a flyweight object -- i.e., it doesn't (necessarily)
    -carry any data of interest, other than just being a member of
    -whatever class it belongs to.
    -
    -A language handle is implemented as a blessed hash.  Subclasses of yours
    -can store whatever data you want in the hash.  Currently the only hash
    -entry used by any crucial Maketext method is "fail", so feel free to
    -use anything else as you like.
    -
    -B  This documentation
    -is vastly longer than the module source itself.
    -
    -=over
    -
    -=back
    -
    -=head1 LANGUAGE CLASS HIERARCHIES
    -
    -These are Locale::Maketext's assumptions about the class
    -hierarchy formed by all your language classes:
    -
    -=over
    -
    -=item *
    -
    -You must have a project base class, which you load, and
    -which you then use as the first argument in
    -the call to YourProjClass->get_handle(...).  It should derive
    -(whether directly or indirectly) from Locale::Maketext.
    -It B how you name this class, altho assuming this
    -is the localization component of your Super Mega Program,
    -good names for your project class might be
    -SuperMegaProgram::Localization, SuperMegaProgram::L10N,
    -SuperMegaProgram::I18N, SuperMegaProgram::International,
    -or even SuperMegaProgram::Languages or SuperMegaProgram::Messages.
    -
    -=item *
    -
    -Language classes are what YourProjClass->get_handle will try to load.
    -It will look for them by taking each language-tag (B it
    -if it doesn't look like a language-tag or locale-tag!), turning it to
    -all lowercase, turning and dashes to underscores, and appending it
    -to YourProjClass . "::".  So this:
    -
    -  $lh = YourProjClass->get_handle(
    -    'en-US', 'fr', 'kon', 'i-klingon', 'i-klingon-romanized'
    -  );
    -
    -will try loading the classes 
    -YourProjClass::en_us (note lowercase!), YourProjClass::fr, 
    -YourProjClass::kon,
    -YourProjClass::i_klingon
    -and YourProjClass::i_klingon_romanized.  (And it'll stop at the
    -first one that actually loads.)
    -
    -=item *
    -
    -I assume that each language class derives (directly or indirectly)
    -from your project class, and also defines its @ISA, its %Lexicon,
    -or both.  But I anticipate no dire consequences if these assumptions
    -do not hold.
    -
    -=item *
    -
    -Language classes may derive from other language classes (altho they
    -should have "use I" or "use base qw(I<...classes...>)").
    -They may derive from the project
    -class.  They may derive from some other class altogether.  Or via
    -multiple inheritance, it may derive from any mixture of these.
    -
    -=item *
    -
    -I foresee no problems with having multiple inheritance in
    -your hierarchy of language classes.  (As usual, however, Perl will
    -complain bitterly if you have a cycle in the hierarchy: i.e., if
    -any class is its own ancestor.)
    -
    -=back
    -
    -=head1 ENTRIES IN EACH LEXICON
    -
    -A typical %Lexicon entry is meant to signify a phrase,
    -taking some number (0 or more) of parameters.  An entry
    -is meant to be accessed by via
    -a string I in $lh->maketext(I, ...parameters...),
    -which should return a string that is generally meant for
    -be used for "output" to the user -- regardless of whether
    -this actually means printing to STDOUT, writing to a file,
    -or putting into a GUI widget.
    -
    -While the key must be a string value (since that's a basic
    -restriction that Perl places on hash keys), the value in
    -the lexicon can currently be of several types:
    -a defined scalar, scalarref, or coderef.  The use of these is
    -explained above, in the section 'The "maketext" Method', and
    -Bracket Notation for strings is discussed in the next section.
    -
    -While you can use arbitrary unique IDs for lexicon keys
    -(like "_min_larger_max_error"), it is often
    -useful for if an entry's key is itself a valid value, like
    -this example error message:
    -
    -  "Minimum ([_1]) is larger than maximum ([_2])!\n",
    -
    -Compare this code that uses an arbitrary ID...
    -
    -  die $lh->maketext( "_min_larger_max_error", $min, $max )
    -   if $min > $max;
    -
    -...to this code that uses a key-as-value:
    -
    -  die $lh->maketext(
    -   "Minimum ([_1]) is larger than maximum ([_2])!\n",
    -   $min, $max
    -  ) if $min > $max;
    -
    -The second is, in short, more readable.  In particular, it's obvious
    -that the number of parameters you're feeding to that phrase (two) is
    -the number of parameters that it I to be fed.  (Since you see
    -_1 and a _2 being used in the key there.)
    -
    -Also, once a project is otherwise
    -complete and you start to localize it, you can scrape together
    -all the various keys you use, and pass it to a translator; and then
    -the translator's work will go faster if what he's presented is this:
    -
    - "Minimum ([_1]) is larger than maximum ([_2])!\n",
    -  => "",   # fill in something here, Jacques!
    -
    -rather than this more cryptic mess:
    -
    - "_min_larger_max_error"
    -  => "",   # fill in something here, Jacques
    -
    -I think that keys as lexicon values makes the completed lexicon
    -entries more readable:
    -
    - "Minimum ([_1]) is larger than maximum ([_2])!\n",
    -  => "Le minimum ([_1]) est plus grand que le maximum ([_2])!\n",
    -
    -Also, having valid values as keys becomes very useful if you set
    -up an _AUTO lexicon.  _AUTO lexicons are discussed in a later
    -section.
    -
    -I almost always use keys that are themselves
    -valid lexicon values.  One notable exception is when the value is
    -quite long.  For example, to get the screenful of data that
    -a command-line program might returns when given an unknown switch,
    -I often just use a key "_USAGE_MESSAGE".  At that point I then go
    -and immediately to define that lexicon entry in the
    -ProjectClass::L10N::en lexicon (since English is always my "project
    -language"):
    -
    -  '_USAGE_MESSAGE' => <<'EOSTUFF',
    -  ...long long message...
    -  EOSTUFF
    -
    -and then I can use it as:
    -
    -  getopt('oDI', \%opts) or die $lh->maketext('_USAGE_MESSAGE');
    -
    -Incidentally,
    -note that each class's C<%Lexicon> inherits-and-extends
    -the lexicons in its superclasses.  This is not because these are
    -special hashes I, but because you access them via the
    -C method, which looks for entries across all the
    -C<%Lexicon>'s in a language class I all its ancestor classes.
    -(This is because the idea of "class data" isn't directly implemented
    -in Perl, but is instead left to individual class-systems to implement
    -as they see fit..)
    -
    -Note that you may have things stored in a lexicon
    -besides just phrases for output:  for example, if your program
    -takes input from the keyboard, asking a "(Y/N)" question,
    -you probably need to know what equivalent of "Y[es]/N[o]" is
    -in whatever language.  You probably also need to know what
    -the equivalents of the answers "y" and "n" are.  You can
    -store that information in the lexicon (say, under the keys
    -"~answer_y" and "~answer_n", and the long forms as
    -"~answer_yes" and "~answer_no", where "~" is just an ad-hoc
    -character meant to indicate to programmers/translators that
    -these are not phrases for output).
    -
    -Or instead of storing this in the language class's lexicon,
    -you can (and, in some cases, really should) represent the same bit
    -of knowledge as code is a method in the language class.  (That
    -leaves a tidy distinction between the lexicon as the things we
    -know how to I, and the rest of the things in the lexicon class
    -as things that we know how to I.)  Consider
    -this example of a processor for responses to French "oui/non"
    -questions:
    -
    -  sub y_or_n {
    -    return undef unless defined $_[1] and length $_[1];
    -    my $answer = lc $_[1];  # smash case
    -    return 1 if $answer eq 'o' or $answer eq 'oui';
    -    return 0 if $answer eq 'n' or $answer eq 'non';
    -    return undef;
    -  }
    -
    -...which you'd then call in a construct like this:
    -
    -  my $response;
    -  until(defined $response) {
    -    print $lh->maketext("Open the pod bay door (y/n)? ");
    -    $response = $lh->y_or_n( get_input_from_keyboard_somehow() );
    -  }
    -  if($response) { $pod_bay_door->open()         }
    -  else          { $pod_bay_door->leave_closed() }
    -
    -Other data worth storing in a lexicon might be things like
    -filenames for language-targetted resources:
    -
    -  ...
    -  "_main_splash_png"
    -    => "/styles/en_us/main_splash.png",
    -  "_main_splash_imagemap"
    -    => "/styles/en_us/main_splash.incl",
    -  "_general_graphics_path"
    -    => "/styles/en_us/",
    -  "_alert_sound"
    -    => "/styles/en_us/hey_there.wav",
    -  "_forward_icon"
    -   => "left_arrow.png",
    -  "_backward_icon"
    -   => "right_arrow.png",
    -  # In some other languages, left equals
    -  #  BACKwards, and right is FOREwards.
    -  ...
    -
    -You might want to do the same thing for expressing key bindings
    -or the like (since hardwiring "q" as the binding for the function
    -that quits a screen/menu/program is useful only if your language
    -happens to associate "q" with "quit"!)
    -
    -=head1 BRACKET NOTATION
    -
    -Bracket Notation is a crucial feature of Locale::Maketext.  I mean
    -Bracket Notation to provide a replacement for sprintf formatting.
    -Everything you do with Bracket Notation could be done with a sub block,
    -but bracket notation is meant to be much more concise.
    -
    -Bracket Notation is a like a miniature "template" system (in the sense
    -of L, not in the sense of C++ templates),
    -where normal text is passed thru basically as is, but text is special
    -regions is specially interpreted.  In Bracket Notation, you use brackets
    -("[...]" -- not "{...}"!) to note sections that are specially interpreted.
    -
    -For example, here all the areas that are taken literally are underlined with
    -a "^", and all the in-bracket special regions are underlined with an X:
    -
    -  "Minimum ([_1]) is larger than maximum ([_2])!\n",
    -   ^^^^^^^^^ XX ^^^^^^^^^^^^^^^^^^^^^^^^^^ XX ^^^^
    -
    -When that string is compiled from bracket notation into a real Perl sub,
    -it's basically turned into:
    -
    -  sub {
    -    my $lh = $_[0];
    -    my @params = @_;
    -    return join '',
    -      "Minimum (",
    -      ...some code here...
    -      ") is larger than maximum (",
    -      ...some code here...
    -      ")!\n",
    -  }
    -  # to be called by $lh->maketext(KEY, params...)
    -   
    -In other words, text outside bracket groups is turned into string
    -literals.  Text in brackets is rather more complex, and currently follows
    -these rules:
    -
    -=over
    -
    -=item *
    -
    -Bracket groups that are empty, or which consist only of whitespace,
    -are ignored.  (Examples: "[]", "[    ]", or a [ and a ] with returns
    -and/or tabs and/or spaces between them.
    -
    -Otherwise, each group is taken to be a comma-separated group of items,
    -and each item is interpreted as follows:
    -
    -=item *
    -
    -An item that is "_I" or "_-I" is interpreted as
    -$_[I].  I.e., "_1" is becomes with $_[1], and "_-3" is interpreted
    -as $_[-3] (in which case @_ should have at least three elements in it).
    -Note that $_[0] is the language handle, and is typically not named
    -directly.
    -
    -=item *
    -
    -An item "_*" is interpreted to mean "all of @_ except $_[0]".
    -I.e., C<@_[1..$#_]>.  Note that this is an empty list in the case
    -of calls like $lh->maketext(I) where there are no
    -parameters (except $_[0], the language handle).
    -
    -=item *
    -
    -Otherwise, each item is interpreted as a string literal.
    -
    -=back
    -
    -The group as a whole is interpreted as follows:
    -
    -=over
    -
    -=item *
    -
    -If the first item in a bracket group looks like a method name,
    -then that group is interpreted like this:
    -
    -  $lh->that_method_name(
    -    ...rest of items in this group...
    -  ),
    -
    -=item *
    -
    -If the first item in a bracket group is "*", it's taken as shorthand
    -for the so commonly called "quant" method.  Similarly, if the first
    -item in a bracket group is "#", it's taken to be shorthand for
    -"numf".
    -
    -=item *
    -
    -If the first item in a bracket group is empty-string, or "_*"
    -or "_I" or "_-I", then that group is interpreted
    -as just the interpolation of all its items:
    -
    -  join('',
    -    ...rest of items in this group...
    -  ),
    -
    -Examples:  "[_1]" and "[,_1]", which are synonymous; and
    -"C<[,ID-(,_4,-,_2,)]>", which compiles as
    -C.
    -
    -=item *
    -
    -Otherwise this bracket group is invalid.  For example, in the group
    -"[!@#,whatever]", the first item C<"!@#"> is neither empty-string,
    -"_I", "_-I", "_*", nor a valid method name; and so
    -Locale::Maketext will throw an exception of you try compiling an
    -expression containing this bracket group.
    -
    -=back
    -
    -Note, incidentally, that items in each group are comma-separated,
    -not C-separated.  That is, you might expect that this
    -bracket group:
    -
    -  "Hoohah [foo, _1 , bar ,baz]!"
    -
    -would compile to this:
    -
    -  sub {
    -    my $lh = $_[0];
    -    return join '',
    -      "Hoohah ",
    -      $lh->foo( $_[1], "bar", "baz"),
    -      "!",
    -  }
    -
    -But it actually compiles as this:
    -
    -  sub {
    -    my $lh = $_[0];
    -    return join '',
    -      "Hoohah ",
    -      $lh->foo(" _1 ", " bar ", "baz"),  #!!!
    -      "!",
    -  }
    -
    -In the notation discussed so far, the characters "[" and "]" are given
    -special meaning, for opening and closing bracket groups, and "," has
    -a special meaning inside bracket groups, where it separates items in the
    -group.  This begs the question of how you'd express a literal "[" or
    -"]" in a Bracket Notation string, and how you'd express a literal
    -comma inside a bracket group.  For this purpose I've adopted "~" (tilde)
    -as an escape character:  "~[" means a literal '[' character anywhere
    -in Bracket Notation (i.e., regardless of whether you're in a bracket
    -group or not), and ditto for "~]" meaning a literal ']', and "~," meaning
    -a literal comma.  (Altho "," means a literal comma outside of
    -bracket groups -- it's only inside bracket groups that commas are special.)
    -
    -And on the off chance you need a literal tilde in a bracket expression,
    -you get it with "~~".
    -
    -Currently, an unescaped "~" before a character
    -other than a bracket or a comma is taken to mean just a "~" and that
    -character.  I.e., "~X" means the same as "~~X" -- i.e., one literal tilde,
    -and then one literal "X".  However, by using "~X", you are assuming that
    -no future version of Maketext will use "~X" as a magic escape sequence.
    -In practice this is not a great problem, since first off you can just
    -write "~~X" and not worry about it; second off, I doubt I'll add lots
    -of new magic characters to bracket notation; and third off, you
    -aren't likely to want literal "~" characters in your messages anyway,
    -since it's not a character with wide use in natural language text.
    -
    -Brackets must be balanced -- every openbracket must have
    -one matching closebracket, and vice versa.  So these are all B:
    -
    -  "I ate [quant,_1,rhubarb pie."
    -  "I ate [quant,_1,rhubarb pie[."
    -  "I ate quant,_1,rhubarb pie]."
    -  "I ate quant,_1,rhubarb pie[."
    -
    -Currently, bracket groups do not nest.  That is, you B say:
    -
    -  "Foo [bar,baz,[quux,quuux]]\n";
    -
    -If you need a notation that's that powerful, use normal Perl:
    -
    -  %Lexicon = (
    -    ...
    -    "some_key" => sub {
    -      my $lh = $_[0];
    -      join '',
    -        "Foo ",
    -        $lh->bar('baz', $lh->quux('quuux')),
    -        "\n",
    -    },
    -    ...
    -  );
    -
    -Or write the "bar" method so you don't need to pass it the
    -output from calling quux.
    -
    -I do not anticipate that you will need (or particularly want)
    -to nest bracket groups, but you are welcome to email me with
    -convincing (real-life) arguments to the contrary.
    -
    -=head1 AUTO LEXICONS
    -
    -If maketext goes to look in an individual %Lexicon for an entry
    -for I (where I does not start with an underscore), and
    -sees none, B an entry of "_AUTO" => I,
    -then we actually define $Lexicon{I} = I right then and there,
    -and then use that value as if it had been there all
    -along.  This happens before we even look in any superclass %Lexicons!
    -
    -(This is meant to be somewhat like the AUTOLOAD mechanism in
    -Perl's function call system -- or, looked at another way,
    -like the L module.)
    -
    -I can picture all sorts of circumstances where you just
    -do not want lookup to be able to fail (since failing
    -normally means that maketext throws a C, altho
    -see the next section for greater control over that).  But
    -here's one circumstance where _AUTO lexicons are meant to
    -be I useful:
    -
    -As you're writing an application, you decide as you go what messages
    -you need to emit.  Normally you'd go to write this:
    -
    -  if(-e $filename) {
    -    go_process_file($filename)
    -  } else {
    -    print "Couldn't find file \"$filename\"!\n";
    -  }
    -
    -but since you anticipate localizing this, you write:
    -
    -  use ThisProject::I18N;
    -  my $lh = ThisProject::I18N->get_handle();
    -   # For the moment, assume that things are set up so
    -   # that we load class ThisProject::I18N::en
    -   # and that that's the class that $lh belongs to.
    -  ...
    -  if(-e $filename) {
    -    go_process_file($filename)
    -  } else {
    -    print $lh->maketext(
    -      "Couldn't find file \"[_1]\"!\n", $filename
    -    );
    -  }
    -
    -Now, right after you've just written the above lines, you'd
    -normally have to go open the file 
    -ThisProject/I18N/en.pm, and immediately add an entry:
    -
    -  "Couldn't find file \"[_1]\"!\n"
    -  => "Couldn't find file \"[_1]\"!\n",
    -
    -But I consider that somewhat of a distraction from the work
    -of getting the main code working -- to say nothing of the fact
    -that I often have to play with the program a few times before
    -I can decide exactly what wording I want in the messages (which
    -in this case would require me to go changing three lines of code:
    -the call to maketext with that key, and then the two lines in
    -ThisProject/I18N/en.pm).
    -
    -However, if you set "_AUTO => 1" in the %Lexicon in,
    -ThisProject/I18N/en.pm (assuming that English (en) is
    -the language that all your programmers will be using for this
    -project's internal message keys), then you don't ever have to
    -go adding lines like this
    -
    -  "Couldn't find file \"[_1]\"!\n"
    -  => "Couldn't find file \"[_1]\"!\n",
    -
    -to ThisProject/I18N/en.pm, because if _AUTO is true there,
    -then just looking for an entry with the key "Couldn't find
    -file \"[_1]\"!\n" in that lexicon will cause it to be added,
    -with that value!
    -
    -Note that the reason that keys that start with "_"
    -are immune to _AUTO isn't anything generally magical about
    -the underscore character -- I just wanted a way to have most
    -lexicon keys be autoable, except for possibly a few, and I
    -arbitrarily decided to use a leading underscore as a signal
    -to distinguish those few.
    -
    -=head1 CONTROLLING LOOKUP FAILURE
    -
    -If you call $lh->maketext(I, ...parameters...),
    -and there's no entry I in $lh's class's %Lexicon, nor
    -in the superclass %Lexicon hash, I if we can't auto-make
    -I (because either it starts with a "_", or because none
    -of its lexicons have C<_AUTO =E 1,>), then we have
    -failed to find a normal way to maketext I.  What then
    -happens in these failure conditions, depends on the $lh object
    -"fail" attribute.
    -
    -If the language handle has no "fail" attribute, maketext
    -will simply throw an exception (i.e., it calls C, mentioning
    -the I whose lookup failed, and naming the line number where
    -the calling $lh->maketext(I,...) was.
    -
    -If the language handle has a "fail" attribute whose value is a
    -coderef, then $lh->maketext(I,...params...) gives up and calls:
    -
    -  return &{$that_subref}($lh, $key, @params);
    -
    -Otherwise, the "fail" attribute's value should be a string denoting
    -a method name, so that $lh->maketext(I,...params...) can
    -give up with:
    -
    -  return $lh->$that_method_name($phrase, @params);
    -
    -The "fail" attribute can be accessed with the C method:
    -
    -  # Set to a coderef:
    -  $lh->fail_with( \&failure_handler );
    -
    -  # Set to a method name:
    -  $lh->fail_with( 'failure_method' );
    -  
    -  # Set to nothing (i.e., so failure throws a plain exception)
    -  $lh->fail_with( undef );
    -  
    -  # Simply read:
    -  $handler = $lh->fail_with();
    -
    -Now, as to what you may want to do with these handlers:  Maybe you'd
    -want to log what key failed for what class, and then die.  Maybe
    -you don't like C and instead you want to send the error message
    -to STDOUT (or wherever) and then merely C.
    -
    -Or maybe you don't want to C at all!  Maybe you could use a
    -handler like this:
    -
    -  # Make all lookups fall back onto an English value,
    -  #  but after we log it for later fingerpointing.
    -  my $lh_backup = ThisProject->get_handle('en');
    -  open(LEX_FAIL_LOG, ">>wherever/lex.log") || die "GNAARGH $!";
    -  sub lex_fail {
    -    my($failing_lh, $key, $params) = @_;
    -    print LEX_FAIL_LOG scalar(localtime), "\t",
    -       ref($failing_lh), "\t", $key, "\n";
    -    return $lh_backup->maketext($key,@params);
    -  }
    -
    -Some users have expressed that they think this whole mechanism of
    -having a "fail" attribute at all, seems a rather pointless complication.
    -But I want Locale::Maketext to be usable for software projects of I
    -scale and type; and different software projects have different ideas
    -of what the right thing is to do in failure conditions.  I could simply
    -say that failure always throws an exception, and that if you want to be
    -careful, you'll just have to wrap every call to $lh->maketext in an
    -S.  However, I want programmers to reserve the right (via
    -the "fail" attribute) to treat lookup failure as something other than
    -an exception of the same level of severity as a config file being
    -unreadable, or some essential resource being inaccessible.
    -
    -One possibly useful value for the "fail" attribute is the method name
    -"failure_handler_auto".  This is a method defined in class
    -Locale::Maketext itself.  You set it with:
    -
    -  $lh->fail_with('failure_handler_auto');
    -
    -Then when you call $lh->maketext(I, ...parameters...) and
    -there's no I in any of those lexicons, maketext gives up with
    -
    -  return $lh->failure_handler_auto($key, @params);
    -
    -But failure_handler_auto, instead of dying or anything, compiles
    -$key, caching it in $lh->{'failure_lex'}{$key} = $complied,
    -and then calls the compiled value, and returns that.  (I.e., if
    -$key looks like bracket notation, $compiled is a sub, and we return
    -&{$compiled}(@params); but if $key is just a plain string, we just
    -return that.)
    -
    -The effect of using "failure_auto_handler"
    -is like an AUTO lexicon, except that it 1) compiles $key even if
    -it starts with "_", and 2) you have a record in the new hashref
    -$lh->{'failure_lex'} of all the keys that have failed for
    -this object.  This should avoid your program dying -- as long
    -as your keys aren't actually invalid as bracket code, and as
    -long as they don't try calling methods that don't exist.
    -
    -"failure_auto_handler" may not be exactly what you want, but I
    -hope it at least shows you that maketext failure can be mitigated
    -in any number of very flexible ways.  If you can formalize exactly
    -what you want, you should be able to express that as a failure
    -handler.  You can even make it default for every object of a given
    -class, by setting it in that class's init:
    -
    -  sub init {
    -    my $lh = $_[0];  # a newborn handle
    -    $lh->SUPER::init();
    -    $lh->fail_with('my_clever_failure_handler');
    -    return;
    -  }
    -  sub my_clever_failure_handler {
    -    ...you clever things here...
    -  }
    -
    -=head1 HOW TO USE MAKETEXT
    -
    -Here is a brief checklist on how to use Maketext to localize
    -applications:
    -
    -=over
    -
    -=item *
    -
    -Decide what system you'll use for lexicon keys.  If you insist,
    -you can use opaque IDs (if you're nostalgic for C),
    -but I have better suggestions in the
    -section "Entries in Each Lexicon", above.  Assuming you opt for
    -meaningful keys that double as values (like "Minimum ([_1]) is
    -larger than maximum ([_2])!\n"), you'll have to settle on what
    -language those should be in.  For the sake of argument, I'll
    -call this English, specifically American English, "en-US".
    -
    -=item *
    -
    -Create a class for your localization project.  This is
    -the name of the class that you'll use in the idiom:
    -
    -  use Projname::L10N;
    -  my $lh = Projname::L10N->get_handle(...) || die "Language?";
    -
    -Assuming your call your class Projname::L10N, create a class
    -consisting minimally of:
    -
    -  package Projname::L10N;
    -  use base qw(Locale::Maketext);
    -  ...any methods you might want all your languages to share...
    -  
    -  # And, assuming you want the base class to be an _AUTO lexicon,
    -  # as is discussed a few sections up:
    -  
    -  1;
    -
    -=item *
    -
    -Create a class for the language your internal keys are in.  Name
    -the class after the language-tag for that language, in lowercase,
    -with dashes changed to underscores.  Assuming your project's first
    -language is US English, you should call this Projname::L10N::en_us.
    -It should consist minimally of:
    -
    -  package Projname::L10N::en_us;
    -  use base qw(Projname::L10N);
    -  %Lexicon = (
    -    '_AUTO' => 1,
    -  );
    -  1;
    -
    -(For the rest of this section, I'll assume that this "first
    -language class" of Projname::L10N::en_us has
    -_AUTO lexicon.)
    -
    -=item *
    -
    -Go and write your program.  Everywhere in your program where 
    -you would say:
    -
    -  print "Foobar $thing stuff\n";
    -
    -instead do it thru maketext, using no variable interpolation in
    -the key:
    -
    -  print $lh->maketext("Foobar [_1] stuff\n", $thing);
    -
    -If you get tired of constantly saying Cmaketext>,
    -consider making a functional wrapper for it, like so:
    -
    -  use Projname::L10N;
    -  use vars qw($lh);
    -  $lh = Projname::L10N->get_handle(...) || die "Language?";
    -  sub pmt (@) { print( $lh->maketext(@_)) }
    -   # "pmt" is short for "Print MakeText"
    -  $Carp::Verbose = 1;
    -   # so if maketext fails, we see made the call to pmt
    -
    -Besides whole phrases meant for output, anything language-dependent
    -should be put into the class Projname::L10N::en_us,
    -whether as methods, or as lexicon entries -- this is discussed
    -in the section "Entries in Each Lexicon", above.
    -
    -=item *
    -
    -Once the program is otherwise done, and once its localization for
    -the first language works right (via the data and methods in
    -Projname::L10N::en_us), you can get together the data for translation.
    -If your first language lexicon isn't an _AUTO lexicon, then you already
    -have all the messages explicitly in the lexicon (or else you'd be
    -getting exceptions thrown when you call $lh->maketext to get
    -messages that aren't in there).  But if you were (advisedly) lazy and are
    -using an _AUTO lexicon, then you've got to make a list of all the phrases
    -that you've so far been letting _AUTO generate for you.  There are very
    -many ways to assemble such a list.  The most straightforward is to simply
    -grep the source for every occurrence of "maketext" (or calls
    -to wrappers around it, like the above C function), and to log the
    -following phrase.
    -
    -=item *
    -
    -You may at this point want to consider whether the your base class 
    -(Projname::L10N) that all lexicons inherit from (Projname::L10N::en,
    -Projname::L10N::es, etc.) should be an _AUTO lexicon.  It may be true
    -that in theory, all needed messages will be in each language class;
    -but in the presumably unlikely or "impossible" case of lookup failure,
    -you should consider whether your program should throw an exception,
    -emit text in English (or whatever your project's first language is),
    -or some more complex solution as described in the section
    -"Controlling Lookup Failure", above.
    -
    -=item *
    -
    -Submit all messages/phrases/etc. to translators.
    -
    -(You may, in fact, want to start with localizing to I other language
    -at first, if you're not sure that you've property abstracted the
    -language-dependent parts of your code.)
    -
    -Translators may request clarification of the situation in which a
    -particular phrase is found.  For example, in English we are entirely happy
    -saying "I files found", regardless of whether we mean "I looked for files,
    -and found I of them" or the rather distinct situation of "I looked for
    -something else (like lines in files), and along the way I saw I
    -files."  This may involve rethinking things that you thought quite clear:
    -should "Edit" on a toolbar be a noun ("editing") or a verb ("to edit")?  Is
    -there already a conventionalized way to express that menu option, separate
    -from the target language's normal word for "to edit"?
    -
    -In all cases where the very common phenomenon of quantification
    -(saying "I files", for B value of N)
    -is involved, each translator should make clear what dependencies the
    -number causes in the sentence.  In many cases, dependency is
    -limited to words adjacent to the number, in places where you might
    -expect them ("I found the-?PLURAL I
    -empty-?PLURAL directory-?PLURAL"), but in some cases there are
    -unexpected dependencies ("I found-?PLURAL ..."!) as well as long-distance
    -dependencies "The I directory-?PLURAL could not be deleted-?PLURAL"!).
    -
    -Remind the translators to consider the case where N is 0:
    -"0 files found" isn't exactly natural-sounding in any language, but it
    -may be unacceptable in many -- or it may condition special
    -kinds of agreement (similar to English "I didN'T find ANY files").
    -
    -Remember to ask your translators about numeral formatting in their
    -language, so that you can override the C method as
    -appropriate.  Typical variables in number formatting are:  what to
    -use as a decimal point (comma? period?); what to use as a thousands
    -separator (space? nonbreaking space? comma? period? small
    -middot? prime? apostrophe?); and even whether the so-called "thousands
    -separator" is actually for every third digit -- I've heard reports of
    -two hundred thousand being expressible as "2,00,000" for some Indian
    -(Subcontinental) languages, besides the less surprising "S<200 000>",
    -"200.000", "200,000", and "200'000".  Also, using a set of numeral
    -glyphs other than the usual ASCII "0"-"9" might be appreciated, as via
    -C for getting digits in Devanagari script
    -(for Hindi, Konkani, others).
    -
    -The basic C method that Locale::Maketext provides should be
    -good for many languages.  For some languages, it might be useful
    -to modify it (or its constituent C method)
    -to take a plural form in the two-argument call to C
    -(as in "[quant,_1,files]") if
    -it's all-around easier to infer the singular form from the plural, than
    -to infer the plural form from the singular.
    -
    -But for other languages (as is discussed at length
    -in L), simple
    -C/C is not enough.  For the particularly problematic
    -Slavic languages, what you may need is a method which you provide
    -with the number, the citation form of the noun to quantify, and
    -the case and gender that the sentence's syntax projects onto that
    -noun slot.  The method would then be responsible for determining
    -what grammatical number that numeral projects onto its noun phrase,
    -and what case and gender it may override the normal case and gender
    -with; and then it would look up the noun in a lexicon providing
    -all needed inflected forms.
    -
    -=item *
    -
    -You may also wish to discuss with the translators the question of
    -how to relate different subforms of the same language tag,
    -considering how this reacts with C's treatment of
    -these.  For example, if a user accepts interfaces in "en, fr", and
    -you have interfaces available in "en-US" and "fr", what should
    -they get?  You may wish to resolve this by establishing that "en"
    -and "en-US" are effectively synonymous, by having one class
    -zero-derive from the other.
    -
    -For some languages this issue may never come up (Danish is rarely
    -expressed as "da-DK", but instead is just "da").  And for other
    -languages, the whole concept of a "generic" form may verge on
    -being uselessly vague, particularly for interfaces involving voice
    -media in forms of Arabic or Chinese.
    -
    -=item *
    -
    -Once you've localized your program/site/etc. for all desired
    -languages, be sure to show the result (whether live, or via
    -screenshots) to the translators.  Once they approve, make every
    -effort to have it then checked by at least one other speaker of
    -that language.  This holds true even when (or especially when) the
    -translation is done by one of your own programmers.  Some
    -kinds of systems may be harder to find testers for than others,
    -depending on the amount of domain-specific jargon and concepts
    -involved -- it's easier to find people who can tell you whether
    -they approve of your translation for "delete this message" in an
    -email-via-Web interface, than to find people who can give you
    -an informed opinion on your translation for "attribute value"
    -in an XML query tool's interface.
    -
    -=back
    -
    -=head1 SEE ALSO
    -
    -I recommend reading all of these:
    -
    -L -- my I article about Maketext.  It explains many important concepts
    -underlying Locale::Maketext's design, and some insight into why
    -Maketext is better than the plain old approach of just having 
    -message catalogs that are just databases of sprintf formats.
    -
    -L is a sample application/module
    -that uses Locale::Maketext to localize its messages.  For a larger
    -internationalized system, see also L.
    -
    -L.
    -
    -L.
    -
    -RFC 3066, I,
    -as at http://sunsite.dk/RFC/rfc/rfc3066.html
    -
    -RFC 2277, I
    -is at http://sunsite.dk/RFC/rfc/rfc2277.html -- much of it is
    -just things of interest to protocol designers, but it explains
    -some basic concepts, like the distinction between locales and
    -language-tags.
    -
    -The manual for GNU C.  The gettext dist is available in
    -C -- get
    -a recent gettext tarball and look in its "doc/" directory, there's
    -an easily browsable HTML version in there.  The
    -gettext documentation asks lots of questions worth thinking
    -about, even if some of their answers are sometimes wonky,
    -particularly where they start talking about pluralization.
    -
    -The Locale/Maketext.pm source.  Obverse that the module is much
    -shorter than its documentation!
    -
    -=head1 COPYRIGHT AND DISCLAIMER
    -
    -Copyright (c) 1999-2004 Sean M. Burke.  All rights reserved.
    -
    -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 AUTHOR
    -
    -Sean M. Burke C
    -
    -=cut
    diff --git a/lib/perl5/5.8.8/Locale/Maketext/TPJ13.pod b/lib/perl5/5.8.8/Locale/Maketext/TPJ13.pod
    deleted file mode 100644
    index 149b84c1..00000000
    --- a/lib/perl5/5.8.8/Locale/Maketext/TPJ13.pod
    +++ /dev/null
    @@ -1,778 +0,0 @@
    -
    -# This document contains text in Perl "POD" format.
    -# Use a POD viewer like perldoc or perlman to render it.
    -
    -# This corrects some typoes in the previous release.
    -
    -=head1 NAME
    -
    -Locale::Maketext::TPJ13 -- article about software localization
    -
    -=head1 SYNOPSIS
    -
    -  # This an article, not a module.
    -
    -=head1 DESCRIPTION
    -
    -The following article by Sean M. Burke and Jordan Lachler
    -first appeared in I #13 and is copyright 1999 The Perl Journal. It appears
    -courtesy of Jon Orwant and The Perl Journal.  This document may be
    -distributed under the same terms as Perl itself.
    -
    -=head1 Localization and Perl: gettext breaks, Maketext fixes
    -
    -by Sean M. Burke and Jordan Lachler
    -
    -This article points out cases where gettext (a common system for
    -localizing software interfaces -- i.e., making them work in the user's
    -language of choice) fails because of basic differences between human
    -languages.  This article then describes Maketext, a new system capable
    -of correctly treating these differences.
    -
    -=head2 A Localization Horror Story: It Could Happen To You
    -
    -=over
    -
    -"There are a number of languages spoken by human beings in this
    -world."
    -
    --- Harald Tveit Alvestrand, in RFC 1766, "Tags for the
    -Identification of Languages"
    -
    -=back
    -
    -Imagine that your task for the day is to localize a piece of software
    --- and luckily for you, the only output the program emits is two
    -messages, like this:
    -
    -  I scanned 12 directories.
    -
    -  Your query matched 10 files in 4 directories.
    -
    -So how hard could that be?  You look at the code that
    -produces the first item, and it reads:
    -
    -  printf("I scanned %g directories.",
    -         $directory_count);
    -
    -You think about that, and realize that it doesn't even work right for
    -English, as it can produce this output:
    -
    -  I scanned 1 directories.
    -
    -So you rewrite it to read:
    -
    -  printf("I scanned %g %s.",
    -         $directory_count,
    -         $directory_count == 1 ?
    -           "directory" : "directories",
    -  );
    -
    -...which does the Right Thing.  (In case you don't recall, "%g" is for
    -locale-specific number interpolation, and "%s" is for string
    -interpolation.)
    -
    -But you still have to localize it for all the languages you're
    -producing this software for, so you pull Locale::gettext off of CPAN
    -so you can access the C C functions you've heard are standard
    -for localization tasks.
    -
    -And you write:
    -
    -  printf(gettext("I scanned %g %s."),
    -         $dir_scan_count,
    -         $dir_scan_count == 1 ?
    -           gettext("directory") : gettext("directories"),
    -  );
    -
    -But you then read in the gettext manual (Drepper, Miller, and Pinard 1995)
    -that this is not a good idea, since how a single word like "directory"
    -or "directories" is translated may depend on context -- and this is
    -true, since in a case language like German or Russian, you'd may need
    -these words with a different case ending in the first instance (where the
    -word is the object of a verb) than in the second instance, which you haven't even
    -gotten to yet (where the word is the object of a preposition, "in %g
    -directories") -- assuming these keep the same syntax when translated
    -into those languages.
    -
    -So, on the advice of the gettext manual, you rewrite:
    -
    -  printf( $dir_scan_count == 1 ?
    -           gettext("I scanned %g directory.") :
    -           gettext("I scanned %g directories."),
    -         $dir_scan_count );
    -
    -So, you email your various translators (the boss decides that the
    -languages du jour are Chinese, Arabic, Russian, and Italian, so you
    -have one translator for each), asking for translations for "I scanned
    -%g directory." and "I scanned %g directories.".  When they reply,
    -you'll put that in the lexicons for gettext to use when it localizes
    -your software, so that when the user is running under the "zh"
    -(Chinese) locale, gettext("I scanned %g directory.") will return the
    -appropriate Chinese text, with a "%g" in there where printf can then
    -interpolate $dir_scan.
    -
    -Your Chinese translator emails right back -- he says both of these
    -phrases translate to the same thing in Chinese, because, in linguistic
    -jargon, Chinese "doesn't have number as a grammatical category" --
    -whereas English does.  That is, English has grammatical rules that
    -refer to "number", i.e., whether something is grammatically singular
    -or plural; and one of these rules is the one that forces nouns to take
    -a plural suffix (generally "s") when in a plural context, as they are when
    -they follow a number other than "one" (including, oddly enough, "zero").
    -Chinese has no such rules, and so has just the one phrase where English
    -has two.  But, no problem, you can have this one Chinese phrase appear
    -as the translation for the two English phrases in the "zh" gettext
    -lexicon for your program.
    -
    -Emboldened by this, you dive into the second phrase that your software
    -needs to output: "Your query matched 10 files in 4 directories.".  You notice
    -that if you want to treat phrases as indivisible, as the gettext
    -manual wisely advises, you need four cases now, instead of two, to
    -cover the permutations of singular and plural on the two items,
    -$dir_count and $file_count.  So you try this:
    -
    -  printf( $file_count == 1 ?
    -    ( $directory_count == 1 ?
    -     gettext("Your query matched %g file in %g directory.") :
    -     gettext("Your query matched %g file in %g directories.") ) :
    -    ( $directory_count == 1 ?
    -     gettext("Your query matched %g files in %g directory.") :
    -     gettext("Your query matched %g files in %g directories.") ),
    -   $file_count, $directory_count,
    -  );
    -
    -(The case of "1 file in 2 [or more] directories" could, I suppose,
    -occur in the case of symlinking or something of the sort.)
    -
    -It occurs to you that this is not the prettiest code you've ever
    -written, but this seems the way to go.  You mail off to the
    -translators asking for translations for these four cases.  The
    -Chinese guy replies with the one phrase that these all translate to in
    -Chinese, and that phrase has two "%g"s in it, as it should -- but
    -there's a problem.  He translates it word-for-word back: "In %g
    -directories contains %g files match your query."  The %g
    -slots are in an order reverse to what they are in English.  You wonder
    -how you'll get gettext to handle that.
    -
    -But you put it aside for the moment, and optimistically hope that the
    -other translators won't have this problem, and that their languages
    -will be better behaved -- i.e., that they will be just like English.
    -
    -But the Arabic translator is the next to write back.  First off, your
    -code for "I scanned %g directory." or "I scanned %g directories."
    -assumes there's only singular or plural.  But, to use linguistic
    -jargon again, Arabic has grammatical number, like English (but unlike
    -Chinese), but it's a three-term category: singular, dual, and plural.
    -In other words, the way you say "directory" depends on whether there's
    -one directory, or I of them, or I of them.  Your
    -test of C<($directory == 1)> no longer does the job.  And it means
    -that where English's grammatical category of number necessitates
    -only the two permutations of the first sentence based on "directory
    -[singular]" and "directories [plural]", Arabic has three -- and,
    -worse, in the second sentence ("Your query matched %g file in %g
    -directory."), where English has four, Arabic has nine.  You sense
    -an unwelcome, exponential trend taking shape.
    -
    -Your Italian translator emails you back and says that "I searched 0
    -directories" (a possible English output of your program) is stilted,
    -and if you think that's fine English, that's your problem, but that
    -I in the language of Dante.  He insists that where
    -$directory_count is 0, your program should produce the Italian text
    -for "I I scan I directories.".  And ditto for "I didn't
    -match any files in any directories", although he says the last part
    -about "in any directories" should probably just be left off.
    -
    -You wonder how you'll get gettext to handle this; to accomodate the
    -ways Arabic, Chinese, and Italian deal with numbers in just these few
    -very simple phrases, you need to write code that will ask gettext for
    -different queries depending on whether the numerical values in
    -question are 1, 2, more than 2, or in some cases 0, and you still haven't
    -figured out the problem with the different word order in Chinese.
    -
    -Then your Russian translator calls on the phone, to I tell
    -you the bad news about how really unpleasant your life is about to
    -become:
    -
    -Russian, like German or Latin, is an inflectional language; that is, nouns
    -and adjectives have to take endings that depend on their case
    -(i.e., nominative, accusative, genitive, etc...) -- which is roughly a matter of
    -what role they have in syntax of the sentence --
    -as well as on the grammatical gender (i.e., masculine, feminine, neuter)
    -and number (i.e., singular or plural) of the noun, as well as on the
    -declension class of the noun.  But unlike with most other inflected languages,
    -putting a number-phrase (like "ten" or "forty-three", or their Arabic
    -numeral equivalents) in front of noun in Russian can change the case and
    -number that noun is, and therefore the endings you have to put on it.
    -
    -He elaborates:  In "I scanned %g directories", you'd I
    -"directories" to be in the accusative case (since it is the direct
    -object in the sentnce) and the plural number,
    -except where $directory_count is 1, then you'd expect the singular, of
    -course.  Just like Latin or German.  I  Where $directory_count %
    -10 is 1 ("%" for modulo, remember), assuming $directory count is an
    -integer, and except where $directory_count % 100 is 11, "directories"
    -is forced to become grammatically singular, which means it gets the
    -ending for the accusative singular...  You begin to visualize the code
    -it'd take to test for the problem so far, I, and how many gettext items that'd take, but
    -he keeps going...  But where $directory_count % 10 is 2, 3, or 4
    -(except where $directory_count % 100 is 12, 13, or 14), the word for
    -"directories" is forced to be genitive singular -- which means another
    -ending... The room begins to spin around you, slowly at first...  But
    -with I integer values, since "directory" is an inanimate
    -noun, when preceded by a number and in the nominative or accusative
    -cases (as it is here, just your luck!), it does stay plural, but it is
    -forced into the genitive case -- yet another ending...  And
    -you never hear him get to the part about how you're going to run into
    -similar (but maybe subtly different) problems with other Slavic
    -languages like Polish, because the floor comes up to meet you, and you
    -fade into unconsciousness.
    -
    -
    -The above cautionary tale relates how an attempt at localization can
    -lead from programmer consternation, to program obfuscation, to a need
    -for sedation.  But careful evaluation shows that your choice of tools
    -merely needed further consideration.
    -
    -=head2 The Linguistic View
    -
    -=over
    -
    -"It is more complicated than you think." 
    -
    --- The Eighth Networking Truth, from RFC 1925
    -
    -=back
    -
    -The field of Linguistics has expended a great deal of effort over the
    -past century trying to find grammatical patterns which hold across
    -languages; it's been a constant process
    -of people making generalizations that should apply to all languages,
    -only to find out that, all too often, these generalizations fail --
    -sometimes failing for just a few languages, sometimes whole classes of
    -languages, and sometimes nearly every language in the world except
    -English.  Broad statistical trends are evident in what the "average
    -language" is like as far as what its rules can look like, must look
    -like, and cannot look like.  But the "average language" is just as
    -unreal a concept as the "average person" -- it runs up against the
    -fact no language (or person) is, in fact, average.  The wisdom of past
    -experience leads us to believe that any given language can do whatever
    -it wants, in any order, with appeal to any kind of grammatical
    -categories wants -- case, number, tense, real or metaphoric
    -characteristics of the things that words refer to, arbitrary or
    -predictable classifications of words based on what endings or prefixes
    -they can take, degree or means of certainty about the truth of
    -statements expressed, and so on, ad infinitum.
    -
    -Mercifully, most localization tasks are a matter of finding ways to
    -translate whole phrases, generally sentences, where the context is
    -relatively set, and where the only variation in content is I
    -in a number being expressed -- as in the example sentences above.
    -Translating specific, fully-formed sentences is, in practice, fairly
    -foolproof -- which is good, because that's what's in the phrasebooks
    -that so many tourists rely on.  Now, a given phrase (whether in a
    -phrasebook or in a gettext lexicon) in one language I have a
    -greater or lesser applicability than that phrase's translation into
    -another language -- for example, strictly speaking, in Arabic, the
    -"your" in "Your query matched..." would take a different form
    -depending on whether the user is male or female; so the Arabic
    -translation "your[feminine] query" is applicable in fewer cases than
    -the corresponding English phrase, which doesn't distinguish the user's
    -gender.  (In practice, it's not feasable to have a program know the
    -user's gender, so the masculine "you" in Arabic is usually used, by
    -default.)
    -
    -But in general, such surprises are rare when entire sentences are
    -being translated, especially when the functional context is restricted
    -to that of a computer interacting with a user either to convey a fact
    -or to prompt for a piece of information.  So, for purposes of
    -localization, translation by phrase (generally by sentence) is both the
    -simplest and the least problematic.
    -
    -=head2 Breaking gettext
    -
    -=over
    -
    -"It Has To Work."
    -
    --- First Networking Truth, RFC 1925
    -
    -=back
    -
    -Consider that sentences in a tourist phrasebook are of two types: ones
    -like "How do I get to the marketplace?" that don't have any blanks to
    -fill in, and ones like "How much do these ___ cost?", where there's
    -one or more blanks to fill in (and these are usually linked to a
    -list of words that you can put in that blank: "fish", "potatoes",
    -"tomatoes", etc.)  The ones with no blanks are no problem, but the
    -fill-in-the-blank ones may not be really straightforward. If it's a
    -Swahili phrasebook, for example, the authors probably didn't bother to
    -tell you the complicated ways that the verb "cost" changes its
    -inflectional prefix depending on the noun you're putting in the blank.
    -The trader in the marketplace will still understand what you're saying if
    -you say "how much do these potatoes cost?" with the wrong
    -inflectional prefix on "cost".  After all, I can't speak proper Swahili,
    -I just a tourist.  But while tourists can be stupid, computers
    -are supposed to be smart; the computer should be able to fill in the
    -blank, and still have the results be grammatical.
    -
    -In other words, a phrasebook entry takes some values as parameters
    -(the things that you fill in the blank or blanks), and provides a value
    -based on these parameters, where the way you get that final value from
    -the given values can, properly speaking, involve an arbitrarily
    -complex series of operations.  (In the case of Chinese, it'd be not at
    -all complex, at least in cases like the examples at the beginning of
    -this article; whereas in the case of Russian it'd be a rather complex
    -series of operations.  And in some languages, the
    -complexity could be spread around differently: while the act of
    -putting a number-expression in front of a noun phrase might not be
    -complex by itself, it may change how you have to, for example, inflect
    -a verb elsewhere in the sentence.  This is what in syntax is called
    -"long-distance dependencies".)
    -
    -This talk of parameters and arbitrary complexity is just another way
    -to say that an entry in a phrasebook is what in a programming language
    -would be called a "function".  Just so you don't miss it, this is the
    -crux of this article: I
    -
    -The reason that using gettext runs into walls (as in the above
    -second-person horror story) is that you're trying to use a string (or
    -worse, a choice among a bunch of strings) to do what you really need a
    -function for -- which is futile.  Preforming (s)printf interpolation
    -on the strings which you get back from gettext does allow you to do I
    -common things passably well... sometimes... sort of; but, to paraphrase
    -what some people say about C script programming, "it fools you
    -into thinking you can use it for real things, but you can't, and you
    -don't discover this until you've already spent too much time trying,
    -and by then it's too late."
    -
    -=head2 Replacing gettext
    -
    -So, what needs to replace gettext is a system that supports lexicons
    -of functions instead of lexicons of strings.  An entry in a lexicon
    -from such a system should I look like this:
    -
    -  "J'ai trouv\xE9 %g fichiers dans %g r\xE9pertoires"
    -
    -[\xE9 is e-acute in Latin-1.  Some pod renderers would
    -scream if I used the actual character here. -- SB]
    -
    -but instead like this, bearing in mind that this is just a first stab:
    -
    -  sub I_found_X1_files_in_X2_directories {
    -    my( $files, $dirs ) = @_[0,1];
    -    $files = sprintf("%g %s", $files,
    -      $files == 1 ? 'fichier' : 'fichiers');
    -    $dirs = sprintf("%g %s", $dirs,
    -      $dirs == 1 ? "r\xE9pertoire" : "r\xE9pertoires");
    -    return "J'ai trouv\xE9 $files dans $dirs.";
    -  }
    -
    -Now, there's no particularly obvious way to store anything but strings
    -in a gettext lexicon; so it looks like we just have to start over and
    -make something better, from scratch.  I call my shot at a
    -gettext-replacement system "Maketext", or, in CPAN terms,
    -Locale::Maketext.
    -
    -When designing Maketext, I chose to plan its main features in terms of
    -"buzzword compliance".  And here are the buzzwords:
    -
    -=head2 Buzzwords: Abstraction and Encapsulation
    -
    -The complexity of the language you're trying to output a phrase in is
    -entirely abstracted inside (and encapsulated within) the Maketext module
    -for that interface.  When you call:
    -
    -  print $lang->maketext("You have [quant,_1,piece] of new mail.",
    -                       scalar(@messages));
    -
    -you don't know (and in fact can't easily find out) whether this will
    -involve lots of figuring, as in Russian (if $lang is a handle to the
    -Russian module), or relatively little, as in Chinese.  That kind of
    -abstraction and encapsulation may encourage other pleasant buzzwords
    -like modularization and stratification, depending on what design
    -decisions you make.
    -
    -=head2 Buzzword: Isomorphism
    -
    -"Isomorphism" means "having the same structure or form"; in discussions
    -of program design, the word takes on the special, specific meaning that
    -your implementation of a solution to a problem I as, say, an informal verbal description of the solution, or
    -maybe of the problem itself.  Isomorphism is, all things considered,
    -a good thing -- it's what problem-solving (and solution-implementing)
    -should look like.
    -
    -What's wrong the with gettext-using code like this...
    -
    -  printf( $file_count == 1 ?
    -    ( $directory_count == 1 ?
    -     "Your query matched %g file in %g directory." :
    -     "Your query matched %g file in %g directories." ) :
    -    ( $directory_count == 1 ?
    -     "Your query matched %g files in %g directory." :
    -     "Your query matched %g files in %g directories." ),
    -   $file_count, $directory_count,
    -  );
    -
    -is first off that it's not well abstracted -- these ways of testing
    -for grammatical number (as in the expressions like C) should be abstracted to each language
    -module, since how you get grammatical number is language-specific.
    -
    -But second off, it's not isomorphic -- the "solution" (i.e., the
    -phrasebook entries) for Chinese maps from these four English phrases to
    -the one Chinese phrase that fits for all of them.  In other words, the
    -informal solution would be "The way to say what you want in Chinese is
    -with the one phrase 'For your question, in Y directories you would
    -find X files'" -- and so the implemented solution should be,
    -isomorphically, just a straightforward way to spit out that one
    -phrase, with numerals properly interpolated.  It shouldn't have to map
    -from the complexity of other languages to the simplicity of this one.
    -
    -=head2 Buzzword: Inheritance
    -
    -There's a great deal of reuse possible for sharing of phrases between
    -modules for related dialects, or for sharing of auxiliary functions
    -between related languages.  (By "auxiliary functions", I mean
    -functions that don't produce phrase-text, but which, say, return an
    -answer to "does this number require a plural noun after it?".  Such
    -auxiliary functions would be used in the internal logic of functions
    -that actually do produce phrase-text.)
    -
    -In the case of sharing phrases, consider that you have an interface
    -already localized for American English (probably by having been
    -written with that as the native locale, but that's incidental).
    -Localizing it for UK English should, in practical terms, be just a
    -matter of running it past a British person with the instructions to
    -indicate what few phrases would benefit from a change in spelling or
    -possibly minor rewording.  In that case, you should be able to put in
    -the UK English localization module I those phrases that are
    -UK-specific, and for all the rest, I from the American
    -English module.  (And I expect this same situation would apply with
    -Brazilian and Continental Portugese, possbily with some I
    -closely related languages like Czech and Slovak, and possibly with the
    -slightly different "versions" of written Mandarin Chinese, as I hear exist in
    -Taiwan and mainland China.)
    -
    -As to sharing of auxiliary functions, consider the problem of Russian
    -numbers from the beginning of this article; obviously, you'd want to
    -write only once the hairy code that, given a numeric value, would
    -return some specification of which case and number a given quanitified
    -noun should use.  But suppose that you discover, while localizing an
    -interface for, say, Ukranian (a Slavic language related to Russian,
    -spoken by several million people, many of whom would be relieved to
    -find that your Web site's or software's interface is available in
    -their language), that the rules in Ukranian are the same as in Russian
    -for quantification, and probably for many other grammatical functions.
    -While there may well be no phrases in common between Russian and
    -Ukranian, you could still choose to have the Ukranian module inherit
    -from the Russian module, just for the sake of inheriting all the
    -various grammatical methods.  Or, probably better organizationally,
    -you could move those functions to a module called C<_E_Slavic> or
    -something, which Russian and Ukranian could inherit useful functions
    -from, but which would (presumably) provide no lexicon.
    -
    -=head2 Buzzword: Concision
    -
    -Okay, concision isn't a buzzword.  But it should be, so I decree that
    -as a new buzzword, "concision" means that simple common things should
    -be expressible in very few lines (or maybe even just a few characters)
    -of code -- call it a special case of "making simple things easy and
    -hard things possible", and see also the role it played in the
    -MIDI::Simple language, discussed elsewhere in this issue [TPJ#13].
    -
    -Consider our first stab at an entry in our "phrasebook of functions":
    -
    -  sub I_found_X1_files_in_X2_directories {
    -    my( $files, $dirs ) = @_[0,1];
    -    $files = sprintf("%g %s", $files,
    -      $files == 1 ? 'fichier' : 'fichiers');
    -    $dirs = sprintf("%g %s", $dirs,
    -      $dirs == 1 ? "r\xE9pertoire" : "r\xE9pertoires");
    -    return "J'ai trouv\xE9 $files dans $dirs.";
    -  }
    -
    -You may sense that a lexicon (to use a non-committal catch-all term for a
    -collection of things you know how to say, regardless of whether they're
    -phrases or words) consisting of functions I as above would
    -make for rather long-winded and repetitive code -- even if you wisely
    -rewrote this to have quantification (as we call adding a number
    -expression to a noun phrase) be a function called like:
    -
    -  sub I_found_X1_files_in_X2_directories {
    -    my( $files, $dirs ) = @_[0,1];
    -    $files = quant($files, "fichier");
    -    $dirs =  quant($dirs,  "r\xE9pertoire");
    -    return "J'ai trouv\xE9 $files dans $dirs.";
    -  }
    -
    -And you may also sense that you do not want to bother your translators
    -with having to write Perl code -- you'd much rather that they spend
    -their I on just translation.  And this is to say
    -nothing of the near impossibility of finding a commercial translator
    -who would know even simple Perl.
    -
    -In a first-hack implementation of Maketext, each language-module's
    -lexicon looked like this:
    -
    - %Lexicon = (
    -   "I found %g files in %g directories"
    -   => sub {
    -      my( $files, $dirs ) = @_[0,1];
    -      $files = quant($files, "fichier");
    -      $dirs =  quant($dirs,  "r\xE9pertoire");
    -      return "J'ai trouv\xE9 $files dans $dirs.";
    -    },
    -  ... and so on with other phrase => sub mappings ...
    - );
    -
    -but I immediately went looking for some more concise way to basically
    -denote the same phrase-function -- a way that would also serve to
    -concisely denote I phrase-functions in the lexicon for I
    -languages.  After much time and even some actual thought, I decided on
    -this system:
    -
    -* Where a value in a %Lexicon hash is a contentful string instead of
    -an anonymous sub (or, conceivably, a coderef), it would be interpreted
    -as a sort of shorthand expression of what the sub does.  When accessed
    -for the first time in a session, it is parsed, turned into Perl code,
    -and then eval'd into an anonymous sub; then that sub replaces the
    -original string in that lexicon.  (That way, the work of parsing and
    -evaling the shorthand form for a given phrase is done no more than
    -once per session.)
    -
    -* Calls to C (as Maketext's main function is called) happen
    -thru a "language session handle", notionally very much like an IO
    -handle, in that you open one at the start of the session, and use it
    -for "sending signals" to an object in order to have it return the text
    -you want.
    -
    -So, this:
    -
    -  $lang->maketext("You have [quant,_1,piece] of new mail.",
    -                 scalar(@messages));
    -
    -basically means this: look in the lexicon for $lang (which may inherit
    -from any number of other lexicons), and find the function that we
    -happen to associate with the string "You have [quant,_1,piece] of new
    -mail" (which is, and should be, a functioning "shorthand" for this
    -function in the native locale -- English in this case).  If you find
    -such a function, call it with $lang as its first parameter (as if it
    -were a method), and then a copy of scalar(@messages) as its second,
    -and then return that value.  If that function was found, but was in
    -string shorthand instead of being a fully specified function, parse it
    -and make it into a function before calling it the first time.
    -
    -* The shorthand uses code in brackets to indicate method calls that
    -should be performed.  A full explanation is not in order here, but a
    -few examples will suffice:
    -
    -  "You have [quant,_1,piece] of new mail."
    -
    -The above code is shorthand for, and will be interpreted as,
    -this:
    -
    -  sub {
    -    my $handle = $_[0];
    -    my(@params) = @_;
    -    return join '',
    -      "You have ",
    -      $handle->quant($params[1], 'piece'),
    -      "of new mail.";
    -  }
    -
    -where "quant" is the name of a method you're using to quantify the
    -noun "piece" with the number $params[0].
    -
    -A string with no brackety calls, like this:
    -
    -  "Your search expression was malformed."
    -
    -is somewhat of a degerate case, and just gets turned into:
    -
    -  sub { return "Your search expression was malformed." }
    -
    -However, not everything you can write in Perl code can be written in
    -the above shorthand system -- not by a long shot.  For example, consider
    -the Italian translator from the beginning of this article, who wanted
    -the Italian for "I didn't find any files" as a special case, instead
    -of "I found 0 files".  That couldn't be specified (at least not easily
    -or simply) in our shorthand system, and it would have to be written
    -out in full, like this:
    -
    -  sub {  # pretend the English strings are in Italian
    -    my($handle, $files, $dirs) = @_[0,1,2];
    -    return "I didn't find any files" unless $files;
    -    return join '',
    -      "I found ",
    -      $handle->quant($files, 'file'),
    -      " in ",
    -      $handle->quant($dirs,  'directory'),
    -      ".";
    -  }
    -
    -Next to a lexicon full of shorthand code, that sort of sticks out like a
    -sore thumb -- but this I a special case, after all; and at least
    -it's possible, if not as concise as usual.
    -
    -As to how you'd implement the Russian example from the beginning of
    -the article, well, There's More Than One Way To Do It, but it could be
    -something like this (using English words for Russian, just so you know
    -what's going on):
    -
    -  "I [quant,_1,directory,accusative] scanned."
    -
    -This shifts the burden of complexity off to the quant method.  That
    -method's parameters are: the numeric value it's going to use to
    -quantify something; the Russian word it's going to quantify; and the
    -parameter "accusative", which you're using to mean that this
    -sentence's syntax wants a noun in the accusative case there, although
    -that quantification method may have to overrule, for grammatical
    -reasons you may recall from the beginning of this article.
    -
    -Now, the Russian quant method here is responsible not only for
    -implementing the strange logic necessary for figuring out how Russian
    -number-phrases impose case and number on their noun-phrases, but also
    -for inflecting the Russian word for "directory".  How that inflection
    -is to be carried out is no small issue, and among the solutions I've
    -seen, some (like variations on a simple lookup in a hash where all
    -possible forms are provided for all necessary words) are
    -straightforward but I become cumbersome when you need to inflect
    -more than a few dozen words; and other solutions (like using
    -algorithms to model the inflections, storing only root forms and
    -irregularities) I involve more overhead than is justifiable for
    -all but the largest lexicons.
    -
    -Mercifully, this design decision becomes crucial only in the hairiest
    -of inflected languages, of which Russian is by no means the I case
    -scenario, but is worse than most.  Most languages have simpler
    -inflection systems; for example, in English or Swahili, there are
    -generally no more than two possible inflected forms for a given noun
    -("error/errors"; "kosa/makosa"), and the
    -rules for producing these forms are fairly simple -- or at least,
    -simple rules can be formulated that work for most words, and you can
    -then treat the exceptions as just "irregular", at least relative to
    -your ad hoc rules.  A simpler inflection system (simpler rules, fewer
    -forms) means that design decisions are less crucial to maintaining
    -sanity, whereas the same decisions could incur
    -overhead-versus-scalability problems in languages like Russian.  It
    -may I be likely that code (possibly in Perl, as with
    -Lingua::EN::Inflect, for English nouns) has already
    -been written for the language in question, whether simple or complex.
    -
    -Moreover, a third possibility may even be simpler than anything
    -discussed above: "Just require that all possible (or at least
    -applicable) forms be provided in the call to the given language's quant
    -method, as in:"
    -
    -  "I found [quant,_1,file,files]."
    -
    -That way, quant just has to chose which form it needs, without having
    -to look up or generate anything.  While possibly not optimal for
    -Russian, this should work well for most other languages, where
    -quantification is not as complicated an operation.
    -
    -=head2 The Devil in the Details
    -
    -There's plenty more to Maketext than described above -- for example,
    -there's the details of how language tags ("en-US", "i-pwn", "fi",
    -etc.) or locale IDs ("en_US") interact with actual module naming
    -("BogoQuery/Locale/en_us.pm"), and what magic can ensue; there's the
    -details of how to record (and possibly negotiate) what character
    -encoding Maketext will return text in (UTF8? Latin-1? KOI8?).  There's
    -the interesting fact that Maketext is for localization, but nowhere
    -actually has a "C" anywhere in it.  For the curious,
    -there's the somewhat frightening details of how I actually
    -implement something like data inheritance so that searches across
    -modules' %Lexicon hashes can parallel how Perl implements method
    -inheritance.
    -
    -And, most importantly, there's all the practical details of how to
    -actually go about deriving from Maketext so you can use it for your
    -interfaces, and the various tools and conventions for starting out and
    -maintaining individual language modules.
    -
    -That is all covered in the documentation for Locale::Maketext and the
    -modules that come with it, available in CPAN.  After having read this
    -article, which covers the why's of Maketext, the documentation,
    -which covers the how's of it, should be quite straightfoward.
    -
    -=head2 The Proof in the Pudding: Localizing Web Sites
    -
    -Maketext and gettext have a notable difference: gettext is in C,
    -accessible thru C library calls, whereas Maketext is in Perl, and
    -really can't work without a Perl interpreter (although I suppose
    -something like it could be written for C).  Accidents of history (and
    -not necessarily lucky ones) have made C++ the most common language for
    -the implementation of applications like word processors, Web browsers,
    -and even many in-house applications like custom query systems.  Current
    -conditions make it somewhat unlikely that the next one of any of these
    -kinds of applications will be written in Perl, albeit clearly more for
    -reasons of custom and inertia than out of consideration of what is the
    -right tool for the job.
    -
    -However, other accidents of history have made Perl a well-accepted
    -language for design of server-side programs (generally in CGI form)
    -for Web site interfaces.  Localization of static pages in Web sites is
    -trivial, feasable either with simple language-negotiation features in
    -servers like Apache, or with some kind of server-side inclusions of
    -language-appropriate text into layout templates.  However, I think
    -that the localization of Perl-based search systems (or other kinds of
    -dynamic content) in Web sites, be they public or access-restricted,
    -is where Maketext will see the greatest use.
    -
    -I presume that it would be only the exceptional Web site that gets
    -localized for English I Chinese I Italian I Arabic
    -I Russian, to recall the languages from the beginning of this
    -article -- to say nothing of German, Spanish, French, Japanese,
    -Finnish, and Hindi, to name a few languages that benefit from large
    -numbers of programmers or Web viewers or both.
    -
    -However, the ever-increasing internationalization of the Web (whether
    -measured in terms of amount of content, of numbers of content writers
    -or programmers, or of size of content audiences) makes it increasingly
    -likely that the interface to the average Web-based dynamic content
    -service will be localized for two or maybe three languages.  It is my
    -hope that Maketext will make that task as simple as possible, and will
    -remove previous barriers to localization for languages dissimilar to
    -English.
    -
    - __END__
    -
    -Sean M. Burke (sburkeE<64>cpan.org) has a Master's in linguistics
    -from Northwestern University; he specializes in language technology.
    -Jordan Lachler (lachlerE<64>unm.edu) is a PhD student in the Department of
    -Linguistics at the University of New Mexico; he specializes in
    -morphology and pedagogy of North American native languages.
    -
    -=head2 References
    -
    -Alvestrand, Harald Tveit.  1995.  I
    -C
    -[Now see RFC 3066.]
    -
    -Callon, Ross, editor.  1996.  I
    -C
    -
    -Drepper, Ulrich, Peter Miller,
    -and FranEois Pinard.  1995-2001.  GNU
    -C.  Available in C, with
    -extensive docs in the distribution tarball.  [Since
    -I wrote this article in 1998, I now see that the
    -gettext docs are now trying more to come to terms with
    -plurality.  Whether useful conclusions have come from it
    -is another question altogether. -- SMB, May 2001]
    -
    -Forbes, Nevill.  1964.  I  Third Edition, revised
    -by J. C. Dumbreck.  Oxford University Press.
    -
    -=cut
    -
    -#End
    -
    diff --git a/lib/perl5/5.8.8/Locale/Script.pod b/lib/perl5/5.8.8/Locale/Script.pod
    deleted file mode 100644
    index 93ff8824..00000000
    --- a/lib/perl5/5.8.8/Locale/Script.pod
    +++ /dev/null
    @@ -1,253 +0,0 @@
    -
    -=head1 NAME
    -
    -Locale::Script - ISO codes for script identification (ISO 15924)
    -
    -=head1 SYNOPSIS
    -
    -    use Locale::Script;
    -    use Locale::Constants;
    -    
    -    $script  = code2script('ph');                       # 'Phoenician'
    -    $code    = script2code('Tibetan');                  # 'bo'
    -    $code3   = script2code('Tibetan',
    -                           LOCALE_CODE_ALPHA_3);        # 'bod'
    -    $codeN   = script2code('Tibetan',
    -                           LOCALE_CODE_ALPHA_NUMERIC);  # 330
    -    
    -    @codes   = all_script_codes();
    -    @scripts = all_script_names();
    -    
    -
    -=head1 DESCRIPTION
    -
    -The C module provides access to the ISO
    -codes for identifying scripts, as defined in ISO 15924.
    -For example, Egyptian hieroglyphs are denoted by the two-letter
    -code 'eg', the three-letter code 'egy', and the numeric code 050.
    -
    -You can either access the codes via the conversion routines
    -(described below), or with the two functions which return lists
    -of all script codes or all script names.
    -
    -There are three different code sets you can use for identifying
    -scripts:
    -
    -=over 4
    -
    -=item B
    -
    -Two letter codes, such as 'bo' for Tibetan.
    -This code set is identified with the symbol C.
    -
    -=item B
    -
    -Three letter codes, such as 'ell' for Greek.
    -This code set is identified with the symbol C.
    -
    -=item B
    -
    -Numeric codes, such as 410 for Hiragana.
    -This code set is identified with the symbol C.
    -
    -=back
    -
    -All of the routines take an optional additional argument
    -which specifies the code set to use.
    -If not specified, it defaults to the two-letter codes.
    -This is partly for backwards compatibility (previous versions
    -of Locale modules only supported the alpha-2 codes), and
    -partly because they are the most widely used codes.
    -
    -The alpha-2 and alpha-3 codes are not case-dependent,
    -so you can use 'BO', 'Bo', 'bO' or 'bo' for Tibetan.
    -When a code is returned by one of the functions in
    -this module, it will always be lower-case.
    -
    -=head2 SPECIAL CODES
    -
    -The standard defines various special codes.
    -
    -=over 4
    -
    -=item *
    -
    -The standard reserves codes in the ranges B - B,
    -B - B, and B<900> - B<919>, for private use.
    -
    -=item *
    -
    -B, B, and B<997>, are the codes for unwritten languages.
    -
    -=item *
    -
    -B, B, and B<998>, are the codes for an undetermined script.
    -
    -=item *
    -
    -B, B, and B<999>, are the codes for an uncoded script.
    -
    -=back
    -
    -The private codes are not recognised by Locale::Script,
    -but the others are.
    -
    -
    -=head1 CONVERSION ROUTINES
    -
    -There are three conversion routines: C, C,
    -and C.
    -
    -=over 4
    -
    -=item code2script( CODE, [ CODESET ] )
    -
    -This function takes a script code and returns a string
    -which contains the name of the script identified.
    -If the code is not a valid script code, as defined by ISO 15924,
    -then C will be returned:
    -
    -    $script = code2script('cy');   # Cyrillic
    -
    -=item script2code( STRING, [ CODESET ] )
    -
    -This function takes a script name and returns the corresponding
    -script code, if such exists.
    -If the argument could not be identified as a script name,
    -then C will be returned:
    -
    -    $code = script2code('Gothic', LOCALE_CODE_ALPHA_3);
    -    # $code will now be 'gth'
    -
    -The case of the script name is not important.
    -See the section L below.
    -
    -=item script_code2code( CODE, CODESET, CODESET )
    -
    -This function takes a script code from one code set,
    -and returns the corresponding code from another code set.
    -
    -    $alpha2 = script_code2code('jwi',
    -		 LOCALE_CODE_ALPHA_3 => LOCALE_CODE_ALPHA_2);
    -    # $alpha2 will now be 'jw' (Javanese)
    -
    -If the code passed is not a valid script code in
    -the first code set, or if there isn't a code for the
    -corresponding script in the second code set,
    -then C will be returned.
    -
    -=back
    -
    -
    -=head1 QUERY ROUTINES
    -
    -There are two function which can be used to obtain a list of all codes,
    -or all script names:
    -
    -=over 4
    -
    -=item C
    -
    -Returns a list of all two-letter script codes.
    -The codes are guaranteed to be all lower-case,
    -and not in any particular order.
    -
    -=item C
    -
    -Returns a list of all script names for which there is a corresponding
    -script code in the specified code set.
    -The names are capitalised, and not returned in any particular order.
    -
    -=back
    -
    -
    -=head1 EXAMPLES
    -
    -The following example illustrates use of the C function.
    -The user is prompted for a script code, and then told the corresponding
    -script name:
    -
    -    $| = 1;   # turn off buffering
    -    
    -    print "Enter script code: ";
    -    chop($code = );
    -    $script = code2script($code, LOCALE_CODE_ALPHA_2);
    -    if (defined $script)
    -    {
    -        print "$code = $script\n";
    -    }
    -    else
    -    {
    -        print "'$code' is not a valid script code!\n";
    -    }
    -
    -
    -=head1 KNOWN BUGS AND LIMITATIONS
    -
    -=over 4
    -
    -=item *
    -
    -When using C, the script name must currently appear
    -exactly as it does in the source of the module. For example,
    -
    -    script2code('Egyptian hieroglyphs')
    -
    -will return B, as expected. But the following will all return C:
    -
    -    script2code('hieroglyphs')
    -    script2code('Egyptian Hieroglypics')
    -
    -If there's need for it, a future version could have variants
    -for script names.
    -
    -=item *
    -
    -In the current implementation, all data is read in when the
    -module is loaded, and then held in memory.
    -A lazy implementation would be more memory friendly.
    -
    -=back
    -
    -=head1 SEE ALSO
    -
    -=over 4
    -
    -=item Locale::Language
    -
    -ISO two letter codes for identification of language (ISO 639).
    -
    -=item Locale::Currency
    -
    -ISO three letter codes for identification of currencies
    -and funds (ISO 4217).
    -
    -=item Locale::Country
    -
    -ISO three letter codes for identification of countries (ISO 3166)
    -
    -=item ISO 15924
    -
    -The ISO standard which defines these codes.
    -
    -=item http://www.evertype.com/standards/iso15924/
    -
    -Home page for ISO 15924.
    -
    -
    -=back
    -
    -
    -=head1 AUTHOR
    -
    -Neil Bowers Eneil@bowers.comE
    -
    -=head1 COPYRIGHT
    -
    -Copyright (c) 2002-2004 Neil Bowers.
    -
    -This module is free software; you can redistribute it and/or
    -modify it under the same terms as Perl itself.
    -
    -=cut
    -
    diff --git a/lib/perl5/5.8.8/Math/BigFloat.pm b/lib/perl5/5.8.8/Math/BigFloat.pm
    deleted file mode 100644
    index 4830618b..00000000
    --- a/lib/perl5/5.8.8/Math/BigFloat.pm
    +++ /dev/null
    @@ -1,3147 +0,0 @@
    -package Math::BigFloat;
    -
    -# 
    -# Mike grinned. 'Two down, infinity to go' - Mike Nostrus in 'Before and After'
    -#
    -
    -# The following hash values are internally used:
    -#   _e	: exponent (ref to $CALC object)
    -#   _m	: mantissa (ref to $CALC object)
    -#   _es	: sign of _e
    -# sign	: +,-,+inf,-inf, or "NaN" if not a number
    -#   _a	: accuracy
    -#   _p	: precision
    -
    -$VERSION = '1.51';
    -require 5.005;
    -
    -require Exporter;
    -@ISA =       qw(Exporter Math::BigInt);
    -
    -use strict;
    -# $_trap_inf/$_trap_nan are internal and should never be accessed from outside
    -use vars qw/$AUTOLOAD $accuracy $precision $div_scale $round_mode $rnd_mode
    -	    $upgrade $downgrade $_trap_nan $_trap_inf/;
    -my $class = "Math::BigFloat";
    -
    -use overload
    -'<=>'	=>	sub { $_[2] ?
    -                      ref($_[0])->bcmp($_[1],$_[0]) : 
    -                      ref($_[0])->bcmp($_[0],$_[1])},
    -'int'	=>	sub { $_[0]->as_number() },		# 'trunc' to bigint
    -;
    -
    -##############################################################################
    -# global constants, flags and assorted stuff
    -
    -# the following are public, but their usage is not recommended. Use the
    -# accessor methods instead.
    -
    -# class constants, use Class->constant_name() to access
    -$round_mode = 'even'; # one of 'even', 'odd', '+inf', '-inf', 'zero' or 'trunc'
    -$accuracy   = undef;
    -$precision  = undef;
    -$div_scale  = 40;
    -
    -$upgrade = undef;
    -$downgrade = undef;
    -# the package we are using for our private parts, defaults to:
    -# Math::BigInt->config()->{lib}
    -my $MBI = 'Math::BigInt::FastCalc';
    -
    -# are NaNs ok? (otherwise it dies when encountering an NaN) set w/ config()
    -$_trap_nan = 0;
    -# the same for infinity
    -$_trap_inf = 0;
    -
    -# constant for easier life
    -my $nan = 'NaN'; 
    -
    -my $IMPORT = 0;	# was import() called yet? used to make require work
    -
    -# some digits of accuracy for blog(undef,10); which we use in blog() for speed
    -my $LOG_10 = 
    - '2.3025850929940456840179914546843642076011014886287729760333279009675726097';
    -my $LOG_10_A = length($LOG_10)-1;
    -# ditto for log(2)
    -my $LOG_2 = 
    - '0.6931471805599453094172321214581765680755001343602552541206800094933936220';
    -my $LOG_2_A = length($LOG_2)-1;
    -my $HALF = '0.5';			# made into an object if necc.
    -
    -##############################################################################
    -# the old code had $rnd_mode, so we need to support it, too
    -
    -sub TIESCALAR   { my ($class) = @_; bless \$round_mode, $class; }
    -sub FETCH       { return $round_mode; }
    -sub STORE       { $rnd_mode = $_[0]->round_mode($_[1]); }
    -
    -BEGIN
    -  {
    -  # when someone set's $rnd_mode, we catch this and check the value to see
    -  # whether it is valid or not. 
    -  $rnd_mode   = 'even'; tie $rnd_mode, 'Math::BigFloat'; 
    -  }
    - 
    -##############################################################################
    -
    -{
    -  # valid method aliases for AUTOLOAD
    -  my %methods = map { $_ => 1 }  
    -   qw / fadd fsub fmul fdiv fround ffround fsqrt fmod fstr fsstr fpow fnorm
    -        fint facmp fcmp fzero fnan finf finc fdec flog ffac fneg
    -	fceil ffloor frsft flsft fone flog froot
    -      /;
    -  # valid method's that can be hand-ed up (for AUTOLOAD)
    -  my %hand_ups = map { $_ => 1 }  
    -   qw / is_nan is_inf is_negative is_positive is_pos is_neg
    -        accuracy precision div_scale round_mode fabs fnot
    -        objectify upgrade downgrade
    -	bone binf bnan bzero
    -      /;
    -
    -  sub method_alias { exists $methods{$_[0]||''}; } 
    -  sub method_hand_up { exists $hand_ups{$_[0]||''}; } 
    -}
    -
    -##############################################################################
    -# constructors
    -
    -sub new 
    -  {
    -  # create a new BigFloat object from a string or another bigfloat object. 
    -  # _e: exponent
    -  # _m: mantissa
    -  # sign  => sign (+/-), or "NaN"
    -
    -  my ($class,$wanted,@r) = @_;
    -
    -  # avoid numify-calls by not using || on $wanted!
    -  return $class->bzero() if !defined $wanted;	# default to 0
    -  return $wanted->copy() if UNIVERSAL::isa($wanted,'Math::BigFloat');
    -
    -  $class->import() if $IMPORT == 0;             # make require work
    -
    -  my $self = {}; bless $self, $class;
    -  # shortcut for bigints and its subclasses
    -  if ((ref($wanted)) && (ref($wanted) ne $class))
    -    {
    -    $self->{_m} = $wanted->as_number()->{value}; # get us a bigint copy
    -    $self->{_e} = $MBI->_zero();
    -    $self->{_es} = '+';
    -    $self->{sign} = $wanted->sign();
    -    return $self->bnorm();
    -    }
    -  # else: got a string
    -
    -  # handle '+inf', '-inf' first
    -  if ($wanted =~ /^[+-]?inf\z/)
    -    {
    -    return $downgrade->new($wanted) if $downgrade;
    -
    -    $self->{sign} = $wanted;		# set a default sign for bstr()
    -    return $self->binf($wanted);
    -    }
    -
    -  # shortcut for simple forms like '12' that neither have trailing nor leading
    -  # zeros
    -  if ($wanted =~ /^([+-]?)([1-9][0-9]*[1-9])$/)
    -    {
    -    $self->{_e} = $MBI->_zero();
    -    $self->{_es} = '+';
    -    $self->{sign} = $1 || '+';
    -    $self->{_m} = $MBI->_new($2);
    -    return $self->round(@r) if !$downgrade;
    -    }
    -
    -  my ($mis,$miv,$mfv,$es,$ev) = Math::BigInt::_split($wanted);
    -  if (!ref $mis)
    -    {
    -    if ($_trap_nan)
    -      {
    -      require Carp;
    -      Carp::croak ("$wanted is not a number initialized to $class");
    -      }
    -    
    -    return $downgrade->bnan() if $downgrade;
    -    
    -    $self->{_e} = $MBI->_zero();
    -    $self->{_es} = '+';
    -    $self->{_m} = $MBI->_zero();
    -    $self->{sign} = $nan;
    -    }
    -  else
    -    {
    -    # make integer from mantissa by adjusting exp, then convert to int
    -    $self->{_e} = $MBI->_new($$ev);		# exponent
    -    $self->{_es} = $$es || '+';
    -    my $mantissa = "$$miv$$mfv"; 		# create mant.
    -    $mantissa =~ s/^0+(\d)/$1/;			# strip leading zeros
    -    $self->{_m} = $MBI->_new($mantissa); 	# create mant.
    -
    -    # 3.123E0 = 3123E-3, and 3.123E-2 => 3123E-5
    -    if (CORE::length($$mfv) != 0)
    -      {
    -      my $len = $MBI->_new( CORE::length($$mfv));
    -      ($self->{_e}, $self->{_es}) =
    -	_e_sub ($self->{_e}, $len, $self->{_es}, '+');
    -      }
    -    # we can only have trailing zeros on the mantissa if $$mfv eq ''
    -    else
    -      {
    -      # Use a regexp to count the trailing zeros in $$miv instead of _zeros()
    -      # because that is faster, especially when _m is not stored in base 10.
    -      my $zeros = 0; $zeros = CORE::length($1) if $$miv =~ /[1-9](0*)$/; 
    -      if ($zeros != 0)
    -        {
    -        my $z = $MBI->_new($zeros);
    -        # turn '120e2' into '12e3'
    -        $MBI->_rsft ( $self->{_m}, $z, 10);
    -        ($self->{_e}, $self->{_es}) =
    -	  _e_add ( $self->{_e}, $z, $self->{_es}, '+');
    -        }
    -      }
    -    $self->{sign} = $$mis;
    -
    -    # for something like 0Ey, set y to 1, and -0 => +0
    -    # Check $$miv for beeing '0' and $$mfv eq '', because otherwise _m could not
    -    # have become 0. That's faster than to call $MBI->_is_zero().
    -    $self->{sign} = '+', $self->{_e} = $MBI->_one()
    -     if $$miv eq '0' and $$mfv eq '';
    -
    -    return $self->round(@r) if !$downgrade;
    -    }
    -  # if downgrade, inf, NaN or integers go down
    -
    -  if ($downgrade && $self->{_es} eq '+')
    -    {
    -    if ($MBI->_is_zero( $self->{_e} ))
    -      {
    -      return $downgrade->new($$mis . $MBI->_str( $self->{_m} ));
    -      }
    -    return $downgrade->new($self->bsstr()); 
    -    }
    -  $self->bnorm()->round(@r);			# first normalize, then round
    -  }
    -
    -sub copy
    -  {
    -  my ($c,$x);
    -  if (@_ > 1)
    -    {
    -    # if two arguments, the first one is the class to "swallow" subclasses
    -    ($c,$x) = @_;
    -    }
    -  else
    -    {
    -    $x = shift;
    -    $c = ref($x);
    -    }
    -  return unless ref($x); # only for objects
    -
    -  my $self = {}; bless $self,$c;
    -
    -  $self->{sign} = $x->{sign};
    -  $self->{_es} = $x->{_es};
    -  $self->{_m} = $MBI->_copy($x->{_m});
    -  $self->{_e} = $MBI->_copy($x->{_e});
    -  $self->{_a} = $x->{_a} if defined $x->{_a};
    -  $self->{_p} = $x->{_p} if defined $x->{_p};
    -  $self;
    -  }
    -
    -sub _bnan
    -  {
    -  # used by parent class bone() to initialize number to NaN
    -  my $self = shift;
    -  
    -  if ($_trap_nan)
    -    {
    -    require Carp;
    -    my $class = ref($self);
    -    Carp::croak ("Tried to set $self to NaN in $class\::_bnan()");
    -    }
    -
    -  $IMPORT=1;					# call our import only once
    -  $self->{_m} = $MBI->_zero();
    -  $self->{_e} = $MBI->_zero();
    -  $self->{_es} = '+';
    -  }
    -
    -sub _binf
    -  {
    -  # used by parent class bone() to initialize number to +-inf
    -  my $self = shift;
    -  
    -  if ($_trap_inf)
    -    {
    -    require Carp;
    -    my $class = ref($self);
    -    Carp::croak ("Tried to set $self to +-inf in $class\::_binf()");
    -    }
    -
    -  $IMPORT=1;					# call our import only once
    -  $self->{_m} = $MBI->_zero();
    -  $self->{_e} = $MBI->_zero();
    -  $self->{_es} = '+';
    -  }
    -
    -sub _bone
    -  {
    -  # used by parent class bone() to initialize number to 1
    -  my $self = shift;
    -  $IMPORT=1;					# call our import only once
    -  $self->{_m} = $MBI->_one();
    -  $self->{_e} = $MBI->_zero();
    -  $self->{_es} = '+';
    -  }
    -
    -sub _bzero
    -  {
    -  # used by parent class bone() to initialize number to 0
    -  my $self = shift;
    -  $IMPORT=1;					# call our import only once
    -  $self->{_m} = $MBI->_zero();
    -  $self->{_e} = $MBI->_one();
    -  $self->{_es} = '+';
    -  }
    -
    -sub isa
    -  {
    -  my ($self,$class) = @_;
    -  return if $class =~ /^Math::BigInt/;		# we aren't one of these
    -  UNIVERSAL::isa($self,$class);
    -  }
    -
    -sub config
    -  {
    -  # return (later set?) configuration data as hash ref
    -  my $class = shift || 'Math::BigFloat';
    -
    -  my $cfg = $class->SUPER::config(@_);
    -
    -  # now we need only to override the ones that are different from our parent
    -  $cfg->{class} = $class;
    -  $cfg->{with} = $MBI;
    -  $cfg;
    -  }
    -
    -##############################################################################
    -# string conversation
    -
    -sub bstr 
    -  {
    -  # (ref to BFLOAT or num_str ) return num_str
    -  # Convert number from internal format to (non-scientific) string format.
    -  # internal format is always normalized (no leading zeros, "-0" => "+0")
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -
    -  if ($x->{sign} !~ /^[+-]$/)
    -    {
    -    return $x->{sign} unless $x->{sign} eq '+inf';      # -inf, NaN
    -    return 'inf';                                       # +inf
    -    }
    -
    -  my $es = '0'; my $len = 1; my $cad = 0; my $dot = '.';
    -
    -  # $x is zero?
    -  my $not_zero = !($x->{sign} eq '+' && $MBI->_is_zero($x->{_m}));
    -  if ($not_zero)
    -    {
    -    $es = $MBI->_str($x->{_m});
    -    $len = CORE::length($es);
    -    my $e = $MBI->_num($x->{_e});	
    -    $e = -$e if $x->{_es} eq '-';
    -    if ($e < 0)
    -      {
    -      $dot = '';
    -      # if _e is bigger than a scalar, the following will blow your memory
    -      if ($e <= -$len)
    -        {
    -        my $r = abs($e) - $len;
    -        $es = '0.'. ('0' x $r) . $es; $cad = -($len+$r);
    -        }
    -      else
    -        {
    -        substr($es,$e,0) = '.'; $cad = $MBI->_num($x->{_e});
    -        $cad = -$cad if $x->{_es} eq '-';
    -        }
    -      }
    -    elsif ($e > 0)
    -      {
    -      # expand with zeros
    -      $es .= '0' x $e; $len += $e; $cad = 0;
    -      }
    -    } # if not zero
    -
    -  $es = '-'.$es if $x->{sign} eq '-';
    -  # if set accuracy or precision, pad with zeros on the right side
    -  if ((defined $x->{_a}) && ($not_zero))
    -    {
    -    # 123400 => 6, 0.1234 => 4, 0.001234 => 4
    -    my $zeros = $x->{_a} - $cad;		# cad == 0 => 12340
    -    $zeros = $x->{_a} - $len if $cad != $len;
    -    $es .= $dot.'0' x $zeros if $zeros > 0;
    -    }
    -  elsif ((($x->{_p} || 0) < 0))
    -    {
    -    # 123400 => 6, 0.1234 => 4, 0.001234 => 6
    -    my $zeros = -$x->{_p} + $cad;
    -    $es .= $dot.'0' x $zeros if $zeros > 0;
    -    }
    -  $es;
    -  }
    -
    -sub bsstr
    -  {
    -  # (ref to BFLOAT or num_str ) return num_str
    -  # Convert number from internal format to scientific string format.
    -  # internal format is always normalized (no leading zeros, "-0E0" => "+0E0")
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -
    -  if ($x->{sign} !~ /^[+-]$/)
    -    {
    -    return $x->{sign} unless $x->{sign} eq '+inf';      # -inf, NaN
    -    return 'inf';                                       # +inf
    -    }
    -  my $sep = 'e'.$x->{_es};
    -  my $sign = $x->{sign}; $sign = '' if $sign eq '+';
    -  $sign . $MBI->_str($x->{_m}) . $sep . $MBI->_str($x->{_e});
    -  }
    -    
    -sub numify 
    -  {
    -  # Make a number from a BigFloat object
    -  # simple return a string and let Perl's atoi()/atof() handle the rest
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -  $x->bsstr(); 
    -  }
    -
    -##############################################################################
    -# public stuff (usually prefixed with "b")
    -
    -sub bneg
    -  {
    -  # (BINT or num_str) return BINT
    -  # negate number or make a negated number from string
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -
    -  return $x if $x->modify('bneg');
    -
    -  # for +0 dont negate (to have always normalized +0). Does nothing for 'NaN'
    -  $x->{sign} =~ tr/+-/-+/ unless ($x->{sign} eq '+' && $MBI->_is_zero($x->{_m}));
    -  $x;
    -  }
    -
    -# tels 2001-08-04 
    -# XXX TODO this must be overwritten and return NaN for non-integer values
    -# band(), bior(), bxor(), too
    -#sub bnot
    -#  {
    -#  $class->SUPER::bnot($class,@_);
    -#  }
    -
    -sub bcmp 
    -  {
    -  # Compares 2 values.  Returns one of undef, <0, =0, >0. (suitable for sort)
    -
    -  # set up parameters
    -  my ($self,$x,$y) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y) = objectify(2,@_);
    -    }
    -
    -  return $upgrade->bcmp($x,$y) if defined $upgrade &&
    -    ((!$x->isa($self)) || (!$y->isa($self)));
    -
    -  if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
    -    {
    -    # handle +-inf and NaN
    -    return undef if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
    -    return 0 if ($x->{sign} eq $y->{sign}) && ($x->{sign} =~ /^[+-]inf$/);
    -    return +1 if $x->{sign} eq '+inf';
    -    return -1 if $x->{sign} eq '-inf';
    -    return -1 if $y->{sign} eq '+inf';
    -    return +1;
    -    }
    -
    -  # check sign for speed first
    -  return 1 if $x->{sign} eq '+' && $y->{sign} eq '-';	# does also 0 <=> -y
    -  return -1 if $x->{sign} eq '-' && $y->{sign} eq '+';	# does also -x <=> 0
    -
    -  # shortcut 
    -  my $xz = $x->is_zero();
    -  my $yz = $y->is_zero();
    -  return 0 if $xz && $yz;				# 0 <=> 0
    -  return -1 if $xz && $y->{sign} eq '+';		# 0 <=> +y
    -  return 1 if $yz && $x->{sign} eq '+';			# +x <=> 0
    -
    -  # adjust so that exponents are equal
    -  my $lxm = $MBI->_len($x->{_m});
    -  my $lym = $MBI->_len($y->{_m});
    -  # the numify somewhat limits our length, but makes it much faster
    -  my ($xes,$yes) = (1,1);
    -  $xes = -1 if $x->{_es} ne '+';
    -  $yes = -1 if $y->{_es} ne '+';
    -  my $lx = $lxm + $xes * $MBI->_num($x->{_e});
    -  my $ly = $lym + $yes * $MBI->_num($y->{_e});
    -  my $l = $lx - $ly; $l = -$l if $x->{sign} eq '-';
    -  return $l <=> 0 if $l != 0;
    -  
    -  # lengths (corrected by exponent) are equal
    -  # so make mantissa equal length by padding with zero (shift left)
    -  my $diff = $lxm - $lym;
    -  my $xm = $x->{_m};		# not yet copy it
    -  my $ym = $y->{_m};
    -  if ($diff > 0)
    -    {
    -    $ym = $MBI->_copy($y->{_m});
    -    $ym = $MBI->_lsft($ym, $MBI->_new($diff), 10);
    -    }
    -  elsif ($diff < 0)
    -    {
    -    $xm = $MBI->_copy($x->{_m});
    -    $xm = $MBI->_lsft($xm, $MBI->_new(-$diff), 10);
    -    }
    -  my $rc = $MBI->_acmp($xm,$ym);
    -  $rc = -$rc if $x->{sign} eq '-';		# -124 < -123
    -  $rc <=> 0;
    -  }
    -
    -sub bacmp 
    -  {
    -  # Compares 2 values, ignoring their signs. 
    -  # Returns one of undef, <0, =0, >0. (suitable for sort)
    -  
    -  # set up parameters
    -  my ($self,$x,$y) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y) = objectify(2,@_);
    -    }
    -
    -  return $upgrade->bacmp($x,$y) if defined $upgrade &&
    -    ((!$x->isa($self)) || (!$y->isa($self)));
    -
    -  # handle +-inf and NaN's
    -  if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/)
    -    {
    -    return undef if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
    -    return 0 if ($x->is_inf() && $y->is_inf());
    -    return 1 if ($x->is_inf() && !$y->is_inf());
    -    return -1;
    -    }
    -
    -  # shortcut 
    -  my $xz = $x->is_zero();
    -  my $yz = $y->is_zero();
    -  return 0 if $xz && $yz;				# 0 <=> 0
    -  return -1 if $xz && !$yz;				# 0 <=> +y
    -  return 1 if $yz && !$xz;				# +x <=> 0
    -
    -  # adjust so that exponents are equal
    -  my $lxm = $MBI->_len($x->{_m});
    -  my $lym = $MBI->_len($y->{_m});
    -  my ($xes,$yes) = (1,1);
    -  $xes = -1 if $x->{_es} ne '+';
    -  $yes = -1 if $y->{_es} ne '+';
    -  # the numify somewhat limits our length, but makes it much faster
    -  my $lx = $lxm + $xes * $MBI->_num($x->{_e});
    -  my $ly = $lym + $yes * $MBI->_num($y->{_e});
    -  my $l = $lx - $ly;
    -  return $l <=> 0 if $l != 0;
    -  
    -  # lengths (corrected by exponent) are equal
    -  # so make mantissa equal-length by padding with zero (shift left)
    -  my $diff = $lxm - $lym;
    -  my $xm = $x->{_m};		# not yet copy it
    -  my $ym = $y->{_m};
    -  if ($diff > 0)
    -    {
    -    $ym = $MBI->_copy($y->{_m});
    -    $ym = $MBI->_lsft($ym, $MBI->_new($diff), 10);
    -    }
    -  elsif ($diff < 0)
    -    {
    -    $xm = $MBI->_copy($x->{_m});
    -    $xm = $MBI->_lsft($xm, $MBI->_new(-$diff), 10);
    -    }
    -  $MBI->_acmp($xm,$ym);
    -  }
    -
    -sub badd 
    -  {
    -  # add second arg (BFLOAT or string) to first (BFLOAT) (modifies first)
    -  # return result as BFLOAT
    -
    -  # set up parameters
    -  my ($self,$x,$y,$a,$p,$r) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,$a,$p,$r) = objectify(2,@_);
    -    }
    -
    -  # inf and NaN handling
    -  if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
    -    {
    -    # NaN first
    -    return $x->bnan() if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
    -    # inf handling
    -    if (($x->{sign} =~ /^[+-]inf$/) && ($y->{sign} =~ /^[+-]inf$/))
    -      {
    -      # +inf++inf or -inf+-inf => same, rest is NaN
    -      return $x if $x->{sign} eq $y->{sign};
    -      return $x->bnan();
    -      }
    -    # +-inf + something => +inf; something +-inf => +-inf
    -    $x->{sign} = $y->{sign}, return $x if $y->{sign} =~ /^[+-]inf$/;
    -    return $x;
    -    }
    -
    -  return $upgrade->badd($x,$y,$a,$p,$r) if defined $upgrade &&
    -   ((!$x->isa($self)) || (!$y->isa($self)));
    -
    -  # speed: no add for 0+y or x+0
    -  return $x->bround($a,$p,$r) if $y->is_zero();		# x+0
    -  if ($x->is_zero())					# 0+y
    -    {
    -    # make copy, clobbering up x (modify in place!)
    -    $x->{_e} = $MBI->_copy($y->{_e});
    -    $x->{_es} = $y->{_es};
    -    $x->{_m} = $MBI->_copy($y->{_m});
    -    $x->{sign} = $y->{sign} || $nan;
    -    return $x->round($a,$p,$r,$y);
    -    }
    - 
    -  # take lower of the two e's and adapt m1 to it to match m2
    -  my $e = $y->{_e};
    -  $e = $MBI->_zero() if !defined $e;		# if no BFLOAT?
    -  $e = $MBI->_copy($e);				# make copy (didn't do it yet)
    -
    -  my $es;
    -
    -  ($e,$es) = _e_sub($e, $x->{_e}, $y->{_es} || '+', $x->{_es});
    -
    -  my $add = $MBI->_copy($y->{_m});
    -
    -  if ($es eq '-')				# < 0
    -    {
    -    $MBI->_lsft( $x->{_m}, $e, 10);
    -    ($x->{_e},$x->{_es}) = _e_add($x->{_e}, $e, $x->{_es}, $es);
    -    }
    -  elsif (!$MBI->_is_zero($e))			# > 0
    -    {
    -    $MBI->_lsft($add, $e, 10);
    -    }
    -  # else: both e are the same, so just leave them
    -
    -  if ($x->{sign} eq $y->{sign})
    -    {
    -    # add
    -    $x->{_m} = $MBI->_add($x->{_m}, $add);
    -    }
    -  else
    -    {
    -    ($x->{_m}, $x->{sign}) = 
    -     _e_add($x->{_m}, $add, $x->{sign}, $y->{sign});
    -    }
    -
    -  # delete trailing zeros, then round
    -  $x->bnorm()->round($a,$p,$r,$y);
    -  }
    -
    -# sub bsub is inherited from Math::BigInt!
    -
    -sub binc
    -  {
    -  # increment arg by one
    -  my ($self,$x,@r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
    -
    -  if ($x->{_es} eq '-')
    -    {
    -    return $x->badd($self->bone(),@r);	#  digits after dot
    -    }
    -
    -  if (!$MBI->_is_zero($x->{_e}))		# _e == 0 for NaN, inf, -inf
    -    {
    -    # 1e2 => 100, so after the shift below _m has a '0' as last digit
    -    $x->{_m} = $MBI->_lsft($x->{_m}, $x->{_e},10);	# 1e2 => 100
    -    $x->{_e} = $MBI->_zero();				# normalize
    -    $x->{_es} = '+';
    -    # we know that the last digit of $x will be '1' or '9', depending on the
    -    # sign
    -    }
    -  # now $x->{_e} == 0
    -  if ($x->{sign} eq '+')
    -    {
    -    $MBI->_inc($x->{_m});
    -    return $x->bnorm()->bround(@r);
    -    }
    -  elsif ($x->{sign} eq '-')
    -    {
    -    $MBI->_dec($x->{_m});
    -    $x->{sign} = '+' if $MBI->_is_zero($x->{_m}); # -1 +1 => -0 => +0
    -    return $x->bnorm()->bround(@r);
    -    }
    -  # inf, nan handling etc
    -  $x->badd($self->bone(),@r);			# badd() does round 
    -  }
    -
    -sub bdec
    -  {
    -  # decrement arg by one
    -  my ($self,$x,@r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
    -
    -  if ($x->{_es} eq '-')
    -    {
    -    return $x->badd($self->bone('-'),@r);	#  digits after dot
    -    }
    -
    -  if (!$MBI->_is_zero($x->{_e}))
    -    {
    -    $x->{_m} = $MBI->_lsft($x->{_m}, $x->{_e},10);	# 1e2 => 100
    -    $x->{_e} = $MBI->_zero();				# normalize
    -    $x->{_es} = '+';
    -    }
    -  # now $x->{_e} == 0
    -  my $zero = $x->is_zero();
    -  # <= 0
    -  if (($x->{sign} eq '-') || $zero)
    -    {
    -    $MBI->_inc($x->{_m});
    -    $x->{sign} = '-' if $zero;				# 0 => 1 => -1
    -    $x->{sign} = '+' if $MBI->_is_zero($x->{_m});	# -1 +1 => -0 => +0
    -    return $x->bnorm()->round(@r);
    -    }
    -  # > 0
    -  elsif ($x->{sign} eq '+')
    -    {
    -    $MBI->_dec($x->{_m});
    -    return $x->bnorm()->round(@r);
    -    }
    -  # inf, nan handling etc
    -  $x->badd($self->bone('-'),@r);		# does round
    -  } 
    -
    -sub DEBUG () { 0; }
    -
    -sub blog
    -  {
    -  my ($self,$x,$base,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
    -
    -  # $base > 0, $base != 1; if $base == undef default to $base == e
    -  # $x >= 0
    -
    -  # we need to limit the accuracy to protect against overflow
    -  my $fallback = 0;
    -  my ($scale,@params);
    -  ($x,@params) = $x->_find_round_parameters($a,$p,$r);
    -
    -  # also takes care of the "error in _find_round_parameters?" case
    -  return $x->bnan() if $x->{sign} ne '+' || $x->is_zero();
    -
    -
    -  # no rounding at all, so must use fallback
    -  if (scalar @params == 0)
    -    {
    -    # simulate old behaviour
    -    $params[0] = $self->div_scale();	# and round to it as accuracy
    -    $params[1] = undef;			# P = undef
    -    $scale = $params[0]+4; 		# at least four more for proper round
    -    $params[2] = $r;			# round mode by caller or undef
    -    $fallback = 1;			# to clear a/p afterwards
    -    }
    -  else
    -    {
    -    # the 4 below is empirical, and there might be cases where it is not
    -    # enough...
    -    $scale = abs($params[0] || $params[1]) + 4;	# take whatever is defined
    -    }
    -
    -  return $x->bzero(@params) if $x->is_one();
    -  # base not defined => base == Euler's constant e
    -  if (defined $base)
    -    {
    -    # make object, since we don't feed it through objectify() to still get the
    -    # case of $base == undef
    -    $base = $self->new($base) unless ref($base);
    -    # $base > 0; $base != 1
    -    return $x->bnan() if $base->is_zero() || $base->is_one() ||
    -      $base->{sign} ne '+';
    -    # if $x == $base, we know the result must be 1.0
    -    if ($x->bcmp($base) == 0)
    -      {
    -      $x->bone('+',@params);
    -      if ($fallback)
    -        {
    -        # clear a/p after round, since user did not request it
    -        delete $x->{_a}; delete $x->{_p};
    -        }
    -      return $x;
    -      }
    -    }
    -
    -  # when user set globals, they would interfere with our calculation, so
    -  # disable them and later re-enable them
    -  no strict 'refs';
    -  my $abr = "$self\::accuracy"; my $ab = $$abr; $$abr = undef;
    -  my $pbr = "$self\::precision"; my $pb = $$pbr; $$pbr = undef;
    -  # we also need to disable any set A or P on $x (_find_round_parameters took
    -  # them already into account), since these would interfere, too
    -  delete $x->{_a}; delete $x->{_p};
    -  # need to disable $upgrade in BigInt, to avoid deep recursion
    -  local $Math::BigInt::upgrade = undef;
    -  local $Math::BigFloat::downgrade = undef;
    -
    -  # upgrade $x if $x is not a BigFloat (handle BigInt input)
    -  if (!$x->isa('Math::BigFloat'))
    -    {
    -    $x = Math::BigFloat->new($x);
    -    $self = ref($x);
    -    }
    -  
    -  my $done = 0;
    -
    -  # If the base is defined and an integer, try to calculate integer result
    -  # first. This is very fast, and in case the real result was found, we can
    -  # stop right here.
    -  if (defined $base && $base->is_int() && $x->is_int())
    -    {
    -    my $i = $MBI->_copy( $x->{_m} );
    -    $MBI->_lsft( $i, $x->{_e}, 10 ) unless $MBI->_is_zero($x->{_e});
    -    my $int = Math::BigInt->bzero();
    -    $int->{value} = $i;
    -    $int->blog($base->as_number());
    -    # if ($exact)
    -    if ($base->as_number()->bpow($int) == $x)
    -      {
    -      # found result, return it
    -      $x->{_m} = $int->{value};
    -      $x->{_e} = $MBI->_zero();
    -      $x->{_es} = '+';
    -      $x->bnorm();
    -      $done = 1;
    -      }
    -    }
    -
    -  if ($done == 0)
    -    {
    -    # first calculate the log to base e (using reduction by 10 (and probably 2))
    -    $self->_log_10($x,$scale);
    -
    -    # and if a different base was requested, convert it
    -    if (defined $base)
    -      {
    -      $base = Math::BigFloat->new($base) unless $base->isa('Math::BigFloat');
    -      # not ln, but some other base (don't modify $base)
    -      $x->bdiv( $base->copy()->blog(undef,$scale), $scale );
    -      }
    -    }
    - 
    -  # shortcut to not run through _find_round_parameters again
    -  if (defined $params[0])
    -    {
    -    $x->bround($params[0],$params[2]);		# then round accordingly
    -    }
    -  else
    -    {
    -    $x->bfround($params[1],$params[2]);		# then round accordingly
    -    }
    -  if ($fallback)
    -    {
    -    # clear a/p after round, since user did not request it
    -    delete $x->{_a}; delete $x->{_p};
    -    }
    -  # restore globals
    -  $$abr = $ab; $$pbr = $pb;
    -
    -  $x;
    -  }
    -
    -sub _log
    -  {
    -  # internal log function to calculate ln() based on Taylor series.
    -  # Modifies $x in place.
    -  my ($self,$x,$scale) = @_;
    -
    -  # in case of $x == 1, result is 0
    -  return $x->bzero() if $x->is_one();
    -
    -  # http://www.efunda.com/math/taylor_series/logarithmic.cfm?search_string=log
    -
    -  # u = x-1, v = x+1
    -  #              _                               _
    -  # Taylor:     |    u    1   u^3   1   u^5       |
    -  # ln (x)  = 2 |   --- + - * --- + - * --- + ... |  x > 0
    -  #             |_   v    3   v^3   5   v^5      _|
    -
    -  # This takes much more steps to calculate the result and is thus not used
    -  # u = x-1
    -  #              _                               _
    -  # Taylor:     |    u    1   u^2   1   u^3       |
    -  # ln (x)  = 2 |   --- + - * --- + - * --- + ... |  x > 1/2
    -  #             |_   x    2   x^2   3   x^3      _|
    -
    -  my ($limit,$v,$u,$below,$factor,$two,$next,$over,$f);
    -
    -  $v = $x->copy(); $v->binc();		# v = x+1
    -  $x->bdec(); $u = $x->copy();		# u = x-1; x = x-1
    -  $x->bdiv($v,$scale);			# first term: u/v
    -  $below = $v->copy();
    -  $over = $u->copy();
    -  $u *= $u; $v *= $v;				# u^2, v^2
    -  $below->bmul($v);				# u^3, v^3
    -  $over->bmul($u);
    -  $factor = $self->new(3); $f = $self->new(2);
    -
    -  my $steps = 0 if DEBUG;  
    -  $limit = $self->new("1E-". ($scale-1));
    -  while (3 < 5)
    -    {
    -    # we calculate the next term, and add it to the last
    -    # when the next term is below our limit, it won't affect the outcome
    -    # anymore, so we stop
    -
    -    # calculating the next term simple from over/below will result in quite
    -    # a time hog if the input has many digits, since over and below will
    -    # accumulate more and more digits, and the result will also have many
    -    # digits, but in the end it is rounded to $scale digits anyway. So if we
    -    # round $over and $below first, we save a lot of time for the division
    -    # (not with log(1.2345), but try log (123**123) to see what I mean. This
    -    # can introduce a rounding error if the division result would be f.i.
    -    # 0.1234500000001 and we round it to 5 digits it would become 0.12346, but
    -    # if we truncated $over and $below we might get 0.12345. Does this matter
    -    # for the end result? So we give $over and $below 4 more digits to be
    -    # on the safe side (unscientific error handling as usual... :+D
    -    
    -    $next = $over->copy->bround($scale+4)->bdiv(
    -      $below->copy->bmul($factor)->bround($scale+4), 
    -      $scale);
    -
    -## old version:    
    -##    $next = $over->copy()->bdiv($below->copy()->bmul($factor),$scale);
    -
    -    last if $next->bacmp($limit) <= 0;
    -
    -    delete $next->{_a}; delete $next->{_p};
    -    $x->badd($next);
    -    # calculate things for the next term
    -    $over *= $u; $below *= $v; $factor->badd($f);
    -    if (DEBUG)
    -      {
    -      $steps++; print "step $steps = $x\n" if $steps % 10 == 0;
    -      }
    -    }
    -  $x->bmul($f);					# $x *= 2
    -  print "took $steps steps\n" if DEBUG;
    -  }
    -
    -sub _log_10
    -  {
    -  # Internal log function based on reducing input to the range of 0.1 .. 9.99
    -  # and then "correcting" the result to the proper one. Modifies $x in place.
    -  my ($self,$x,$scale) = @_;
    -
    -  # taking blog() from numbers greater than 10 takes a *very long* time, so we
    -  # break the computation down into parts based on the observation that:
    -  #  blog(x*y) = blog(x) + blog(y)
    -  # We set $y here to multiples of 10 so that $x is below 1 (the smaller $x is
    -  # the faster it get's, especially because 2*$x takes about 10 times as long,
    -  # so by dividing $x by 10 we make it at least factor 100 faster...)
    -
    -  # The same observation is valid for numbers smaller than 0.1 (e.g. computing
    -  # log(1) is fastest, and the farther away we get from 1, the longer it takes)
    -  # so we also 'break' this down by multiplying $x with 10 and subtract the
    -  # log(10) afterwards to get the correct result.
    -
    -  # calculate nr of digits before dot
    -  my $dbd = $MBI->_num($x->{_e});
    -  $dbd = -$dbd if $x->{_es} eq '-';
    -  $dbd += $MBI->_len($x->{_m});
    -
    -  # more than one digit (e.g. at least 10), but *not* exactly 10 to avoid
    -  # infinite recursion
    -
    -  my $calc = 1;					# do some calculation?
    -
    -  # disable the shortcut for 10, since we need log(10) and this would recurse
    -  # infinitely deep
    -  if ($x->{_es} eq '+' && $MBI->_is_one($x->{_e}) && $MBI->_is_one($x->{_m}))
    -    {
    -    $dbd = 0;					# disable shortcut
    -    # we can use the cached value in these cases
    -    if ($scale <= $LOG_10_A)
    -      {
    -      $x->bzero(); $x->badd($LOG_10);
    -      $calc = 0; 				# no need to calc, but round
    -      }
    -    }
    -  else
    -    {
    -    # disable the shortcut for 2, since we maybe have it cached
    -    if (($MBI->_is_zero($x->{_e}) && $MBI->_is_two($x->{_m})))
    -      {
    -      $dbd = 0;					# disable shortcut
    -      # we can use the cached value in these cases
    -      if ($scale <= $LOG_2_A)
    -        {
    -        $x->bzero(); $x->badd($LOG_2);
    -        $calc = 0; 				# no need to calc, but round
    -        }
    -      }
    -    }
    -
    -  # if $x = 0.1, we know the result must be 0-log(10)
    -  if ($calc != 0 && $x->{_es} eq '-' && $MBI->_is_one($x->{_e}) &&
    -      $MBI->_is_one($x->{_m}))
    -    {
    -    $dbd = 0;					# disable shortcut
    -    # we can use the cached value in these cases
    -    if ($scale <= $LOG_10_A)
    -      {
    -      $x->bzero(); $x->bsub($LOG_10);
    -      $calc = 0; 				# no need to calc, but round
    -      }
    -    }
    -
    -  return if $calc == 0;				# already have the result
    -
    -  # default: these correction factors are undef and thus not used
    -  my $l_10;				# value of ln(10) to A of $scale
    -  my $l_2;				# value of ln(2) to A of $scale
    -
    -  # $x == 2 => 1, $x == 13 => 2, $x == 0.1 => 0, $x == 0.01 => -1
    -  # so don't do this shortcut for 1 or 0
    -  if (($dbd > 1) || ($dbd < 0))
    -    {
    -    # convert our cached value to an object if not already (avoid doing this
    -    # at import() time, since not everybody needs this)
    -    $LOG_10 = $self->new($LOG_10,undef,undef) unless ref $LOG_10;
    -
    -    #print "x = $x, dbd = $dbd, calc = $calc\n";
    -    # got more than one digit before the dot, or more than one zero after the
    -    # dot, so do:
    -    #  log(123)    == log(1.23) + log(10) * 2
    -    #  log(0.0123) == log(1.23) - log(10) * 2
    -  
    -    if ($scale <= $LOG_10_A)
    -      {
    -      # use cached value
    -      $l_10 = $LOG_10->copy();		# copy for mul
    -      }
    -    else
    -      {
    -      # else: slower, compute it (but don't cache it, because it could be big)
    -      # also disable downgrade for this code path
    -      local $Math::BigFloat::downgrade = undef;
    -      $l_10 = $self->new(10)->blog(undef,$scale);	# scale+4, actually
    -      }
    -    $dbd-- if ($dbd > 1); 		# 20 => dbd=2, so make it dbd=1	
    -    $l_10->bmul( $self->new($dbd));	# log(10) * (digits_before_dot-1)
    -    my $dbd_sign = '+';
    -    if ($dbd < 0)
    -      {
    -      $dbd = -$dbd;
    -      $dbd_sign = '-';
    -      }
    -    ($x->{_e}, $x->{_es}) = 
    -	_e_sub( $x->{_e}, $MBI->_new($dbd), $x->{_es}, $dbd_sign); # 123 => 1.23
    - 
    -    }
    -
    -  # Now: 0.1 <= $x < 10 (and possible correction in l_10)
    -
    -  ### Since $x in the range 0.5 .. 1.5 is MUCH faster, we do a repeated div
    -  ### or mul by 2 (maximum times 3, since x < 10 and x > 0.1)
    -
    -  $HALF = $self->new($HALF) unless ref($HALF);
    -
    -  my $twos = 0;				# default: none (0 times)	
    -  my $two = $self->new(2);
    -  while ($x->bacmp($HALF) <= 0)
    -    {
    -    $twos--; $x->bmul($two);
    -    }
    -  while ($x->bacmp($two) >= 0)
    -    {
    -    $twos++; $x->bdiv($two,$scale+4);		# keep all digits
    -    }
    -  # $twos > 0 => did mul 2, < 0 => did div 2 (never both)
    -  # calculate correction factor based on ln(2)
    -  if ($twos != 0)
    -    {
    -    $LOG_2 = $self->new($LOG_2,undef,undef) unless ref $LOG_2;
    -    if ($scale <= $LOG_2_A)
    -      {
    -      # use cached value
    -      $l_2 = $LOG_2->copy();			# copy for mul
    -      }
    -    else
    -      {
    -      # else: slower, compute it (but don't cache it, because it could be big)
    -      # also disable downgrade for this code path
    -      local $Math::BigFloat::downgrade = undef;
    -      $l_2 = $two->blog(undef,$scale);	# scale+4, actually
    -      }
    -    $l_2->bmul($twos);		# * -2 => subtract, * 2 => add
    -    }
    -  
    -  $self->_log($x,$scale);			# need to do the "normal" way
    -  $x->badd($l_10) if defined $l_10; 		# correct it by ln(10)
    -  $x->badd($l_2) if defined $l_2;		# and maybe by ln(2)
    -  # all done, $x contains now the result
    -  }
    -
    -sub blcm 
    -  { 
    -  # (BFLOAT or num_str, BFLOAT or num_str) return BFLOAT
    -  # does not modify arguments, but returns new object
    -  # Lowest Common Multiplicator
    -
    -  my ($self,@arg) = objectify(0,@_);
    -  my $x = $self->new(shift @arg);
    -  while (@arg) { $x = Math::BigInt::__lcm($x,shift @arg); } 
    -  $x;
    -  }
    -
    -sub bgcd
    -  {
    -  # (BINT or num_str, BINT or num_str) return BINT
    -  # does not modify arguments, but returns new object
    -
    -  my $y = shift;
    -  $y = __PACKAGE__->new($y) if !ref($y);
    -  my $self = ref($y);
    -  my $x = $y->copy()->babs();			# keep arguments
    -
    -  return $x->bnan() if $x->{sign} !~ /^[+-]$/	# x NaN?
    -	|| !$x->is_int();			# only for integers now
    -
    -  while (@_)
    -    {
    -    my $t = shift; $t = $self->new($t) if !ref($t);
    -    $y = $t->copy()->babs();
    -    
    -    return $x->bnan() if $y->{sign} !~ /^[+-]$/	# y NaN?
    -     	|| !$y->is_int();			# only for integers now
    -
    -    # greatest common divisor
    -    while (! $y->is_zero())
    -      {
    -      ($x,$y) = ($y->copy(), $x->copy()->bmod($y));
    -      }
    -
    -    last if $x->is_one();
    -    }
    -  $x;
    -  }
    -
    -##############################################################################
    -
    -sub _e_add
    -  {
    -  # Internal helper sub to take two positive integers and their signs and
    -  # then add them. Input ($CALC,$CALC,('+'|'-'),('+'|'-')), 
    -  # output ($CALC,('+'|'-'))
    -  my ($x,$y,$xs,$ys) = @_;
    -
    -  # if the signs are equal we can add them (-5 + -3 => -(5 + 3) => -8)
    -  if ($xs eq $ys)
    -    {
    -    $x = $MBI->_add ($x, $y );		# a+b
    -    # the sign follows $xs
    -    return ($x, $xs);
    -    }
    -
    -  my $a = $MBI->_acmp($x,$y);
    -  if ($a > 0)
    -    {
    -    $x = $MBI->_sub ($x , $y);				# abs sub
    -    }
    -  elsif ($a == 0)
    -    {
    -    $x = $MBI->_zero();					# result is 0
    -    $xs = '+';
    -    }
    -  else # a < 0
    -    {
    -    $x = $MBI->_sub ( $y, $x, 1 );			# abs sub
    -    $xs = $ys;
    -    }
    -  ($x,$xs);
    -  }
    -
    -sub _e_sub
    -  {
    -  # Internal helper sub to take two positive integers and their signs and
    -  # then subtract them. Input ($CALC,$CALC,('+'|'-'),('+'|'-')), 
    -  # output ($CALC,('+'|'-'))
    -  my ($x,$y,$xs,$ys) = @_;
    -
    -  # flip sign
    -  $ys =~ tr/+-/-+/;
    -  _e_add($x,$y,$xs,$ys);		# call add (does subtract now)
    -  }
    -
    -###############################################################################
    -# is_foo methods (is_negative, is_positive are inherited from BigInt)
    -
    -sub is_int
    -  {
    -  # return true if arg (BFLOAT or num_str) is an integer
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -
    -  return 1 if ($x->{sign} =~ /^[+-]$/) &&	# NaN and +-inf aren't
    -    $x->{_es} eq '+';				# 1e-1 => no integer
    -  0;
    -  }
    -
    -sub is_zero
    -  {
    -  # return true if arg (BFLOAT or num_str) is zero
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -
    -  return 1 if $x->{sign} eq '+' && $MBI->_is_zero($x->{_m});
    -  0;
    -  }
    -
    -sub is_one
    -  {
    -  # return true if arg (BFLOAT or num_str) is +1 or -1 if signis given
    -  my ($self,$x,$sign) = ref($_[0]) ? (undef,@_) : objectify(1,@_);
    -
    -  $sign = '+' if !defined $sign || $sign ne '-';
    -  return 1
    -   if ($x->{sign} eq $sign && 
    -    $MBI->_is_zero($x->{_e}) && $MBI->_is_one($x->{_m})); 
    -  0;
    -  }
    -
    -sub is_odd
    -  {
    -  # return true if arg (BFLOAT or num_str) is odd or false if even
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -  
    -  return 1 if ($x->{sign} =~ /^[+-]$/) &&		# NaN & +-inf aren't
    -    ($MBI->_is_zero($x->{_e}) && $MBI->_is_odd($x->{_m})); 
    -  0;
    -  }
    -
    -sub is_even
    -  {
    -  # return true if arg (BINT or num_str) is even or false if odd
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -
    -  return 0 if $x->{sign} !~ /^[+-]$/;			# NaN & +-inf aren't
    -  return 1 if ($x->{_es} eq '+'	 			# 123.45 is never
    -     && $MBI->_is_even($x->{_m}));			# but 1200 is
    -  0;
    -  }
    -
    -sub bmul 
    -  { 
    -  # multiply two numbers -- stolen from Knuth Vol 2 pg 233
    -  # (BINT or num_str, BINT or num_str) return BINT
    -  
    -  # set up parameters
    -  my ($self,$x,$y,$a,$p,$r) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,$a,$p,$r) = objectify(2,@_);
    -    }
    -
    -  return $x->bnan() if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
    -
    -  # inf handling
    -  if (($x->{sign} =~ /^[+-]inf$/) || ($y->{sign} =~ /^[+-]inf$/))
    -    {
    -    return $x->bnan() if $x->is_zero() || $y->is_zero(); 
    -    # result will always be +-inf:
    -    # +inf * +/+inf => +inf, -inf * -/-inf => +inf
    -    # +inf * -/-inf => -inf, -inf * +/+inf => -inf
    -    return $x->binf() if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/);
    -    return $x->binf() if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/);
    -    return $x->binf('-');
    -    }
    -  # handle result = 0
    -  return $x->bzero() if $x->is_zero() || $y->is_zero();
    -  
    -  return $upgrade->bmul($x,$y,$a,$p,$r) if defined $upgrade &&
    -   ((!$x->isa($self)) || (!$y->isa($self)));
    -
    -  # aEb * cEd = (a*c)E(b+d)
    -  $MBI->_mul($x->{_m},$y->{_m});
    -  ($x->{_e}, $x->{_es}) = _e_add($x->{_e}, $y->{_e}, $x->{_es}, $y->{_es});
    -
    -  # adjust sign:
    -  $x->{sign} = $x->{sign} ne $y->{sign} ? '-' : '+';
    -  return $x->bnorm()->round($a,$p,$r,$y);
    -  }
    -
    -sub bdiv 
    -  {
    -  # (dividend: BFLOAT or num_str, divisor: BFLOAT or num_str) return 
    -  # (BFLOAT,BFLOAT) (quo,rem) or BFLOAT (only rem)
    -
    -  # set up parameters
    -  my ($self,$x,$y,$a,$p,$r) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,$a,$p,$r) = objectify(2,@_);
    -    }
    -
    -  return $self->_div_inf($x,$y)
    -   if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/) || $y->is_zero());
    -
    -  # x== 0 # also: or y == 1 or y == -1
    -  return wantarray ? ($x,$self->bzero()) : $x if $x->is_zero();
    -
    -  # upgrade ?
    -  return $upgrade->bdiv($upgrade->new($x),$y,$a,$p,$r) if defined $upgrade;
    -
    -  # we need to limit the accuracy to protect against overflow
    -  my $fallback = 0;
    -  my (@params,$scale);
    -  ($x,@params) = $x->_find_round_parameters($a,$p,$r,$y);
    -
    -  return $x if $x->is_nan();		# error in _find_round_parameters?
    -
    -  # no rounding at all, so must use fallback
    -  if (scalar @params == 0)
    -    {
    -    # simulate old behaviour
    -    $params[0] = $self->div_scale();	# and round to it as accuracy
    -    $scale = $params[0]+4; 		# at least four more for proper round
    -    $params[2] = $r;			# round mode by caller or undef
    -    $fallback = 1;			# to clear a/p afterwards
    -    }
    -  else
    -    {
    -    # the 4 below is empirical, and there might be cases where it is not
    -    # enough...
    -    $scale = abs($params[0] || $params[1]) + 4;	# take whatever is defined
    -    }
    -
    -  my $rem; $rem = $self->bzero() if wantarray;
    -
    -  $y = $self->new($y) unless $y->isa('Math::BigFloat');
    -
    -  my $lx = $MBI->_len($x->{_m}); my $ly = $MBI->_len($y->{_m});
    -  $scale = $lx if $lx > $scale;
    -  $scale = $ly if $ly > $scale;
    -  my $diff = $ly - $lx;
    -  $scale += $diff if $diff > 0;		# if lx << ly, but not if ly << lx!
    -
    -  # already handled inf/NaN/-inf above:
    -
    -  # check that $y is not 1 nor -1 and cache the result:
    -  my $y_not_one = !($MBI->_is_zero($y->{_e}) && $MBI->_is_one($y->{_m}));
    -
    -  # flipping the sign of $y will also flip the sign of $x for the special
    -  # case of $x->bsub($x); so we can catch it below:
    -  my $xsign = $x->{sign};
    -  $y->{sign} =~ tr/+-/-+/;
    -
    -  if ($xsign ne $x->{sign})
    -    {
    -    # special case of $x /= $x results in 1
    -    $x->bone();			# "fixes" also sign of $y, since $x is $y
    -    }
    -  else
    -    {
    -    # correct $y's sign again
    -    $y->{sign} =~ tr/+-/-+/;
    -    # continue with normal div code:
    -
    -    # make copy of $x in case of list context for later reminder calculation
    -    if (wantarray && $y_not_one)
    -      {
    -      $rem = $x->copy();
    -      }
    -
    -    $x->{sign} = $x->{sign} ne $y->sign() ? '-' : '+'; 
    -
    -    # check for / +-1 ( +/- 1E0)
    -    if ($y_not_one)
    -      {
    -      # promote BigInts and it's subclasses (except when already a BigFloat)
    -      $y = $self->new($y) unless $y->isa('Math::BigFloat'); 
    -
    -      # calculate the result to $scale digits and then round it
    -      # a * 10 ** b / c * 10 ** d => a/c * 10 ** (b-d)
    -      $MBI->_lsft($x->{_m},$MBI->_new($scale),10);
    -      $MBI->_div ($x->{_m},$y->{_m});	# a/c
    -
    -      # correct exponent of $x
    -      ($x->{_e},$x->{_es}) = _e_sub($x->{_e}, $y->{_e}, $x->{_es}, $y->{_es});
    -      # correct for 10**scale
    -      ($x->{_e},$x->{_es}) = _e_sub($x->{_e}, $MBI->_new($scale), $x->{_es}, '+');
    -      $x->bnorm();		# remove trailing 0's
    -      }
    -    } # ende else $x != $y
    -
    -  # shortcut to not run through _find_round_parameters again
    -  if (defined $params[0])
    -    {
    -    delete $x->{_a}; 				# clear before round
    -    $x->bround($params[0],$params[2]);		# then round accordingly
    -    }
    -  else
    -    {
    -    delete $x->{_p}; 				# clear before round
    -    $x->bfround($params[1],$params[2]);		# then round accordingly
    -    }
    -  if ($fallback)
    -    {
    -    # clear a/p after round, since user did not request it
    -    delete $x->{_a}; delete $x->{_p};
    -    }
    -
    -  if (wantarray)
    -    {
    -    if ($y_not_one)
    -      {
    -      $rem->bmod($y,@params);			# copy already done
    -      }
    -    if ($fallback)
    -      {
    -      # clear a/p after round, since user did not request it
    -      delete $rem->{_a}; delete $rem->{_p};
    -      }
    -    return ($x,$rem);
    -    }
    -  $x;
    -  }
    -
    -sub bmod 
    -  {
    -  # (dividend: BFLOAT or num_str, divisor: BFLOAT or num_str) return reminder 
    -
    -  # set up parameters
    -  my ($self,$x,$y,$a,$p,$r) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,$a,$p,$r) = objectify(2,@_);
    -    }
    -
    -  # handle NaN, inf, -inf
    -  if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
    -    {
    -    my ($d,$re) = $self->SUPER::_div_inf($x,$y);
    -    $x->{sign} = $re->{sign};
    -    $x->{_e} = $re->{_e};
    -    $x->{_m} = $re->{_m};
    -    return $x->round($a,$p,$r,$y);
    -    } 
    -  if ($y->is_zero())
    -    {
    -    return $x->bnan() if $x->is_zero();
    -    return $x;
    -    }
    -
    -  return $x->bzero() if $x->is_zero()
    - || ($x->is_int() &&
    -  # check that $y == +1 or $y == -1:
    -    ($MBI->_is_zero($y->{_e}) && $MBI->_is_one($y->{_m})));
    -
    -  my $cmp = $x->bacmp($y);			# equal or $x < $y?
    -  return $x->bzero($a,$p) if $cmp == 0;		# $x == $y => result 0
    -
    -  # only $y of the operands negative? 
    -  my $neg = 0; $neg = 1 if $x->{sign} ne $y->{sign};
    -
    -  $x->{sign} = $y->{sign};				# calc sign first
    -  return $x->round($a,$p,$r) if $cmp < 0 && $neg == 0;	# $x < $y => result $x
    -  
    -  my $ym = $MBI->_copy($y->{_m});
    -  
    -  # 2e1 => 20
    -  $MBI->_lsft( $ym, $y->{_e}, 10) 
    -   if $y->{_es} eq '+' && !$MBI->_is_zero($y->{_e});
    - 
    -  # if $y has digits after dot
    -  my $shifty = 0;			# correct _e of $x by this
    -  if ($y->{_es} eq '-')			# has digits after dot
    -    {
    -    # 123 % 2.5 => 1230 % 25 => 5 => 0.5
    -    $shifty = $MBI->_num($y->{_e}); 	# no more digits after dot
    -    $MBI->_lsft($x->{_m}, $y->{_e}, 10);# 123 => 1230, $y->{_m} is already 25
    -    }
    -  # $ym is now mantissa of $y based on exponent 0
    -
    -  my $shiftx = 0;			# correct _e of $x by this
    -  if ($x->{_es} eq '-')			# has digits after dot
    -    {
    -    # 123.4 % 20 => 1234 % 200
    -    $shiftx = $MBI->_num($x->{_e});	# no more digits after dot
    -    $MBI->_lsft($ym, $x->{_e}, 10);	# 123 => 1230
    -    }
    -  # 123e1 % 20 => 1230 % 20
    -  if ($x->{_es} eq '+' && !$MBI->_is_zero($x->{_e}))
    -    {
    -    $MBI->_lsft( $x->{_m}, $x->{_e},10);	# es => '+' here
    -    }
    -
    -  $x->{_e} = $MBI->_new($shiftx);
    -  $x->{_es} = '+'; 
    -  $x->{_es} = '-' if $shiftx != 0 || $shifty != 0;
    -  $MBI->_add( $x->{_e}, $MBI->_new($shifty)) if $shifty != 0;
    -  
    -  # now mantissas are equalized, exponent of $x is adjusted, so calc result
    -
    -  $x->{_m} = $MBI->_mod( $x->{_m}, $ym);
    -
    -  $x->{sign} = '+' if $MBI->_is_zero($x->{_m});		# fix sign for -0
    -  $x->bnorm();
    -
    -  if ($neg != 0)	# one of them negative => correct in place
    -    {
    -    my $r = $y - $x;
    -    $x->{_m} = $r->{_m};
    -    $x->{_e} = $r->{_e};
    -    $x->{_es} = $r->{_es};
    -    $x->{sign} = '+' if $MBI->_is_zero($x->{_m});	# fix sign for -0
    -    $x->bnorm();
    -    }
    -
    -  $x->round($a,$p,$r,$y);	# round and return
    -  }
    -
    -sub broot
    -  {
    -  # calculate $y'th root of $x
    -  
    -  # set up parameters
    -  my ($self,$x,$y,$a,$p,$r) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,$a,$p,$r) = objectify(2,@_);
    -    }
    -
    -  # NaN handling: $x ** 1/0, x or y NaN, or y inf/-inf or y == 0
    -  return $x->bnan() if $x->{sign} !~ /^\+/ || $y->is_zero() ||
    -         $y->{sign} !~ /^\+$/;
    -
    -  return $x if $x->is_zero() || $x->is_one() || $x->is_inf() || $y->is_one();
    -  
    -  # we need to limit the accuracy to protect against overflow
    -  my $fallback = 0;
    -  my (@params,$scale);
    -  ($x,@params) = $x->_find_round_parameters($a,$p,$r);
    -
    -  return $x if $x->is_nan();		# error in _find_round_parameters?
    -
    -  # no rounding at all, so must use fallback
    -  if (scalar @params == 0) 
    -    {
    -    # simulate old behaviour
    -    $params[0] = $self->div_scale();	# and round to it as accuracy
    -    $scale = $params[0]+4; 		# at least four more for proper round
    -    $params[2] = $r;			# iound mode by caller or undef
    -    $fallback = 1;			# to clear a/p afterwards
    -    }
    -  else
    -    {
    -    # the 4 below is empirical, and there might be cases where it is not
    -    # enough...
    -    $scale = abs($params[0] || $params[1]) + 4; # take whatever is defined
    -    }
    -
    -  # when user set globals, they would interfere with our calculation, so
    -  # disable them and later re-enable them
    -  no strict 'refs';
    -  my $abr = "$self\::accuracy"; my $ab = $$abr; $$abr = undef;
    -  my $pbr = "$self\::precision"; my $pb = $$pbr; $$pbr = undef;
    -  # we also need to disable any set A or P on $x (_find_round_parameters took
    -  # them already into account), since these would interfere, too
    -  delete $x->{_a}; delete $x->{_p};
    -  # need to disable $upgrade in BigInt, to avoid deep recursion
    -  local $Math::BigInt::upgrade = undef;	# should be really parent class vs MBI
    -
    -  # remember sign and make $x positive, since -4 ** (1/2) => -2
    -  my $sign = 0; $sign = 1 if $x->{sign} eq '-'; $x->{sign} = '+';
    -
    -  my $is_two = 0;
    -  if ($y->isa('Math::BigFloat'))
    -    {
    -    $is_two = ($y->{sign} eq '+' && $MBI->_is_two($y->{_m}) && $MBI->_is_zero($y->{_e}));
    -    }
    -  else
    -    {
    -    $is_two = ($y == 2);
    -    }
    -
    -  # normal square root if $y == 2:
    -  if ($is_two)
    -    {
    -    $x->bsqrt($scale+4);
    -    }
    -  elsif ($y->is_one('-'))
    -    {
    -    # $x ** -1 => 1/$x
    -    my $u = $self->bone()->bdiv($x,$scale);
    -    # copy private parts over
    -    $x->{_m} = $u->{_m};
    -    $x->{_e} = $u->{_e};
    -    $x->{_es} = $u->{_es};
    -    }
    -  else
    -    {
    -    # calculate the broot() as integer result first, and if it fits, return
    -    # it rightaway (but only if $x and $y are integer):
    -
    -    my $done = 0;				# not yet
    -    if ($y->is_int() && $x->is_int())
    -      {
    -      my $i = $MBI->_copy( $x->{_m} );
    -      $MBI->_lsft( $i, $x->{_e}, 10 ) unless $MBI->_is_zero($x->{_e});
    -      my $int = Math::BigInt->bzero();
    -      $int->{value} = $i;
    -      $int->broot($y->as_number());
    -      # if ($exact)
    -      if ($int->copy()->bpow($y) == $x)
    -        {
    -        # found result, return it
    -        $x->{_m} = $int->{value};
    -        $x->{_e} = $MBI->_zero();
    -        $x->{_es} = '+';
    -        $x->bnorm();
    -        $done = 1;
    -        }
    -      }
    -    if ($done == 0)
    -      {
    -      my $u = $self->bone()->bdiv($y,$scale+4);
    -      delete $u->{_a}; delete $u->{_p};         # otherwise it conflicts
    -      $x->bpow($u,$scale+4);                    # el cheapo
    -      }
    -    }
    -  $x->bneg() if $sign == 1;
    -  
    -  # shortcut to not run through _find_round_parameters again
    -  if (defined $params[0])
    -    {
    -    $x->bround($params[0],$params[2]);		# then round accordingly
    -    }
    -  else
    -    {
    -    $x->bfround($params[1],$params[2]);		# then round accordingly
    -    }
    -  if ($fallback)
    -    {
    -    # clear a/p after round, since user did not request it
    -    delete $x->{_a}; delete $x->{_p};
    -    }
    -  # restore globals
    -  $$abr = $ab; $$pbr = $pb;
    -  $x;
    -  }
    -
    -sub bsqrt
    -  { 
    -  # calculate square root
    -  my ($self,$x,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
    -
    -  return $x->bnan() if $x->{sign} !~ /^[+]/;	# NaN, -inf or < 0
    -  return $x if $x->{sign} eq '+inf';		# sqrt(inf) == inf
    -  return $x->round($a,$p,$r) if $x->is_zero() || $x->is_one();
    -
    -  # we need to limit the accuracy to protect against overflow
    -  my $fallback = 0;
    -  my (@params,$scale);
    -  ($x,@params) = $x->_find_round_parameters($a,$p,$r);
    -
    -  return $x if $x->is_nan();		# error in _find_round_parameters?
    -
    -  # no rounding at all, so must use fallback
    -  if (scalar @params == 0) 
    -    {
    -    # simulate old behaviour
    -    $params[0] = $self->div_scale();	# and round to it as accuracy
    -    $scale = $params[0]+4; 		# at least four more for proper round
    -    $params[2] = $r;			# round mode by caller or undef
    -    $fallback = 1;			# to clear a/p afterwards
    -    }
    -  else
    -    {
    -    # the 4 below is empirical, and there might be cases where it is not
    -    # enough...
    -    $scale = abs($params[0] || $params[1]) + 4; # take whatever is defined
    -    }
    -
    -  # when user set globals, they would interfere with our calculation, so
    -  # disable them and later re-enable them
    -  no strict 'refs';
    -  my $abr = "$self\::accuracy"; my $ab = $$abr; $$abr = undef;
    -  my $pbr = "$self\::precision"; my $pb = $$pbr; $$pbr = undef;
    -  # we also need to disable any set A or P on $x (_find_round_parameters took
    -  # them already into account), since these would interfere, too
    -  delete $x->{_a}; delete $x->{_p};
    -  # need to disable $upgrade in BigInt, to avoid deep recursion
    -  local $Math::BigInt::upgrade = undef;	# should be really parent class vs MBI
    -
    -  my $i = $MBI->_copy( $x->{_m} );
    -  $MBI->_lsft( $i, $x->{_e}, 10 ) unless $MBI->_is_zero($x->{_e});
    -  my $xas = Math::BigInt->bzero();
    -  $xas->{value} = $i;
    -
    -  my $gs = $xas->copy()->bsqrt();	# some guess
    -
    -  if (($x->{_es} ne '-')		# guess can't be accurate if there are
    -					# digits after the dot
    -   && ($xas->bacmp($gs * $gs) == 0))	# guess hit the nail on the head?
    -    {
    -    # exact result, copy result over to keep $x
    -    $x->{_m} = $gs->{value}; $x->{_e} = $MBI->_zero(); $x->{_es} = '+';
    -    $x->bnorm();
    -    # shortcut to not run through _find_round_parameters again
    -    if (defined $params[0])
    -      {
    -      $x->bround($params[0],$params[2]);	# then round accordingly
    -      }
    -    else
    -      {
    -      $x->bfround($params[1],$params[2]);	# then round accordingly
    -      }
    -    if ($fallback)
    -      {
    -      # clear a/p after round, since user did not request it
    -      delete $x->{_a}; delete $x->{_p};
    -      }
    -    # re-enable A and P, upgrade is taken care of by "local"
    -    ${"$self\::accuracy"} = $ab; ${"$self\::precision"} = $pb;
    -    return $x;
    -    }
    - 
    -  # sqrt(2) = 1.4 because sqrt(2*100) = 1.4*10; so we can increase the accuracy
    -  # of the result by multipyling the input by 100 and then divide the integer
    -  # result of sqrt(input) by 10. Rounding afterwards returns the real result.
    -
    -  # The following steps will transform 123.456 (in $x) into 123456 (in $y1)
    -  my $y1 = $MBI->_copy($x->{_m});
    -
    -  my $length = $MBI->_len($y1);
    -  
    -  # Now calculate how many digits the result of sqrt(y1) would have
    -  my $digits = int($length / 2);
    -
    -  # But we need at least $scale digits, so calculate how many are missing
    -  my $shift = $scale - $digits;
    -
    -  # That should never happen (we take care of integer guesses above)
    -  # $shift = 0 if $shift < 0; 
    -
    -  # Multiply in steps of 100, by shifting left two times the "missing" digits
    -  my $s2 = $shift * 2;
    -
    -  # We now make sure that $y1 has the same odd or even number of digits than
    -  # $x had. So when _e of $x is odd, we must shift $y1 by one digit left,
    -  # because we always must multiply by steps of 100 (sqrt(100) is 10) and not
    -  # steps of 10. The length of $x does not count, since an even or odd number
    -  # of digits before the dot is not changed by adding an even number of digits
    -  # after the dot (the result is still odd or even digits long).
    -  $s2++ if $MBI->_is_odd($x->{_e});
    -
    -  $MBI->_lsft( $y1, $MBI->_new($s2), 10);
    -
    -  # now take the square root and truncate to integer
    -  $y1 = $MBI->_sqrt($y1);
    -
    -  # By "shifting" $y1 right (by creating a negative _e) we calculate the final
    -  # result, which is than later rounded to the desired scale.
    -
    -  # calculate how many zeros $x had after the '.' (or before it, depending
    -  # on sign of $dat, the result should have half as many:
    -  my $dat = $MBI->_num($x->{_e});
    -  $dat = -$dat if $x->{_es} eq '-';
    -  $dat += $length;
    -
    -  if ($dat > 0)
    -    {
    -    # no zeros after the dot (e.g. 1.23, 0.49 etc)
    -    # preserve half as many digits before the dot than the input had 
    -    # (but round this "up")
    -    $dat = int(($dat+1)/2);
    -    }
    -  else
    -    {
    -    $dat = int(($dat)/2);
    -    }
    -  $dat -= $MBI->_len($y1);
    -  if ($dat < 0)
    -    {
    -    $dat = abs($dat);
    -    $x->{_e} = $MBI->_new( $dat );
    -    $x->{_es} = '-';
    -    }
    -  else
    -    {    
    -    $x->{_e} = $MBI->_new( $dat );
    -    $x->{_es} = '+';
    -    }
    -  $x->{_m} = $y1;
    -  $x->bnorm();
    -
    -  # shortcut to not run through _find_round_parameters again
    -  if (defined $params[0])
    -    {
    -    $x->bround($params[0],$params[2]);		# then round accordingly
    -    }
    -  else
    -    {
    -    $x->bfround($params[1],$params[2]);		# then round accordingly
    -    }
    -  if ($fallback)
    -    {
    -    # clear a/p after round, since user did not request it
    -    delete $x->{_a}; delete $x->{_p};
    -    }
    -  # restore globals
    -  $$abr = $ab; $$pbr = $pb;
    -  $x;
    -  }
    -
    -sub bfac
    -  {
    -  # (BFLOAT or num_str, BFLOAT or num_str) return BFLOAT
    -  # compute factorial number, modifies first argument
    -
    -  # set up parameters
    -  my ($self,$x,@r) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  ($self,$x,@r) = objectify(1,@_) if !ref($x);
    -
    - return $x if $x->{sign} eq '+inf';	# inf => inf
    -  return $x->bnan() 
    -    if (($x->{sign} ne '+') ||		# inf, NaN, <0 etc => NaN
    -     ($x->{_es} ne '+'));		# digits after dot?
    -
    -  # use BigInt's bfac() for faster calc
    -  if (! $MBI->_is_zero($x->{_e}))
    -    {
    -    $MBI->_lsft($x->{_m}, $x->{_e},10);	# change 12e1 to 120e0
    -    $x->{_e} = $MBI->_zero();		# normalize
    -    $x->{_es} = '+';
    -    }
    -  $MBI->_fac($x->{_m});			# calculate factorial
    -  $x->bnorm()->round(@r); 		# norm again and round result
    -  }
    -
    -sub _pow
    -  {
    -  # Calculate a power where $y is a non-integer, like 2 ** 0.5
    -  my ($x,$y,$a,$p,$r) = @_;
    -  my $self = ref($x);
    -
    -  # if $y == 0.5, it is sqrt($x)
    -  $HALF = $self->new($HALF) unless ref($HALF);
    -  return $x->bsqrt($a,$p,$r,$y) if $y->bcmp($HALF) == 0;
    -
    -  # Using:
    -  # a ** x == e ** (x * ln a)
    -
    -  # u = y * ln x
    -  #                _                         _
    -  # Taylor:       |   u    u^2    u^3         |
    -  # x ** y  = 1 + |  --- + --- + ----- + ...  |
    -  #               |_  1    1*2   1*2*3       _|
    -
    -  # we need to limit the accuracy to protect against overflow
    -  my $fallback = 0;
    -  my ($scale,@params);
    -  ($x,@params) = $x->_find_round_parameters($a,$p,$r);
    -    
    -  return $x if $x->is_nan();		# error in _find_round_parameters?
    -
    -  # no rounding at all, so must use fallback
    -  if (scalar @params == 0)
    -    {
    -    # simulate old behaviour
    -    $params[0] = $self->div_scale();	# and round to it as accuracy
    -    $params[1] = undef;			# disable P
    -    $scale = $params[0]+4; 		# at least four more for proper round
    -    $params[2] = $r;			# round mode by caller or undef
    -    $fallback = 1;			# to clear a/p afterwards
    -    }
    -  else
    -    {
    -    # the 4 below is empirical, and there might be cases where it is not
    -    # enough...
    -    $scale = abs($params[0] || $params[1]) + 4; # take whatever is defined
    -    }
    -
    -  # when user set globals, they would interfere with our calculation, so
    -  # disable them and later re-enable them
    -  no strict 'refs';
    -  my $abr = "$self\::accuracy"; my $ab = $$abr; $$abr = undef;
    -  my $pbr = "$self\::precision"; my $pb = $$pbr; $$pbr = undef;
    -  # we also need to disable any set A or P on $x (_find_round_parameters took
    -  # them already into account), since these would interfere, too
    -  delete $x->{_a}; delete $x->{_p};
    -  # need to disable $upgrade in BigInt, to avoid deep recursion
    -  local $Math::BigInt::upgrade = undef;
    - 
    -  my ($limit,$v,$u,$below,$factor,$next,$over);
    -
    -  $u = $x->copy()->blog(undef,$scale)->bmul($y);
    -  $v = $self->bone();				# 1
    -  $factor = $self->new(2);			# 2
    -  $x->bone();					# first term: 1
    -
    -  $below = $v->copy();
    -  $over = $u->copy();
    -
    -  $limit = $self->new("1E-". ($scale-1));
    -  #my $steps = 0;
    -  while (3 < 5)
    -    {
    -    # we calculate the next term, and add it to the last
    -    # when the next term is below our limit, it won't affect the outcome
    -    # anymore, so we stop
    -    $next = $over->copy()->bdiv($below,$scale);
    -    last if $next->bacmp($limit) <= 0;
    -    $x->badd($next);
    -    # calculate things for the next term
    -    $over *= $u; $below *= $factor; $factor->binc();
    -
    -    last if $x->{sign} !~ /^[-+]$/;
    -
    -    #$steps++;
    -    }
    -  
    -  # shortcut to not run through _find_round_parameters again
    -  if (defined $params[0])
    -    {
    -    $x->bround($params[0],$params[2]);		# then round accordingly
    -    }
    -  else
    -    {
    -    $x->bfround($params[1],$params[2]);		# then round accordingly
    -    }
    -  if ($fallback)
    -    {
    -    # clear a/p after round, since user did not request it
    -    delete $x->{_a}; delete $x->{_p};
    -    }
    -  # restore globals
    -  $$abr = $ab; $$pbr = $pb;
    -  $x;
    -  }
    -
    -sub bpow 
    -  {
    -  # (BFLOAT or num_str, BFLOAT or num_str) return BFLOAT
    -  # compute power of two numbers, second arg is used as integer
    -  # modifies first argument
    -
    -  # set up parameters
    -  my ($self,$x,$y,$a,$p,$r) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,$a,$p,$r) = objectify(2,@_);
    -    }
    -
    -  return $x->bnan() if $x->{sign} eq $nan || $y->{sign} eq $nan;
    -  return $x if $x->{sign} =~ /^[+-]inf$/;
    -  
    -  # -2 ** -2 => NaN
    -  return $x->bnan() if $x->{sign} eq '-' && $y->{sign} eq '-';
    -
    -  # cache the result of is_zero
    -  my $y_is_zero = $y->is_zero();
    -  return $x->bone() if $y_is_zero;
    -  return $x         if $x->is_one() || $y->is_one();
    -
    -  my $x_is_zero = $x->is_zero();
    -  return $x->_pow($y,$a,$p,$r) if !$x_is_zero && !$y->is_int();		# non-integer power
    -
    -  my $y1 = $y->as_number()->{value};			# make MBI part
    -
    -  # if ($x == -1)
    -  if ($x->{sign} eq '-' && $MBI->_is_one($x->{_m}) && $MBI->_is_zero($x->{_e}))
    -    {
    -    # if $x == -1 and odd/even y => +1/-1  because +-1 ^ (+-1) => +-1
    -    return $MBI->_is_odd($y1) ? $x : $x->babs(1);
    -    }
    -  if ($x_is_zero)
    -    {
    -    return $x->bone() if $y_is_zero;
    -    return $x if $y->{sign} eq '+'; 	# 0**y => 0 (if not y <= 0)
    -    # 0 ** -y => 1 / (0 ** y) => 1 / 0! (1 / 0 => +inf)
    -    return $x->binf();
    -    }
    -
    -  my $new_sign = '+';
    -  $new_sign = $MBI->_is_odd($y1) ? '-' : '+' if $x->{sign} ne '+';
    -
    -  # calculate $x->{_m} ** $y and $x->{_e} * $y separately (faster)
    -  $x->{_m} = $MBI->_pow( $x->{_m}, $y1);
    -  $x->{_e} = $MBI->_mul ($x->{_e}, $y1);
    -
    -  $x->{sign} = $new_sign;
    -  $x->bnorm();
    -  if ($y->{sign} eq '-')
    -    {
    -    # modify $x in place!
    -    my $z = $x->copy(); $x->bone();
    -    return $x->bdiv($z,$a,$p,$r);	# round in one go (might ignore y's A!)
    -    }
    -  $x->round($a,$p,$r,$y);
    -  }
    -
    -###############################################################################
    -# rounding functions
    -
    -sub bfround
    -  {
    -  # precision: round to the $Nth digit left (+$n) or right (-$n) from the '.'
    -  # $n == 0 means round to integer
    -  # expects and returns normalized numbers!
    -  my $x = shift; my $self = ref($x) || $x; $x = $self->new(shift) if !ref($x);
    -
    -  my ($scale,$mode) = $x->_scale_p(@_);
    -  return $x if !defined $scale || $x->modify('bfround'); # no-op
    -
    -  # never round a 0, +-inf, NaN
    -  if ($x->is_zero())
    -    {
    -    $x->{_p} = $scale if !defined $x->{_p} || $x->{_p} < $scale; # -3 < -2
    -    return $x; 
    -    }
    -  return $x if $x->{sign} !~ /^[+-]$/;
    -
    -  # don't round if x already has lower precision
    -  return $x if (defined $x->{_p} && $x->{_p} < 0 && $scale < $x->{_p});
    -
    -  $x->{_p} = $scale;			# remember round in any case
    -  delete $x->{_a};			# and clear A
    -  if ($scale < 0)
    -    {
    -    # round right from the '.'
    -
    -    return $x if $x->{_es} eq '+';		# e >= 0 => nothing to round
    -
    -    $scale = -$scale;				# positive for simplicity
    -    my $len = $MBI->_len($x->{_m});		# length of mantissa
    -
    -    # the following poses a restriction on _e, but if _e is bigger than a
    -    # scalar, you got other problems (memory etc) anyway
    -    my $dad = -(0+ ($x->{_es}.$MBI->_num($x->{_e})));	# digits after dot
    -    my $zad = 0;				# zeros after dot
    -    $zad = $dad - $len if (-$dad < -$len);	# for 0.00..00xxx style
    -   
    -    # p rint "scale $scale dad $dad zad $zad len $len\n";
    -    # number  bsstr   len zad dad	
    -    # 0.123   123e-3	3   0 3
    -    # 0.0123  123e-4	3   1 4
    -    # 0.001   1e-3      1   2 3
    -    # 1.23    123e-2	3   0 2
    -    # 1.2345  12345e-4	5   0 4
    -
    -    # do not round after/right of the $dad
    -    return $x if $scale > $dad;			# 0.123, scale >= 3 => exit
    -
    -    # round to zero if rounding inside the $zad, but not for last zero like:
    -    # 0.0065, scale -2, round last '0' with following '65' (scale == zad case)
    -    return $x->bzero() if $scale < $zad;
    -    if ($scale == $zad)			# for 0.006, scale -3 and trunc
    -      {
    -      $scale = -$len;
    -      }
    -    else
    -      {
    -      # adjust round-point to be inside mantissa
    -      if ($zad != 0)
    -        {
    -	$scale = $scale-$zad;
    -        }
    -      else
    -        {
    -        my $dbd = $len - $dad; $dbd = 0 if $dbd < 0;	# digits before dot
    -	$scale = $dbd+$scale;
    -        }
    -      }
    -    }
    -  else
    -    {
    -    # round left from the '.'
    -
    -    # 123 => 100 means length(123) = 3 - $scale (2) => 1
    -
    -    my $dbt = $MBI->_len($x->{_m}); 
    -    # digits before dot 
    -    my $dbd = $dbt + ($x->{_es} . $MBI->_num($x->{_e}));
    -    # should be the same, so treat it as this 
    -    $scale = 1 if $scale == 0; 
    -    # shortcut if already integer 
    -    return $x if $scale == 1 && $dbt <= $dbd; 
    -    # maximum digits before dot 
    -    ++$dbd;
    -
    -    if ($scale > $dbd) 
    -       { 
    -       # not enough digits before dot, so round to zero 
    -       return $x->bzero; 
    -       }
    -    elsif ( $scale == $dbd )
    -       { 
    -       # maximum 
    -       $scale = -$dbt; 
    -       } 
    -    else
    -       { 
    -       $scale = $dbd - $scale; 
    -       }
    -    }
    -  # pass sign to bround for rounding modes '+inf' and '-inf'
    -  my $m = bless { sign => $x->{sign}, value => $x->{_m} }, 'Math::BigInt';
    -  $m->bround($scale,$mode);
    -  $x->{_m} = $m->{value};			# get our mantissa back
    -  $x->bnorm();
    -  }
    -
    -sub bround
    -  {
    -  # accuracy: preserve $N digits, and overwrite the rest with 0's
    -  my $x = shift; my $self = ref($x) || $x; $x = $self->new(shift) if !ref($x);
    -
    -  if (($_[0] || 0) < 0)
    -    {
    -    require Carp; Carp::croak ('bround() needs positive accuracy');
    -    }
    -
    -  my ($scale,$mode) = $x->_scale_a(@_);
    -  return $x if !defined $scale || $x->modify('bround');	# no-op
    -
    -  # scale is now either $x->{_a}, $accuracy, or the user parameter
    -  # test whether $x already has lower accuracy, do nothing in this case 
    -  # but do round if the accuracy is the same, since a math operation might
    -  # want to round a number with A=5 to 5 digits afterwards again
    -  return $x if defined $x->{_a} && $x->{_a} < $scale;
    -
    -  # scale < 0 makes no sense
    -  # scale == 0 => keep all digits
    -  # never round a +-inf, NaN
    -  return $x if ($scale <= 0) || $x->{sign} !~ /^[+-]$/;
    -
    -  # 1: never round a 0
    -  # 2: if we should keep more digits than the mantissa has, do nothing
    -  if ($x->is_zero() || $MBI->_len($x->{_m}) <= $scale)
    -    {
    -    $x->{_a} = $scale if !defined $x->{_a} || $x->{_a} > $scale;
    -    return $x; 
    -    }
    -
    -  # pass sign to bround for '+inf' and '-inf' rounding modes
    -  my $m = bless { sign => $x->{sign}, value => $x->{_m} }, 'Math::BigInt';
    -
    -  $m->bround($scale,$mode);		# round mantissa
    -  $x->{_m} = $m->{value};		# get our mantissa back
    -  $x->{_a} = $scale;			# remember rounding
    -  delete $x->{_p};			# and clear P
    -  $x->bnorm();				# del trailing zeros gen. by bround()
    -  }
    -
    -sub bfloor
    -  {
    -  # return integer less or equal then $x
    -  my ($self,$x,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
    -
    -  return $x if $x->modify('bfloor');
    -   
    -  return $x if $x->{sign} !~ /^[+-]$/;	# nan, +inf, -inf
    -
    -  # if $x has digits after dot
    -  if ($x->{_es} eq '-')
    -    {
    -    $x->{_m} = $MBI->_rsft($x->{_m},$x->{_e},10); # cut off digits after dot
    -    $x->{_e} = $MBI->_zero();			# trunc/norm	
    -    $x->{_es} = '+';				# abs e
    -    $MBI->_inc($x->{_m}) if $x->{sign} eq '-';	# increment if negative
    -    }
    -  $x->round($a,$p,$r);
    -  }
    -
    -sub bceil
    -  {
    -  # return integer greater or equal then $x
    -  my ($self,$x,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
    -
    -  return $x if $x->modify('bceil');
    -  return $x if $x->{sign} !~ /^[+-]$/;	# nan, +inf, -inf
    -
    -  # if $x has digits after dot
    -  if ($x->{_es} eq '-')
    -    {
    -    $x->{_m} = $MBI->_rsft($x->{_m},$x->{_e},10); # cut off digits after dot
    -    $x->{_e} = $MBI->_zero();			# trunc/norm	
    -    $x->{_es} = '+';				# abs e
    -    $MBI->_inc($x->{_m}) if $x->{sign} eq '+';	# increment if positive
    -    }
    -  $x->round($a,$p,$r);
    -  }
    -
    -sub brsft
    -  {
    -  # shift right by $y (divide by power of $n)
    -  
    -  # set up parameters
    -  my ($self,$x,$y,$n,$a,$p,$r) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,$n,$a,$p,$r) = objectify(2,@_);
    -    }
    -
    -  return $x if $x->modify('brsft');
    -  return $x if $x->{sign} !~ /^[+-]$/;	# nan, +inf, -inf
    -
    -  $n = 2 if !defined $n; $n = $self->new($n);
    -  $x->bdiv($n->bpow($y),$a,$p,$r,$y);
    -  }
    -
    -sub blsft
    -  {
    -  # shift left by $y (multiply by power of $n)
    -  
    -  # set up parameters
    -  my ($self,$x,$y,$n,$a,$p,$r) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,$n,$a,$p,$r) = objectify(2,@_);
    -    }
    -
    -  return $x if $x->modify('blsft');
    -  return $x if $x->{sign} !~ /^[+-]$/;	# nan, +inf, -inf
    -
    -  $n = 2 if !defined $n; $n = $self->new($n);
    -  $x->bmul($n->bpow($y),$a,$p,$r,$y);
    -  }
    -
    -###############################################################################
    -
    -sub DESTROY
    -  {
    -  # going through AUTOLOAD for every DESTROY is costly, avoid it by empty sub
    -  }
    -
    -sub AUTOLOAD
    -  {
    -  # make fxxx and bxxx both work by selectively mapping fxxx() to MBF::bxxx()
    -  # or falling back to MBI::bxxx()
    -  my $name = $AUTOLOAD;
    -
    -  $name =~ s/(.*):://;	# split package
    -  my $c = $1 || $class;
    -  no strict 'refs';
    -  $c->import() if $IMPORT == 0;
    -  if (!method_alias($name))
    -    {
    -    if (!defined $name)
    -      {
    -      # delayed load of Carp and avoid recursion	
    -      require Carp;
    -      Carp::croak ("$c: Can't call a method without name");
    -      }
    -    if (!method_hand_up($name))
    -      {
    -      # delayed load of Carp and avoid recursion	
    -      require Carp;
    -      Carp::croak ("Can't call $c\-\>$name, not a valid method");
    -      }
    -    # try one level up, but subst. bxxx() for fxxx() since MBI only got bxxx()
    -    $name =~ s/^f/b/;
    -    return &{"Math::BigInt"."::$name"}(@_);
    -    }
    -  my $bname = $name; $bname =~ s/^f/b/;
    -  $c .= "::$name";
    -  *{$c} = \&{$bname};
    -  &{$c};	# uses @_
    -  }
    -
    -sub exponent
    -  {
    -  # return a copy of the exponent
    -  my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
    -
    -  if ($x->{sign} !~ /^[+-]$/)
    -    {
    -    my $s = $x->{sign}; $s =~ s/^[+-]//;
    -    return Math::BigInt->new($s); 		# -inf, +inf => +inf
    -    }
    -  Math::BigInt->new( $x->{_es} . $MBI->_str($x->{_e}));
    -  }
    -
    -sub mantissa
    -  {
    -  # return a copy of the mantissa
    -  my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
    - 
    -  if ($x->{sign} !~ /^[+-]$/)
    -    {
    -    my $s = $x->{sign}; $s =~ s/^[+]//;
    -    return Math::BigInt->new($s);		# -inf, +inf => +inf
    -    }
    -  my $m = Math::BigInt->new( $MBI->_str($x->{_m}));
    -  $m->bneg() if $x->{sign} eq '-';
    -
    -  $m;
    -  }
    -
    -sub parts
    -  {
    -  # return a copy of both the exponent and the mantissa
    -  my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
    -
    -  if ($x->{sign} !~ /^[+-]$/)
    -    {
    -    my $s = $x->{sign}; $s =~ s/^[+]//; my $se = $s; $se =~ s/^[-]//;
    -    return ($self->new($s),$self->new($se)); # +inf => inf and -inf,+inf => inf
    -    }
    -  my $m = Math::BigInt->bzero();
    -  $m->{value} = $MBI->_copy($x->{_m});
    -  $m->bneg() if $x->{sign} eq '-';
    -  ($m, Math::BigInt->new( $x->{_es} . $MBI->_num($x->{_e}) ));
    -  }
    -
    -##############################################################################
    -# private stuff (internal use only)
    -
    -sub import
    -  {
    -  my $self = shift;
    -  my $l = scalar @_;
    -  my $lib = ''; my @a;
    -  $IMPORT=1;
    -  for ( my $i = 0; $i < $l ; $i++)
    -    {
    -    if ( $_[$i] eq ':constant' )
    -      {
    -      # This causes overlord er load to step in. 'binary' and 'integer'
    -      # are handled by BigInt.
    -      overload::constant float => sub { $self->new(shift); }; 
    -      }
    -    elsif ($_[$i] eq 'upgrade')
    -      {
    -      # this causes upgrading
    -      $upgrade = $_[$i+1];		# or undef to disable
    -      $i++;
    -      }
    -    elsif ($_[$i] eq 'downgrade')
    -      {
    -      # this causes downgrading
    -      $downgrade = $_[$i+1];		# or undef to disable
    -      $i++;
    -      }
    -    elsif ($_[$i] eq 'lib')
    -      {
    -      # alternative library
    -      $lib = $_[$i+1] || '';		# default Calc
    -      $i++;
    -      }
    -    elsif ($_[$i] eq 'with')
    -      {
    -      # alternative class for our private parts()
    -      # XXX: no longer supported
    -      # $MBI = $_[$i+1] || 'Math::BigInt';
    -      $i++;
    -      }
    -    else
    -      {
    -      push @a, $_[$i];
    -      }
    -    }
    -
    -  $lib =~ tr/a-zA-Z0-9,://cd;		# restrict to sane characters
    -  # let use Math::BigInt lib => 'GMP'; use Math::BigFloat; still work
    -  my $mbilib = eval { Math::BigInt->config()->{lib} };
    -  if ((defined $mbilib) && ($MBI eq 'Math::BigInt::Calc'))
    -    {
    -    # MBI already loaded
    -    Math::BigInt->import('lib',"$lib,$mbilib", 'objectify');
    -    }
    -  else
    -    {
    -    # MBI not loaded, or with ne "Math::BigInt::Calc"
    -    $lib .= ",$mbilib" if defined $mbilib;
    -    $lib =~ s/^,//;				# don't leave empty 
    -    
    -    # replacement library can handle lib statement, but also could ignore it
    -    
    -    # Perl < 5.6.0 dies with "out of memory!" when eval() and ':constant' is
    -    # used in the same script, or eval inside import(). So we require MBI:
    -    require Math::BigInt;
    -    Math::BigInt->import( lib => $lib, 'objectify' );
    -    }
    -  if ($@)
    -    {
    -    require Carp; Carp::croak ("Couldn't load $lib: $! $@");
    -    }
    -  # find out which one was actually loaded
    -  $MBI = Math::BigInt->config()->{lib};
    -
    -  # register us with MBI to get notified of future lib changes
    -  Math::BigInt::_register_callback( $self, sub { $MBI = $_[0]; } );
    -   
    -  # any non :constant stuff is handled by our parent, Exporter
    -  # even if @_ is empty, to give it a chance
    -  $self->SUPER::import(@a);      	# for subclasses
    -  $self->export_to_level(1,$self,@a);	# need this, too
    -  }
    -
    -sub bnorm
    -  {
    -  # adjust m and e so that m is smallest possible
    -  # round number according to accuracy and precision settings
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -
    -  return $x if $x->{sign} !~ /^[+-]$/;		# inf, nan etc
    -
    -  my $zeros = $MBI->_zeros($x->{_m});		# correct for trailing zeros
    -  if ($zeros != 0)
    -    {
    -    my $z = $MBI->_new($zeros);
    -    $x->{_m} = $MBI->_rsft ($x->{_m}, $z, 10);
    -    if ($x->{_es} eq '-')
    -      {
    -      if ($MBI->_acmp($x->{_e},$z) >= 0)
    -        {
    -        $x->{_e} = $MBI->_sub  ($x->{_e}, $z);
    -        $x->{_es} = '+' if $MBI->_is_zero($x->{_e});
    -        }
    -      else
    -        {
    -        $x->{_e} = $MBI->_sub  ( $MBI->_copy($z), $x->{_e});
    -        $x->{_es} = '+';
    -        }
    -      }
    -    else
    -      {
    -      $x->{_e} = $MBI->_add  ($x->{_e}, $z);
    -      }
    -    }
    -  else
    -    {
    -    # $x can only be 0Ey if there are no trailing zeros ('0' has 0 trailing
    -    # zeros). So, for something like 0Ey, set y to 1, and -0 => +0
    -    $x->{sign} = '+', $x->{_es} = '+', $x->{_e} = $MBI->_one()
    -     if $MBI->_is_zero($x->{_m});
    -    }
    -
    -  $x;					# MBI bnorm is no-op, so dont call it
    -  } 
    - 
    -##############################################################################
    -
    -sub as_hex
    -  {
    -  # return number as hexadecimal string (only for integers defined)
    -  my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
    -
    -  return $x->bstr() if $x->{sign} !~ /^[+-]$/;  # inf, nan etc
    -  return '0x0' if $x->is_zero();
    -
    -  return $nan if $x->{_es} ne '+';		# how to do 1e-1 in hex!?
    -
    -  my $z = $MBI->_copy($x->{_m});
    -  if (! $MBI->_is_zero($x->{_e}))		# > 0 
    -    {
    -    $MBI->_lsft( $z, $x->{_e},10);
    -    }
    -  $z = Math::BigInt->new( $x->{sign} . $MBI->_num($z));
    -  $z->as_hex();
    -  }
    -
    -sub as_bin
    -  {
    -  # return number as binary digit string (only for integers defined)
    -  my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
    -
    -  return $x->bstr() if $x->{sign} !~ /^[+-]$/;  # inf, nan etc
    -  return '0b0' if $x->is_zero();
    -
    -  return $nan if $x->{_es} ne '+';		# how to do 1e-1 in hex!?
    -
    -  my $z = $MBI->_copy($x->{_m});
    -  if (! $MBI->_is_zero($x->{_e}))		# > 0 
    -    {
    -    $MBI->_lsft( $z, $x->{_e},10);
    -    }
    -  $z = Math::BigInt->new( $x->{sign} . $MBI->_num($z));
    -  $z->as_bin();
    -  }
    -
    -sub as_number
    -  {
    -  # return copy as a bigint representation of this BigFloat number
    -  my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
    -
    -  my $z = $MBI->_copy($x->{_m});
    -  if ($x->{_es} eq '-')			# < 0
    -    {
    -    $MBI->_rsft( $z, $x->{_e},10);
    -    } 
    -  elsif (! $MBI->_is_zero($x->{_e}))	# > 0 
    -    {
    -    $MBI->_lsft( $z, $x->{_e},10);
    -    }
    -  $z = Math::BigInt->new( $x->{sign} . $MBI->_num($z));
    -  $z;
    -  }
    -
    -sub length
    -  {
    -  my $x = shift;
    -  my $class = ref($x) || $x;
    -  $x = $class->new(shift) unless ref($x);
    -
    -  return 1 if $MBI->_is_zero($x->{_m});
    -
    -  my $len = $MBI->_len($x->{_m});
    -  $len += $MBI->_num($x->{_e}) if $x->{_es} eq '+';
    -  if (wantarray())
    -    {
    -    my $t = 0;
    -    $t = $MBI->_num($x->{_e}) if $x->{_es} eq '-';
    -    return ($len, $t);
    -    }
    -  $len;
    -  }
    -
    -1;
    -__END__
    -
    -=head1 NAME
    -
    -Math::BigFloat - Arbitrary size floating point math package
    -
    -=head1 SYNOPSIS
    -
    -  use Math::BigFloat;
    -
    -  # Number creation
    -  $x = Math::BigFloat->new($str);	# defaults to 0
    -  $nan  = Math::BigFloat->bnan();	# create a NotANumber
    -  $zero = Math::BigFloat->bzero();	# create a +0
    -  $inf = Math::BigFloat->binf();	# create a +inf
    -  $inf = Math::BigFloat->binf('-');	# create a -inf
    -  $one = Math::BigFloat->bone();	# create a +1
    -  $one = Math::BigFloat->bone('-');	# create a -1
    -
    -  # Testing
    -  $x->is_zero();		# true if arg is +0
    -  $x->is_nan();			# true if arg is NaN
    -  $x->is_one();			# true if arg is +1
    -  $x->is_one('-');		# true if arg is -1
    -  $x->is_odd();			# true if odd, false for even
    -  $x->is_even();		# true if even, false for odd
    -  $x->is_pos();			# true if >= 0
    -  $x->is_neg();			# true if <  0
    -  $x->is_inf(sign);		# true if +inf, or -inf (default is '+')
    -
    -  $x->bcmp($y);			# compare numbers (undef,<0,=0,>0)
    -  $x->bacmp($y);		# compare absolutely (undef,<0,=0,>0)
    -  $x->sign();			# return the sign, either +,- or NaN
    -  $x->digit($n);		# return the nth digit, counting from right
    -  $x->digit(-$n);		# return the nth digit, counting from left 
    -
    -  # The following all modify their first argument. If you want to preserve
    -  # $x, use $z = $x->copy()->bXXX($y); See under L for why this is
    -  # neccessary when mixing $a = $b assigments with non-overloaded math.
    - 
    -  # set 
    -  $x->bzero();			# set $i to 0
    -  $x->bnan();			# set $i to NaN
    -  $x->bone();                   # set $x to +1
    -  $x->bone('-');                # set $x to -1
    -  $x->binf();                   # set $x to inf
    -  $x->binf('-');                # set $x to -inf
    -
    -  $x->bneg();			# negation
    -  $x->babs();			# absolute value
    -  $x->bnorm();			# normalize (no-op)
    -  $x->bnot();			# two's complement (bit wise not)
    -  $x->binc();			# increment x by 1
    -  $x->bdec();			# decrement x by 1
    -  
    -  $x->badd($y);			# addition (add $y to $x)
    -  $x->bsub($y);			# subtraction (subtract $y from $x)
    -  $x->bmul($y);			# multiplication (multiply $x by $y)
    -  $x->bdiv($y);			# divide, set $x to quotient
    -				# return (quo,rem) or quo if scalar
    -
    -  $x->bmod($y);			# modulus ($x % $y)
    -  $x->bpow($y);			# power of arguments ($x ** $y)
    -  $x->blsft($y);		# left shift
    -  $x->brsft($y);		# right shift 
    -				# return (quo,rem) or quo if scalar
    -  
    -  $x->blog();			# logarithm of $x to base e (Euler's number)
    -  $x->blog($base);		# logarithm of $x to base $base (f.i. 2)
    -  
    -  $x->band($y);			# bit-wise and
    -  $x->bior($y);			# bit-wise inclusive or
    -  $x->bxor($y);			# bit-wise exclusive or
    -  $x->bnot();			# bit-wise not (two's complement)
    - 
    -  $x->bsqrt();			# calculate square-root
    -  $x->broot($y);		# $y'th root of $x (e.g. $y == 3 => cubic root)
    -  $x->bfac();			# factorial of $x (1*2*3*4*..$x)
    - 
    -  $x->bround($N); 		# accuracy: preserve $N digits
    -  $x->bfround($N);		# precision: round to the $Nth digit
    -
    -  $x->bfloor();			# return integer less or equal than $x
    -  $x->bceil();			# return integer greater or equal than $x
    -
    -  # The following do not modify their arguments:
    -
    -  bgcd(@values);		# greatest common divisor
    -  blcm(@values);		# lowest common multiplicator
    -  
    -  $x->bstr();			# return string
    -  $x->bsstr();			# return string in scientific notation
    -
    -  $x->as_int();			# return $x as BigInt 
    -  $x->exponent();		# return exponent as BigInt
    -  $x->mantissa();		# return mantissa as BigInt
    -  $x->parts();			# return (mantissa,exponent) as BigInt
    -
    -  $x->length();			# number of digits (w/o sign and '.')
    -  ($l,$f) = $x->length();	# number of digits, and length of fraction	
    -
    -  $x->precision();		# return P of $x (or global, if P of $x undef)
    -  $x->precision($n);		# set P of $x to $n
    -  $x->accuracy();		# return A of $x (or global, if A of $x undef)
    -  $x->accuracy($n);		# set A $x to $n
    -
    -  # these get/set the appropriate global value for all BigFloat objects
    -  Math::BigFloat->precision();	# Precision
    -  Math::BigFloat->accuracy();	# Accuracy
    -  Math::BigFloat->round_mode();	# rounding mode
    -
    -=head1 DESCRIPTION
    -
    -All operators (inlcuding basic math operations) are overloaded if you
    -declare your big floating point numbers as
    -
    -  $i = new Math::BigFloat '12_3.456_789_123_456_789E-2';
    -
    -Operations with overloaded operators preserve the arguments, which is
    -exactly what you expect.
    -
    -=head2 Canonical notation
    -
    -Input to these routines are either BigFloat objects, or strings of the
    -following four forms:
    -
    -=over 2
    -
    -=item *
    -
    -C
    -
    -=item *
    -
    -C
    -
    -=item *
    -
    -C
    -
    -=item *
    -
    -C
    -
    -=back
    -
    -all with optional leading and trailing zeros and/or spaces. Additonally,
    -numbers are allowed to have an underscore between any two digits.
    -
    -Empty strings as well as other illegal numbers results in 'NaN'.
    -
    -bnorm() on a BigFloat object is now effectively a no-op, since the numbers 
    -are always stored in normalized form. On a string, it creates a BigFloat 
    -object.
    -
    -=head2 Output
    -
    -Output values are BigFloat objects (normalized), except for bstr() and bsstr().
    -
    -The string output will always have leading and trailing zeros stripped and drop
    -a plus sign. C will give you always the form with a decimal point,
    -while C (s for scientific) gives you the scientific notation.
    -
    -	Input			bstr()		bsstr()
    -	'-0'			'0'		'0E1'
    -   	'  -123 123 123'	'-123123123'	'-123123123E0'
    -	'00.0123'		'0.0123'	'123E-4'
    -	'123.45E-2'		'1.2345'	'12345E-4'
    -	'10E+3'			'10000'		'1E4'
    -
    -Some routines (C, C, C, C,
    -C) return true or false, while others (C, C)
    -return either undef, <0, 0 or >0 and are suited for sort.
    -
    -Actual math is done by using the class defined with C Class;> (which
    -defaults to BigInts) to represent the mantissa and exponent.
    -
    -The sign C is stored separately. The string 'NaN' is used to 
    -represent the result when input arguments are not numbers, as well as 
    -the result of dividing by zero.
    -
    -=head2 C, C and C
    -
    -C and C return the said parts of the BigFloat 
    -as BigInts such that:
    -
    -	$m = $x->mantissa();
    -	$e = $x->exponent();
    -	$y = $m * ( 10 ** $e );
    -	print "ok\n" if $x == $y;
    -
    -C<< ($m,$e) = $x->parts(); >> is just a shortcut giving you both of them.
    -
    -A zero is represented and returned as C<0E1>, B C<0E0> (after Knuth).
    -
    -Currently the mantissa is reduced as much as possible, favouring higher
    -exponents over lower ones (e.g. returning 1e7 instead of 10e6 or 10000000e0).
    -This might change in the future, so do not depend on it.
    -
    -=head2 Accuracy vs. Precision
    -
    -See also: L.
    -
    -Math::BigFloat supports both precision (rounding to a certain place before or
    -after the dot) and accuracy (rounding to a certain number of digits). For a
    -full documentation, examples and tips on these topics please see the large
    -section about rounding in L.
    -
    -Since things like C or C<1 / 3> must presented with a limited
    -accuracy lest a operation consumes all resources, each operation produces
    -no more than the requested number of digits.
    -
    -If there is no gloabl precision or accuracy set, B the operation in
    -question was not called with a requested precision or accuracy, B the
    -input $x has no accuracy or precision set, then a fallback parameter will
    -be used. For historical reasons, it is called C and can be accessed
    -via:
    -
    -	$d = Math::BigFloat->div_scale();		# query
    -	Math::BigFloat->div_scale($n);			# set to $n digits
    -
    -The default value for C is 40.
    -
    -In case the result of one operation has more digits than specified,
    -it is rounded. The rounding mode taken is either the default mode, or the one
    -supplied to the operation after the I:
    -
    -	$x = Math::BigFloat->new(2);
    -	Math::BigFloat->accuracy(5);		# 5 digits max
    -	$y = $x->copy()->bdiv(3);		# will give 0.66667
    -	$y = $x->copy()->bdiv(3,6);		# will give 0.666667
    -	$y = $x->copy()->bdiv(3,6,undef,'odd');	# will give 0.666667
    -	Math::BigFloat->round_mode('zero');
    -	$y = $x->copy()->bdiv(3,6);		# will also give 0.666667
    -
    -Note that C<< Math::BigFloat->accuracy() >> and C<< Math::BigFloat->precision() >>
    -set the global variables, and thus B newly created number will be subject
    -to the global rounding B. This means that in the examples above, the
    -C<3> as argument to C will also get an accuracy of B<5>.
    -
    -It is less confusing to either calculate the result fully, and afterwards
    -round it explicitely, or use the additional parameters to the math
    -functions like so:
    -
    -	use Math::BigFloat;	
    -	$x = Math::BigFloat->new(2);
    -	$y = $x->copy()->bdiv(3);
    -	print $y->bround(5),"\n";		# will give 0.66667
    -
    -	or
    -
    -	use Math::BigFloat;	
    -	$x = Math::BigFloat->new(2);
    -	$y = $x->copy()->bdiv(3,5);		# will give 0.66667
    -	print "$y\n";
    -
    -=head2 Rounding
    -
    -=over 2
    -
    -=item ffround ( +$scale )
    -
    -Rounds to the $scale'th place left from the '.', counting from the dot.
    -The first digit is numbered 1. 
    -
    -=item ffround ( -$scale )
    -
    -Rounds to the $scale'th place right from the '.', counting from the dot.
    -
    -=item ffround ( 0 )
    -
    -Rounds to an integer.
    -
    -=item fround  ( +$scale )
    -
    -Preserves accuracy to $scale digits from the left (aka significant digits)
    -and pads the rest with zeros. If the number is between 1 and -1, the
    -significant digits count from the first non-zero after the '.'
    -
    -=item fround  ( -$scale ) and fround ( 0 )
    -
    -These are effectively no-ops.
    -
    -=back
    -
    -All rounding functions take as a second parameter a rounding mode from one of
    -the following: 'even', 'odd', '+inf', '-inf', 'zero' or 'trunc'.
    -
    -The default rounding mode is 'even'. By using
    -C<< Math::BigFloat->round_mode($round_mode); >> you can get and set the default
    -mode for subsequent rounding. The usage of C<$Math::BigFloat::$round_mode> is
    -no longer supported.
    -The second parameter to the round functions then overrides the default
    -temporarily. 
    -
    -The C function returns a BigInt from a Math::BigFloat. It uses
    -'trunc' as rounding mode to make it equivalent to:
    -
    -	$x = 2.5;
    -	$y = int($x) + 2;
    -
    -You can override this by passing the desired rounding mode as parameter to
    -C:
    -
    -	$x = Math::BigFloat->new(2.5);
    -	$y = $x->as_number('odd');	# $y = 3
    -
    -=head1 METHODS
    -
    -=head2 accuracy
    -
    -        $x->accuracy(5);                # local for $x
    -        CLASS->accuracy(5);             # global for all members of CLASS
    -                                        # Note: This also applies to new()!
    -
    -        $A = $x->accuracy();            # read out accuracy that affects $x
    -        $A = CLASS->accuracy();         # read out global accuracy
    -
    -Set or get the global or local accuracy, aka how many significant digits the
    -results have. If you set a global accuracy, then this also applies to new()!
    -
    -Warning! The accuracy I, e.g. once you created a number under the
    -influence of C<< CLASS->accuracy($A) >>, all results from math operations with
    -that number will also be rounded.
    -
    -In most cases, you should probably round the results explicitely using one of
    -L, L or L or by passing the desired accuracy
    -to the math operation as additional parameter:
    -
    -        my $x = Math::BigInt->new(30000);
    -        my $y = Math::BigInt->new(7);
    -        print scalar $x->copy()->bdiv($y, 2);           # print 4300
    -        print scalar $x->copy()->bdiv($y)->bround(2);   # print 4300
    -
    -=head2 precision()
    -
    -        $x->precision(-2);      # local for $x, round at the second digit right of the dot
    -        $x->precision(2);       # ditto, round at the second digit left of the dot
    -
    -        CLASS->precision(5);    # Global for all members of CLASS
    -                                # This also applies to new()!
    -        CLASS->precision(-5);   # ditto
    -
    -        $P = CLASS->precision();        # read out global precision
    -        $P = $x->precision();           # read out precision that affects $x
    -
    -Note: You probably want to use L instead. With L you
    -set the number of digits each result should have, with L you
    -set the place where to round!
    -
    -=head1 Autocreating constants
    -
    -After C all the floating point constants
    -in the given scope are converted to C. This conversion
    -happens at compile time.
    -
    -In particular
    -
    -  perl -MMath::BigFloat=:constant -e 'print 2E-100,"\n"'
    -
    -prints the value of C<2E-100>. Note that without conversion of 
    -constants the expression 2E-100 will be calculated as normal floating point 
    -number.
    -
    -Please note that ':constant' does not affect integer constants, nor binary 
    -nor hexadecimal constants. Use L or L to get this to
    -work.
    -
    -=head2 Math library
    -
    -Math with the numbers is done (by default) by a module called
    -Math::BigInt::Calc. This is equivalent to saying:
    -
    -	use Math::BigFloat lib => 'Calc';
    -
    -You can change this by using:
    -
    -	use Math::BigFloat lib => 'BitVect';
    -
    -The following would first try to find Math::BigInt::Foo, then
    -Math::BigInt::Bar, and when this also fails, revert to Math::BigInt::Calc:
    -
    -	use Math::BigFloat lib => 'Foo,Math::BigInt::Bar';
    -
    -Calc.pm uses as internal format an array of elements of some decimal base
    -(usually 1e7, but this might be differen for some systems) with the least
    -significant digit first, while BitVect.pm uses a bit vector of base 2, most
    -significant bit first. Other modules might use even different means of
    -representing the numbers. See the respective module documentation for further
    -details.
    -
    -Please note that Math::BigFloat does B use the denoted library itself,
    -but it merely passes the lib argument to Math::BigInt. So, instead of the need
    -to do:
    -
    -	use Math::BigInt lib => 'GMP';
    -	use Math::BigFloat;
    -
    -you can roll it all into one line:
    -
    -	use Math::BigFloat lib => 'GMP';
    -
    -It is also possible to just require Math::BigFloat:
    -
    -	require Math::BigFloat;
    -
    -This will load the neccessary things (like BigInt) when they are needed, and
    -automatically.
    -
    -Use the lib, Luke! And see L for more details than
    -you ever wanted to know about loading a different library.
    -
    -=head2 Using Math::BigInt::Lite
    -
    -It is possible to use L with Math::BigFloat:
    -
    -        # 1
    -        use Math::BigFloat with => 'Math::BigInt::Lite';
    -
    -There is no need to "use Math::BigInt" or "use Math::BigInt::Lite", but you
    -can combine these if you want. For instance, you may want to use
    -Math::BigInt objects in your main script, too.
    -
    -        # 2
    -        use Math::BigInt;
    -        use Math::BigFloat with => 'Math::BigInt::Lite';
    -
    -Of course, you can combine this with the C parameter.
    -
    -        # 3
    -        use Math::BigFloat with => 'Math::BigInt::Lite', lib => 'GMP,Pari';
    -
    -There is no need for a "use Math::BigInt;" statement, even if you want to
    -use Math::BigInt's, since Math::BigFloat will needs Math::BigInt and thus
    -always loads it. But if you add it, add it B:
    -
    -        # 4
    -        use Math::BigInt;
    -        use Math::BigFloat with => 'Math::BigInt::Lite', lib => 'GMP,Pari';
    -
    -Notice that the module with the last C will "win" and thus
    -it's lib will be used if the lib is available:
    -
    -        # 5
    -        use Math::BigInt lib => 'Bar,Baz';
    -        use Math::BigFloat with => 'Math::BigInt::Lite', lib => 'Foo';
    -
    -That would try to load Foo, Bar, Baz and Calc (in that order). Or in other
    -words, Math::BigFloat will try to retain previously loaded libs when you
    -don't specify it onem but if you specify one, it will try to load them.
    -
    -Actually, the lib loading order would be "Bar,Baz,Calc", and then
    -"Foo,Bar,Baz,Calc", but independend of which lib exists, the result is the
    -same as trying the latter load alone, except for the fact that one of Bar or
    -Baz might be loaded needlessly in an intermidiate step (and thus hang around
    -and waste memory). If neither Bar nor Baz exist (or don't work/compile), they
    -will still be tried to be loaded, but this is not as time/memory consuming as
    -actually loading one of them. Still, this type of usage is not recommended due
    -to these issues.
    -
    -The old way (loading the lib only in BigInt) still works though:
    -
    -        # 6
    -        use Math::BigInt lib => 'Bar,Baz';
    -        use Math::BigFloat;
    -
    -You can even load Math::BigInt afterwards:
    -
    -        # 7
    -        use Math::BigFloat;
    -        use Math::BigInt lib => 'Bar,Baz';
    -
    -But this has the same problems like #5, it will first load Calc
    -(Math::BigFloat needs Math::BigInt and thus loads it) and then later Bar or
    -Baz, depending on which of them works and is usable/loadable. Since this
    -loads Calc unnecc., it is not recommended.
    -
    -Since it also possible to just require Math::BigFloat, this poses the question
    -about what libary this will use:
    -
    -	require Math::BigFloat;
    -	my $x = Math::BigFloat->new(123); $x += 123;
    -
    -It will use Calc. Please note that the call to import() is still done, but
    -only when you use for the first time some Math::BigFloat math (it is triggered
    -via any constructor, so the first time you create a Math::BigFloat, the load
    -will happen in the background). This means:
    -
    -	require Math::BigFloat;
    -	Math::BigFloat->import ( lib => 'Foo,Bar' );
    -
    -would be the same as:
    -
    -	use Math::BigFloat lib => 'Foo, Bar';
    -
    -But don't try to be clever to insert some operations in between:
    -
    -	require Math::BigFloat;
    -	my $x = Math::BigFloat->bone() + 4;		# load BigInt and Calc
    -	Math::BigFloat->import( lib => 'Pari' );	# load Pari, too
    -	$x = Math::BigFloat->bone()+4;			# now use Pari
    -
    -While this works, it loads Calc needlessly. But maybe you just wanted that?
    -
    -B for daily usage.
    -
    -=head1 BUGS
    -
    -Please see the file BUGS in the CPAN distribution Math::BigInt for known bugs.
    -
    -=head1 CAVEATS
    -
    -=over 1
    -
    -=item stringify, bstr()
    -
    -Both stringify and bstr() now drop the leading '+'. The old code would return
    -'+1.23', the new returns '1.23'. See the documentation in L for
    -reasoning and details.
    -
    -=item bdiv
    -
    -The following will probably not do what you expect:
    -
    -	print $c->bdiv(123.456),"\n";
    -
    -It prints both quotient and reminder since print works in list context. Also,
    -bdiv() will modify $c, so be carefull. You probably want to use
    -	
    -	print $c / 123.456,"\n";
    -	print scalar $c->bdiv(123.456),"\n";  # or if you want to modify $c
    -
    -instead.
    -
    -=item Modifying and =
    -
    -Beware of:
    -
    -	$x = Math::BigFloat->new(5);
    -	$y = $x;
    -
    -It will not do what you think, e.g. making a copy of $x. Instead it just makes
    -a second reference to the B object and stores it in $y. Thus anything
    -that modifies $x will modify $y (except overloaded math operators), and vice
    -versa. See L for details and how to avoid that.
    -
    -=item bpow
    -
    -C now modifies the first argument, unlike the old code which left
    -it alone and only returned the result. This is to be consistent with
    -C etc. The first will modify $x, the second one won't:
    -
    -	print bpow($x,$i),"\n"; 	# modify $x
    -	print $x->bpow($i),"\n"; 	# ditto
    -	print $x ** $i,"\n";		# leave $x alone 
    -
    -=item precision() vs. accuracy()
    -
    -A common pitfall is to use L when you want to round a result to
    -a certain number of digits:
    -
    -	use Math::BigFloat;
    -
    -	Math::BigFloat->precision(4);		# does not do what you think it does
    -	my $x = Math::BigFloat->new(12345);	# rounds $x to "12000"!
    -	print "$x\n";				# print "12000"
    -	my $y = Math::BigFloat->new(3);		# rounds $y to "0"!
    -	print "$y\n";				# print "0"
    -	$z = $x / $y;				# 12000 / 0 => NaN!
    -	print "$z\n";
    -	print $z->precision(),"\n";		# 4
    -
    -Replacing L with L is probably not what you want, either:
    -
    -	use Math::BigFloat;
    -
    -	Math::BigFloat->accuracy(4);		# enables global rounding:
    -	my $x = Math::BigFloat->new(123456);	# rounded immidiately to "12350"
    -	print "$x\n";				# print "123500"
    -	my $y = Math::BigFloat->new(3);		# rounded to "3
    -	print "$y\n";				# print "3"
    -	print $z = $x->copy()->bdiv($y),"\n";	# 41170
    -	print $z->accuracy(),"\n";		# 4
    -
    -What you want to use instead is:
    -
    -	use Math::BigFloat;
    -
    -	my $x = Math::BigFloat->new(123456);	# no rounding
    -	print "$x\n";				# print "123456"
    -	my $y = Math::BigFloat->new(3);		# no rounding
    -	print "$y\n";				# print "3"
    -	print $z = $x->copy()->bdiv($y,4),"\n";	# 41150
    -	print $z->accuracy(),"\n";		# undef
    -
    -In addition to computing what you expected, the last example also does B
    -"taint" the result with an accuracy or precision setting, which would
    -influence any further operation.
    -
    -=back
    -
    -=head1 SEE ALSO
    -
    -L, L and L as well as
    -L, L and  L.
    -
    -The pragmas L, L and L might also be of interest
    -because they solve the autoupgrading/downgrading issue, at least partly.
    -
    -The package at
    -L contains
    -more documentation including a full version history, testcases, empty
    -subclass files and benchmarks.
    -
    -=head1 LICENSE
    -
    -This program is free software; you may redistribute it and/or modify it under
    -the same terms as Perl itself.
    -
    -=head1 AUTHORS
    -
    -Mark Biggar, overloaded interface by Ilya Zakharevich.
    -Completely rewritten by Tels L in 2001 - 2004, and still
    -at it in 2005.
    -
    -=cut
    diff --git a/lib/perl5/5.8.8/Math/BigFloat/Trace.pm b/lib/perl5/5.8.8/Math/BigFloat/Trace.pm
    deleted file mode 100644
    index 871b2a96..00000000
    --- a/lib/perl5/5.8.8/Math/BigFloat/Trace.pm
    +++ /dev/null
    @@ -1,58 +0,0 @@
    -#!/usr/bin/perl -w
    -
    -package Math::BigFloat::Trace;
    -
    -require 5.005_02;
    -use strict;
    -
    -use Exporter;
    -use Math::BigFloat;
    -use vars qw($VERSION @ISA $PACKAGE @EXPORT_OK
    -            $accuracy $precision $round_mode $div_scale);
    -
    -@ISA = qw(Exporter Math::BigFloat);
    -
    -$VERSION = 0.01;
    -
    -use overload;	# inherit overload from BigFloat
    -
    -# Globals
    -$accuracy = $precision = undef;
    -$round_mode = 'even';
    -$div_scale = 40;
    -
    -sub new
    -{
    -        my $proto  = shift;
    -        my $class  = ref($proto) || $proto;
    -
    -        my $value       = shift;
    -	my $a = $accuracy; $a = $_[0] if defined $_[0];
    -	my $p = $precision; $p = $_[1] if defined $_[1];
    -        my $self = Math::BigFloat->new($value,$a,$p,$round_mode);
    -
    -#	remember, downgrading may return a BigInt, so don't meddle with class	
    -#	bless $self,$class;
    -
    -	print "MBF new '$value' => '$self' (",ref($self),")";
    -        return $self;
    -}
    -
    -sub import
    -  {
    -  print "MBF import ",join(' ',@_);
    -  my $self = shift;
    -
    -  # we catch the constants, the rest goes go BigFloat
    -  my @a = ();
    -  foreach (@_)
    -    {
    -    push @a, $_ if $_ ne ':constant';
    -    }
    -  overload::constant float => sub { $self->new(shift); }; 
    -
    -  Math::BigFloat->import(@a);		# need it for subclasses
    -#  $self->export_to_level(1,$self,@_);		# need this ?
    -  }
    -
    -1;
    diff --git a/lib/perl5/5.8.8/Math/BigInt.pm b/lib/perl5/5.8.8/Math/BigInt.pm
    deleted file mode 100644
    index e40809e4..00000000
    --- a/lib/perl5/5.8.8/Math/BigInt.pm
    +++ /dev/null
    @@ -1,4450 +0,0 @@
    -package Math::BigInt;
    -
    -#
    -# "Mike had an infinite amount to do and a negative amount of time in which
    -# to do it." - Before and After
    -#
    -
    -# The following hash values are used:
    -#   value: unsigned int with actual value (as a Math::BigInt::Calc or similiar)
    -#   sign : +,-,NaN,+inf,-inf
    -#   _a   : accuracy
    -#   _p   : precision
    -#   _f   : flags, used by MBF to flag parts of a float as untouchable
    -
    -# Remember not to take shortcuts ala $xs = $x->{value}; $CALC->foo($xs); since
    -# underlying lib might change the reference!
    -
    -my $class = "Math::BigInt";
    -require 5.005;
    -
    -$VERSION = '1.77';
    -
    -@ISA = qw(Exporter);
    -@EXPORT_OK = qw(objectify bgcd blcm); 
    -
    -# _trap_inf and _trap_nan are internal and should never be accessed from the
    -# outside
    -use vars qw/$round_mode $accuracy $precision $div_scale $rnd_mode 
    -	    $upgrade $downgrade $_trap_nan $_trap_inf/;
    -use strict;
    -
    -# Inside overload, the first arg is always an object. If the original code had
    -# it reversed (like $x = 2 * $y), then the third paramater is true.
    -# In some cases (like add, $x = $x + 2 is the same as $x = 2 + $x) this makes
    -# no difference, but in some cases it does.
    -
    -# For overloaded ops with only one argument we simple use $_[0]->copy() to
    -# preserve the argument.
    -
    -# Thus inheritance of overload operators becomes possible and transparent for
    -# our subclasses without the need to repeat the entire overload section there.
    -
    -use overload
    -'='     =>      sub { $_[0]->copy(); },
    -
    -# some shortcuts for speed (assumes that reversed order of arguments is routed
    -# to normal '+' and we thus can always modify first arg. If this is changed,
    -# this breaks and must be adjusted.)
    -'+='	=>	sub { $_[0]->badd($_[1]); },
    -'-='	=>	sub { $_[0]->bsub($_[1]); },
    -'*='	=>	sub { $_[0]->bmul($_[1]); },
    -'/='	=>	sub { scalar $_[0]->bdiv($_[1]); },
    -'%='	=>	sub { $_[0]->bmod($_[1]); },
    -'^='	=>	sub { $_[0]->bxor($_[1]); },
    -'&='	=>	sub { $_[0]->band($_[1]); },
    -'|='	=>	sub { $_[0]->bior($_[1]); },
    -
    -'**='	=>	sub { $_[0]->bpow($_[1]); },
    -'<<='	=>	sub { $_[0]->blsft($_[1]); },
    -'>>='	=>	sub { $_[0]->brsft($_[1]); },
    -
    -# not supported by Perl yet
    -'..'	=>	\&_pointpoint,
    -
    -# we might need '==' and '!=' to get things like "NaN == NaN" right
    -'<=>'	=>	sub { $_[2] ?
    -                      ref($_[0])->bcmp($_[1],$_[0]) : 
    -                      $_[0]->bcmp($_[1]); },
    -'cmp'	=>	sub {
    -         $_[2] ? 
    -               "$_[1]" cmp $_[0]->bstr() :
    -               $_[0]->bstr() cmp "$_[1]" },
    -
    -# make cos()/sin()/exp() "work" with BigInt's or subclasses
    -'cos'	=>	sub { cos($_[0]->numify()) }, 
    -'sin'	=>	sub { sin($_[0]->numify()) }, 
    -'exp'	=>	sub { exp($_[0]->numify()) }, 
    -'atan2'	=>	sub { $_[2] ?
    -			atan2($_[1],$_[0]->numify()) :
    -			atan2($_[0]->numify(),$_[1]) },
    -
    -# are not yet overloadable
    -#'hex'	=>	sub { print "hex"; $_[0]; }, 
    -#'oct'	=>	sub { print "oct"; $_[0]; }, 
    -
    -'log'	=>	sub { $_[0]->copy()->blog($_[1]); }, 
    -'int'	=>	sub { $_[0]->copy(); }, 
    -'neg'	=>	sub { $_[0]->copy()->bneg(); }, 
    -'abs'	=>	sub { $_[0]->copy()->babs(); },
    -'sqrt'  =>	sub { $_[0]->copy()->bsqrt(); },
    -'~'	=>	sub { $_[0]->copy()->bnot(); },
    -
    -# for subtract it's a bit tricky to not modify b: b-a => -a+b
    -'-'	=>	sub { my $c = $_[0]->copy; $_[2] ?
    -			$c->bneg()->badd( $_[1]) :
    -			$c->bsub( $_[1]) },
    -'+'	=>	sub { $_[0]->copy()->badd($_[1]); },
    -'*'	=>	sub { $_[0]->copy()->bmul($_[1]); },
    -
    -'/'	=>	sub { 
    -   $_[2] ? ref($_[0])->new($_[1])->bdiv($_[0]) : $_[0]->copy->bdiv($_[1]);
    -  }, 
    -'%'	=>	sub { 
    -   $_[2] ? ref($_[0])->new($_[1])->bmod($_[0]) : $_[0]->copy->bmod($_[1]);
    -  }, 
    -'**'	=>	sub { 
    -   $_[2] ? ref($_[0])->new($_[1])->bpow($_[0]) : $_[0]->copy->bpow($_[1]);
    -  }, 
    -'<<'	=>	sub { 
    -   $_[2] ? ref($_[0])->new($_[1])->blsft($_[0]) : $_[0]->copy->blsft($_[1]);
    -  }, 
    -'>>'	=>	sub { 
    -   $_[2] ? ref($_[0])->new($_[1])->brsft($_[0]) : $_[0]->copy->brsft($_[1]);
    -  }, 
    -'&'	=>	sub { 
    -   $_[2] ? ref($_[0])->new($_[1])->band($_[0]) : $_[0]->copy->band($_[1]);
    -  }, 
    -'|'	=>	sub { 
    -   $_[2] ? ref($_[0])->new($_[1])->bior($_[0]) : $_[0]->copy->bior($_[1]);
    -  }, 
    -'^'	=>	sub { 
    -   $_[2] ? ref($_[0])->new($_[1])->bxor($_[0]) : $_[0]->copy->bxor($_[1]);
    -  }, 
    -
    -# can modify arg of ++ and --, so avoid a copy() for speed, but don't
    -# use $_[0]->bone(), it would modify $_[0] to be 1!
    -'++'	=>	sub { $_[0]->binc() },
    -'--'	=>	sub { $_[0]->bdec() },
    -
    -# if overloaded, O(1) instead of O(N) and twice as fast for small numbers
    -'bool'  =>	sub {
    -  # this kludge is needed for perl prior 5.6.0 since returning 0 here fails :-/
    -  # v5.6.1 dumps on this: return !$_[0]->is_zero() || undef;		    :-(
    -  my $t = undef;
    -  $t = 1 if !$_[0]->is_zero();
    -  $t;
    -  },
    -
    -# the original qw() does not work with the TIESCALAR below, why?
    -# Order of arguments unsignificant
    -'""' => sub { $_[0]->bstr(); },
    -'0+' => sub { $_[0]->numify(); }
    -;
    -
    -##############################################################################
    -# global constants, flags and accessory
    -
    -# These vars are public, but their direct usage is not recommended, use the
    -# accessor methods instead
    -
    -$round_mode = 'even'; # one of 'even', 'odd', '+inf', '-inf', 'zero' or 'trunc'
    -$accuracy   = undef;
    -$precision  = undef;
    -$div_scale  = 40;
    -
    -$upgrade = undef;			# default is no upgrade
    -$downgrade = undef;			# default is no downgrade
    -
    -# These are internally, and not to be used from the outside at all
    -
    -$_trap_nan = 0;				# are NaNs ok? set w/ config()
    -$_trap_inf = 0;				# are infs ok? set w/ config()
    -my $nan = 'NaN'; 			# constants for easier life
    -
    -my $CALC = 'Math::BigInt::FastCalc';	# module to do the low level math
    -					# default is FastCalc.pm
    -my $IMPORT = 0;				# was import() called yet?
    -					# used to make require work
    -my %WARN;				# warn only once for low-level libs
    -my %CAN;				# cache for $CALC->can(...)
    -my %CALLBACKS;				# callbacks to notify on lib loads
    -my $EMU_LIB = 'Math/BigInt/CalcEmu.pm';	# emulate low-level math
    -
    -##############################################################################
    -# the old code had $rnd_mode, so we need to support it, too
    -
    -$rnd_mode   = 'even';
    -sub TIESCALAR  { my ($class) = @_; bless \$round_mode, $class; }
    -sub FETCH      { return $round_mode; }
    -sub STORE      { $rnd_mode = $_[0]->round_mode($_[1]); }
    -
    -BEGIN
    -  { 
    -  # tie to enable $rnd_mode to work transparently
    -  tie $rnd_mode, 'Math::BigInt'; 
    -
    -  # set up some handy alias names
    -  *as_int = \&as_number;
    -  *is_pos = \&is_positive;
    -  *is_neg = \&is_negative;
    -  }
    -
    -############################################################################## 
    -
    -sub round_mode
    -  {
    -  no strict 'refs';
    -  # make Class->round_mode() work
    -  my $self = shift;
    -  my $class = ref($self) || $self || __PACKAGE__;
    -  if (defined $_[0])
    -    {
    -    my $m = shift;
    -    if ($m !~ /^(even|odd|\+inf|\-inf|zero|trunc)$/)
    -      {
    -      require Carp; Carp::croak ("Unknown round mode '$m'");
    -      }
    -    return ${"${class}::round_mode"} = $m;
    -    }
    -  ${"${class}::round_mode"};
    -  }
    -
    -sub upgrade
    -  {
    -  no strict 'refs';
    -  # make Class->upgrade() work
    -  my $self = shift;
    -  my $class = ref($self) || $self || __PACKAGE__;
    -  # need to set new value?
    -  if (@_ > 0)
    -    {
    -    return ${"${class}::upgrade"} = $_[0];
    -    }
    -  ${"${class}::upgrade"};
    -  }
    -
    -sub downgrade
    -  {
    -  no strict 'refs';
    -  # make Class->downgrade() work
    -  my $self = shift;
    -  my $class = ref($self) || $self || __PACKAGE__;
    -  # need to set new value?
    -  if (@_ > 0)
    -    {
    -    return ${"${class}::downgrade"} = $_[0];
    -    }
    -  ${"${class}::downgrade"};
    -  }
    -
    -sub div_scale
    -  {
    -  no strict 'refs';
    -  # make Class->div_scale() work
    -  my $self = shift;
    -  my $class = ref($self) || $self || __PACKAGE__;
    -  if (defined $_[0])
    -    {
    -    if ($_[0] < 0)
    -      {
    -      require Carp; Carp::croak ('div_scale must be greater than zero');
    -      }
    -    ${"${class}::div_scale"} = $_[0];
    -    }
    -  ${"${class}::div_scale"};
    -  }
    -
    -sub accuracy
    -  {
    -  # $x->accuracy($a);		ref($x)	$a
    -  # $x->accuracy();		ref($x)
    -  # Class->accuracy();		class
    -  # Class->accuracy($a);	class $a
    -
    -  my $x = shift;
    -  my $class = ref($x) || $x || __PACKAGE__;
    -
    -  no strict 'refs';
    -  # need to set new value?
    -  if (@_ > 0)
    -    {
    -    my $a = shift;
    -    # convert objects to scalars to avoid deep recursion. If object doesn't
    -    # have numify(), then hopefully it will have overloading for int() and
    -    # boolean test without wandering into a deep recursion path...
    -    $a = $a->numify() if ref($a) && $a->can('numify');
    -
    -    if (defined $a)
    -      {
    -      # also croak on non-numerical
    -      if (!$a || $a <= 0)
    -        {
    -        require Carp;
    -        Carp::croak ('Argument to accuracy must be greater than zero');
    -        }
    -      if (int($a) != $a)
    -        {
    -        require Carp; Carp::croak ('Argument to accuracy must be an integer');
    -        }
    -      }
    -    if (ref($x))
    -      {
    -      # $object->accuracy() or fallback to global
    -      $x->bround($a) if $a;		# not for undef, 0
    -      $x->{_a} = $a;			# set/overwrite, even if not rounded
    -      delete $x->{_p};			# clear P
    -      $a = ${"${class}::accuracy"} unless defined $a;   # proper return value
    -      }
    -    else
    -      {
    -      ${"${class}::accuracy"} = $a;	# set global A
    -      ${"${class}::precision"} = undef;	# clear global P
    -      }
    -    return $a;				# shortcut
    -    }
    -
    -  my $a;
    -  # $object->accuracy() or fallback to global
    -  $a = $x->{_a} if ref($x);
    -  # but don't return global undef, when $x's accuracy is 0!
    -  $a = ${"${class}::accuracy"} if !defined $a;
    -  $a;
    -  }
    -
    -sub precision
    -  {
    -  # $x->precision($p);		ref($x)	$p
    -  # $x->precision();		ref($x)
    -  # Class->precision();		class
    -  # Class->precision($p);	class $p
    -
    -  my $x = shift;
    -  my $class = ref($x) || $x || __PACKAGE__;
    -
    -  no strict 'refs';
    -  if (@_ > 0)
    -    {
    -    my $p = shift;
    -    # convert objects to scalars to avoid deep recursion. If object doesn't
    -    # have numify(), then hopefully it will have overloading for int() and
    -    # boolean test without wandering into a deep recursion path...
    -    $p = $p->numify() if ref($p) && $p->can('numify');
    -    if ((defined $p) && (int($p) != $p))
    -      {
    -      require Carp; Carp::croak ('Argument to precision must be an integer');
    -      }
    -    if (ref($x))
    -      {
    -      # $object->precision() or fallback to global
    -      $x->bfround($p) if $p;		# not for undef, 0
    -      $x->{_p} = $p;			# set/overwrite, even if not rounded
    -      delete $x->{_a};			# clear A
    -      $p = ${"${class}::precision"} unless defined $p;  # proper return value
    -      }
    -    else
    -      {
    -      ${"${class}::precision"} = $p;	# set global P
    -      ${"${class}::accuracy"} = undef;	# clear global A
    -      }
    -    return $p;				# shortcut
    -    }
    -
    -  my $p;
    -  # $object->precision() or fallback to global
    -  $p = $x->{_p} if ref($x);
    -  # but don't return global undef, when $x's precision is 0!
    -  $p = ${"${class}::precision"} if !defined $p;
    -  $p;
    -  }
    -
    -sub config
    -  {
    -  # return (or set) configuration data as hash ref
    -  my $class = shift || 'Math::BigInt';
    -
    -  no strict 'refs';
    -  if (@_ > 0)
    -    {
    -    # try to set given options as arguments from hash
    -
    -    my $args = $_[0];
    -    if (ref($args) ne 'HASH')
    -      {
    -      $args = { @_ };
    -      }
    -    # these values can be "set"
    -    my $set_args = {};
    -    foreach my $key (
    -     qw/trap_inf trap_nan
    -        upgrade downgrade precision accuracy round_mode div_scale/
    -     )
    -      {
    -      $set_args->{$key} = $args->{$key} if exists $args->{$key};
    -      delete $args->{$key};
    -      }
    -    if (keys %$args > 0)
    -      {
    -      require Carp;
    -      Carp::croak ("Illegal key(s) '",
    -       join("','",keys %$args),"' passed to $class\->config()");
    -      }
    -    foreach my $key (keys %$set_args)
    -      {
    -      if ($key =~ /^trap_(inf|nan)\z/)
    -        {
    -        ${"${class}::_trap_$1"} = ($set_args->{"trap_$1"} ? 1 : 0);
    -        next;
    -        }
    -      # use a call instead of just setting the $variable to check argument
    -      $class->$key($set_args->{$key});
    -      }
    -    }
    -
    -  # now return actual configuration
    -
    -  my $cfg = {
    -    lib => $CALC,
    -    lib_version => ${"${CALC}::VERSION"},
    -    class => $class,
    -    trap_nan => ${"${class}::_trap_nan"},
    -    trap_inf => ${"${class}::_trap_inf"},
    -    version => ${"${class}::VERSION"},
    -    };
    -  foreach my $key (qw/
    -     upgrade downgrade precision accuracy round_mode div_scale
    -     /)
    -    {
    -    $cfg->{$key} = ${"${class}::$key"};
    -    };
    -  $cfg;
    -  }
    -
    -sub _scale_a
    -  { 
    -  # select accuracy parameter based on precedence,
    -  # used by bround() and bfround(), may return undef for scale (means no op)
    -  my ($x,$scale,$mode) = @_;
    -
    -  $scale = $x->{_a} unless defined $scale;
    -
    -  no strict 'refs';
    -  my $class = ref($x);
    -
    -  $scale = ${ $class . '::accuracy' } unless defined $scale;
    -  $mode = ${ $class . '::round_mode' } unless defined $mode;
    -
    -  ($scale,$mode);
    -  }
    -
    -sub _scale_p
    -  { 
    -  # select precision parameter based on precedence,
    -  # used by bround() and bfround(), may return undef for scale (means no op)
    -  my ($x,$scale,$mode) = @_;
    -  
    -  $scale = $x->{_p} unless defined $scale;
    -
    -  no strict 'refs';
    -  my $class = ref($x);
    -
    -  $scale = ${ $class . '::precision' } unless defined $scale;
    -  $mode = ${ $class . '::round_mode' } unless defined $mode;
    -
    -  ($scale,$mode);
    -  }
    -
    -##############################################################################
    -# constructors
    -
    -sub copy
    -  {
    -  my ($c,$x);
    -  if (@_ > 1)
    -    {
    -    # if two arguments, the first one is the class to "swallow" subclasses
    -    ($c,$x) = @_;
    -    }
    -  else
    -    {
    -    $x = shift;
    -    $c = ref($x);
    -    }
    -  return unless ref($x); # only for objects
    -
    -  my $self = bless {}, $c;
    -
    -  $self->{sign} = $x->{sign};
    -  $self->{value} = $CALC->_copy($x->{value});
    -  $self->{_a} = $x->{_a} if defined $x->{_a};
    -  $self->{_p} = $x->{_p} if defined $x->{_p};
    -  $self;
    -  }
    -
    -sub new 
    -  {
    -  # create a new BigInt object from a string or another BigInt object. 
    -  # see hash keys documented at top
    -
    -  # the argument could be an object, so avoid ||, && etc on it, this would
    -  # cause costly overloaded code to be called. The only allowed ops are
    -  # ref() and defined.
    -
    -  my ($class,$wanted,$a,$p,$r) = @_;
    - 
    -  # avoid numify-calls by not using || on $wanted!
    -  return $class->bzero($a,$p) if !defined $wanted;	# default to 0
    -  return $class->copy($wanted,$a,$p,$r)
    -   if ref($wanted) && $wanted->isa($class);		# MBI or subclass
    -
    -  $class->import() if $IMPORT == 0;		# make require work
    -  
    -  my $self = bless {}, $class;
    -
    -  # shortcut for "normal" numbers
    -  if ((!ref $wanted) && ($wanted =~ /^([+-]?)[1-9][0-9]*\z/))
    -    {
    -    $self->{sign} = $1 || '+';
    -
    -    if ($wanted =~ /^[+-]/)
    -     {
    -      # remove sign without touching wanted to make it work with constants
    -      my $t = $wanted; $t =~ s/^[+-]//;
    -      $self->{value} = $CALC->_new($t);
    -      }
    -    else
    -      {
    -      $self->{value} = $CALC->_new($wanted);
    -      }
    -    no strict 'refs';
    -    if ( (defined $a) || (defined $p) 
    -        || (defined ${"${class}::precision"})
    -        || (defined ${"${class}::accuracy"}) 
    -       )
    -      {
    -      $self->round($a,$p,$r) unless (@_ == 4 && !defined $a && !defined $p);
    -      }
    -    return $self;
    -    }
    -
    -  # handle '+inf', '-inf' first
    -  if ($wanted =~ /^[+-]?inf\z/)
    -    {
    -    $self->{sign} = $wanted;		# set a default sign for bstr()
    -    return $self->binf($wanted);
    -    }
    -  # split str in m mantissa, e exponent, i integer, f fraction, v value, s sign
    -  my ($mis,$miv,$mfv,$es,$ev) = _split($wanted);
    -  if (!ref $mis)
    -    {
    -    if ($_trap_nan)
    -      {
    -      require Carp; Carp::croak("$wanted is not a number in $class");
    -      }
    -    $self->{value} = $CALC->_zero();
    -    $self->{sign} = $nan;
    -    return $self;
    -    }
    -  if (!ref $miv)
    -    {
    -    # _from_hex or _from_bin
    -    $self->{value} = $mis->{value};
    -    $self->{sign} = $mis->{sign};
    -    return $self;	# throw away $mis
    -    }
    -  # make integer from mantissa by adjusting exp, then convert to bigint
    -  $self->{sign} = $$mis;			# store sign
    -  $self->{value} = $CALC->_zero();		# for all the NaN cases
    -  my $e = int("$$es$$ev");			# exponent (avoid recursion)
    -  if ($e > 0)
    -    {
    -    my $diff = $e - CORE::length($$mfv);
    -    if ($diff < 0)				# Not integer
    -      {
    -      if ($_trap_nan)
    -        {
    -        require Carp; Carp::croak("$wanted not an integer in $class");
    -        }
    -      #print "NOI 1\n";
    -      return $upgrade->new($wanted,$a,$p,$r) if defined $upgrade;
    -      $self->{sign} = $nan;
    -      }
    -    else					# diff >= 0
    -      {
    -      # adjust fraction and add it to value
    -      #print "diff > 0 $$miv\n";
    -      $$miv = $$miv . ($$mfv . '0' x $diff);
    -      }
    -    }
    -  else
    -    {
    -    if ($$mfv ne '')				# e <= 0
    -      {
    -      # fraction and negative/zero E => NOI
    -      if ($_trap_nan)
    -        {
    -        require Carp; Carp::croak("$wanted not an integer in $class");
    -        }
    -      #print "NOI 2 \$\$mfv '$$mfv'\n";
    -      return $upgrade->new($wanted,$a,$p,$r) if defined $upgrade;
    -      $self->{sign} = $nan;
    -      }
    -    elsif ($e < 0)
    -      {
    -      # xE-y, and empty mfv
    -      #print "xE-y\n";
    -      $e = abs($e);
    -      if ($$miv !~ s/0{$e}$//)		# can strip so many zero's?
    -        {
    -        if ($_trap_nan)
    -          {
    -          require Carp; Carp::croak("$wanted not an integer in $class");
    -          }
    -        #print "NOI 3\n";
    -        return $upgrade->new($wanted,$a,$p,$r) if defined $upgrade;
    -        $self->{sign} = $nan;
    -        }
    -      }
    -    }
    -  $self->{sign} = '+' if $$miv eq '0';			# normalize -0 => +0
    -  $self->{value} = $CALC->_new($$miv) if $self->{sign} =~ /^[+-]$/;
    -  # if any of the globals is set, use them to round and store them inside $self
    -  # do not round for new($x,undef,undef) since that is used by MBF to signal
    -  # no rounding
    -  $self->round($a,$p,$r) unless @_ == 4 && !defined $a && !defined $p;
    -  $self;
    -  }
    -
    -sub bnan
    -  {
    -  # create a bigint 'NaN', if given a BigInt, set it to 'NaN'
    -  my $self = shift;
    -  $self = $class if !defined $self;
    -  if (!ref($self))
    -    {
    -    my $c = $self; $self = {}; bless $self, $c;
    -    }
    -  no strict 'refs';
    -  if (${"${class}::_trap_nan"})
    -    {
    -    require Carp;
    -    Carp::croak ("Tried to set $self to NaN in $class\::bnan()");
    -    }
    -  $self->import() if $IMPORT == 0;		# make require work
    -  return if $self->modify('bnan');
    -  if ($self->can('_bnan'))
    -    {
    -    # use subclass to initialize
    -    $self->_bnan();
    -    }
    -  else
    -    {
    -    # otherwise do our own thing
    -    $self->{value} = $CALC->_zero();
    -    }
    -  $self->{sign} = $nan;
    -  delete $self->{_a}; delete $self->{_p};	# rounding NaN is silly
    -  $self;
    -  }
    -
    -sub binf
    -  {
    -  # create a bigint '+-inf', if given a BigInt, set it to '+-inf'
    -  # the sign is either '+', or if given, used from there
    -  my $self = shift;
    -  my $sign = shift; $sign = '+' if !defined $sign || $sign !~ /^-(inf)?$/;
    -  $self = $class if !defined $self;
    -  if (!ref($self))
    -    {
    -    my $c = $self; $self = {}; bless $self, $c;
    -    }
    -  no strict 'refs';
    -  if (${"${class}::_trap_inf"})
    -    {
    -    require Carp;
    -    Carp::croak ("Tried to set $self to +-inf in $class\::binf()");
    -    }
    -  $self->import() if $IMPORT == 0;		# make require work
    -  return if $self->modify('binf');
    -  if ($self->can('_binf'))
    -    {
    -    # use subclass to initialize
    -    $self->_binf();
    -    }
    -  else
    -    {
    -    # otherwise do our own thing
    -    $self->{value} = $CALC->_zero();
    -    }
    -  $sign = $sign . 'inf' if $sign !~ /inf$/;	# - => -inf
    -  $self->{sign} = $sign;
    -  ($self->{_a},$self->{_p}) = @_;		# take over requested rounding
    -  $self;
    -  }
    -
    -sub bzero
    -  {
    -  # create a bigint '+0', if given a BigInt, set it to 0
    -  my $self = shift;
    -  $self = __PACKAGE__ if !defined $self;
    - 
    -  if (!ref($self))
    -    {
    -    my $c = $self; $self = {}; bless $self, $c;
    -    }
    -  $self->import() if $IMPORT == 0;		# make require work
    -  return if $self->modify('bzero');
    -  
    -  if ($self->can('_bzero'))
    -    {
    -    # use subclass to initialize
    -    $self->_bzero();
    -    }
    -  else
    -    {
    -    # otherwise do our own thing
    -    $self->{value} = $CALC->_zero();
    -    }
    -  $self->{sign} = '+';
    -  if (@_ > 0)
    -    {
    -    if (@_ > 3)
    -      {
    -      # call like: $x->bzero($a,$p,$r,$y);
    -      ($self,$self->{_a},$self->{_p}) = $self->_find_round_parameters(@_);
    -      }
    -    else
    -      {
    -      $self->{_a} = $_[0]
    -       if ( (!defined $self->{_a}) || (defined $_[0] && $_[0] > $self->{_a}));
    -      $self->{_p} = $_[1]
    -       if ( (!defined $self->{_p}) || (defined $_[1] && $_[1] > $self->{_p}));
    -      }
    -    }
    -  $self;
    -  }
    -
    -sub bone
    -  {
    -  # create a bigint '+1' (or -1 if given sign '-'),
    -  # if given a BigInt, set it to +1 or -1, respecively
    -  my $self = shift;
    -  my $sign = shift; $sign = '+' if !defined $sign || $sign ne '-';
    -  $self = $class if !defined $self;
    -
    -  if (!ref($self))
    -    {
    -    my $c = $self; $self = {}; bless $self, $c;
    -    }
    -  $self->import() if $IMPORT == 0;		# make require work
    -  return if $self->modify('bone');
    -
    -  if ($self->can('_bone'))
    -    {
    -    # use subclass to initialize
    -    $self->_bone();
    -    }
    -  else
    -    {
    -    # otherwise do our own thing
    -    $self->{value} = $CALC->_one();
    -    }
    -  $self->{sign} = $sign;
    -  if (@_ > 0)
    -    {
    -    if (@_ > 3)
    -      {
    -      # call like: $x->bone($sign,$a,$p,$r,$y);
    -      ($self,$self->{_a},$self->{_p}) = $self->_find_round_parameters(@_);
    -      }
    -    else
    -      {
    -      # call like: $x->bone($sign,$a,$p,$r);
    -      $self->{_a} = $_[0]
    -       if ( (!defined $self->{_a}) || (defined $_[0] && $_[0] > $self->{_a}));
    -      $self->{_p} = $_[1]
    -       if ( (!defined $self->{_p}) || (defined $_[1] && $_[1] > $self->{_p}));
    -      }
    -    }
    -  $self;
    -  }
    -
    -##############################################################################
    -# string conversation
    -
    -sub bsstr
    -  {
    -  # (ref to BFLOAT or num_str ) return num_str
    -  # Convert number from internal format to scientific string format.
    -  # internal format is always normalized (no leading zeros, "-0E0" => "+0E0")
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_); 
    -
    -  if ($x->{sign} !~ /^[+-]$/)
    -    {
    -    return $x->{sign} unless $x->{sign} eq '+inf';	# -inf, NaN
    -    return 'inf';					# +inf
    -    }
    -  my ($m,$e) = $x->parts();
    -  #$m->bstr() . 'e+' . $e->bstr(); 	# e can only be positive in BigInt
    -  # 'e+' because E can only be positive in BigInt
    -  $m->bstr() . 'e+' . $CALC->_str($e->{value}); 
    -  }
    -
    -sub bstr 
    -  {
    -  # make a string from bigint object
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_); 
    -
    -  if ($x->{sign} !~ /^[+-]$/)
    -    {
    -    return $x->{sign} unless $x->{sign} eq '+inf';	# -inf, NaN
    -    return 'inf';					# +inf
    -    }
    -  my $es = ''; $es = $x->{sign} if $x->{sign} eq '-';
    -  $es.$CALC->_str($x->{value});
    -  }
    -
    -sub numify 
    -  {
    -  # Make a "normal" scalar from a BigInt object
    -  my $x = shift; $x = $class->new($x) unless ref $x;
    -
    -  return $x->bstr() if $x->{sign} !~ /^[+-]$/;
    -  my $num = $CALC->_num($x->{value});
    -  return -$num if $x->{sign} eq '-';
    -  $num;
    -  }
    -
    -##############################################################################
    -# public stuff (usually prefixed with "b")
    -
    -sub sign
    -  {
    -  # return the sign of the number: +/-/-inf/+inf/NaN
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_); 
    -  
    -  $x->{sign};
    -  }
    -
    -sub _find_round_parameters
    -  {
    -  # After any operation or when calling round(), the result is rounded by
    -  # regarding the A & P from arguments, local parameters, or globals.
    -
    -  # !!!!!!! If you change this, remember to change round(), too! !!!!!!!!!!
    -
    -  # This procedure finds the round parameters, but it is for speed reasons
    -  # duplicated in round. Otherwise, it is tested by the testsuite and used
    -  # by fdiv().
    - 
    -  # returns ($self) or ($self,$a,$p,$r) - sets $self to NaN of both A and P
    -  # were requested/defined (locally or globally or both)
    -  
    -  my ($self,$a,$p,$r,@args) = @_;
    -  # $a accuracy, if given by caller
    -  # $p precision, if given by caller
    -  # $r round_mode, if given by caller
    -  # @args all 'other' arguments (0 for unary, 1 for binary ops)
    -
    -  my $c = ref($self);				# find out class of argument(s)
    -  no strict 'refs';
    -
    -  # now pick $a or $p, but only if we have got "arguments"
    -  if (!defined $a)
    -    {
    -    foreach ($self,@args)
    -      {
    -      # take the defined one, or if both defined, the one that is smaller
    -      $a = $_->{_a} if (defined $_->{_a}) && (!defined $a || $_->{_a} < $a);
    -      }
    -    }
    -  if (!defined $p)
    -    {
    -    # even if $a is defined, take $p, to signal error for both defined
    -    foreach ($self,@args)
    -      {
    -      # take the defined one, or if both defined, the one that is bigger
    -      # -2 > -3, and 3 > 2
    -      $p = $_->{_p} if (defined $_->{_p}) && (!defined $p || $_->{_p} > $p);
    -      }
    -    }
    -  # if still none defined, use globals (#2)
    -  $a = ${"$c\::accuracy"} unless defined $a;
    -  $p = ${"$c\::precision"} unless defined $p;
    -
    -  # A == 0 is useless, so undef it to signal no rounding
    -  $a = undef if defined $a && $a == 0;
    - 
    -  # no rounding today? 
    -  return ($self) unless defined $a || defined $p;		# early out
    -
    -  # set A and set P is an fatal error
    -  return ($self->bnan()) if defined $a && defined $p;		# error
    -
    -  $r = ${"$c\::round_mode"} unless defined $r;
    -  if ($r !~ /^(even|odd|\+inf|\-inf|zero|trunc)$/)
    -    {
    -    require Carp; Carp::croak ("Unknown round mode '$r'");
    -    }
    -
    -  ($self,$a,$p,$r);
    -  }
    -
    -sub round
    -  {
    -  # Round $self according to given parameters, or given second argument's
    -  # parameters or global defaults 
    -
    -  # for speed reasons, _find_round_parameters is embeded here:
    -
    -  my ($self,$a,$p,$r,@args) = @_;
    -  # $a accuracy, if given by caller
    -  # $p precision, if given by caller
    -  # $r round_mode, if given by caller
    -  # @args all 'other' arguments (0 for unary, 1 for binary ops)
    -
    -  my $c = ref($self);				# find out class of argument(s)
    -  no strict 'refs';
    -
    -  # now pick $a or $p, but only if we have got "arguments"
    -  if (!defined $a)
    -    {
    -    foreach ($self,@args)
    -      {
    -      # take the defined one, or if both defined, the one that is smaller
    -      $a = $_->{_a} if (defined $_->{_a}) && (!defined $a || $_->{_a} < $a);
    -      }
    -    }
    -  if (!defined $p)
    -    {
    -    # even if $a is defined, take $p, to signal error for both defined
    -    foreach ($self,@args)
    -      {
    -      # take the defined one, or if both defined, the one that is bigger
    -      # -2 > -3, and 3 > 2
    -      $p = $_->{_p} if (defined $_->{_p}) && (!defined $p || $_->{_p} > $p);
    -      }
    -    }
    -  # if still none defined, use globals (#2)
    -  $a = ${"$c\::accuracy"} unless defined $a;
    -  $p = ${"$c\::precision"} unless defined $p;
    - 
    -  # A == 0 is useless, so undef it to signal no rounding
    -  $a = undef if defined $a && $a == 0;
    -  
    -  # no rounding today? 
    -  return $self unless defined $a || defined $p;		# early out
    -
    -  # set A and set P is an fatal error
    -  return $self->bnan() if defined $a && defined $p;
    -
    -  $r = ${"$c\::round_mode"} unless defined $r;
    -  if ($r !~ /^(even|odd|\+inf|\-inf|zero|trunc)$/)
    -    {
    -    require Carp; Carp::croak ("Unknown round mode '$r'");
    -    }
    -
    -  # now round, by calling either fround or ffround:
    -  if (defined $a)
    -    {
    -    $self->bround($a,$r) if !defined $self->{_a} || $self->{_a} >= $a;
    -    }
    -  else # both can't be undefined due to early out
    -    {
    -    $self->bfround($p,$r) if !defined $self->{_p} || $self->{_p} <= $p;
    -    }
    -  # bround() or bfround() already callled bnorm() if necc.
    -  $self;
    -  }
    -
    -sub bnorm
    -  { 
    -  # (numstr or BINT) return BINT
    -  # Normalize number -- no-op here
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -  $x;
    -  }
    -
    -sub babs 
    -  {
    -  # (BINT or num_str) return BINT
    -  # make number absolute, or return absolute BINT from string
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -
    -  return $x if $x->modify('babs');
    -  # post-normalized abs for internal use (does nothing for NaN)
    -  $x->{sign} =~ s/^-/+/;
    -  $x;
    -  }
    -
    -sub bneg 
    -  { 
    -  # (BINT or num_str) return BINT
    -  # negate number or make a negated number from string
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -  
    -  return $x if $x->modify('bneg');
    -
    -  # for +0 dont negate (to have always normalized +0). Does nothing for 'NaN'
    -  $x->{sign} =~ tr/+-/-+/ unless ($x->{sign} eq '+' && $CALC->_is_zero($x->{value}));
    -  $x;
    -  }
    -
    -sub bcmp 
    -  {
    -  # Compares 2 values.  Returns one of undef, <0, =0, >0. (suitable for sort)
    -  # (BINT or num_str, BINT or num_str) return cond_code
    -  
    -  # set up parameters
    -  my ($self,$x,$y) = (ref($_[0]),@_);
    -
    -  # objectify is costly, so avoid it 
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y) = objectify(2,@_);
    -    }
    -
    -  return $upgrade->bcmp($x,$y) if defined $upgrade &&
    -    ((!$x->isa($self)) || (!$y->isa($self)));
    -
    -  if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
    -    {
    -    # handle +-inf and NaN
    -    return undef if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
    -    return 0 if $x->{sign} eq $y->{sign} && $x->{sign} =~ /^[+-]inf$/;
    -    return +1 if $x->{sign} eq '+inf';
    -    return -1 if $x->{sign} eq '-inf';
    -    return -1 if $y->{sign} eq '+inf';
    -    return +1;
    -    }
    -  # check sign for speed first
    -  return 1 if $x->{sign} eq '+' && $y->{sign} eq '-';	# does also 0 <=> -y
    -  return -1 if $x->{sign} eq '-' && $y->{sign} eq '+';  # does also -x <=> 0 
    -
    -  # have same sign, so compare absolute values. Don't make tests for zero here
    -  # because it's actually slower than testin in Calc (especially w/ Pari et al)
    -
    -  # post-normalized compare for internal use (honors signs)
    -  if ($x->{sign} eq '+') 
    -    {
    -    # $x and $y both > 0
    -    return $CALC->_acmp($x->{value},$y->{value});
    -    }
    -
    -  # $x && $y both < 0
    -  $CALC->_acmp($y->{value},$x->{value});	# swaped acmp (lib returns 0,1,-1)
    -  }
    -
    -sub bacmp 
    -  {
    -  # Compares 2 values, ignoring their signs. 
    -  # Returns one of undef, <0, =0, >0. (suitable for sort)
    -  # (BINT, BINT) return cond_code
    -  
    -  # set up parameters
    -  my ($self,$x,$y) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it 
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y) = objectify(2,@_);
    -    }
    -
    -  return $upgrade->bacmp($x,$y) if defined $upgrade &&
    -    ((!$x->isa($self)) || (!$y->isa($self)));
    -
    -  if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
    -    {
    -    # handle +-inf and NaN
    -    return undef if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
    -    return 0 if $x->{sign} =~ /^[+-]inf$/ && $y->{sign} =~ /^[+-]inf$/;
    -    return 1 if $x->{sign} =~ /^[+-]inf$/ && $y->{sign} !~ /^[+-]inf$/;
    -    return -1;
    -    }
    -  $CALC->_acmp($x->{value},$y->{value});	# lib does only 0,1,-1
    -  }
    -
    -sub badd 
    -  {
    -  # add second arg (BINT or string) to first (BINT) (modifies first)
    -  # return result as BINT
    -
    -  # set up parameters
    -  my ($self,$x,$y,@r) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it 
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,@r) = objectify(2,@_);
    -    }
    -
    -  return $x if $x->modify('badd');
    -  return $upgrade->badd($upgrade->new($x),$upgrade->new($y),@r) if defined $upgrade &&
    -    ((!$x->isa($self)) || (!$y->isa($self)));
    -
    -  $r[3] = $y;				# no push!
    -  # inf and NaN handling
    -  if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
    -    {
    -    # NaN first
    -    return $x->bnan() if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
    -    # inf handling
    -    if (($x->{sign} =~ /^[+-]inf$/) && ($y->{sign} =~ /^[+-]inf$/))
    -      {
    -      # +inf++inf or -inf+-inf => same, rest is NaN
    -      return $x if $x->{sign} eq $y->{sign};
    -      return $x->bnan();
    -      }
    -    # +-inf + something => +inf
    -    # something +-inf => +-inf
    -    $x->{sign} = $y->{sign}, return $x if $y->{sign} =~ /^[+-]inf$/;
    -    return $x;
    -    }
    -    
    -  my ($sx, $sy) = ( $x->{sign}, $y->{sign} ); 		# get signs
    -
    -  if ($sx eq $sy)  
    -    {
    -    $x->{value} = $CALC->_add($x->{value},$y->{value});	# same sign, abs add
    -    }
    -  else 
    -    {
    -    my $a = $CALC->_acmp ($y->{value},$x->{value});	# absolute compare
    -    if ($a > 0)                           
    -      {
    -      $x->{value} = $CALC->_sub($y->{value},$x->{value},1); # abs sub w/ swap
    -      $x->{sign} = $sy;
    -      } 
    -    elsif ($a == 0)
    -      {
    -      # speedup, if equal, set result to 0
    -      $x->{value} = $CALC->_zero();
    -      $x->{sign} = '+';
    -      }
    -    else # a < 0
    -      {
    -      $x->{value} = $CALC->_sub($x->{value}, $y->{value}); # abs sub
    -      }
    -    }
    -  $x->round(@r);
    -  }
    -
    -sub bsub 
    -  {
    -  # (BINT or num_str, BINT or num_str) return BINT
    -  # subtract second arg from first, modify first
    -  
    -  # set up parameters
    -  my ($self,$x,$y,@r) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,@r) = objectify(2,@_);
    -    }
    -
    -  return $x if $x->modify('bsub');
    -
    -  return $upgrade->new($x)->bsub($upgrade->new($y),@r) if defined $upgrade &&
    -   ((!$x->isa($self)) || (!$y->isa($self)));
    -
    -  return $x->round(@r) if $y->is_zero();
    -
    -  # To correctly handle the lone special case $x->bsub($x), we note the sign
    -  # of $x, then flip the sign from $y, and if the sign of $x did change, too,
    -  # then we caught the special case:
    -  my $xsign = $x->{sign};
    -  $y->{sign} =~ tr/+\-/-+/; 	# does nothing for NaN
    -  if ($xsign ne $x->{sign})
    -    {
    -    # special case of $x->bsub($x) results in 0
    -    return $x->bzero(@r) if $xsign =~ /^[+-]$/;
    -    return $x->bnan();          # NaN, -inf, +inf
    -    }
    -  $x->badd($y,@r); 		# badd does not leave internal zeros
    -  $y->{sign} =~ tr/+\-/-+/; 	# refix $y (does nothing for NaN)
    -  $x;				# already rounded by badd() or no round necc.
    -  }
    -
    -sub binc
    -  {
    -  # increment arg by one
    -  my ($self,$x,$a,$p,$r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
    -  return $x if $x->modify('binc');
    -
    -  if ($x->{sign} eq '+')
    -    {
    -    $x->{value} = $CALC->_inc($x->{value});
    -    return $x->round($a,$p,$r);
    -    }
    -  elsif ($x->{sign} eq '-')
    -    {
    -    $x->{value} = $CALC->_dec($x->{value});
    -    $x->{sign} = '+' if $CALC->_is_zero($x->{value}); # -1 +1 => -0 => +0
    -    return $x->round($a,$p,$r);
    -    }
    -  # inf, nan handling etc
    -  $x->badd($self->bone(),$a,$p,$r);		# badd does round
    -  }
    -
    -sub bdec
    -  {
    -  # decrement arg by one
    -  my ($self,$x,@r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
    -  return $x if $x->modify('bdec');
    -  
    -  if ($x->{sign} eq '-')
    -    {
    -    # x already < 0
    -    $x->{value} = $CALC->_inc($x->{value});
    -    } 
    -  else
    -    {
    -    return $x->badd($self->bone('-'),@r) unless $x->{sign} eq '+'; 	# inf or NaN
    -    # >= 0
    -    if ($CALC->_is_zero($x->{value}))
    -      {
    -      # == 0
    -      $x->{value} = $CALC->_one(); $x->{sign} = '-';		# 0 => -1
    -      }
    -    else
    -      {
    -      # > 0
    -      $x->{value} = $CALC->_dec($x->{value});
    -      }
    -    }
    -  $x->round(@r);
    -  }
    -
    -sub blog
    -  {
    -  # calculate $x = $a ** $base + $b and return $a (e.g. the log() to base
    -  # $base of $x)
    -
    -  # set up parameters
    -  my ($self,$x,$base,@r) = (undef,@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$base,@r) = objectify(1,ref($x),@_);
    -    }
    -  
    -  return $x if $x->modify('blog');
    -
    -  # inf, -inf, NaN, <0 => NaN
    -  return $x->bnan()
    -   if $x->{sign} ne '+' || (defined $base && $base->{sign} ne '+');
    -
    -  return $upgrade->blog($upgrade->new($x),$base,@r) if 
    -    defined $upgrade;
    -
    -  my ($rc,$exact) = $CALC->_log_int($x->{value},$base->{value});
    -  return $x->bnan() unless defined $rc;		# not possible to take log?
    -  $x->{value} = $rc;
    -  $x->round(@r);
    -  }
    -
    -sub blcm 
    -  { 
    -  # (BINT or num_str, BINT or num_str) return BINT
    -  # does not modify arguments, but returns new object
    -  # Lowest Common Multiplicator
    -
    -  my $y = shift; my ($x);
    -  if (ref($y))
    -    {
    -    $x = $y->copy();
    -    }
    -  else
    -    {
    -    $x = $class->new($y);
    -    }
    -  my $self = ref($x);
    -  while (@_) 
    -    {
    -    my $y = shift; $y = $self->new($y) if !ref ($y);
    -    $x = __lcm($x,$y);
    -    } 
    -  $x;
    -  }
    -
    -sub bgcd 
    -  { 
    -  # (BINT or num_str, BINT or num_str) return BINT
    -  # does not modify arguments, but returns new object
    -  # GCD -- Euclids algorithm, variant C (Knuth Vol 3, pg 341 ff)
    -
    -  my $y = shift;
    -  $y = $class->new($y) if !ref($y);
    -  my $self = ref($y);
    -  my $x = $y->copy()->babs();			# keep arguments
    -  return $x->bnan() if $x->{sign} !~ /^[+-]$/;	# x NaN?
    -
    -  while (@_)
    -    {
    -    $y = shift; $y = $self->new($y) if !ref($y);
    -    return $x->bnan() if $y->{sign} !~ /^[+-]$/;	# y NaN?
    -    $x->{value} = $CALC->_gcd($x->{value},$y->{value});
    -    last if $CALC->_is_one($x->{value});
    -    }
    -  $x;
    -  }
    -
    -sub bnot 
    -  {
    -  # (num_str or BINT) return BINT
    -  # represent ~x as twos-complement number
    -  # we don't need $self, so undef instead of ref($_[0]) make it slightly faster
    -  my ($self,$x,$a,$p,$r) = ref($_[0]) ? (undef,@_) : objectify(1,@_);
    - 
    -  return $x if $x->modify('bnot');
    -  $x->binc()->bneg();			# binc already does round
    -  }
    -
    -##############################################################################
    -# is_foo test routines
    -# we don't need $self, so undef instead of ref($_[0]) make it slightly faster
    -
    -sub is_zero
    -  {
    -  # return true if arg (BINT or num_str) is zero (array '+', '0')
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -  
    -  return 0 if $x->{sign} !~ /^\+$/;			# -, NaN & +-inf aren't
    -  $CALC->_is_zero($x->{value});
    -  }
    -
    -sub is_nan
    -  {
    -  # return true if arg (BINT or num_str) is NaN
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -
    -  $x->{sign} eq $nan ? 1 : 0;
    -  }
    -
    -sub is_inf
    -  {
    -  # return true if arg (BINT or num_str) is +-inf
    -  my ($self,$x,$sign) = ref($_[0]) ? (undef,@_) : objectify(1,@_);
    -
    -  if (defined $sign)
    -    {
    -    $sign = '[+-]inf' if $sign eq '';	# +- doesn't matter, only that's inf
    -    $sign = "[$1]inf" if $sign =~ /^([+-])(inf)?$/;	# extract '+' or '-'
    -    return $x->{sign} =~ /^$sign$/ ? 1 : 0;
    -    }
    -  $x->{sign} =~ /^[+-]inf$/ ? 1 : 0;		# only +-inf is infinity
    -  }
    -
    -sub is_one
    -  {
    -  # return true if arg (BINT or num_str) is +1, or -1 if sign is given
    -  my ($self,$x,$sign) = ref($_[0]) ? (undef,@_) : objectify(1,@_);
    -    
    -  $sign = '+' if !defined $sign || $sign ne '-';
    - 
    -  return 0 if $x->{sign} ne $sign; 	# -1 != +1, NaN, +-inf aren't either
    -  $CALC->_is_one($x->{value});
    -  }
    -
    -sub is_odd
    -  {
    -  # return true when arg (BINT or num_str) is odd, false for even
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -
    -  return 0 if $x->{sign} !~ /^[+-]$/;			# NaN & +-inf aren't
    -  $CALC->_is_odd($x->{value});
    -  }
    -
    -sub is_even
    -  {
    -  # return true when arg (BINT or num_str) is even, false for odd
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -
    -  return 0 if $x->{sign} !~ /^[+-]$/;			# NaN & +-inf aren't
    -  $CALC->_is_even($x->{value});
    -  }
    -
    -sub is_positive
    -  {
    -  # return true when arg (BINT or num_str) is positive (>= 0)
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -
    -  return 1 if $x->{sign} eq '+inf';			# +inf is positive
    - 
    -  # 0+ is neither positive nor negative
    -  ($x->{sign} eq '+' && !$x->is_zero()) ? 1 : 0;	
    -  }
    -
    -sub is_negative
    -  {
    -  # return true when arg (BINT or num_str) is negative (< 0)
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -  
    -  $x->{sign} =~ /^-/ ? 1 : 0; 		# -inf is negative, but NaN is not
    -  }
    -
    -sub is_int
    -  {
    -  # return true when arg (BINT or num_str) is an integer
    -  # always true for BigInt, but different for BigFloats
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -  
    -  $x->{sign} =~ /^[+-]$/ ? 1 : 0;		# inf/-inf/NaN aren't
    -  }
    -
    -###############################################################################
    -
    -sub bmul 
    -  { 
    -  # multiply two numbers -- stolen from Knuth Vol 2 pg 233
    -  # (BINT or num_str, BINT or num_str) return BINT
    -
    -  # set up parameters
    -  my ($self,$x,$y,@r) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,@r) = objectify(2,@_);
    -    }
    -  
    -  return $x if $x->modify('bmul');
    -
    -  return $x->bnan() if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
    -
    -  # inf handling
    -  if (($x->{sign} =~ /^[+-]inf$/) || ($y->{sign} =~ /^[+-]inf$/))
    -    {
    -    return $x->bnan() if $x->is_zero() || $y->is_zero();
    -    # result will always be +-inf:
    -    # +inf * +/+inf => +inf, -inf * -/-inf => +inf
    -    # +inf * -/-inf => -inf, -inf * +/+inf => -inf
    -    return $x->binf() if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/); 
    -    return $x->binf() if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/); 
    -    return $x->binf('-');
    -    }
    -
    -  return $upgrade->bmul($x,$upgrade->new($y),@r)
    -   if defined $upgrade && !$y->isa($self);
    -  
    -  $r[3] = $y;				# no push here
    -
    -  $x->{sign} = $x->{sign} eq $y->{sign} ? '+' : '-'; # +1 * +1 or -1 * -1 => +
    -
    -  $x->{value} = $CALC->_mul($x->{value},$y->{value});	# do actual math
    -  $x->{sign} = '+' if $CALC->_is_zero($x->{value}); 	# no -0
    -
    -  $x->round(@r);
    -  }
    -
    -sub _div_inf
    -  {
    -  # helper function that handles +-inf cases for bdiv()/bmod() to reuse code
    -  my ($self,$x,$y) = @_;
    -
    -  # NaN if x == NaN or y == NaN or x==y==0
    -  return wantarray ? ($x->bnan(),$self->bnan()) : $x->bnan()
    -   if (($x->is_nan() || $y->is_nan())   ||
    -       ($x->is_zero() && $y->is_zero()));
    - 
    -  # +-inf / +-inf == NaN, reminder also NaN
    -  if (($x->{sign} =~ /^[+-]inf$/) && ($y->{sign} =~ /^[+-]inf$/))
    -    {
    -    return wantarray ? ($x->bnan(),$self->bnan()) : $x->bnan();
    -    }
    -  # x / +-inf => 0, remainder x (works even if x == 0)
    -  if ($y->{sign} =~ /^[+-]inf$/)
    -    {
    -    my $t = $x->copy();		# bzero clobbers up $x
    -    return wantarray ? ($x->bzero(),$t) : $x->bzero()
    -    }
    -  
    -  # 5 / 0 => +inf, -6 / 0 => -inf
    -  # +inf / 0 = inf, inf,  and -inf / 0 => -inf, -inf 
    -  # exception:   -8 / 0 has remainder -8, not 8
    -  # exception: -inf / 0 has remainder -inf, not inf
    -  if ($y->is_zero())
    -    {
    -    # +-inf / 0 => special case for -inf
    -    return wantarray ?  ($x,$x->copy()) : $x if $x->is_inf();
    -    if (!$x->is_zero() && !$x->is_inf())
    -      {
    -      my $t = $x->copy();		# binf clobbers up $x
    -      return wantarray ?
    -       ($x->binf($x->{sign}),$t) : $x->binf($x->{sign})
    -      }
    -    }
    -  
    -  # last case: +-inf / ordinary number
    -  my $sign = '+inf';
    -  $sign = '-inf' if substr($x->{sign},0,1) ne $y->{sign};
    -  $x->{sign} = $sign;
    -  return wantarray ? ($x,$self->bzero()) : $x;
    -  }
    -
    -sub bdiv 
    -  {
    -  # (dividend: BINT or num_str, divisor: BINT or num_str) return 
    -  # (BINT,BINT) (quo,rem) or BINT (only rem)
    -  
    -  # set up parameters
    -  my ($self,$x,$y,@r) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it 
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,@r) = objectify(2,@_);
    -    } 
    -
    -  return $x if $x->modify('bdiv');
    -
    -  return $self->_div_inf($x,$y)
    -   if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/) || $y->is_zero());
    -
    -  return $upgrade->bdiv($upgrade->new($x),$upgrade->new($y),@r)
    -   if defined $upgrade;
    -   
    -  $r[3] = $y;					# no push!
    -
    -  # calc new sign and in case $y == +/- 1, return $x
    -  my $xsign = $x->{sign};				# keep
    -  $x->{sign} = ($x->{sign} ne $y->{sign} ? '-' : '+'); 
    -
    -  if (wantarray)
    -    {
    -    my $rem = $self->bzero(); 
    -    ($x->{value},$rem->{value}) = $CALC->_div($x->{value},$y->{value});
    -    $x->{sign} = '+' if $CALC->_is_zero($x->{value});
    -    $rem->{_a} = $x->{_a};
    -    $rem->{_p} = $x->{_p};
    -    $x->round(@r);
    -    if (! $CALC->_is_zero($rem->{value}))
    -      {
    -      $rem->{sign} = $y->{sign};
    -      $rem = $y->copy()->bsub($rem) if $xsign ne $y->{sign}; # one of them '-'
    -      }
    -    else
    -      {
    -      $rem->{sign} = '+';			# dont leave -0
    -      }
    -    $rem->round(@r);
    -    return ($x,$rem);
    -    }
    -
    -  $x->{value} = $CALC->_div($x->{value},$y->{value});
    -  $x->{sign} = '+' if $CALC->_is_zero($x->{value});
    -
    -  $x->round(@r);
    -  }
    -
    -###############################################################################
    -# modulus functions
    -
    -sub bmod 
    -  {
    -  # modulus (or remainder)
    -  # (BINT or num_str, BINT or num_str) return BINT
    -  
    -  # set up parameters
    -  my ($self,$x,$y,@r) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,@r) = objectify(2,@_);
    -    }
    -
    -  return $x if $x->modify('bmod');
    -  $r[3] = $y;					# no push!
    -  if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/) || $y->is_zero())
    -    {
    -    my ($d,$r) = $self->_div_inf($x,$y);
    -    $x->{sign} = $r->{sign};
    -    $x->{value} = $r->{value};
    -    return $x->round(@r);
    -    }
    -
    -  # calc new sign and in case $y == +/- 1, return $x
    -  $x->{value} = $CALC->_mod($x->{value},$y->{value});
    -  if (!$CALC->_is_zero($x->{value}))
    -    {
    -    $x->{value} = $CALC->_sub($y->{value},$x->{value},1) 	# $y-$x
    -      if ($x->{sign} ne $y->{sign});
    -    $x->{sign} = $y->{sign};
    -    }
    -   else
    -    {
    -    $x->{sign} = '+';				# dont leave -0
    -    }
    -  $x->round(@r);
    -  }
    -
    -sub bmodinv
    -  {
    -  # Modular inverse.  given a number which is (hopefully) relatively
    -  # prime to the modulus, calculate its inverse using Euclid's
    -  # alogrithm.  If the number is not relatively prime to the modulus
    -  # (i.e. their gcd is not one) then NaN is returned.
    -
    -  # set up parameters
    -  my ($self,$x,$y,@r) = (undef,@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,@r) = objectify(2,@_);
    -    }
    -
    -  return $x if $x->modify('bmodinv');
    -
    -  return $x->bnan()
    -        if ($y->{sign} ne '+'                           # -, NaN, +inf, -inf
    -         || $x->is_zero()                               # or num == 0
    -         || $x->{sign} !~ /^[+-]$/                      # or num NaN, inf, -inf
    -        );
    -
    -  # put least residue into $x if $x was negative, and thus make it positive
    -  $x->bmod($y) if $x->{sign} eq '-';
    -
    -  my $sign;
    -  ($x->{value},$sign) = $CALC->_modinv($x->{value},$y->{value});
    -  return $x->bnan() if !defined $x->{value};		# in case no GCD found
    -  return $x if !defined $sign;			# already real result
    -  $x->{sign} = $sign;				# flip/flop see below
    -  $x->bmod($y);					# calc real result
    -  $x;
    -  }
    -
    -sub bmodpow
    -  {
    -  # takes a very large number to a very large exponent in a given very
    -  # large modulus, quickly, thanks to binary exponentation.  supports
    -  # negative exponents.
    -  my ($self,$num,$exp,$mod,@r) = objectify(3,@_);
    -
    -  return $num if $num->modify('bmodpow');
    -
    -  # check modulus for valid values
    -  return $num->bnan() if ($mod->{sign} ne '+'		# NaN, - , -inf, +inf
    -                       || $mod->is_zero());
    -
    -  # check exponent for valid values
    -  if ($exp->{sign} =~ /\w/) 
    -    {
    -    # i.e., if it's NaN, +inf, or -inf...
    -    return $num->bnan();
    -    }
    -
    -  $num->bmodinv ($mod) if ($exp->{sign} eq '-');
    -
    -  # check num for valid values (also NaN if there was no inverse but $exp < 0)
    -  return $num->bnan() if $num->{sign} !~ /^[+-]$/;
    -
    -  # $mod is positive, sign on $exp is ignored, result also positive
    -  $num->{value} = $CALC->_modpow($num->{value},$exp->{value},$mod->{value});
    -  $num;
    -  }
    -
    -###############################################################################
    -
    -sub bfac
    -  {
    -  # (BINT or num_str, BINT or num_str) return BINT
    -  # compute factorial number from $x, modify $x in place
    -  my ($self,$x,@r) = ref($_[0]) ? (undef,@_) : objectify(1,@_);
    -
    -  return $x if $x->modify('bfac') || $x->{sign} eq '+inf';	# inf => inf
    -  return $x->bnan() if $x->{sign} ne '+';			# NaN, <0 etc => NaN
    -
    -  $x->{value} = $CALC->_fac($x->{value});
    -  $x->round(@r);
    -  }
    - 
    -sub bpow 
    -  {
    -  # (BINT or num_str, BINT or num_str) return BINT
    -  # compute power of two numbers -- stolen from Knuth Vol 2 pg 233
    -  # modifies first argument
    -
    -  # set up parameters
    -  my ($self,$x,$y,@r) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,@r) = objectify(2,@_);
    -    }
    -
    -  return $x if $x->modify('bpow');
    -
    -  return $x->bnan() if $x->{sign} eq $nan || $y->{sign} eq $nan;
    -
    -  # inf handling
    -  if (($x->{sign} =~ /^[+-]inf$/) || ($y->{sign} =~ /^[+-]inf$/))
    -    {
    -    if (($x->{sign} =~ /^[+-]inf$/) && ($y->{sign} =~ /^[+-]inf$/))
    -      {
    -      # +-inf ** +-inf
    -      return $x->bnan();
    -      }
    -    # +-inf ** Y
    -    if ($x->{sign} =~ /^[+-]inf/)
    -      {
    -      # +inf ** 0 => NaN
    -      return $x->bnan() if $y->is_zero();
    -      # -inf ** -1 => 1/inf => 0
    -      return $x->bzero() if $y->is_one('-') && $x->is_negative();
    -
    -      # +inf ** Y => inf
    -      return $x if $x->{sign} eq '+inf';
    -
    -      # -inf ** Y => -inf if Y is odd
    -      return $x if $y->is_odd();
    -      return $x->babs();
    -      }
    -    # X ** +-inf
    -
    -    # 1 ** +inf => 1
    -    return $x if $x->is_one();
    -    
    -    # 0 ** inf => 0
    -    return $x if $x->is_zero() && $y->{sign} =~ /^[+]/;
    -
    -    # 0 ** -inf => inf
    -    return $x->binf() if $x->is_zero();
    -
    -    # -1 ** -inf => NaN
    -    return $x->bnan() if $x->is_one('-') && $y->{sign} =~ /^[-]/;
    -
    -    # -X ** -inf => 0
    -    return $x->bzero() if $x->{sign} eq '-' && $y->{sign} =~ /^[-]/;
    -
    -    # -1 ** inf => NaN
    -    return $x->bnan() if $x->{sign} eq '-';
    -
    -    # X ** inf => inf
    -    return $x->binf() if $y->{sign} =~ /^[+]/;
    -    # X ** -inf => 0
    -    return $x->bzero();
    -    }
    -
    -  return $upgrade->bpow($upgrade->new($x),$y,@r)
    -   if defined $upgrade && !$y->isa($self);
    -
    -  $r[3] = $y;					# no push!
    -
    -  # cases 0 ** Y, X ** 0, X ** 1, 1 ** Y are handled by Calc or Emu
    -
    -  my $new_sign = '+';
    -  $new_sign = $y->is_odd() ? '-' : '+' if ($x->{sign} ne '+'); 
    -
    -  # 0 ** -7 => ( 1 / (0 ** 7)) => 1 / 0 => +inf 
    -  return $x->binf() 
    -    if $y->{sign} eq '-' && $x->{sign} eq '+' && $CALC->_is_zero($x->{value});
    -  # 1 ** -y => 1 / (1 ** |y|)
    -  # so do test for negative $y after above's clause
    -  return $x->bnan() if $y->{sign} eq '-' && !$CALC->_is_one($x->{value});
    -
    -  $x->{value} = $CALC->_pow($x->{value},$y->{value});
    -  $x->{sign} = $new_sign;
    -  $x->{sign} = '+' if $CALC->_is_zero($y->{value});
    -  $x->round(@r);
    -  }
    -
    -sub blsft 
    -  {
    -  # (BINT or num_str, BINT or num_str) return BINT
    -  # compute x << y, base n, y >= 0
    - 
    -  # set up parameters
    -  my ($self,$x,$y,$n,@r) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,$n,@r) = objectify(2,@_);
    -    }
    -
    -  return $x if $x->modify('blsft');
    -  return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
    -  return $x->round(@r) if $y->is_zero();
    -
    -  $n = 2 if !defined $n; return $x->bnan() if $n <= 0 || $y->{sign} eq '-';
    -
    -  $x->{value} = $CALC->_lsft($x->{value},$y->{value},$n);
    -  $x->round(@r);
    -  }
    -
    -sub brsft 
    -  {
    -  # (BINT or num_str, BINT or num_str) return BINT
    -  # compute x >> y, base n, y >= 0
    -  
    -  # set up parameters
    -  my ($self,$x,$y,$n,@r) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,$n,@r) = objectify(2,@_);
    -    }
    -
    -  return $x if $x->modify('brsft');
    -  return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
    -  return $x->round(@r) if $y->is_zero();
    -  return $x->bzero(@r) if $x->is_zero();		# 0 => 0
    -
    -  $n = 2 if !defined $n; return $x->bnan() if $n <= 0 || $y->{sign} eq '-';
    -
    -   # this only works for negative numbers when shifting in base 2
    -  if (($x->{sign} eq '-') && ($n == 2))
    -    {
    -    return $x->round(@r) if $x->is_one('-');	# -1 => -1
    -    if (!$y->is_one())
    -      {
    -      # although this is O(N*N) in calc (as_bin!) it is O(N) in Pari et al
    -      # but perhaps there is a better emulation for two's complement shift...
    -      # if $y != 1, we must simulate it by doing:
    -      # convert to bin, flip all bits, shift, and be done
    -      $x->binc();			# -3 => -2
    -      my $bin = $x->as_bin();
    -      $bin =~ s/^-0b//;			# strip '-0b' prefix
    -      $bin =~ tr/10/01/;		# flip bits
    -      # now shift
    -      if (CORE::length($bin) <= $y)
    -        {
    -	$bin = '0'; 			# shifting to far right creates -1
    -					# 0, because later increment makes 
    -					# that 1, attached '-' makes it '-1'
    -					# because -1 >> x == -1 !
    -        } 
    -      else
    -	{
    -	$bin =~ s/.{$y}$//;		# cut off at the right side
    -        $bin = '1' . $bin;		# extend left side by one dummy '1'
    -        $bin =~ tr/10/01/;		# flip bits back
    -	}
    -      my $res = $self->new('0b'.$bin);	# add prefix and convert back
    -      $res->binc();			# remember to increment
    -      $x->{value} = $res->{value};	# take over value
    -      return $x->round(@r);		# we are done now, magic, isn't?
    -      }
    -    # x < 0, n == 2, y == 1
    -    $x->bdec();				# n == 2, but $y == 1: this fixes it
    -    }
    -
    -  $x->{value} = $CALC->_rsft($x->{value},$y->{value},$n);
    -  $x->round(@r);
    -  }
    -
    -sub band 
    -  {
    -  #(BINT or num_str, BINT or num_str) return BINT
    -  # compute x & y
    - 
    -  # set up parameters
    -  my ($self,$x,$y,@r) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,@r) = objectify(2,@_);
    -    }
    -  
    -  return $x if $x->modify('band');
    -
    -  $r[3] = $y;				# no push!
    -
    -  return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
    -
    -  my $sx = $x->{sign} eq '+' ? 1 : -1;
    -  my $sy = $y->{sign} eq '+' ? 1 : -1;
    -  
    -  if ($sx == 1 && $sy == 1)
    -    {
    -    $x->{value} = $CALC->_and($x->{value},$y->{value});
    -    return $x->round(@r);
    -    }
    -  
    -  if ($CAN{signed_and})
    -    {
    -    $x->{value} = $CALC->_signed_and($x->{value},$y->{value},$sx,$sy);
    -    return $x->round(@r);
    -    }
    - 
    -  require $EMU_LIB;
    -  __emu_band($self,$x,$y,$sx,$sy,@r);
    -  }
    -
    -sub bior 
    -  {
    -  #(BINT or num_str, BINT or num_str) return BINT
    -  # compute x | y
    -  
    -  # set up parameters
    -  my ($self,$x,$y,@r) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,@r) = objectify(2,@_);
    -    }
    -
    -  return $x if $x->modify('bior');
    -  $r[3] = $y;				# no push!
    -
    -  return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
    -
    -  my $sx = $x->{sign} eq '+' ? 1 : -1;
    -  my $sy = $y->{sign} eq '+' ? 1 : -1;
    -
    -  # the sign of X follows the sign of X, e.g. sign of Y irrelevant for bior()
    -  
    -  # don't use lib for negative values
    -  if ($sx == 1 && $sy == 1)
    -    {
    -    $x->{value} = $CALC->_or($x->{value},$y->{value});
    -    return $x->round(@r);
    -    }
    -
    -  # if lib can do negative values, let it handle this
    -  if ($CAN{signed_or})
    -    {
    -    $x->{value} = $CALC->_signed_or($x->{value},$y->{value},$sx,$sy);
    -    return $x->round(@r);
    -    }
    -
    -  require $EMU_LIB;
    -  __emu_bior($self,$x,$y,$sx,$sy,@r);
    -  }
    -
    -sub bxor 
    -  {
    -  #(BINT or num_str, BINT or num_str) return BINT
    -  # compute x ^ y
    -  
    -  # set up parameters
    -  my ($self,$x,$y,@r) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,@r) = objectify(2,@_);
    -    }
    -
    -  return $x if $x->modify('bxor');
    -  $r[3] = $y;				# no push!
    -
    -  return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
    -  
    -  my $sx = $x->{sign} eq '+' ? 1 : -1;
    -  my $sy = $y->{sign} eq '+' ? 1 : -1;
    -
    -  # don't use lib for negative values
    -  if ($sx == 1 && $sy == 1)
    -    {
    -    $x->{value} = $CALC->_xor($x->{value},$y->{value});
    -    return $x->round(@r);
    -    }
    -  
    -  # if lib can do negative values, let it handle this
    -  if ($CAN{signed_xor})
    -    {
    -    $x->{value} = $CALC->_signed_xor($x->{value},$y->{value},$sx,$sy);
    -    return $x->round(@r);
    -    }
    -
    -  require $EMU_LIB;
    -  __emu_bxor($self,$x,$y,$sx,$sy,@r);
    -  }
    -
    -sub length
    -  {
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -
    -  my $e = $CALC->_len($x->{value}); 
    -  wantarray ? ($e,0) : $e;
    -  }
    -
    -sub digit
    -  {
    -  # return the nth decimal digit, negative values count backward, 0 is right
    -  my ($self,$x,$n) = ref($_[0]) ? (undef,@_) : objectify(1,@_);
    -
    -  $n = $n->numify() if ref($n);
    -  $CALC->_digit($x->{value},$n||0);
    -  }
    -
    -sub _trailing_zeros
    -  {
    -  # return the amount of trailing zeros in $x (as scalar)
    -  my $x = shift;
    -  $x = $class->new($x) unless ref $x;
    -
    -  return 0 if $x->{sign} !~ /^[+-]$/;	# NaN, inf, -inf etc
    -
    -  $CALC->_zeros($x->{value});		# must handle odd values, 0 etc
    -  }
    -
    -sub bsqrt
    -  {
    -  # calculate square root of $x
    -  my ($self,$x,@r) = ref($_[0]) ? (undef,@_) : objectify(1,@_);
    -
    -  return $x if $x->modify('bsqrt');
    -
    -  return $x->bnan() if $x->{sign} !~ /^\+/;	# -x or -inf or NaN => NaN
    -  return $x if $x->{sign} eq '+inf';		# sqrt(+inf) == inf
    -
    -  return $upgrade->bsqrt($x,@r) if defined $upgrade;
    -
    -  $x->{value} = $CALC->_sqrt($x->{value});
    -  $x->round(@r);
    -  }
    -
    -sub broot
    -  {
    -  # calculate $y'th root of $x
    - 
    -  # set up parameters
    -  my ($self,$x,$y,@r) = (ref($_[0]),@_);
    -
    -  $y = $self->new(2) unless defined $y;
    -
    -  # objectify is costly, so avoid it
    -  if ((!ref($x)) || (ref($x) ne ref($y)))
    -    {
    -    ($self,$x,$y,@r) = objectify(2,$self || $class,@_);
    -    }
    -
    -  return $x if $x->modify('broot');
    -
    -  # NaN handling: $x ** 1/0, x or y NaN, or y inf/-inf or y == 0
    -  return $x->bnan() if $x->{sign} !~ /^\+/ || $y->is_zero() ||
    -         $y->{sign} !~ /^\+$/;
    -
    -  return $x->round(@r)
    -    if $x->is_zero() || $x->is_one() || $x->is_inf() || $y->is_one();
    -
    -  return $upgrade->new($x)->broot($upgrade->new($y),@r) if defined $upgrade;
    -
    -  $x->{value} = $CALC->_root($x->{value},$y->{value});
    -  $x->round(@r);
    -  }
    -
    -sub exponent
    -  {
    -  # return a copy of the exponent (here always 0, NaN or 1 for $m == 0)
    -  my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
    - 
    -  if ($x->{sign} !~ /^[+-]$/)
    -    {
    -    my $s = $x->{sign}; $s =~ s/^[+-]//;  # NaN, -inf,+inf => NaN or inf
    -    return $self->new($s);
    -    }
    -  return $self->bone() if $x->is_zero();
    -
    -  $self->new($x->_trailing_zeros());
    -  }
    -
    -sub mantissa
    -  {
    -  # return the mantissa (compatible to Math::BigFloat, e.g. reduced)
    -  my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
    -
    -  if ($x->{sign} !~ /^[+-]$/)
    -    {
    -    # for NaN, +inf, -inf: keep the sign
    -    return $self->new($x->{sign});
    -    }
    -  my $m = $x->copy(); delete $m->{_p}; delete $m->{_a};
    -  # that's a bit inefficient:
    -  my $zeros = $m->_trailing_zeros();
    -  $m->brsft($zeros,10) if $zeros != 0;
    -  $m;
    -  }
    -
    -sub parts
    -  {
    -  # return a copy of both the exponent and the mantissa
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -
    -  ($x->mantissa(),$x->exponent());
    -  }
    -   
    -##############################################################################
    -# rounding functions
    -
    -sub bfround
    -  {
    -  # precision: round to the $Nth digit left (+$n) or right (-$n) from the '.'
    -  # $n == 0 || $n == 1 => round to integer
    -  my $x = shift; my $self = ref($x) || $x; $x = $self->new($x) unless ref $x;
    -
    -  my ($scale,$mode) = $x->_scale_p(@_);
    -
    -  return $x if !defined $scale || $x->modify('bfround');	# no-op
    -
    -  # no-op for BigInts if $n <= 0
    -  $x->bround( $x->length()-$scale, $mode) if $scale > 0;
    -
    -  delete $x->{_a};	# delete to save memory
    -  $x->{_p} = $scale;	# store new _p
    -  $x;
    -  }
    -
    -sub _scan_for_nonzero
    -  {
    -  # internal, used by bround() to scan for non-zeros after a '5'
    -  my ($x,$pad,$xs,$len) = @_;
    - 
    -  return 0 if $len == 1;		# "5" is trailed by invisible zeros
    -  my $follow = $pad - 1;
    -  return 0 if $follow > $len || $follow < 1;
    -
    -  # use the string form to check whether only '0's follow or not
    -  substr ($xs,-$follow) =~ /[^0]/ ? 1 : 0;
    -  }
    -
    -sub fround
    -  {
    -  # Exists to make life easier for switch between MBF and MBI (should we
    -  # autoload fxxx() like MBF does for bxxx()?)
    -  my $x = shift; $x = $class->new($x) unless ref $x;
    -  $x->bround(@_);
    -  }
    -
    -sub bround
    -  {
    -  # accuracy: +$n preserve $n digits from left,
    -  #           -$n preserve $n digits from right (f.i. for 0.1234 style in MBF)
    -  # no-op for $n == 0
    -  # and overwrite the rest with 0's, return normalized number
    -  # do not return $x->bnorm(), but $x
    -
    -  my $x = shift; $x = $class->new($x) unless ref $x;
    -  my ($scale,$mode) = $x->_scale_a(@_);
    -  return $x if !defined $scale || $x->modify('bround');	# no-op
    -  
    -  if ($x->is_zero() || $scale == 0)
    -    {
    -    $x->{_a} = $scale if !defined $x->{_a} || $x->{_a} > $scale; # 3 > 2
    -    return $x;
    -    }
    -  return $x if $x->{sign} !~ /^[+-]$/;		# inf, NaN
    -
    -  # we have fewer digits than we want to scale to
    -  my $len = $x->length();
    -  # convert $scale to a scalar in case it is an object (put's a limit on the
    -  # number length, but this would already limited by memory constraints), makes
    -  # it faster
    -  $scale = $scale->numify() if ref ($scale);
    -
    -  # scale < 0, but > -len (not >=!)
    -  if (($scale < 0 && $scale < -$len-1) || ($scale >= $len))
    -    {
    -    $x->{_a} = $scale if !defined $x->{_a} || $x->{_a} > $scale; # 3 > 2
    -    return $x; 
    -    }
    -   
    -  # count of 0's to pad, from left (+) or right (-): 9 - +6 => 3, or |-6| => 6
    -  my ($pad,$digit_round,$digit_after);
    -  $pad = $len - $scale;
    -  $pad = abs($scale-1) if $scale < 0;
    -
    -  # do not use digit(), it is very costly for binary => decimal
    -  # getting the entire string is also costly, but we need to do it only once
    -  my $xs = $CALC->_str($x->{value});
    -  my $pl = -$pad-1;
    -
    -  # pad:   123: 0 => -1, at 1 => -2, at 2 => -3, at 3 => -4
    -  # pad+1: 123: 0 => 0,  at 1 => -1, at 2 => -2, at 3 => -3
    -  $digit_round = '0'; $digit_round = substr($xs,$pl,1) if $pad <= $len;
    -  $pl++; $pl ++ if $pad >= $len;
    -  $digit_after = '0'; $digit_after = substr($xs,$pl,1) if $pad > 0;
    -
    -  # in case of 01234 we round down, for 6789 up, and only in case 5 we look
    -  # closer at the remaining digits of the original $x, remember decision
    -  my $round_up = 1;					# default round up
    -  $round_up -- if
    -    ($mode eq 'trunc')				||	# trunc by round down
    -    ($digit_after =~ /[01234]/)			|| 	# round down anyway,
    -							# 6789 => round up
    -    ($digit_after eq '5')			&&	# not 5000...0000
    -    ($x->_scan_for_nonzero($pad,$xs,$len) == 0)		&&
    -    (
    -     ($mode eq 'even') && ($digit_round =~ /[24680]/) ||
    -     ($mode eq 'odd')  && ($digit_round =~ /[13579]/) ||
    -     ($mode eq '+inf') && ($x->{sign} eq '-')   ||
    -     ($mode eq '-inf') && ($x->{sign} eq '+')   ||
    -     ($mode eq 'zero')		# round down if zero, sign adjusted below
    -    );
    -  my $put_back = 0;					# not yet modified
    -	
    -  if (($pad > 0) && ($pad <= $len))
    -    {
    -    substr($xs,-$pad,$pad) = '0' x $pad;		# replace with '00...'
    -    $put_back = 1;					# need to put back
    -    }
    -  elsif ($pad > $len)
    -    {
    -    $x->bzero();					# round to '0'
    -    }
    -
    -  if ($round_up)					# what gave test above?
    -    {
    -    $put_back = 1;					# need to put back
    -    $pad = $len, $xs = '0' x $pad if $scale < 0;	# tlr: whack 0.51=>1.0	
    -
    -    # we modify directly the string variant instead of creating a number and
    -    # adding it, since that is faster (we already have the string)
    -    my $c = 0; $pad ++;				# for $pad == $len case
    -    while ($pad <= $len)
    -      {
    -      $c = substr($xs,-$pad,1) + 1; $c = '0' if $c eq '10';
    -      substr($xs,-$pad,1) = $c; $pad++;
    -      last if $c != 0;				# no overflow => early out
    -      }
    -    $xs = '1'.$xs if $c == 0;
    -
    -    }
    -  $x->{value} = $CALC->_new($xs) if $put_back == 1;	# put back, if needed
    -
    -  $x->{_a} = $scale if $scale >= 0;
    -  if ($scale < 0)
    -    {
    -    $x->{_a} = $len+$scale;
    -    $x->{_a} = 0 if $scale < -$len;
    -    }
    -  $x;
    -  }
    -
    -sub bfloor
    -  {
    -  # return integer less or equal then number; no-op since it's already integer
    -  my ($self,$x,@r) = ref($_[0]) ? (undef,@_) : objectify(1,@_);
    -
    -  $x->round(@r);
    -  }
    -
    -sub bceil
    -  {
    -  # return integer greater or equal then number; no-op since it's already int
    -  my ($self,$x,@r) = ref($_[0]) ? (undef,@_) : objectify(1,@_);
    -
    -  $x->round(@r);
    -  }
    -
    -sub as_number
    -  {
    -  # An object might be asked to return itself as bigint on certain overloaded
    -  # operations, this does exactly this, so that sub classes can simple inherit
    -  # it or override with their own integer conversion routine.
    -  $_[0]->copy();
    -  }
    -
    -sub as_hex
    -  {
    -  # return as hex string, with prefixed 0x
    -  my $x = shift; $x = $class->new($x) if !ref($x);
    -
    -  return $x->bstr() if $x->{sign} !~ /^[+-]$/;	# inf, nan etc
    -
    -  my $s = '';
    -  $s = $x->{sign} if $x->{sign} eq '-';
    -  $s . $CALC->_as_hex($x->{value});
    -  }
    -
    -sub as_bin
    -  {
    -  # return as binary string, with prefixed 0b
    -  my $x = shift; $x = $class->new($x) if !ref($x);
    -
    -  return $x->bstr() if $x->{sign} !~ /^[+-]$/;	# inf, nan etc
    -
    -  my $s = ''; $s = $x->{sign} if $x->{sign} eq '-';
    -  return $s . $CALC->_as_bin($x->{value});
    -  }
    -
    -##############################################################################
    -# private stuff (internal use only)
    -
    -sub objectify
    -  {
    -  # check for strings, if yes, return objects instead
    - 
    -  # the first argument is number of args objectify() should look at it will
    -  # return $count+1 elements, the first will be a classname. This is because
    -  # overloaded '""' calls bstr($object,undef,undef) and this would result in
    -  # useless objects beeing created and thrown away. So we cannot simple loop
    -  # over @_. If the given count is 0, all arguments will be used.
    - 
    -  # If the second arg is a ref, use it as class.
    -  # If not, try to use it as classname, unless undef, then use $class 
    -  # (aka Math::BigInt). The latter shouldn't happen,though.
    -
    -  # caller:			   gives us:
    -  # $x->badd(1);                => ref x, scalar y
    -  # Class->badd(1,2);           => classname x (scalar), scalar x, scalar y
    -  # Class->badd( Class->(1),2); => classname x (scalar), ref x, scalar y
    -  # Math::BigInt::badd(1,2);    => scalar x, scalar y
    -  # In the last case we check number of arguments to turn it silently into
    -  # $class,1,2. (We can not take '1' as class ;o)
    -  # badd($class,1) is not supported (it should, eventually, try to add undef)
    -  # currently it tries 'Math::BigInt' + 1, which will not work.
    -
    -  # some shortcut for the common cases
    -  # $x->unary_op();
    -  return (ref($_[1]),$_[1]) if (@_ == 2) && ($_[0]||0 == 1) && ref($_[1]);
    -
    -  my $count = abs(shift || 0);
    -  
    -  my (@a,$k,$d);		# resulting array, temp, and downgrade 
    -  if (ref $_[0])
    -    {
    -    # okay, got object as first
    -    $a[0] = ref $_[0];
    -    }
    -  else
    -    {
    -    # nope, got 1,2 (Class->xxx(1) => Class,1 and not supported)
    -    $a[0] = $class;
    -    $a[0] = shift if $_[0] =~ /^[A-Z].*::/;	# classname as first?
    -    }
    -
    -  no strict 'refs';
    -  # disable downgrading, because Math::BigFLoat->foo('1.0','2.0') needs floats
    -  if (defined ${"$a[0]::downgrade"})
    -    {
    -    $d = ${"$a[0]::downgrade"};
    -    ${"$a[0]::downgrade"} = undef;
    -    }
    -
    -  my $up = ${"$a[0]::upgrade"};
    -  #print "Now in objectify, my class is today $a[0], count = $count\n";
    -  if ($count == 0)
    -    {
    -    while (@_)
    -      {
    -      $k = shift;
    -      if (!ref($k))
    -        {
    -        $k = $a[0]->new($k);
    -        }
    -      elsif (!defined $up && ref($k) ne $a[0])
    -	{
    -	# foreign object, try to convert to integer
    -        $k->can('as_number') ?  $k = $k->as_number() : $k = $a[0]->new($k);
    -	}
    -      push @a,$k;
    -      }
    -    }
    -  else
    -    {
    -    while ($count > 0)
    -      {
    -      $count--; 
    -      $k = shift; 
    -      if (!ref($k))
    -        {
    -        $k = $a[0]->new($k);
    -        }
    -      elsif (!defined $up && ref($k) ne $a[0])
    -	{
    -	# foreign object, try to convert to integer
    -        $k->can('as_number') ?  $k = $k->as_number() : $k = $a[0]->new($k);
    -	}
    -      push @a,$k;
    -      }
    -    push @a,@_;		# return other params, too
    -    }
    -  if (! wantarray)
    -    {
    -    require Carp; Carp::croak ("$class objectify needs list context");
    -    }
    -  ${"$a[0]::downgrade"} = $d;
    -  @a;
    -  }
    -
    -sub _register_callback
    -  {
    -  my ($class,$callback) = @_;
    -
    -  if (ref($callback) ne 'CODE')
    -    { 
    -    require Carp;
    -    Carp::croak ("$callback is not a coderef");
    -    }
    -  $CALLBACKS{$class} = $callback;
    -  }
    -
    -sub import 
    -  {
    -  my $self = shift;
    -
    -  $IMPORT++;				# remember we did import()
    -  my @a; my $l = scalar @_;
    -  for ( my $i = 0; $i < $l ; $i++ )
    -    {
    -    if ($_[$i] eq ':constant')
    -      {
    -      # this causes overlord er load to step in
    -      overload::constant 
    -	integer => sub { $self->new(shift) },
    -      	binary => sub { $self->new(shift) };
    -      }
    -    elsif ($_[$i] eq 'upgrade')
    -      {
    -      # this causes upgrading
    -      $upgrade = $_[$i+1];		# or undef to disable
    -      $i++;
    -      }
    -    elsif ($_[$i] =~ /^lib$/i)
    -      {
    -      # this causes a different low lib to take care...
    -      $CALC = $_[$i+1] || '';
    -      $i++;
    -      }
    -    else
    -      {
    -      push @a, $_[$i];
    -      }
    -    }
    -  # any non :constant stuff is handled by our parent, Exporter
    -  if (@a > 0)
    -    {
    -    require Exporter;
    - 
    -    $self->SUPER::import(@a);			# need it for subclasses
    -    $self->export_to_level(1,$self,@a);		# need it for MBF
    -    }
    -
    -  # try to load core math lib
    -  my @c = split /\s*,\s*/,$CALC;
    -  foreach (@c)
    -    {
    -    $_ =~ tr/a-zA-Z0-9://cd;			# limit to sane characters
    -    }
    -  push @c, 'FastCalc', 'Calc';			# if all fail, try these
    -  $CALC = '';					# signal error
    -  foreach my $lib (@c)
    -    {
    -    next if ($lib || '') eq '';
    -    $lib = 'Math::BigInt::'.$lib if $lib !~ /^Math::BigInt/i;
    -    $lib =~ s/\.pm$//;
    -    if ($] < 5.006)
    -      {
    -      # Perl < 5.6.0 dies with "out of memory!" when eval("") and ':constant' is
    -      # used in the same script, or eval("") inside import().
    -      my @parts = split /::/, $lib;             # Math::BigInt => Math BigInt
    -      my $file = pop @parts; $file .= '.pm';    # BigInt => BigInt.pm
    -      require File::Spec;
    -      $file = File::Spec->catfile (@parts, $file);
    -      eval { require "$file"; $lib->import( @c ); }
    -      }
    -    else
    -      {
    -      eval "use $lib qw/@c/;";
    -      }
    -    if ($@ eq '')
    -      {
    -      my $ok = 1;
    -      # loaded it ok, see if the api_version() is high enough
    -      if ($lib->can('api_version') && $lib->api_version() >= 1.0)
    -	{
    -	$ok = 0;
    -	# api_version matches, check if it really provides anything we need
    -        for my $method (qw/
    -		one two ten
    -		str num
    -		add mul div sub dec inc
    -		acmp len digit is_one is_zero is_even is_odd
    -		is_two is_ten
    -		new copy check from_hex from_bin as_hex as_bin zeros
    -		rsft lsft xor and or
    -		mod sqrt root fac pow modinv modpow log_int gcd
    -	 /)
    -          {
    -	  if (!$lib->can("_$method"))
    -	    {
    -	    if (($WARN{$lib}||0) < 2)
    -	      {
    -	      require Carp;
    -	      Carp::carp ("$lib is missing method '_$method'");
    -	      $WARN{$lib} = 1;		# still warn about the lib
    -	      }
    -            $ok++; last; 
    -	    }
    -          }
    -	}
    -      if ($ok == 0)
    -	{
    -	$CALC = $lib;
    -        last;			# found a usable one, break
    -	}
    -      else
    -	{
    -	if (($WARN{$lib}||0) < 2)
    -	  {
    -	  my $ver = eval "\$$lib\::VERSION" || 'unknown';
    -	  require Carp;
    -	  Carp::carp ("Cannot load outdated $lib v$ver, please upgrade");
    -	  $WARN{$lib} = 2;		# never warn again
    -	  }
    -        }
    -      }
    -    }
    -  if ($CALC eq '')
    -    {
    -    require Carp;
    -    Carp::croak ("Couldn't load any math lib, not even 'Calc.pm'");
    -    }
    -
    -  # notify callbacks
    -  foreach my $class (keys %CALLBACKS)
    -    {
    -    &{$CALLBACKS{$class}}($CALC);
    -    }
    -
    -  # Fill $CAN with the results of $CALC->can(...) for emulating lower math lib
    -  # functions
    -
    -  %CAN = ();
    -  for my $method (qw/ signed_and signed_or signed_xor /)
    -    {
    -    $CAN{$method} = $CALC->can("_$method") ? 1 : 0;
    -    }
    -
    -  # import done
    -  }
    -
    -sub __from_hex
    -  {
    -  # internal
    -  # convert a (ref to) big hex string to BigInt, return undef for error
    -  my $hs = shift;
    -
    -  my $x = Math::BigInt->bzero();
    -  
    -  # strip underscores
    -  $hs =~ s/([0-9a-fA-F])_([0-9a-fA-F])/$1$2/g;	
    -  $hs =~ s/([0-9a-fA-F])_([0-9a-fA-F])/$1$2/g;	
    -  
    -  return $x->bnan() if $hs !~ /^[\-\+]?0x[0-9A-Fa-f]+$/;
    -
    -  my $sign = '+'; $sign = '-' if $hs =~ /^-/;
    -
    -  $hs =~ s/^[+-]//;						# strip sign
    -  $x->{value} = $CALC->_from_hex($hs);
    -  $x->{sign} = $sign unless $CALC->_is_zero($x->{value}); 	# no '-0'
    -  $x;
    -  }
    -
    -sub __from_bin
    -  {
    -  # internal
    -  # convert a (ref to) big binary string to BigInt, return undef for error
    -  my $bs = shift;
    -
    -  my $x = Math::BigInt->bzero();
    -  # strip underscores
    -  $bs =~ s/([01])_([01])/$1$2/g;	
    -  $bs =~ s/([01])_([01])/$1$2/g;	
    -  return $x->bnan() if $bs !~ /^[+-]?0b[01]+$/;
    -
    -  my $sign = '+'; $sign = '-' if $bs =~ /^\-/;
    -  $bs =~ s/^[+-]//;						# strip sign
    -
    -  $x->{value} = $CALC->_from_bin($bs);
    -  $x->{sign} = $sign unless $CALC->_is_zero($x->{value}); 	# no '-0'
    -  $x;
    -  }
    -
    -sub _split
    -  {
    -  # input: num_str; output: undef for invalid or
    -  # (\$mantissa_sign,\$mantissa_value,\$mantissa_fraction,\$exp_sign,\$exp_value)
    -  # Internal, take apart a string and return the pieces.
    -  # Strip leading/trailing whitespace, leading zeros, underscore and reject
    -  # invalid input.
    -  my $x = shift;
    -
    -  # strip white space at front, also extranous leading zeros
    -  $x =~ s/^\s*([-]?)0*([0-9])/$1$2/g;	# will not strip '  .2'
    -  $x =~ s/^\s+//;			# but this will			
    -  $x =~ s/\s+$//g;			# strip white space at end
    -
    -  # shortcut, if nothing to split, return early
    -  if ($x =~ /^[+-]?\d+\z/)
    -    {
    -    $x =~ s/^([+-])0*([0-9])/$2/; my $sign = $1 || '+';
    -    return (\$sign, \$x, \'', \'', \0);
    -    }
    -
    -  # invalid starting char?
    -  return if $x !~ /^[+-]?(\.?[0-9]|0b[0-1]|0x[0-9a-fA-F])/;
    -
    -  return __from_hex($x) if $x =~ /^[\-\+]?0x/;	# hex string
    -  return __from_bin($x) if $x =~ /^[\-\+]?0b/;	# binary string
    -  
    -  # strip underscores between digits
    -  $x =~ s/(\d)_(\d)/$1$2/g;
    -  $x =~ s/(\d)_(\d)/$1$2/g;		# do twice for 1_2_3
    -
    -  # some possible inputs: 
    -  # 2.1234 # 0.12        # 1 	      # 1E1 # 2.134E1 # 434E-10 # 1.02009E-2 
    -  # .2 	   # 1_2_3.4_5_6 # 1.4E1_2_3  # 1e3 # +.2     # 0e999	
    -
    -  my ($m,$e,$last) = split /[Ee]/,$x;
    -  return if defined $last;		# last defined => 1e2E3 or others
    -  $e = '0' if !defined $e || $e eq "";
    -
    -  # sign,value for exponent,mantint,mantfrac
    -  my ($es,$ev,$mis,$miv,$mfv);
    -  # valid exponent?
    -  if ($e =~ /^([+-]?)0*(\d+)$/) # strip leading zeros
    -    {
    -    $es = $1; $ev = $2;
    -    # valid mantissa?
    -    return if $m eq '.' || $m eq '';
    -    my ($mi,$mf,$lastf) = split /\./,$m;
    -    return if defined $lastf;		# lastf defined => 1.2.3 or others
    -    $mi = '0' if !defined $mi;
    -    $mi .= '0' if $mi =~ /^[\-\+]?$/;
    -    $mf = '0' if !defined $mf || $mf eq '';
    -    if ($mi =~ /^([+-]?)0*(\d+)$/) # strip leading zeros
    -      {
    -      $mis = $1||'+'; $miv = $2;
    -      return unless ($mf =~ /^(\d*?)0*$/);	# strip trailing zeros
    -      $mfv = $1;
    -      # handle the 0e999 case here
    -      $ev = 0 if $miv eq '0' && $mfv eq '';
    -      return (\$mis,\$miv,\$mfv,\$es,\$ev);
    -      }
    -    }
    -  return; # NaN, not a number
    -  }
    -
    -##############################################################################
    -# internal calculation routines (others are in Math::BigInt::Calc etc)
    -
    -sub __lcm 
    -  { 
    -  # (BINT or num_str, BINT or num_str) return BINT
    -  # does modify first argument
    -  # LCM
    - 
    -  my ($x,$ty) = @_;
    -  return $x->bnan() if ($x->{sign} eq $nan) || ($ty->{sign} eq $nan);
    -  my $method = ref($x) . '::bgcd';
    -  no strict 'refs';
    -  $x * $ty / &$method($x,$ty);
    -  }
    -
    -###############################################################################
    -# this method returns 0 if the object can be modified, or 1 if not.
    -# We use a fast constant sub() here, to avoid costly calls. Subclasses
    -# may override it with special code (f.i. Math::BigInt::Constant does so)
    -
    -sub modify () { 0; }
    -
    -1;
    -__END__
    -
    -=pod
    -
    -=head1 NAME
    -
    -Math::BigInt - Arbitrary size integer/float math package
    -
    -=head1 SYNOPSIS
    -
    -  use Math::BigInt;
    -
    -  # or make it faster: install (optional) Math::BigInt::GMP
    -  # and always use (it will fall back to pure Perl if the
    -  # GMP library is not installed):
    -
    -  use Math::BigInt lib => 'GMP';
    -
    -  my $str = '1234567890';
    -  my @values = (64,74,18);
    -  my $n = 1; my $sign = '-';
    -
    -  # Number creation	
    -  $x = Math::BigInt->new($str);		# defaults to 0
    -  $y = $x->copy();			# make a true copy
    -  $nan  = Math::BigInt->bnan(); 	# create a NotANumber
    -  $zero = Math::BigInt->bzero();	# create a +0
    -  $inf = Math::BigInt->binf();		# create a +inf
    -  $inf = Math::BigInt->binf('-');	# create a -inf
    -  $one = Math::BigInt->bone();		# create a +1
    -  $one = Math::BigInt->bone('-');	# create a -1
    -
    -  # Testing (don't modify their arguments)
    -  # (return true if the condition is met, otherwise false)
    -
    -  $x->is_zero();	# if $x is +0
    -  $x->is_nan();		# if $x is NaN
    -  $x->is_one();		# if $x is +1
    -  $x->is_one('-');	# if $x is -1
    -  $x->is_odd();		# if $x is odd
    -  $x->is_even();	# if $x is even
    -  $x->is_pos();		# if $x >= 0
    -  $x->is_neg();		# if $x <  0
    -  $x->is_inf($sign);	# if $x is +inf, or -inf (sign is default '+')
    -  $x->is_int();		# if $x is an integer (not a float)
    -
    -  # comparing and digit/sign extration
    -  $x->bcmp($y);		# compare numbers (undef,<0,=0,>0)
    -  $x->bacmp($y);	# compare absolutely (undef,<0,=0,>0)
    -  $x->sign();		# return the sign, either +,- or NaN
    -  $x->digit($n);	# return the nth digit, counting from right
    -  $x->digit(-$n);	# return the nth digit, counting from left
    -
    -  # The following all modify their first argument. If you want to preserve
    -  # $x, use $z = $x->copy()->bXXX($y); See under L for why this is
    -  # neccessary when mixing $a = $b assigments with non-overloaded math.
    -
    -  $x->bzero();		# set $x to 0
    -  $x->bnan();		# set $x to NaN
    -  $x->bone();		# set $x to +1
    -  $x->bone('-');	# set $x to -1
    -  $x->binf();		# set $x to inf
    -  $x->binf('-');	# set $x to -inf
    -
    -  $x->bneg();		# negation
    -  $x->babs();		# absolute value
    -  $x->bnorm();		# normalize (no-op in BigInt)
    -  $x->bnot();		# two's complement (bit wise not)
    -  $x->binc();		# increment $x by 1
    -  $x->bdec();		# decrement $x by 1
    -  
    -  $x->badd($y);		# addition (add $y to $x)
    -  $x->bsub($y);		# subtraction (subtract $y from $x)
    -  $x->bmul($y);		# multiplication (multiply $x by $y)
    -  $x->bdiv($y);		# divide, set $x to quotient
    -			# return (quo,rem) or quo if scalar
    -
    -  $x->bmod($y);		   # modulus (x % y)
    -  $x->bmodpow($exp,$mod);  # modular exponentation (($num**$exp) % $mod))
    -  $x->bmodinv($mod);	   # the inverse of $x in the given modulus $mod
    -
    -  $x->bpow($y);		   # power of arguments (x ** y)
    -  $x->blsft($y);	   # left shift
    -  $x->brsft($y);	   # right shift 
    -  $x->blsft($y,$n);	   # left shift, by base $n (like 10)
    -  $x->brsft($y,$n);	   # right shift, by base $n (like 10)
    -  
    -  $x->band($y);		   # bitwise and
    -  $x->bior($y);		   # bitwise inclusive or
    -  $x->bxor($y);		   # bitwise exclusive or
    -  $x->bnot();		   # bitwise not (two's complement)
    -
    -  $x->bsqrt();		   # calculate square-root
    -  $x->broot($y);	   # $y'th root of $x (e.g. $y == 3 => cubic root)
    -  $x->bfac();		   # factorial of $x (1*2*3*4*..$x)
    -
    -  $x->round($A,$P,$mode);  # round to accuracy or precision using mode $mode
    -  $x->bround($n);	   # accuracy: preserve $n digits
    -  $x->bfround($n);	   # round to $nth digit, no-op for BigInts
    -
    -  # The following do not modify their arguments in BigInt (are no-ops),
    -  # but do so in BigFloat:
    -
    -  $x->bfloor();		   # return integer less or equal than $x
    -  $x->bceil();		   # return integer greater or equal than $x
    -  
    -  # The following do not modify their arguments:
    -
    -  # greatest common divisor (no OO style)
    -  my $gcd = Math::BigInt::bgcd(@values);
    -  # lowest common multiplicator (no OO style)
    -  my $lcm = Math::BigInt::blcm(@values);	
    - 
    -  $x->length();		   # return number of digits in number
    -  ($xl,$f) = $x->length(); # length of number and length of fraction part,
    -			   # latter is always 0 digits long for BigInts
    -
    -  $x->exponent();	   # return exponent as BigInt
    -  $x->mantissa();	   # return (signed) mantissa as BigInt
    -  $x->parts();		   # return (mantissa,exponent) as BigInt
    -  $x->copy();		   # make a true copy of $x (unlike $y = $x;)
    -  $x->as_int();		   # return as BigInt (in BigInt: same as copy())
    -  $x->numify();		   # return as scalar (might overflow!)
    -  
    -  # conversation to string (do not modify their argument)
    -  $x->bstr();		   # normalized string (e.g. '3')
    -  $x->bsstr();		   # norm. string in scientific notation (e.g. '3E0')
    -  $x->as_hex();		   # as signed hexadecimal string with prefixed 0x
    -  $x->as_bin();		   # as signed binary string with prefixed 0b
    -
    -
    -  # precision and accuracy (see section about rounding for more)
    -  $x->precision();	   # return P of $x (or global, if P of $x undef)
    -  $x->precision($n);	   # set P of $x to $n
    -  $x->accuracy();	   # return A of $x (or global, if A of $x undef)
    -  $x->accuracy($n);	   # set A $x to $n
    -
    -  # Global methods
    -  Math::BigInt->precision();	# get/set global P for all BigInt objects
    -  Math::BigInt->accuracy(); 	# get/set global A for all BigInt objects
    -  Math::BigInt->round_mode();	# get/set global round mode, one of
    -				# 'even', 'odd', '+inf', '-inf', 'zero' or 'trunc'
    -  Math::BigInt->config();	# return hash containing configuration
    -
    -=head1 DESCRIPTION
    -
    -All operators (inlcuding basic math operations) are overloaded if you
    -declare your big integers as
    -
    -  $i = new Math::BigInt '123_456_789_123_456_789';
    -
    -Operations with overloaded operators preserve the arguments which is
    -exactly what you expect.
    -
    -=over 2
    -
    -=item Input
    -
    -Input values to these routines may be any string, that looks like a number
    -and results in an integer, including hexadecimal and binary numbers.
    -
    -Scalars holding numbers may also be passed, but note that non-integer numbers
    -may already have lost precision due to the conversation to float. Quote
    -your input if you want BigInt to see all the digits:
    -
    -	$x = Math::BigInt->new(12345678890123456789);	# bad
    -	$x = Math::BigInt->new('12345678901234567890');	# good
    -
    -You can include one underscore between any two digits.
    -
    -This means integer values like 1.01E2 or even 1000E-2 are also accepted.
    -Non-integer values result in NaN.
    -
    -Currently, Math::BigInt::new() defaults to 0, while Math::BigInt::new('')
    -results in 'NaN'. This might change in the future, so use always the following
    -explicit forms to get a zero or NaN:
    -
    -	$zero = Math::BigInt->bzero(); 
    -	$nan = Math::BigInt->bnan(); 
    -
    -C on a BigInt object is now effectively a no-op, since the numbers 
    -are always stored in normalized form. If passed a string, creates a BigInt 
    -object from the input.
    -
    -=item Output
    -
    -Output values are BigInt objects (normalized), except for the methods which
    -return a string (see L).
    -
    -Some routines (C, C, C, C,
    -C, etc.) return true or false, while others (C, C)
    -return either undef (if NaN is involved), <0, 0 or >0 and are suited for sort.
    -
    -=back
    -
    -=head1 METHODS
    -
    -Each of the methods below (except config(), accuracy() and precision())
    -accepts three additional parameters. These arguments C<$A>, C<$P> and C<$R>
    -are C, C and C. Please see the section about
    -L for more information.
    -
    -=head2 config
    -
    -	use Data::Dumper;
    -
    -	print Dumper ( Math::BigInt->config() );
    -	print Math::BigInt->config()->{lib},"\n";
    -
    -Returns a hash containing the configuration, e.g. the version number, lib
    -loaded etc. The following hash keys are currently filled in with the
    -appropriate information.
    -
    -	key		Description
    -			Example
    -	============================================================
    -	lib		Name of the low-level math library
    -			Math::BigInt::Calc
    -	lib_version 	Version of low-level math library (see 'lib')
    -			0.30
    -	class		The class name of config() you just called
    -			Math::BigInt
    -	upgrade		To which class math operations might be upgraded
    -			Math::BigFloat
    -	downgrade	To which class math operations might be downgraded
    -			undef
    -	precision	Global precision
    -			undef
    -	accuracy	Global accuracy
    -			undef
    -	round_mode	Global round mode
    -			even
    -	version		version number of the class you used
    -			1.61
    -	div_scale	Fallback acccuracy for div
    -			40
    -	trap_nan	If true, traps creation of NaN via croak()
    -			1
    -	trap_inf	If true, traps creation of +inf/-inf via croak()
    -			1
    -
    -The following values can be set by passing C a reference to a hash:
    -
    -	trap_inf trap_nan
    -        upgrade downgrade precision accuracy round_mode div_scale
    -
    -Example:
    -	
    -	$new_cfg = Math::BigInt->config( { trap_inf => 1, precision => 5 } );
    -
    -=head2 accuracy
    -
    -	$x->accuracy(5);		# local for $x
    -	CLASS->accuracy(5);		# global for all members of CLASS
    -					# Note: This also applies to new()!
    -
    -	$A = $x->accuracy();		# read out accuracy that affects $x
    -	$A = CLASS->accuracy();		# read out global accuracy
    -
    -Set or get the global or local accuracy, aka how many significant digits the
    -results have. If you set a global accuracy, then this also applies to new()!
    -
    -Warning! The accuracy I, e.g. once you created a number under the
    -influence of C<< CLASS->accuracy($A) >>, all results from math operations with
    -that number will also be rounded. 
    -
    -In most cases, you should probably round the results explicitely using one of
    -L, L or L or by passing the desired accuracy
    -to the math operation as additional parameter:
    -
    -        my $x = Math::BigInt->new(30000);
    -        my $y = Math::BigInt->new(7);
    -        print scalar $x->copy()->bdiv($y, 2);		# print 4300
    -        print scalar $x->copy()->bdiv($y)->bround(2);	# print 4300
    -
    -Please see the section about L for further details.
    -
    -Value must be greater than zero. Pass an undef value to disable it:
    -
    -	$x->accuracy(undef);
    -	Math::BigInt->accuracy(undef);
    -
    -Returns the current accuracy. For C<$x->accuracy()> it will return either the
    -local accuracy, or if not defined, the global. This means the return value
    -represents the accuracy that will be in effect for $x:
    -
    -	$y = Math::BigInt->new(1234567);	# unrounded
    -	print Math::BigInt->accuracy(4),"\n";	# set 4, print 4
    -	$x = Math::BigInt->new(123456);		# $x will be automatically rounded!
    -	print "$x $y\n";			# '123500 1234567'
    -	print $x->accuracy(),"\n";		# will be 4
    -	print $y->accuracy(),"\n";		# also 4, since global is 4
    -	print Math::BigInt->accuracy(5),"\n";	# set to 5, print 5
    -	print $x->accuracy(),"\n";		# still 4
    -	print $y->accuracy(),"\n";		# 5, since global is 5
    -
    -Note: Works also for subclasses like Math::BigFloat. Each class has it's own
    -globals separated from Math::BigInt, but it is possible to subclass
    -Math::BigInt and make the globals of the subclass aliases to the ones from
    -Math::BigInt.
    -
    -=head2 precision
    -
    -	$x->precision(-2);	# local for $x, round at the second digit right of the dot
    -	$x->precision(2);	# ditto, round at the second digit left of the dot
    -
    -	CLASS->precision(5);	# Global for all members of CLASS
    -				# This also applies to new()!
    -	CLASS->precision(-5);	# ditto
    -
    -	$P = CLASS->precision();	# read out global precision 
    -	$P = $x->precision();		# read out precision that affects $x
    -
    -Note: You probably want to use L instead. With L you
    -set the number of digits each result should have, with L you
    -set the place where to round!
    -
    -C sets or gets the global or local precision, aka at which digit
    -before or after the dot to round all results. A set global precision also
    -applies to all newly created numbers!
    -
    -In Math::BigInt, passing a negative number precision has no effect since no
    -numbers have digits after the dot. In L, it will round all
    -results to P digits after the dot.
    -
    -Please see the section about L for further details.
    -
    -Pass an undef value to disable it:
    -
    -	$x->precision(undef);
    -	Math::BigInt->precision(undef);
    -
    -Returns the current precision. For C<$x->precision()> it will return either the
    -local precision of $x, or if not defined, the global. This means the return
    -value represents the prevision that will be in effect for $x:
    -
    -	$y = Math::BigInt->new(1234567);	# unrounded
    -	print Math::BigInt->precision(4),"\n";	# set 4, print 4
    -	$x = Math::BigInt->new(123456);		# will be automatically rounded
    -	print $x;				# print "120000"!
    -
    -Note: Works also for subclasses like L. Each class has its
    -own globals separated from Math::BigInt, but it is possible to subclass
    -Math::BigInt and make the globals of the subclass aliases to the ones from
    -Math::BigInt.
    -
    -=head2 brsft
    -
    -	$x->brsft($y,$n);		
    -
    -Shifts $x right by $y in base $n. Default is base 2, used are usually 10 and
    -2, but others work, too.
    -
    -Right shifting usually amounts to dividing $x by $n ** $y and truncating the
    -result:
    -
    -
    -	$x = Math::BigInt->new(10);
    -	$x->brsft(1);			# same as $x >> 1: 5
    -	$x = Math::BigInt->new(1234);
    -	$x->brsft(2,10);		# result 12
    -
    -There is one exception, and that is base 2 with negative $x:
    -
    -
    -	$x = Math::BigInt->new(-5);
    -	print $x->brsft(1);
    -
    -This will print -3, not -2 (as it would if you divide -5 by 2 and truncate the
    -result).
    -
    -=head2 new
    -
    -  	$x = Math::BigInt->new($str,$A,$P,$R);
    -
    -Creates a new BigInt object from a scalar or another BigInt object. The
    -input is accepted as decimal, hex (with leading '0x') or binary (with leading
    -'0b').
    -
    -See L for more info on accepted input formats.
    -
    -=head2 bnan
    -
    -  	$x = Math::BigInt->bnan();
    -
    -Creates a new BigInt object representing NaN (Not A Number).
    -If used on an object, it will set it to NaN:
    -
    -	$x->bnan();
    -
    -=head2 bzero
    -
    -  	$x = Math::BigInt->bzero();
    -
    -Creates a new BigInt object representing zero.
    -If used on an object, it will set it to zero:
    -
    -	$x->bzero();
    -
    -=head2 binf
    -
    -  	$x = Math::BigInt->binf($sign);
    -
    -Creates a new BigInt object representing infinity. The optional argument is
    -either '-' or '+', indicating whether you want infinity or minus infinity.
    -If used on an object, it will set it to infinity:
    -
    -	$x->binf();
    -	$x->binf('-');
    -
    -=head2 bone
    -
    -  	$x = Math::BigInt->binf($sign);
    -
    -Creates a new BigInt object representing one. The optional argument is
    -either '-' or '+', indicating whether you want one or minus one.
    -If used on an object, it will set it to one:
    -
    -	$x->bone();		# +1
    -	$x->bone('-');		# -1
    -
    -=head2 is_one()/is_zero()/is_nan()/is_inf()
    -
    -  
    -	$x->is_zero();			# true if arg is +0
    -	$x->is_nan();			# true if arg is NaN
    -	$x->is_one();			# true if arg is +1
    -	$x->is_one('-');		# true if arg is -1
    -	$x->is_inf();			# true if +inf
    -	$x->is_inf('-');		# true if -inf (sign is default '+')
    -
    -These methods all test the BigInt for beeing one specific value and return
    -true or false depending on the input. These are faster than doing something
    -like:
    -
    -	if ($x == 0)
    -
    -=head2 is_pos()/is_neg()
    -	
    -	$x->is_pos();			# true if > 0
    -	$x->is_neg();			# true if < 0
    -
    -The methods return true if the argument is positive or negative, respectively.
    -C is neither positive nor negative, while C<+inf> counts as positive, and
    -C<-inf> is negative. A C is neither positive nor negative.
    -
    -These methods are only testing the sign, and not the value.
    -
    -C and C are aliase to C and
    -C, respectively. C and C were
    -introduced in v1.36, while C and C were only introduced
    -in v1.68.
    -
    -=head2 is_odd()/is_even()/is_int()
    -
    -	$x->is_odd();			# true if odd, false for even
    -	$x->is_even();			# true if even, false for odd
    -	$x->is_int();			# true if $x is an integer
    -
    -The return true when the argument satisfies the condition. C, C<+inf>,
    -C<-inf> are not integers and are neither odd nor even.
    -
    -In BigInt, all numbers except C, C<+inf> and C<-inf> are integers.
    -
    -=head2 bcmp
    -
    -	$x->bcmp($y);
    -
    -Compares $x with $y and takes the sign into account.
    -Returns -1, 0, 1 or undef.
    -
    -=head2 bacmp
    -
    -	$x->bacmp($y);
    -
    -Compares $x with $y while ignoring their. Returns -1, 0, 1 or undef.
    -
    -=head2 sign
    -
    -	$x->sign();
    -
    -Return the sign, of $x, meaning either C<+>, C<->, C<-inf>, C<+inf> or NaN.
    -
    -If you want $x to have a certain sign, use one of the following methods:
    -
    -	$x->babs();		# '+'
    -	$x->babs()->bneg();	# '-'
    -	$x->bnan();		# 'NaN'
    -	$x->binf();		# '+inf'
    -	$x->binf('-');		# '-inf'
    -
    -=head2 digit
    -
    -	$x->digit($n);		# return the nth digit, counting from right
    -
    -If C<$n> is negative, returns the digit counting from left.
    -
    -=head2 bneg
    -
    -	$x->bneg();
    -
    -Negate the number, e.g. change the sign between '+' and '-', or between '+inf'
    -and '-inf', respectively. Does nothing for NaN or zero.
    -
    -=head2 babs
    -
    -	$x->babs();
    -
    -Set the number to it's absolute value, e.g. change the sign from '-' to '+'
    -and from '-inf' to '+inf', respectively. Does nothing for NaN or positive
    -numbers.
    -
    -=head2 bnorm
    -
    -	$x->bnorm();			# normalize (no-op)
    -
    -=head2 bnot
    -
    -	$x->bnot();			
    -
    -Two's complement (bit wise not). This is equivalent to
    -
    -	$x->binc()->bneg();
    -
    -but faster.
    -
    -=head2 binc
    -
    -	$x->binc();			# increment x by 1
    -
    -=head2 bdec
    -
    -	$x->bdec();			# decrement x by 1
    -
    -=head2 badd
    -
    -	$x->badd($y);			# addition (add $y to $x)
    -
    -=head2 bsub
    -
    -	$x->bsub($y);			# subtraction (subtract $y from $x)
    -
    -=head2 bmul
    -
    -	$x->bmul($y);			# multiplication (multiply $x by $y)
    -
    -=head2 bdiv
    -
    -	$x->bdiv($y);			# divide, set $x to quotient
    -					# return (quo,rem) or quo if scalar
    -
    -=head2 bmod
    -
    -	$x->bmod($y);			# modulus (x % y)
    -
    -=head2 bmodinv
    -
    -	num->bmodinv($mod);		# modular inverse
    -
    -Returns the inverse of C<$num> in the given modulus C<$mod>.  'C' is
    -returned unless C<$num> is relatively prime to C<$mod>, i.e. unless
    -C.
    -
    -=head2 bmodpow
    -
    -	$num->bmodpow($exp,$mod);	# modular exponentation
    -					# ($num**$exp % $mod)
    -
    -Returns the value of C<$num> taken to the power C<$exp> in the modulus
    -C<$mod> using binary exponentation.  C is far superior to
    -writing
    -
    -	$num ** $exp % $mod
    -
    -because it is much faster - it reduces internal variables into
    -the modulus whenever possible, so it operates on smaller numbers.
    -
    -C also supports negative exponents.
    -
    -	bmodpow($num, -1, $mod)
    -
    -is exactly equivalent to
    -
    -	bmodinv($num, $mod)
    -
    -=head2 bpow
    -
    -	$x->bpow($y);			# power of arguments (x ** y)
    -
    -=head2 blsft
    -
    -	$x->blsft($y);		# left shift
    -	$x->blsft($y,$n);	# left shift, in base $n (like 10)
    -
    -=head2 brsft
    -
    -	$x->brsft($y);		# right shift 
    -	$x->brsft($y,$n);	# right shift, in base $n (like 10)
    -
    -=head2 band
    -
    -	$x->band($y);			# bitwise and
    -
    -=head2 bior
    -
    -	$x->bior($y);			# bitwise inclusive or
    -
    -=head2 bxor
    -
    -	$x->bxor($y);			# bitwise exclusive or
    -
    -=head2 bnot
    -
    -	$x->bnot();			# bitwise not (two's complement)
    -
    -=head2 bsqrt
    -
    -	$x->bsqrt();			# calculate square-root
    -
    -=head2 bfac
    -
    -	$x->bfac();			# factorial of $x (1*2*3*4*..$x)
    -
    -=head2 round
    -
    -	$x->round($A,$P,$round_mode);
    -	
    -Round $x to accuracy C<$A> or precision C<$P> using the round mode
    -C<$round_mode>.
    -
    -=head2 bround
    -
    -	$x->bround($N);               # accuracy: preserve $N digits
    -
    -=head2 bfround
    -
    -	$x->bfround($N);              # round to $Nth digit, no-op for BigInts
    -
    -=head2 bfloor
    -
    -	$x->bfloor();			
    -
    -Set $x to the integer less or equal than $x. This is a no-op in BigInt, but
    -does change $x in BigFloat.
    -
    -=head2 bceil
    -
    -	$x->bceil();
    -
    -Set $x to the integer greater or equal than $x. This is a no-op in BigInt, but
    -does change $x in BigFloat.
    -
    -=head2 bgcd
    -
    -	bgcd(@values);		# greatest common divisor (no OO style)
    -
    -=head2 blcm
    -
    -	blcm(@values);		# lowest common multiplicator (no OO style)
    - 
    -head2 length
    -
    -	$x->length();
    -        ($xl,$fl) = $x->length();
    -
    -Returns the number of digits in the decimal representation of the number.
    -In list context, returns the length of the integer and fraction part. For
    -BigInt's, the length of the fraction part will always be 0.
    -
    -=head2 exponent
    -
    -	$x->exponent();
    -
    -Return the exponent of $x as BigInt.
    -
    -=head2 mantissa
    -
    -	$x->mantissa();
    -
    -Return the signed mantissa of $x as BigInt.
    -
    -=head2 parts
    -
    -	$x->parts();		# return (mantissa,exponent) as BigInt
    -
    -=head2 copy
    -
    -	$x->copy();		# make a true copy of $x (unlike $y = $x;)
    -
    -=head2 as_int
    -
    -	$x->as_int();	
    -
    -Returns $x as a BigInt (truncated towards zero). In BigInt this is the same as
    -C. 
    -
    -C is an alias to this method. C was introduced in
    -v1.22, while C was only introduced in v1.68.
    -  
    -=head2 bstr
    -
    -	$x->bstr();
    -
    -Returns a normalized string represantation of C<$x>.
    -
    -=head2 bsstr
    -
    -	$x->bsstr();		# normalized string in scientific notation
    -
    -=head2 as_hex
    -
    -	$x->as_hex();		# as signed hexadecimal string with prefixed 0x
    -
    -=head2 as_bin
    -
    -	$x->as_bin();		# as signed binary string with prefixed 0b
    -
    -=head1 ACCURACY and PRECISION
    -
    -Since version v1.33, Math::BigInt and Math::BigFloat have full support for
    -accuracy and precision based rounding, both automatically after every
    -operation, as well as manually.
    -
    -This section describes the accuracy/precision handling in Math::Big* as it
    -used to be and as it is now, complete with an explanation of all terms and
    -abbreviations.
    -
    -Not yet implemented things (but with correct description) are marked with '!',
    -things that need to be answered are marked with '?'.
    -
    -In the next paragraph follows a short description of terms used here (because
    -these may differ from terms used by others people or documentation).
    -
    -During the rest of this document, the shortcuts A (for accuracy), P (for
    -precision), F (fallback) and R (rounding mode) will be used.
    -
    -=head2 Precision P
    -
    -A fixed number of digits before (positive) or after (negative)
    -the decimal point. For example, 123.45 has a precision of -2. 0 means an
    -integer like 123 (or 120). A precision of 2 means two digits to the left
    -of the decimal point are zero, so 123 with P = 1 becomes 120. Note that
    -numbers with zeros before the decimal point may have different precisions,
    -because 1200 can have p = 0, 1 or 2 (depending on what the inital value
    -was). It could also have p < 0, when the digits after the decimal point
    -are zero.
    -
    -The string output (of floating point numbers) will be padded with zeros:
    - 
    -	Initial value   P       A	Result          String
    -	------------------------------------------------------------
    -	1234.01         -3      	1000            1000
    -	1234            -2      	1200            1200
    -	1234.5          -1      	1230            1230
    -	1234.001        1       	1234            1234.0
    -	1234.01         0       	1234            1234
    -	1234.01         2       	1234.01		1234.01
    -	1234.01         5       	1234.01		1234.01000
    -
    -For BigInts, no padding occurs.
    -
    -=head2 Accuracy A
    -
    -Number of significant digits. Leading zeros are not counted. A
    -number may have an accuracy greater than the non-zero digits
    -when there are zeros in it or trailing zeros. For example, 123.456 has
    -A of 6, 10203 has 5, 123.0506 has 7, 123.450000 has 8 and 0.000123 has 3.
    -
    -The string output (of floating point numbers) will be padded with zeros:
    -
    -	Initial value   P       A	Result          String
    -	------------------------------------------------------------
    -	1234.01			3	1230		1230
    -	1234.01			6	1234.01		1234.01
    -	1234.1			8	1234.1		1234.1000
    -
    -For BigInts, no padding occurs.
    -
    -=head2 Fallback F
    -
    -When both A and P are undefined, this is used as a fallback accuracy when
    -dividing numbers.
    -
    -=head2 Rounding mode R
    -
    -When rounding a number, different 'styles' or 'kinds'
    -of rounding are possible. (Note that random rounding, as in
    -Math::Round, is not implemented.)
    -
    -=over 2
    -
    -=item 'trunc'
    -
    -truncation invariably removes all digits following the
    -rounding place, replacing them with zeros. Thus, 987.65 rounded
    -to tens (P=1) becomes 980, and rounded to the fourth sigdig
    -becomes 987.6 (A=4). 123.456 rounded to the second place after the
    -decimal point (P=-2) becomes 123.46.
    -
    -All other implemented styles of rounding attempt to round to the
    -"nearest digit." If the digit D immediately to the right of the
    -rounding place (skipping the decimal point) is greater than 5, the
    -number is incremented at the rounding place (possibly causing a
    -cascade of incrementation): e.g. when rounding to units, 0.9 rounds
    -to 1, and -19.9 rounds to -20. If D < 5, the number is similarly
    -truncated at the rounding place: e.g. when rounding to units, 0.4
    -rounds to 0, and -19.4 rounds to -19.
    -
    -However the results of other styles of rounding differ if the
    -digit immediately to the right of the rounding place (skipping the
    -decimal point) is 5 and if there are no digits, or no digits other
    -than 0, after that 5. In such cases:
    -
    -=item 'even'
    -
    -rounds the digit at the rounding place to 0, 2, 4, 6, or 8
    -if it is not already. E.g., when rounding to the first sigdig, 0.45
    -becomes 0.4, -0.55 becomes -0.6, but 0.4501 becomes 0.5.
    -
    -=item 'odd'
    -
    -rounds the digit at the rounding place to 1, 3, 5, 7, or 9 if
    -it is not already. E.g., when rounding to the first sigdig, 0.45
    -becomes 0.5, -0.55 becomes -0.5, but 0.5501 becomes 0.6.
    -
    -=item '+inf'
    -
    -round to plus infinity, i.e. always round up. E.g., when
    -rounding to the first sigdig, 0.45 becomes 0.5, -0.55 becomes -0.5,
    -and 0.4501 also becomes 0.5.
    -
    -=item '-inf'
    -
    -round to minus infinity, i.e. always round down. E.g., when
    -rounding to the first sigdig, 0.45 becomes 0.4, -0.55 becomes -0.6,
    -but 0.4501 becomes 0.5.
    -
    -=item 'zero'
    -
    -round to zero, i.e. positive numbers down, negative ones up.
    -E.g., when rounding to the first sigdig, 0.45 becomes 0.4, -0.55
    -becomes -0.5, but 0.4501 becomes 0.5.
    -
    -=back
    -
    -The handling of A & P in MBI/MBF (the old core code shipped with Perl
    -versions <= 5.7.2) is like this:
    -
    -=over 2
    -
    -=item Precision
    -
    -  * ffround($p) is able to round to $p number of digits after the decimal
    -    point
    -  * otherwise P is unused
    -
    -=item Accuracy (significant digits)
    -
    -  * fround($a) rounds to $a significant digits
    -  * only fdiv() and fsqrt() take A as (optional) paramater
    -    + other operations simply create the same number (fneg etc), or more (fmul)
    -      of digits
    -    + rounding/truncating is only done when explicitly calling one of fround
    -      or ffround, and never for BigInt (not implemented)
    -  * fsqrt() simply hands its accuracy argument over to fdiv.
    -  * the documentation and the comment in the code indicate two different ways
    -    on how fdiv() determines the maximum number of digits it should calculate,
    -    and the actual code does yet another thing
    -    POD:
    -      max($Math::BigFloat::div_scale,length(dividend)+length(divisor))
    -    Comment:
    -      result has at most max(scale, length(dividend), length(divisor)) digits
    -    Actual code:
    -      scale = max(scale, length(dividend)-1,length(divisor)-1);
    -      scale += length(divisior) - length(dividend);
    -    So for lx = 3, ly = 9, scale = 10, scale will actually be 16 (10+9-3).
    -    Actually, the 'difference' added to the scale is calculated from the
    -    number of "significant digits" in dividend and divisor, which is derived
    -    by looking at the length of the mantissa. Which is wrong, since it includes
    -    the + sign (oops) and actually gets 2 for '+100' and 4 for '+101'. Oops
    -    again. Thus 124/3 with div_scale=1 will get you '41.3' based on the strange
    -    assumption that 124 has 3 significant digits, while 120/7 will get you
    -    '17', not '17.1' since 120 is thought to have 2 significant digits.
    -    The rounding after the division then uses the remainder and $y to determine
    -    wether it must round up or down.
    - ?  I have no idea which is the right way. That's why I used a slightly more
    - ?  simple scheme and tweaked the few failing testcases to match it.
    -
    -=back
    -
    -This is how it works now:
    -
    -=over 2
    -
    -=item Setting/Accessing
    -
    -  * You can set the A global via C<< Math::BigInt->accuracy() >> or
    -    C<< Math::BigFloat->accuracy() >> or whatever class you are using.
    -  * You can also set P globally by using C<< Math::SomeClass->precision() >>
    -    likewise.
    -  * Globals are classwide, and not inherited by subclasses.
    -  * to undefine A, use C<< Math::SomeCLass->accuracy(undef); >>
    -  * to undefine P, use C<< Math::SomeClass->precision(undef); >>
    -  * Setting C<< Math::SomeClass->accuracy() >> clears automatically
    -    C<< Math::SomeClass->precision() >>, and vice versa.
    -  * To be valid, A must be > 0, P can have any value.
    -  * If P is negative, this means round to the P'th place to the right of the
    -    decimal point; positive values mean to the left of the decimal point.
    -    P of 0 means round to integer.
    -  * to find out the current global A, use C<< Math::SomeClass->accuracy() >>
    -  * to find out the current global P, use C<< Math::SomeClass->precision() >>
    -  * use C<< $x->accuracy() >> respective C<< $x->precision() >> for the local
    -    setting of C<< $x >>.
    -  * Please note that C<< $x->accuracy() >> respecive C<< $x->precision() >>
    -    return eventually defined global A or P, when C<< $x >>'s A or P is not
    -    set.
    -
    -=item Creating numbers
    -
    -  * When you create a number, you can give it's desired A or P via:
    -    $x = Math::BigInt->new($number,$A,$P);
    -  * Only one of A or P can be defined, otherwise the result is NaN
    -  * If no A or P is give ($x = Math::BigInt->new($number) form), then the
    -    globals (if set) will be used. Thus changing the global defaults later on
    -    will not change the A or P of previously created numbers (i.e., A and P of
    -    $x will be what was in effect when $x was created)
    -  * If given undef for A and P, B rounding will occur, and the globals will
    -    B be used. This is used by subclasses to create numbers without
    -    suffering rounding in the parent. Thus a subclass is able to have it's own
    -    globals enforced upon creation of a number by using
    -    C<< $x = Math::BigInt->new($number,undef,undef) >>:
    -
    -	use Math::BigInt::SomeSubclass;
    -	use Math::BigInt;
    -
    -	Math::BigInt->accuracy(2);
    -	Math::BigInt::SomeSubClass->accuracy(3);
    -	$x = Math::BigInt::SomeSubClass->new(1234);	
    -
    -    $x is now 1230, and not 1200. A subclass might choose to implement
    -    this otherwise, e.g. falling back to the parent's A and P.
    -
    -=item Usage
    -
    -  * If A or P are enabled/defined, they are used to round the result of each
    -    operation according to the rules below
    -  * Negative P is ignored in Math::BigInt, since BigInts never have digits
    -    after the decimal point
    -  * Math::BigFloat uses Math::BigInt internally, but setting A or P inside
    -    Math::BigInt as globals does not tamper with the parts of a BigFloat.
    -    A flag is used to mark all Math::BigFloat numbers as 'never round'.
    -
    -=item Precedence
    -
    -  * It only makes sense that a number has only one of A or P at a time.
    -    If you set either A or P on one object, or globally, the other one will
    -    be automatically cleared.
    -  * If two objects are involved in an operation, and one of them has A in
    -    effect, and the other P, this results in an error (NaN).
    -  * A takes precendence over P (Hint: A comes before P).
    -    If neither of them is defined, nothing is used, i.e. the result will have
    -    as many digits as it can (with an exception for fdiv/fsqrt) and will not
    -    be rounded.
    -  * There is another setting for fdiv() (and thus for fsqrt()). If neither of
    -    A or P is defined, fdiv() will use a fallback (F) of $div_scale digits.
    -    If either the dividend's or the divisor's mantissa has more digits than
    -    the value of F, the higher value will be used instead of F.
    -    This is to limit the digits (A) of the result (just consider what would
    -    happen with unlimited A and P in the case of 1/3 :-)
    -  * fdiv will calculate (at least) 4 more digits than required (determined by
    -    A, P or F), and, if F is not used, round the result
    -    (this will still fail in the case of a result like 0.12345000000001 with A
    -    or P of 5, but this can not be helped - or can it?)
    -  * Thus you can have the math done by on Math::Big* class in two modi:
    -    + never round (this is the default):
    -      This is done by setting A and P to undef. No math operation
    -      will round the result, with fdiv() and fsqrt() as exceptions to guard
    -      against overflows. You must explicitely call bround(), bfround() or
    -      round() (the latter with parameters).
    -      Note: Once you have rounded a number, the settings will 'stick' on it
    -      and 'infect' all other numbers engaged in math operations with it, since
    -      local settings have the highest precedence. So, to get SaferRound[tm],
    -      use a copy() before rounding like this:
    -
    -        $x = Math::BigFloat->new(12.34);
    -        $y = Math::BigFloat->new(98.76);
    -        $z = $x * $y;                           # 1218.6984
    -        print $x->copy()->fround(3);            # 12.3 (but A is now 3!)
    -        $z = $x * $y;                           # still 1218.6984, without
    -                                                # copy would have been 1210!
    -
    -    + round after each op:
    -      After each single operation (except for testing like is_zero()), the
    -      method round() is called and the result is rounded appropriately. By
    -      setting proper values for A and P, you can have all-the-same-A or
    -      all-the-same-P modes. For example, Math::Currency might set A to undef,
    -      and P to -2, globally.
    -
    - ?Maybe an extra option that forbids local A & P settings would be in order,
    - ?so that intermediate rounding does not 'poison' further math? 
    -
    -=item Overriding globals
    -
    -  * you will be able to give A, P and R as an argument to all the calculation
    -    routines; the second parameter is A, the third one is P, and the fourth is
    -    R (shift right by one for binary operations like badd). P is used only if
    -    the first parameter (A) is undefined. These three parameters override the
    -    globals in the order detailed as follows, i.e. the first defined value
    -    wins:
    -    (local: per object, global: global default, parameter: argument to sub)
    -      + parameter A
    -      + parameter P
    -      + local A (if defined on both of the operands: smaller one is taken)
    -      + local P (if defined on both of the operands: bigger one is taken)
    -      + global A
    -      + global P
    -      + global F
    -  * fsqrt() will hand its arguments to fdiv(), as it used to, only now for two
    -    arguments (A and P) instead of one
    -
    -=item Local settings
    -
    -  * You can set A or P locally by using C<< $x->accuracy() >> or
    -    C<< $x->precision() >>
    -    and thus force different A and P for different objects/numbers.
    -  * Setting A or P this way immediately rounds $x to the new value.
    -  * C<< $x->accuracy() >> clears C<< $x->precision() >>, and vice versa.
    -
    -=item Rounding
    -
    -  * the rounding routines will use the respective global or local settings.
    -    fround()/bround() is for accuracy rounding, while ffround()/bfround()
    -    is for precision
    -  * the two rounding functions take as the second parameter one of the
    -    following rounding modes (R):
    -    'even', 'odd', '+inf', '-inf', 'zero', 'trunc'
    -  * you can set/get the global R by using C<< Math::SomeClass->round_mode() >>
    -    or by setting C<< $Math::SomeClass::round_mode >>
    -  * after each operation, C<< $result->round() >> is called, and the result may
    -    eventually be rounded (that is, if A or P were set either locally,
    -    globally or as parameter to the operation)
    -  * to manually round a number, call C<< $x->round($A,$P,$round_mode); >>
    -    this will round the number by using the appropriate rounding function
    -    and then normalize it.
    -  * rounding modifies the local settings of the number:
    -
    -        $x = Math::BigFloat->new(123.456);
    -        $x->accuracy(5);
    -        $x->bround(4);
    -
    -    Here 4 takes precedence over 5, so 123.5 is the result and $x->accuracy()
    -    will be 4 from now on.
    -
    -=item Default values
    -
    -  * R: 'even'
    -  * F: 40
    -  * A: undef
    -  * P: undef
    -
    -=item Remarks
    -
    -  * The defaults are set up so that the new code gives the same results as
    -    the old code (except in a few cases on fdiv):
    -    + Both A and P are undefined and thus will not be used for rounding
    -      after each operation.
    -    + round() is thus a no-op, unless given extra parameters A and P
    -
    -=back
    -
    -=head1 Infinity and Not a Number
    -
    -While BigInt has extensive handling of inf and NaN, certain quirks remain.
    -
    -=over 2
    -
    -=item oct()/hex()
    -
    -These perl routines currently (as of Perl v.5.8.6) cannot handle passed
    -inf.
    -
    -	te@linux:~> perl -wle 'print 2 ** 3333'
    -	inf
    -	te@linux:~> perl -wle 'print 2 ** 3333 == 2 ** 3333'
    -	1
    -	te@linux:~> perl -wle 'print oct(2 ** 3333)'
    -	0
    -	te@linux:~> perl -wle 'print hex(2 ** 3333)'
    -	Illegal hexadecimal digit 'i' ignored at -e line 1.
    -	0
    -
    -The same problems occur if you pass them Math::BigInt->binf() objects. Since
    -overloading these routines is not possible, this cannot be fixed from BigInt.
    -
    -=item ==, !=, <, >, <=, >= with NaNs
    -
    -BigInt's bcmp() routine currently returns undef to signal that a NaN was
    -involved in a comparisation. However, the overload code turns that into
    -either 1 or '' and thus operations like C<< NaN != NaN >> might return
    -wrong values.
    -
    -=item log(-inf)
    -
    -C<< log(-inf) >> is highly weird. Since log(-x)=pi*i+log(x), then
    -log(-inf)=pi*i+inf. However, since the imaginary part is finite, the real
    -infinity "overshadows" it, so the number might as well just be infinity.
    -However, the result is a complex number, and since BigInt/BigFloat can only
    -have real numbers as results, the result is NaN.
    -
    -=item exp(), cos(), sin(), atan2()
    -
    -These all might have problems handling infinity right.
    - 
    -=back
    -
    -=head1 INTERNALS
    -
    -The actual numbers are stored as unsigned big integers (with seperate sign).
    -
    -You should neither care about nor depend on the internal representation; it
    -might change without notice. Use B method calls like C<< $x->sign(); >>
    -instead relying on the internal representation.
    -
    -=head2 MATH LIBRARY
    -
    -Math with the numbers is done (by default) by a module called
    -C. This is equivalent to saying:
    -
    -	use Math::BigInt lib => 'Calc';
    -
    -You can change this by using:
    -
    -	use Math::BigInt lib => 'BitVect';
    -
    -The following would first try to find Math::BigInt::Foo, then
    -Math::BigInt::Bar, and when this also fails, revert to Math::BigInt::Calc:
    -
    -	use Math::BigInt lib => 'Foo,Math::BigInt::Bar';
    -
    -Since Math::BigInt::GMP is in almost all cases faster than Calc (especially in
    -math involving really big numbers, where it is B faster), and there is
    -no penalty if Math::BigInt::GMP is not installed, it is a good idea to always
    -use the following:
    -
    -	use Math::BigInt lib => 'GMP';
    -
    -Different low-level libraries use different formats to store the
    -numbers. You should B depend on the number having a specific format
    -internally.
    -
    -See the respective math library module documentation for further details.
    -
    -=head2 SIGN
    -
    -The sign is either '+', '-', 'NaN', '+inf' or '-inf'.
    -
    -A sign of 'NaN' is used to represent the result when input arguments are not
    -numbers or as a result of 0/0. '+inf' and '-inf' represent plus respectively
    -minus infinity. You will get '+inf' when dividing a positive number by 0, and
    -'-inf' when dividing any negative number by 0.
    -
    -=head2 mantissa(), exponent() and parts()
    -
    -C and C return the said parts of the BigInt such
    -that:
    -
    -        $m = $x->mantissa();
    -        $e = $x->exponent();
    -        $y = $m * ( 10 ** $e );
    -        print "ok\n" if $x == $y;
    -
    -C<< ($m,$e) = $x->parts() >> is just a shortcut that gives you both of them
    -in one go. Both the returned mantissa and exponent have a sign.
    -
    -Currently, for BigInts C<$e> is always 0, except for NaN, +inf and -inf,
    -where it is C; and for C<$x == 0>, where it is C<1> (to be compatible
    -with Math::BigFloat's internal representation of a zero as C<0E1>).
    -
    -C<$m> is currently just a copy of the original number. The relation between
    -C<$e> and C<$m> will stay always the same, though their real values might
    -change.
    -
    -=head1 EXAMPLES
    - 
    -  use Math::BigInt;
    -
    -  sub bint { Math::BigInt->new(shift); }
    -
    -  $x = Math::BigInt->bstr("1234")      	# string "1234"
    -  $x = "$x";                         	# same as bstr()
    -  $x = Math::BigInt->bneg("1234");   	# BigInt "-1234"
    -  $x = Math::BigInt->babs("-12345"); 	# BigInt "12345"
    -  $x = Math::BigInt->bnorm("-0 00"); 	# BigInt "0"
    -  $x = bint(1) + bint(2);            	# BigInt "3"
    -  $x = bint(1) + "2";                	# ditto (auto-BigIntify of "2")
    -  $x = bint(1);                      	# BigInt "1"
    -  $x = $x + 5 / 2;                   	# BigInt "3"
    -  $x = $x ** 3;                      	# BigInt "27"
    -  $x *= 2;                           	# BigInt "54"
    -  $x = Math::BigInt->new(0);       	# BigInt "0"
    -  $x--;                              	# BigInt "-1"
    -  $x = Math::BigInt->badd(4,5)		# BigInt "9"
    -  print $x->bsstr();			# 9e+0
    -
    -Examples for rounding:
    -
    -  use Math::BigFloat;
    -  use Test;
    -
    -  $x = Math::BigFloat->new(123.4567);
    -  $y = Math::BigFloat->new(123.456789);
    -  Math::BigFloat->accuracy(4);		# no more A than 4
    -
    -  ok ($x->copy()->fround(),123.4);	# even rounding
    -  print $x->copy()->fround(),"\n";	# 123.4
    -  Math::BigFloat->round_mode('odd');	# round to odd
    -  print $x->copy()->fround(),"\n";	# 123.5
    -  Math::BigFloat->accuracy(5);		# no more A than 5
    -  Math::BigFloat->round_mode('odd');	# round to odd
    -  print $x->copy()->fround(),"\n";	# 123.46
    -  $y = $x->copy()->fround(4),"\n";	# A = 4: 123.4
    -  print "$y, ",$y->accuracy(),"\n";	# 123.4, 4
    -
    -  Math::BigFloat->accuracy(undef);	# A not important now
    -  Math::BigFloat->precision(2); 	# P important
    -  print $x->copy()->bnorm(),"\n";	# 123.46
    -  print $x->copy()->fround(),"\n";	# 123.46
    -
    -Examples for converting:
    -
    -  my $x = Math::BigInt->new('0b1'.'01' x 123);
    -  print "bin: ",$x->as_bin()," hex:",$x->as_hex()," dec: ",$x,"\n";
    -
    -=head1 Autocreating constants
    -
    -After C all the B decimal, hexadecimal
    -and binary constants in the given scope are converted to C.
    -This conversion happens at compile time. 
    -
    -In particular,
    -
    -  perl -MMath::BigInt=:constant -e 'print 2**100,"\n"'
    -
    -prints the integer value of C<2**100>. Note that without conversion of 
    -constants the expression 2**100 will be calculated as perl scalar.
    -
    -Please note that strings and floating point constants are not affected,
    -so that
    -
    -  	use Math::BigInt qw/:constant/;
    -
    -	$x = 1234567890123456789012345678901234567890
    -		+ 123456789123456789;
    -	$y = '1234567890123456789012345678901234567890'
    -		+ '123456789123456789';
    -
    -do not work. You need an explicit Math::BigInt->new() around one of the
    -operands. You should also quote large constants to protect loss of precision:
    -
    -	use Math::BigInt;
    -
    -	$x = Math::BigInt->new('1234567889123456789123456789123456789');
    -
    -Without the quotes Perl would convert the large number to a floating point
    -constant at compile time and then hand the result to BigInt, which results in
    -an truncated result or a NaN.
    -
    -This also applies to integers that look like floating point constants:
    -
    -	use Math::BigInt ':constant';
    -
    -	print ref(123e2),"\n";
    -	print ref(123.2e2),"\n";
    -
    -will print nothing but newlines. Use either L or L
    -to get this to work.
    -
    -=head1 PERFORMANCE
    -
    -Using the form $x += $y; etc over $x = $x + $y is faster, since a copy of $x
    -must be made in the second case. For long numbers, the copy can eat up to 20%
    -of the work (in the case of addition/subtraction, less for
    -multiplication/division). If $y is very small compared to $x, the form
    -$x += $y is MUCH faster than $x = $x + $y since making the copy of $x takes
    -more time then the actual addition.
    -
    -With a technique called copy-on-write, the cost of copying with overload could
    -be minimized or even completely avoided. A test implementation of COW did show
    -performance gains for overloaded math, but introduced a performance loss due
    -to a constant overhead for all other operatons. So Math::BigInt does currently
    -not COW.
    -
    -The rewritten version of this module (vs. v0.01) is slower on certain
    -operations, like C, C and C. The reason are that it
    -does now more work and handles much more cases. The time spent in these
    -operations is usually gained in the other math operations so that code on
    -the average should get (much) faster. If they don't, please contact the author.
    -
    -Some operations may be slower for small numbers, but are significantly faster
    -for big numbers. Other operations are now constant (O(1), like C,
    -C etc), instead of O(N) and thus nearly always take much less time.
    -These optimizations were done on purpose.
    -
    -If you find the Calc module to slow, try to install any of the replacement
    -modules and see if they help you. 
    -
    -=head2 Alternative math libraries
    -
    -You can use an alternative library to drive Math::BigInt via:
    -
    -	use Math::BigInt lib => 'Module';
    -
    -See L for more information.
    -
    -For more benchmark results see L.
    -
    -=head2 SUBCLASSING
    -
    -=head1 Subclassing Math::BigInt
    -
    -The basic design of Math::BigInt allows simple subclasses with very little
    -work, as long as a few simple rules are followed:
    -
    -=over 2
    -
    -=item *
    -
    -The public API must remain consistent, i.e. if a sub-class is overloading
    -addition, the sub-class must use the same name, in this case badd(). The
    -reason for this is that Math::BigInt is optimized to call the object methods
    -directly.
    -
    -=item *
    -
    -The private object hash keys like C<$x->{sign}> may not be changed, but
    -additional keys can be added, like C<$x->{_custom}>.
    -
    -=item *
    -
    -Accessor functions are available for all existing object hash keys and should
    -be used instead of directly accessing the internal hash keys. The reason for
    -this is that Math::BigInt itself has a pluggable interface which permits it
    -to support different storage methods.
    -
    -=back
    -
    -More complex sub-classes may have to replicate more of the logic internal of
    -Math::BigInt if they need to change more basic behaviors. A subclass that
    -needs to merely change the output only needs to overload C. 
    -
    -All other object methods and overloaded functions can be directly inherited
    -from the parent class.
    -
    -At the very minimum, any subclass will need to provide it's own C and can
    -store additional hash keys in the object. There are also some package globals
    -that must be defined, e.g.:
    -
    -  # Globals
    -  $accuracy = undef;
    -  $precision = -2;       # round to 2 decimal places
    -  $round_mode = 'even';
    -  $div_scale = 40;
    -
    -Additionally, you might want to provide the following two globals to allow
    -auto-upgrading and auto-downgrading to work correctly:
    -
    -  $upgrade = undef;
    -  $downgrade = undef;
    -
    -This allows Math::BigInt to correctly retrieve package globals from the 
    -subclass, like C<$SubClass::precision>.  See t/Math/BigInt/Subclass.pm or
    -t/Math/BigFloat/SubClass.pm completely functional subclass examples.
    -
    -Don't forget to 
    -
    -	use overload;
    -
    -in your subclass to automatically inherit the overloading from the parent. If
    -you like, you can change part of the overloading, look at Math::String for an
    -example.
    -
    -=head1 UPGRADING
    -
    -When used like this:
    -
    -	use Math::BigInt upgrade => 'Foo::Bar';
    -
    -certain operations will 'upgrade' their calculation and thus the result to
    -the class Foo::Bar. Usually this is used in conjunction with Math::BigFloat:
    -
    -	use Math::BigInt upgrade => 'Math::BigFloat';
    -
    -As a shortcut, you can use the module C:
    -
    -	use bignum;
    -
    -Also good for oneliners:
    -
    -	perl -Mbignum -le 'print 2 ** 255'
    -
    -This makes it possible to mix arguments of different classes (as in 2.5 + 2)
    -as well es preserve accuracy (as in sqrt(3)).
    -
    -Beware: This feature is not fully implemented yet.
    -
    -=head2 Auto-upgrade
    -
    -The following methods upgrade themselves unconditionally; that is if upgrade
    -is in effect, they will always hand up their work:
    -
    -=over 2
    -
    -=item bsqrt()
    -
    -=item div()
    -
    -=item blog()
    -
    -=back
    -
    -Beware: This list is not complete.
    -
    -All other methods upgrade themselves only when one (or all) of their
    -arguments are of the class mentioned in $upgrade (This might change in later
    -versions to a more sophisticated scheme):
    -
    -=head1 BUGS
    -
    -=over 2
    -
    -=item broot() does not work
    -
    -The broot() function in BigInt may only work for small values. This will be
    -fixed in a later version.
    -
    -=item Out of Memory!
    -
    -Under Perl prior to 5.6.0 having an C and 
    -C in your code will crash with "Out of memory". This is probably an
    -overload/exporter bug. You can workaround by not having C 
    -and ':constant' at the same time or upgrade your Perl to a newer version.
    -
    -=item Fails to load Calc on Perl prior 5.6.0
    -
    -Since eval(' use ...') can not be used in conjunction with ':constant', BigInt
    -will fall back to eval { require ... } when loading the math lib on Perls
    -prior to 5.6.0. This simple replaces '::' with '/' and thus might fail on
    -filesystems using a different seperator.  
    -
    -=back
    -
    -=head1 CAVEATS
    -
    -Some things might not work as you expect them. Below is documented what is
    -known to be troublesome:
    -
    -=over 1
    -
    -=item bstr(), bsstr() and 'cmp'
    -
    -Both C and C as well as automated stringify via overload now
    -drop the leading '+'. The old code would return '+3', the new returns '3'.
    -This is to be consistent with Perl and to make C (especially with
    -overloading) to work as you expect. It also solves problems with C,
    -because it's C uses 'eq' internally. 
    -
    -Mark Biggar said, when asked about to drop the '+' altogether, or make only
    -C work:
    -
    -	I agree (with the first alternative), don't add the '+' on positive
    -	numbers.  It's not as important anymore with the new internal 
    -	form for numbers.  It made doing things like abs and neg easier,
    -	but those have to be done differently now anyway.
    -
    -So, the following examples will now work all as expected:
    -
    -	use Test;
    -        BEGIN { plan tests => 1 }
    -	use Math::BigInt;
    -
    -	my $x = new Math::BigInt 3*3;
    -	my $y = new Math::BigInt 3*3;
    -
    -	ok ($x,3*3);
    -	print "$x eq 9" if $x eq $y;
    -	print "$x eq 9" if $x eq '9';
    -	print "$x eq 9" if $x eq 3*3;
    -
    -Additionally, the following still works:
    -	
    -	print "$x == 9" if $x == $y;
    -	print "$x == 9" if $x == 9;
    -	print "$x == 9" if $x == 3*3;
    -
    -There is now a C method to get the string in scientific notation aka
    -C<1e+2> instead of C<100>. Be advised that overloaded 'eq' always uses bstr()
    -for comparisation, but Perl will represent some numbers as 100 and others
    -as 1e+308. If in doubt, convert both arguments to Math::BigInt before 
    -comparing them as strings:
    -
    -	use Test;
    -        BEGIN { plan tests => 3 }
    -	use Math::BigInt;
    -
    -	$x = Math::BigInt->new('1e56'); $y = 1e56;
    -	ok ($x,$y);			# will fail
    -	ok ($x->bsstr(),$y);		# okay
    -	$y = Math::BigInt->new($y);
    -	ok ($x,$y);			# okay
    -
    -Alternatively, simple use C<< <=> >> for comparisations, this will get it
    -always right. There is not yet a way to get a number automatically represented
    -as a string that matches exactly the way Perl represents it.
    -
    -See also the section about L for problems in
    -comparing NaNs.
    -
    -=item int()
    -
    -C will return (at least for Perl v5.7.1 and up) another BigInt, not a 
    -Perl scalar:
    -
    -	$x = Math::BigInt->new(123);
    -	$y = int($x);				# BigInt 123
    -	$x = Math::BigFloat->new(123.45);
    -	$y = int($x);				# BigInt 123
    -
    -In all Perl versions you can use C or C for the same
    -effect:
    -
    -	$x = Math::BigFloat->new(123.45);
    -	$y = $x->as_number();			# BigInt 123
    -	$y = $x->as_int();			# ditto
    -
    -This also works for other subclasses, like Math::String.
    -
    -It is yet unlcear whether overloaded int() should return a scalar or a BigInt.
    -
    -If you want a real Perl scalar, use C:
    -
    -	$y = $x->numify();			# 123 as scalar
    -
    -This is seldom necessary, though, because this is done automatically, like
    -when you access an array:
    -
    -	$z = $array[$x];			# does work automatically
    -
    -=item length
    -
    -The following will probably not do what you expect:
    -
    -	$c = Math::BigInt->new(123);
    -	print $c->length(),"\n";		# prints 30
    -
    -It prints both the number of digits in the number and in the fraction part
    -since print calls C in list context. Use something like: 
    -	
    -	print scalar $c->length(),"\n";		# prints 3 
    -
    -=item bdiv
    -
    -The following will probably not do what you expect:
    -
    -	print $c->bdiv(10000),"\n";
    -
    -It prints both quotient and remainder since print calls C in list
    -context. Also, C will modify $c, so be carefull. You probably want
    -to use
    -	
    -	print $c / 10000,"\n";
    -	print scalar $c->bdiv(10000),"\n";  # or if you want to modify $c
    -
    -instead.
    -
    -The quotient is always the greatest integer less than or equal to the
    -real-valued quotient of the two operands, and the remainder (when it is
    -nonzero) always has the same sign as the second operand; so, for
    -example,
    -
    -	  1 / 4  => ( 0, 1)
    -	  1 / -4 => (-1,-3)
    -	 -3 / 4  => (-1, 1)
    -	 -3 / -4 => ( 0,-3)
    -	-11 / 2  => (-5,1)
    -	 11 /-2  => (-5,-1)
    -
    -As a consequence, the behavior of the operator % agrees with the
    -behavior of Perl's built-in % operator (as documented in the perlop
    -manpage), and the equation
    -
    -	$x == ($x / $y) * $y + ($x % $y)
    -
    -holds true for any $x and $y, which justifies calling the two return
    -values of bdiv() the quotient and remainder. The only exception to this rule
    -are when $y == 0 and $x is negative, then the remainder will also be
    -negative. See below under "infinity handling" for the reasoning behing this.
    -
    -Perl's 'use integer;' changes the behaviour of % and / for scalars, but will
    -not change BigInt's way to do things. This is because under 'use integer' Perl
    -will do what the underlying C thinks is right and this is different for each
    -system. If you need BigInt's behaving exactly like Perl's 'use integer', bug
    -the author to implement it ;)
    -
    -=item infinity handling
    -
    -Here are some examples that explain the reasons why certain results occur while
    -handling infinity:
    -
    -The following table shows the result of the division and the remainder, so that
    -the equation above holds true. Some "ordinary" cases are strewn in to show more
    -clearly the reasoning:
    -
    -	A /  B  =   C,     R so that C *    B +    R =    A
    -     =========================================================
    -	5 /   8 =   0,     5 	     0 *    8 +    5 =    5
    -	0 /   8 =   0,     0	     0 *    8 +    0 =    0
    -	0 / inf =   0,     0	     0 *  inf +    0 =    0
    -	0 /-inf =   0,     0	     0 * -inf +    0 =    0
    -	5 / inf =   0,     5	     0 *  inf +    5 =    5
    -	5 /-inf =   0,     5	     0 * -inf +    5 =    5
    -	-5/ inf =   0,    -5	     0 *  inf +   -5 =   -5
    -	-5/-inf =   0,    -5	     0 * -inf +   -5 =   -5
    -       inf/   5 =  inf,    0	   inf *    5 +    0 =  inf
    -      -inf/   5 = -inf,    0      -inf *    5 +    0 = -inf
    -       inf/  -5 = -inf,    0	  -inf *   -5 +    0 =  inf
    -      -inf/  -5 =  inf,    0       inf *   -5 +    0 = -inf
    -	 5/   5 =    1,    0         1 *    5 +    0 =    5
    -	-5/  -5 =    1,    0         1 *   -5 +    0 =   -5
    -       inf/ inf =    1,    0         1 *  inf +    0 =  inf
    -      -inf/-inf =    1,    0         1 * -inf +    0 = -inf
    -       inf/-inf =   -1,    0        -1 * -inf +    0 =  inf
    -      -inf/ inf =   -1,    0         1 * -inf +    0 = -inf
    -	 8/   0 =  inf,    8       inf *    0 +    8 =    8 
    -       inf/   0 =  inf,  inf       inf *    0 +  inf =  inf 
    -         0/   0 =  NaN
    -
    -These cases below violate the "remainder has the sign of the second of the two
    -arguments", since they wouldn't match up otherwise.
    -
    -	A /  B  =   C,     R so that C *    B +    R =    A
    -     ========================================================
    -      -inf/   0 = -inf, -inf      -inf *    0 +  inf = -inf 
    -	-8/   0 = -inf,   -8      -inf *    0 +    8 = -8 
    -
    -=item Modifying and =
    -
    -Beware of:
    -
    -        $x = Math::BigFloat->new(5);
    -        $y = $x;
    -
    -It will not do what you think, e.g. making a copy of $x. Instead it just makes
    -a second reference to the B object and stores it in $y. Thus anything
    -that modifies $x (except overloaded operators) will modify $y, and vice versa.
    -Or in other words, C<=> is only safe if you modify your BigInts only via
    -overloaded math. As soon as you use a method call it breaks:
    -
    -        $x->bmul(2);
    -        print "$x, $y\n";       # prints '10, 10'
    -
    -If you want a true copy of $x, use:
    -
    -        $y = $x->copy();
    -
    -You can also chain the calls like this, this will make first a copy and then
    -multiply it by 2:
    -
    -        $y = $x->copy()->bmul(2);
    -
    -See also the documentation for overload.pm regarding C<=>.
    -
    -=item bpow
    -
    -C (and the rounding functions) now modifies the first argument and
    -returns it, unlike the old code which left it alone and only returned the
    -result. This is to be consistent with C etc. The first three will
    -modify $x, the last one won't:
    -
    -	print bpow($x,$i),"\n"; 	# modify $x
    -	print $x->bpow($i),"\n"; 	# ditto
    -	print $x **= $i,"\n";		# the same
    -	print $x ** $i,"\n";		# leave $x alone 
    -
    -The form C<$x **= $y> is faster than C<$x = $x ** $y;>, though.
    -
    -=item Overloading -$x
    -
    -The following:
    -
    -	$x = -$x;
    -
    -is slower than
    -
    -	$x->bneg();
    -
    -since overload calls C instead of C. The first variant
    -needs to preserve $x since it does not know that it later will get overwritten.
    -This makes a copy of $x and takes O(N), but $x->bneg() is O(1).
    -
    -=item Mixing different object types
    -
    -In Perl you will get a floating point value if you do one of the following:
    -
    -	$float = 5.0 + 2;
    -	$float = 2 + 5.0;
    -	$float = 5 / 2;
    -
    -With overloaded math, only the first two variants will result in a BigFloat:
    -
    -	use Math::BigInt;
    -	use Math::BigFloat;
    -	
    -	$mbf = Math::BigFloat->new(5);
    -	$mbi2 = Math::BigInteger->new(5);
    -	$mbi = Math::BigInteger->new(2);
    -
    -					# what actually gets called:
    -	$float = $mbf + $mbi;		# $mbf->badd()
    -	$float = $mbf / $mbi;		# $mbf->bdiv()
    -	$integer = $mbi + $mbf;		# $mbi->badd()
    -	$integer = $mbi2 / $mbi;	# $mbi2->bdiv()
    -	$integer = $mbi2 / $mbf;	# $mbi2->bdiv()
    -
    -This is because math with overloaded operators follows the first (dominating)
    -operand, and the operation of that is called and returns thus the result. So,
    -Math::BigInt::bdiv() will always return a Math::BigInt, regardless whether
    -the result should be a Math::BigFloat or the second operant is one.
    -
    -To get a Math::BigFloat you either need to call the operation manually,
    -make sure the operands are already of the proper type or casted to that type
    -via Math::BigFloat->new():
    -	
    -	$float = Math::BigFloat->new($mbi2) / $mbi;	# = 2.5
    -
    -Beware of simple "casting" the entire expression, this would only convert
    -the already computed result:
    -
    -	$float = Math::BigFloat->new($mbi2 / $mbi);	# = 2.0 thus wrong!
    -
    -Beware also of the order of more complicated expressions like:
    -
    -	$integer = ($mbi2 + $mbi) / $mbf;		# int / float => int
    -	$integer = $mbi2 / Math::BigFloat->new($mbi);	# ditto
    -
    -If in doubt, break the expression into simpler terms, or cast all operands
    -to the desired resulting type.
    -
    -Scalar values are a bit different, since:
    -	
    -	$float = 2 + $mbf;
    -	$float = $mbf + 2;
    -
    -will both result in the proper type due to the way the overloaded math works.
    -
    -This section also applies to other overloaded math packages, like Math::String.
    -
    -One solution to you problem might be autoupgrading|upgrading. See the
    -pragmas L, L and L for an easy way to do this.
    -
    -=item bsqrt()
    -
    -C works only good if the result is a big integer, e.g. the square
    -root of 144 is 12, but from 12 the square root is 3, regardless of rounding
    -mode. The reason is that the result is always truncated to an integer.
    -
    -If you want a better approximation of the square root, then use:
    -
    -	$x = Math::BigFloat->new(12);
    -	Math::BigFloat->precision(0);
    -	Math::BigFloat->round_mode('even');
    -	print $x->copy->bsqrt(),"\n";		# 4
    -
    -	Math::BigFloat->precision(2);
    -	print $x->bsqrt(),"\n";			# 3.46
    -	print $x->bsqrt(3),"\n";		# 3.464
    -
    -=item brsft()
    -
    -For negative numbers in base see also L.
    -
    -=back
    -
    -=head1 LICENSE
    -
    -This program is free software; you may redistribute it and/or modify it under
    -the same terms as Perl itself.
    -
    -=head1 SEE ALSO
    -
    -L, L and L as well as
    -L, L and  L.
    -
    -The pragmas L, L and L also might be of interest
    -because they solve the autoupgrading/downgrading issue, at least partly.
    -
    -The package at
    -L contains
    -more documentation including a full version history, testcases, empty
    -subclass files and benchmarks.
    -
    -=head1 AUTHORS
    -
    -Original code by Mark Biggar, overloaded interface by Ilya Zakharevich.
    -Completely rewritten by Tels http://bloodgate.com in late 2000, 2001 - 2004
    -and still at it in 2005.
    -
    -Many people contributed in one or more ways to the final beast, see the file
    -CREDITS for an (uncomplete) list. If you miss your name, please drop me a
    -mail. Thank you!
    -
    -=cut
    diff --git a/lib/perl5/5.8.8/Math/BigInt/Calc.pm b/lib/perl5/5.8.8/Math/BigInt/Calc.pm
    deleted file mode 100644
    index 4bdd3e64..00000000
    --- a/lib/perl5/5.8.8/Math/BigInt/Calc.pm
    +++ /dev/null
    @@ -1,2102 +0,0 @@
    -package Math::BigInt::Calc;
    -
    -use 5.005;
    -use strict;
    -# use warnings;	# dont use warnings for older Perls
    -
    -use vars qw/$VERSION/;
    -
    -$VERSION = '0.47';
    -
    -# Package to store unsigned big integers in decimal and do math with them
    -
    -# Internally the numbers are stored in an array with at least 1 element, no
    -# leading zero parts (except the first) and in base 1eX where X is determined
    -# automatically at loading time to be the maximum possible value
    -
    -# todo:
    -# - fully remove funky $# stuff in div() (maybe - that code scares me...)
    -
    -# USE_MUL: due to problems on certain os (os390, posix-bc) "* 1e-5" is used
    -# instead of "/ 1e5" at some places, (marked with USE_MUL). Other platforms
    -# BS2000, some Crays need USE_DIV instead.
    -# The BEGIN block is used to determine which of the two variants gives the
    -# correct result.
    -
    -# Beware of things like:
    -# $i = $i * $y + $car; $car = int($i / $MBASE); $i = $i % $MBASE;
    -# This works on x86, but fails on ARM (SA1100, iPAQ) due to whoknows what
    -# reasons. So, use this instead (slower, but correct):
    -# $i = $i * $y + $car; $car = int($i / $MBASE); $i -= $MBASE * $car;
    -
    -##############################################################################
    -# global constants, flags and accessory
    -
    -# announce that we are compatible with MBI v1.70 and up
    -sub api_version () { 1; }
    - 
    -# constants for easier life
    -my ($BASE,$BASE_LEN,$MBASE,$RBASE,$MAX_VAL,$BASE_LEN_SMALL);
    -my ($AND_BITS,$XOR_BITS,$OR_BITS);
    -my ($AND_MASK,$XOR_MASK,$OR_MASK);
    -
    -sub _base_len 
    -  {
    -  # set/get the BASE_LEN and assorted other, connected values
    -  # used only be the testsuite, set is used only by the BEGIN block below
    -  shift;
    -
    -  my $b = shift;
    -  if (defined $b)
    -    {
    -    # find whether we can use mul or div or none in mul()/div()
    -    # (in last case reduce BASE_LEN_SMALL)
    -    $BASE_LEN_SMALL = $b+1;
    -    my $caught = 0;
    -    while (--$BASE_LEN_SMALL > 5)
    -      {
    -      $MBASE = int("1e".$BASE_LEN_SMALL);
    -      $RBASE = abs('1e-'.$BASE_LEN_SMALL);		# see USE_MUL
    -      $caught = 0;
    -      $caught += 1 if (int($MBASE * $RBASE) != 1);	# should be 1
    -      $caught += 2 if (int($MBASE / $MBASE) != 1);	# should be 1
    -      last if $caught != 3;
    -      }
    -    # BASE_LEN is used for anything else than mul()/div()
    -    $BASE_LEN = $BASE_LEN_SMALL;
    -    $BASE_LEN = shift if (defined $_[0]);		# one more arg?
    -    $BASE = int("1e".$BASE_LEN);
    -
    -    $MBASE = int("1e".$BASE_LEN_SMALL);
    -    $RBASE = abs('1e-'.$BASE_LEN_SMALL);		# see USE_MUL
    -    $MAX_VAL = $MBASE-1;
    -   
    -    # avoid redefinitions
    - 
    -    undef &_mul;
    -    undef &_div;
    -
    -    # $caught & 1 != 0 => cannot use MUL
    -    # $caught & 2 != 0 => cannot use DIV
    -    # The parens around ($caught & 1) were important, indeed, if we would use
    -    # & here.
    -    if ($caught == 2)				# 2
    -      {
    -      # must USE_MUL since we cannot use DIV
    -      *{_mul} = \&_mul_use_mul;
    -      *{_div} = \&_div_use_mul;
    -      }
    -    else					# 0 or 1
    -      {
    -      # can USE_DIV instead
    -      *{_mul} = \&_mul_use_div;
    -      *{_div} = \&_div_use_div;
    -      }
    -    }
    -  return $BASE_LEN unless wantarray;
    -  return ($BASE_LEN, $AND_BITS, $XOR_BITS, $OR_BITS, $BASE_LEN_SMALL, $MAX_VAL, $BASE);
    -  }
    -
    -sub _new
    -  {
    -  # (ref to string) return ref to num_array
    -  # Convert a number from string format (without sign) to internal base
    -  # 1ex format. Assumes normalized value as input.
    -  my $il = length($_[1])-1;
    -
    -  # < BASE_LEN due len-1 above
    -  return [ int($_[1]) ] if $il < $BASE_LEN;	# shortcut for short numbers
    -
    -  # this leaves '00000' instead of int 0 and will be corrected after any op
    -  [ reverse(unpack("a" . ($il % $BASE_LEN+1) 
    -    . ("a$BASE_LEN" x ($il / $BASE_LEN)), $_[1])) ];
    -  }                                                                             
    -
    -BEGIN
    -  {
    -  # from Daniel Pfeiffer: determine largest group of digits that is precisely
    -  # multipliable with itself plus carry
    -  # Test now changed to expect the proper pattern, not a result off by 1 or 2
    -  my ($e, $num) = 3;	# lowest value we will use is 3+1-1 = 3
    -  do 
    -    {
    -    $num = ('9' x ++$e) + 0;
    -    $num *= $num + 1.0;
    -    } while ("$num" =~ /9{$e}0{$e}/);	# must be a certain pattern
    -  $e--; 				# last test failed, so retract one step
    -  # the limits below brush the problems with the test above under the rug:
    -  # the test should be able to find the proper $e automatically
    -  $e = 5 if $^O =~ /^uts/;	# UTS get's some special treatment
    -  $e = 5 if $^O =~ /^unicos/;	# unicos is also problematic (6 seems to work
    -				# there, but we play safe)
    -  $e = 5 if $] < 5.006;		# cap, for older Perls
    -  $e = 7 if $e > 7;		# cap, for VMS, OS/390 and other 64 bit systems
    -				# 8 fails inside random testsuite, so take 7
    -
    -  __PACKAGE__->_base_len($e);	# set and store
    -
    -  use integer;
    -  # find out how many bits _and, _or and _xor can take (old default = 16)
    -  # I don't think anybody has yet 128 bit scalars, so let's play safe.
    -  local $^W = 0;	# don't warn about 'nonportable number'
    -  $AND_BITS = 15; $XOR_BITS = 15; $OR_BITS = 15;
    -
    -  # find max bits, we will not go higher than numberofbits that fit into $BASE
    -  # to make _and etc simpler (and faster for smaller, slower for large numbers)
    -  my $max = 16;
    -  while (2 ** $max < $BASE) { $max++; }
    -  {
    -    no integer;
    -    $max = 16 if $] < 5.006;	# older Perls might not take >16 too well
    -  }
    -  my ($x,$y,$z);
    -  do {
    -    $AND_BITS++;
    -    $x = oct('0b' . '1' x $AND_BITS); $y = $x & $x;
    -    $z = (2 ** $AND_BITS) - 1;
    -    } while ($AND_BITS < $max && $x == $z && $y == $x);
    -  $AND_BITS --;						# retreat one step
    -  do {
    -    $XOR_BITS++;
    -    $x = oct('0b' . '1' x $XOR_BITS); $y = $x ^ 0;
    -    $z = (2 ** $XOR_BITS) - 1;
    -    } while ($XOR_BITS < $max && $x == $z && $y == $x);
    -  $XOR_BITS --;						# retreat one step
    -  do {
    -    $OR_BITS++;
    -    $x = oct('0b' . '1' x $OR_BITS); $y = $x | $x;
    -    $z = (2 ** $OR_BITS) - 1;
    -    } while ($OR_BITS < $max && $x == $z && $y == $x);
    -  $OR_BITS --;						# retreat one step
    -  
    -  $AND_MASK = __PACKAGE__->_new( ( 2 ** $AND_BITS ));
    -  $XOR_MASK = __PACKAGE__->_new( ( 2 ** $XOR_BITS ));
    -  $OR_MASK = __PACKAGE__->_new( ( 2 ** $OR_BITS ));
    -  }
    -
    -###############################################################################
    -
    -sub _zero
    -  {
    -  # create a zero
    -  [ 0 ];
    -  }
    -
    -sub _one
    -  {
    -  # create a one
    -  [ 1 ];
    -  }
    -
    -sub _two
    -  {
    -  # create a two (used internally for shifting)
    -  [ 2 ];
    -  }
    -
    -sub _ten
    -  {
    -  # create a 10 (used internally for shifting)
    -  [ 10 ];
    -  }
    -
    -sub _copy
    -  {
    -  # make a true copy
    -  [ @{$_[1]} ];
    -  }
    -
    -# catch and throw away
    -sub import { }
    -
    -##############################################################################
    -# convert back to string and number
    -
    -sub _str
    -  {
    -  # (ref to BINT) return num_str
    -  # Convert number from internal base 100000 format to string format.
    -  # internal format is always normalized (no leading zeros, "-0" => "+0")
    -  my $ar = $_[1];
    -
    -  my $l = scalar @$ar;				# number of parts
    -  if ($l < 1)					# should not happen
    -    {
    -    require Carp;
    -    Carp::croak("$_[1] has no elements");
    -    }
    -
    -  my $ret = "";
    -  # handle first one different to strip leading zeros from it (there are no
    -  # leading zero parts in internal representation)
    -  $l --; $ret .= int($ar->[$l]); $l--;
    -  # Interestingly, the pre-padd method uses more time
    -  # the old grep variant takes longer (14 vs. 10 sec)
    -  my $z = '0' x ($BASE_LEN-1);                            
    -  while ($l >= 0)
    -    {
    -    $ret .= substr($z.$ar->[$l],-$BASE_LEN); # fastest way I could think of
    -    $l--;
    -    }
    -  $ret;
    -  }                                                                             
    -
    -sub _num
    -  {
    -  # Make a number (scalar int/float) from a BigInt object 
    -  my $x = $_[1];
    -
    -  return 0+$x->[0] if scalar @$x == 1;  # below $BASE
    -  my $fac = 1;
    -  my $num = 0;
    -  foreach (@$x)
    -    {
    -    $num += $fac*$_; $fac *= $BASE;
    -    }
    -  $num; 
    -  }
    -
    -##############################################################################
    -# actual math code
    -
    -sub _add
    -  {
    -  # (ref to int_num_array, ref to int_num_array)
    -  # routine to add two base 1eX numbers
    -  # stolen from Knuth Vol 2 Algorithm A pg 231
    -  # there are separate routines to add and sub as per Knuth pg 233
    -  # This routine clobbers up array x, but not y.
    - 
    -  my ($c,$x,$y) = @_;
    -
    -  return $x if (@$y == 1) && $y->[0] == 0;		# $x + 0 => $x
    -  if ((@$x == 1) && $x->[0] == 0)			# 0 + $y => $y->copy
    -    {
    -    # twice as slow as $x = [ @$y ], but necc. to retain $x as ref :(
    -    @$x = @$y; return $x;		
    -    }
    - 
    -  # for each in Y, add Y to X and carry. If after that, something is left in
    -  # X, foreach in X add carry to X and then return X, carry
    -  # Trades one "$j++" for having to shift arrays
    -  my $i; my $car = 0; my $j = 0;
    -  for $i (@$y)
    -    {
    -    $x->[$j] -= $BASE if $car = (($x->[$j] += $i + $car) >= $BASE) ? 1 : 0;
    -    $j++;
    -    }
    -  while ($car != 0)
    -    {
    -    $x->[$j] -= $BASE if $car = (($x->[$j] += $car) >= $BASE) ? 1 : 0; $j++;
    -    }
    -  $x;
    -  }                                                                             
    -
    -sub _inc
    -  {
    -  # (ref to int_num_array, ref to int_num_array)
    -  # Add 1 to $x, modify $x in place
    -  my ($c,$x) = @_;
    -
    -  for my $i (@$x)
    -    {
    -    return $x if (($i += 1) < $BASE);		# early out
    -    $i = 0;					# overflow, next
    -    }
    -  push @$x,1 if (($x->[-1] || 0) == 0);		# last overflowed, so extend
    -  $x;
    -  }                                                                             
    -
    -sub _dec
    -  {
    -  # (ref to int_num_array, ref to int_num_array)
    -  # Sub 1 from $x, modify $x in place
    -  my ($c,$x) = @_;
    -
    -  my $MAX = $BASE-1;				# since MAX_VAL based on MBASE
    -  for my $i (@$x)
    -    {
    -    last if (($i -= 1) >= 0);			# early out
    -    $i = $MAX;					# underflow, next
    -    }
    -  pop @$x if $x->[-1] == 0 && @$x > 1;		# last underflowed (but leave 0)
    -  $x;
    -  }                                                                             
    -
    -sub _sub
    -  {
    -  # (ref to int_num_array, ref to int_num_array, swap)
    -  # subtract base 1eX numbers -- stolen from Knuth Vol 2 pg 232, $x > $y
    -  # subtract Y from X by modifying x in place
    -  my ($c,$sx,$sy,$s) = @_;
    - 
    -  my $car = 0; my $i; my $j = 0;
    -  if (!$s)
    -    {
    -    for $i (@$sx)
    -      {
    -      last unless defined $sy->[$j] || $car;
    -      $i += $BASE if $car = (($i -= ($sy->[$j] || 0) + $car) < 0); $j++;
    -      }
    -    # might leave leading zeros, so fix that
    -    return __strip_zeros($sx);
    -    }
    -  for $i (@$sx)
    -    {
    -    # we can't do an early out if $x is < than $y, since we
    -    # need to copy the high chunks from $y. Found by Bob Mathews.
    -    #last unless defined $sy->[$j] || $car;
    -    $sy->[$j] += $BASE
    -     if $car = (($sy->[$j] = $i-($sy->[$j]||0) - $car) < 0);
    -    $j++;
    -    }
    -  # might leave leading zeros, so fix that
    -  __strip_zeros($sy);
    -  }                                                                             
    -
    -sub _mul_use_mul
    -  {
    -  # (ref to int_num_array, ref to int_num_array)
    -  # multiply two numbers in internal representation
    -  # modifies first arg, second need not be different from first
    -  my ($c,$xv,$yv) = @_;
    -
    -  if (@$yv == 1)
    -    {
    -    # shortcut for two very short numbers (improved by Nathan Zook)
    -    # works also if xv and yv are the same reference, and handles also $x == 0
    -    if (@$xv == 1)
    -      {
    -      if (($xv->[0] *= $yv->[0]) >= $MBASE)
    -         {
    -         $xv->[0] = $xv->[0] - ($xv->[1] = int($xv->[0] * $RBASE)) * $MBASE;
    -         };
    -      return $xv;
    -      }
    -    # $x * 0 => 0
    -    if ($yv->[0] == 0)
    -      {
    -      @$xv = (0);
    -      return $xv;
    -      }
    -    # multiply a large number a by a single element one, so speed up
    -    my $y = $yv->[0]; my $car = 0;
    -    foreach my $i (@$xv)
    -      {
    -      $i = $i * $y + $car; $car = int($i * $RBASE); $i -= $car * $MBASE;
    -      }
    -    push @$xv, $car if $car != 0;
    -    return $xv;
    -    }
    -  # shortcut for result $x == 0 => result = 0
    -  return $xv if ( ((@$xv == 1) && ($xv->[0] == 0)) ); 
    -
    -  # since multiplying $x with $x fails, make copy in this case
    -  $yv = [@$xv] if $xv == $yv;	# same references?
    -
    -  my @prod = (); my ($prod,$car,$cty,$xi,$yi);
    -
    -  for $xi (@$xv)
    -    {
    -    $car = 0; $cty = 0;
    -
    -    # slow variant
    -#    for $yi (@$yv)
    -#      {
    -#      $prod = $xi * $yi + ($prod[$cty] || 0) + $car;
    -#      $prod[$cty++] =
    -#       $prod - ($car = int($prod * RBASE)) * $MBASE;  # see USE_MUL
    -#      }
    -#    $prod[$cty] += $car if $car; # need really to check for 0?
    -#    $xi = shift @prod;
    -
    -    # faster variant
    -    # looping through this if $xi == 0 is silly - so optimize it away!
    -    $xi = (shift @prod || 0), next if $xi == 0;
    -    for $yi (@$yv)
    -      {
    -      $prod = $xi * $yi + ($prod[$cty] || 0) + $car;
    -##     this is actually a tad slower
    -##        $prod = $prod[$cty]; $prod += ($car + $xi * $yi);	# no ||0 here
    -      $prod[$cty++] =
    -       $prod - ($car = int($prod * $RBASE)) * $MBASE;  # see USE_MUL
    -      }
    -    $prod[$cty] += $car if $car; # need really to check for 0?
    -    $xi = shift @prod || 0;	# || 0 makes v5.005_3 happy
    -    }
    -  push @$xv, @prod;
    -  __strip_zeros($xv);
    -  $xv;
    -  }                                                                             
    -
    -sub _mul_use_div
    -  {
    -  # (ref to int_num_array, ref to int_num_array)
    -  # multiply two numbers in internal representation
    -  # modifies first arg, second need not be different from first
    -  my ($c,$xv,$yv) = @_;
    - 
    -  if (@$yv == 1)
    -    {
    -    # shortcut for two small numbers, also handles $x == 0
    -    if (@$xv == 1)
    -      {
    -      # shortcut for two very short numbers (improved by Nathan Zook)
    -      # works also if xv and yv are the same reference, and handles also $x == 0
    -      if (($xv->[0] *= $yv->[0]) >= $MBASE)
    -          {
    -          $xv->[0] =
    -              $xv->[0] - ($xv->[1] = int($xv->[0] / $MBASE)) * $MBASE;
    -          };
    -      return $xv;
    -      }
    -    # $x * 0 => 0
    -    if ($yv->[0] == 0)
    -      {
    -      @$xv = (0);
    -      return $xv;
    -      }
    -    # multiply a large number a by a single element one, so speed up
    -    my $y = $yv->[0]; my $car = 0;
    -    foreach my $i (@$xv)
    -      {
    -      $i = $i * $y + $car; $car = int($i / $MBASE); $i -= $car * $MBASE;
    -      }
    -    push @$xv, $car if $car != 0;
    -    return $xv;
    -    }
    -  # shortcut for result $x == 0 => result = 0
    -  return $xv if ( ((@$xv == 1) && ($xv->[0] == 0)) ); 
    -
    -  # since multiplying $x with $x fails, make copy in this case
    -  $yv = [@$xv] if $xv == $yv;	# same references?
    -
    -  my @prod = (); my ($prod,$car,$cty,$xi,$yi);
    -  for $xi (@$xv)
    -    {
    -    $car = 0; $cty = 0;
    -    # looping through this if $xi == 0 is silly - so optimize it away!
    -    $xi = (shift @prod || 0), next if $xi == 0;
    -    for $yi (@$yv)
    -      {
    -      $prod = $xi * $yi + ($prod[$cty] || 0) + $car;
    -      $prod[$cty++] =
    -       $prod - ($car = int($prod / $MBASE)) * $MBASE;
    -      }
    -    $prod[$cty] += $car if $car; # need really to check for 0?
    -    $xi = shift @prod || 0;	# || 0 makes v5.005_3 happy
    -    }
    -  push @$xv, @prod;
    -  __strip_zeros($xv);
    -  $xv;
    -  }                                                                             
    -
    -sub _div_use_mul
    -  {
    -  # ref to array, ref to array, modify first array and return remainder if 
    -  # in list context
    -
    -  # see comments in _div_use_div() for more explanations
    -
    -  my ($c,$x,$yorg) = @_;
    -  
    -  # the general div algorithmn here is about O(N*N) and thus quite slow, so
    -  # we first check for some special cases and use shortcuts to handle them.
    -
    -  # This works, because we store the numbers in a chunked format where each
    -  # element contains 5..7 digits (depending on system).
    -
    -  # if both numbers have only one element:
    -  if (@$x == 1 && @$yorg == 1)
    -    {
    -    # shortcut, $yorg and $x are two small numbers
    -    if (wantarray)
    -      {
    -      my $r = [ $x->[0] % $yorg->[0] ];
    -      $x->[0] = int($x->[0] / $yorg->[0]);
    -      return ($x,$r); 
    -      }
    -    else
    -      {
    -      $x->[0] = int($x->[0] / $yorg->[0]);
    -      return $x; 
    -      }
    -    }
    -
    -  # if x has more than one, but y has only one element:
    -  if (@$yorg == 1)
    -    {
    -    my $rem;
    -    $rem = _mod($c,[ @$x ],$yorg) if wantarray;
    -
    -    # shortcut, $y is < $BASE
    -    my $j = scalar @$x; my $r = 0; 
    -    my $y = $yorg->[0]; my $b;
    -    while ($j-- > 0)
    -      {
    -      $b = $r * $MBASE + $x->[$j];
    -      $x->[$j] = int($b/$y);
    -      $r = $b % $y;
    -      }
    -    pop @$x if @$x > 1 && $x->[-1] == 0;	# splice up a leading zero 
    -    return ($x,$rem) if wantarray;
    -    return $x;
    -    }
    -
    -  # now x and y have more than one element
    -
    -  # check whether y has more elements than x, if yet, the result will be 0
    -  if (@$yorg > @$x)
    -    {
    -    my $rem;
    -    $rem = [@$x] if wantarray;                  # make copy
    -    splice (@$x,1);                             # keep ref to original array
    -    $x->[0] = 0;                                # set to 0
    -    return ($x,$rem) if wantarray;              # including remainder?
    -    return $x;					# only x, which is [0] now
    -    }
    -  # check whether the numbers have the same number of elements, in that case
    -  # the result will fit into one element and can be computed efficiently
    -  if (@$yorg == @$x)
    -    {
    -    my $rem;
    -    # if $yorg has more digits than $x (it's leading element is longer than
    -    # the one from $x), the result will also be 0:
    -    if (length(int($yorg->[-1])) > length(int($x->[-1])))
    -      {
    -      $rem = [@$x] if wantarray;		# make copy
    -      splice (@$x,1);				# keep ref to org array
    -      $x->[0] = 0;				# set to 0
    -      return ($x,$rem) if wantarray;		# including remainder?
    -      return $x;
    -      }
    -    # now calculate $x / $yorg
    -    if (length(int($yorg->[-1])) == length(int($x->[-1])))
    -      {
    -      # same length, so make full compare
    -
    -      my $a = 0; my $j = scalar @$x - 1;
    -      # manual way (abort if unequal, good for early ne)
    -      while ($j >= 0)
    -        {
    -        last if ($a = $x->[$j] - $yorg->[$j]); $j--;
    -        }
    -      # $a contains the result of the compare between X and Y
    -      # a < 0: x < y, a == 0: x == y, a > 0: x > y
    -      if ($a <= 0)
    -        {
    -        $rem = [ 0 ];                   # a = 0 => x == y => rem 0
    -        $rem = [@$x] if $a != 0;        # a < 0 => x < y => rem = x
    -        splice(@$x,1);                  # keep single element
    -        $x->[0] = 0;                    # if $a < 0
    -        $x->[0] = 1 if $a == 0;         # $x == $y
    -        return ($x,$rem) if wantarray;
    -        return $x;
    -        }
    -      # $x >= $y, so proceed normally
    -      }
    -    }
    -
    -  # all other cases:
    -
    -  my $y = [ @$yorg ];				# always make copy to preserve
    -
    -  my ($car,$bar,$prd,$dd,$xi,$yi,@q,$v2,$v1,@d,$tmp,$q,$u2,$u1,$u0);
    -
    -  $car = $bar = $prd = 0;
    -  if (($dd = int($MBASE/($y->[-1]+1))) != 1) 
    -    {
    -    for $xi (@$x) 
    -      {
    -      $xi = $xi * $dd + $car;
    -      $xi -= ($car = int($xi * $RBASE)) * $MBASE;	# see USE_MUL
    -      }
    -    push(@$x, $car); $car = 0;
    -    for $yi (@$y) 
    -      {
    -      $yi = $yi * $dd + $car;
    -      $yi -= ($car = int($yi * $RBASE)) * $MBASE;	# see USE_MUL
    -      }
    -    }
    -  else 
    -    {
    -    push(@$x, 0);
    -    }
    -  @q = (); ($v2,$v1) = @$y[-2,-1];
    -  $v2 = 0 unless $v2;
    -  while ($#$x > $#$y) 
    -    {
    -    ($u2,$u1,$u0) = @$x[-3..-1];
    -    $u2 = 0 unless $u2;
    -    #warn "oups v1 is 0, u0: $u0 $y->[-2] $y->[-1] l ",scalar @$y,"\n"
    -    # if $v1 == 0;
    -    $q = (($u0 == $v1) ? $MAX_VAL : int(($u0*$MBASE+$u1)/$v1));
    -    --$q while ($v2*$q > ($u0*$MBASE+$u1-$q*$v1)*$MBASE+$u2);
    -    if ($q)
    -      {
    -      ($car, $bar) = (0,0);
    -      for ($yi = 0, $xi = $#$x-$#$y-1; $yi <= $#$y; ++$yi,++$xi) 
    -        {
    -        $prd = $q * $y->[$yi] + $car;
    -        $prd -= ($car = int($prd * $RBASE)) * $MBASE;	# see USE_MUL
    -	$x->[$xi] += $MBASE if ($bar = (($x->[$xi] -= $prd + $bar) < 0));
    -	}
    -      if ($x->[-1] < $car + $bar) 
    -        {
    -        $car = 0; --$q;
    -	for ($yi = 0, $xi = $#$x-$#$y-1; $yi <= $#$y; ++$yi,++$xi) 
    -          {
    -	  $x->[$xi] -= $MBASE
    -	   if ($car = (($x->[$xi] += $y->[$yi] + $car) >= $MBASE));
    -	  }
    -	}   
    -      }
    -    pop(@$x);
    -    unshift(@q, $q);
    -    }
    -  if (wantarray) 
    -    {
    -    @d = ();
    -    if ($dd != 1)  
    -      {
    -      $car = 0; 
    -      for $xi (reverse @$x) 
    -        {
    -        $prd = $car * $MBASE + $xi;
    -        $car = $prd - ($tmp = int($prd / $dd)) * $dd; # see USE_MUL
    -        unshift(@d, $tmp);
    -        }
    -      }
    -    else 
    -      {
    -      @d = @$x;
    -      }
    -    @$x = @q;
    -    my $d = \@d; 
    -    __strip_zeros($x);
    -    __strip_zeros($d);
    -    return ($x,$d);
    -    }
    -  @$x = @q;
    -  __strip_zeros($x);
    -  $x;
    -  }
    -
    -sub _div_use_div
    -  {
    -  # ref to array, ref to array, modify first array and return remainder if 
    -  # in list context
    -  my ($c,$x,$yorg) = @_;
    -
    -  # the general div algorithmn here is about O(N*N) and thus quite slow, so
    -  # we first check for some special cases and use shortcuts to handle them.
    -
    -  # This works, because we store the numbers in a chunked format where each
    -  # element contains 5..7 digits (depending on system).
    -
    -  # if both numbers have only one element:
    -  if (@$x == 1 && @$yorg == 1)
    -    {
    -    # shortcut, $yorg and $x are two small numbers
    -    if (wantarray)
    -      {
    -      my $r = [ $x->[0] % $yorg->[0] ];
    -      $x->[0] = int($x->[0] / $yorg->[0]);
    -      return ($x,$r); 
    -      }
    -    else
    -      {
    -      $x->[0] = int($x->[0] / $yorg->[0]);
    -      return $x; 
    -      }
    -    }
    -  # if x has more than one, but y has only one element:
    -  if (@$yorg == 1)
    -    {
    -    my $rem;
    -    $rem = _mod($c,[ @$x ],$yorg) if wantarray;
    -
    -    # shortcut, $y is < $BASE
    -    my $j = scalar @$x; my $r = 0; 
    -    my $y = $yorg->[0]; my $b;
    -    while ($j-- > 0)
    -      {
    -      $b = $r * $MBASE + $x->[$j];
    -      $x->[$j] = int($b/$y);
    -      $r = $b % $y;
    -      }
    -    pop @$x if @$x > 1 && $x->[-1] == 0;	# splice up a leading zero 
    -    return ($x,$rem) if wantarray;
    -    return $x;
    -    }
    -  # now x and y have more than one element
    -
    -  # check whether y has more elements than x, if yet, the result will be 0
    -  if (@$yorg > @$x)
    -    {
    -    my $rem;
    -    $rem = [@$x] if wantarray;			# make copy
    -    splice (@$x,1);				# keep ref to original array
    -    $x->[0] = 0;				# set to 0
    -    return ($x,$rem) if wantarray;		# including remainder?
    -    return $x;					# only x, which is [0] now
    -    }
    -  # check whether the numbers have the same number of elements, in that case
    -  # the result will fit into one element and can be computed efficiently
    -  if (@$yorg == @$x)
    -    {
    -    my $rem;
    -    # if $yorg has more digits than $x (it's leading element is longer than
    -    # the one from $x), the result will also be 0:
    -    if (length(int($yorg->[-1])) > length(int($x->[-1])))
    -      {
    -      $rem = [@$x] if wantarray;		# make copy
    -      splice (@$x,1);				# keep ref to org array
    -      $x->[0] = 0;				# set to 0
    -      return ($x,$rem) if wantarray;		# including remainder?
    -      return $x;
    -      }
    -    # now calculate $x / $yorg
    -
    -    if (length(int($yorg->[-1])) == length(int($x->[-1])))
    -      {
    -      # same length, so make full compare
    -
    -      my $a = 0; my $j = scalar @$x - 1;
    -      # manual way (abort if unequal, good for early ne)
    -      while ($j >= 0)
    -        {
    -        last if ($a = $x->[$j] - $yorg->[$j]); $j--;
    -        }
    -      # $a contains the result of the compare between X and Y
    -      # a < 0: x < y, a == 0: x == y, a > 0: x > y
    -      if ($a <= 0)
    -        {
    -        $rem = [ 0 ];			# a = 0 => x == y => rem 0
    -        $rem = [@$x] if $a != 0;	# a < 0 => x < y => rem = x
    -        splice(@$x,1);			# keep single element
    -        $x->[0] = 0;			# if $a < 0
    -        $x->[0] = 1 if $a == 0; 	# $x == $y
    -        return ($x,$rem) if wantarray;	# including remainder?
    -        return $x;
    -        }
    -      # $x >= $y, so proceed normally
    -
    -      }
    -    }
    -
    -  # all other cases:
    -
    -  my $y = [ @$yorg ];				# always make copy to preserve
    - 
    -  my ($car,$bar,$prd,$dd,$xi,$yi,@q,$v2,$v1,@d,$tmp,$q,$u2,$u1,$u0);
    -
    -  $car = $bar = $prd = 0;
    -  if (($dd = int($MBASE/($y->[-1]+1))) != 1) 
    -    {
    -    for $xi (@$x) 
    -      {
    -      $xi = $xi * $dd + $car;
    -      $xi -= ($car = int($xi / $MBASE)) * $MBASE;
    -      }
    -    push(@$x, $car); $car = 0;
    -    for $yi (@$y) 
    -      {
    -      $yi = $yi * $dd + $car;
    -      $yi -= ($car = int($yi / $MBASE)) * $MBASE;
    -      }
    -    }
    -  else 
    -    {
    -    push(@$x, 0);
    -    }
    -
    -  # @q will accumulate the final result, $q contains the current computed
    -  # part of the final result
    -
    -  @q = (); ($v2,$v1) = @$y[-2,-1];
    -  $v2 = 0 unless $v2;
    -  while ($#$x > $#$y) 
    -    {
    -    ($u2,$u1,$u0) = @$x[-3..-1];
    -    $u2 = 0 unless $u2;
    -    #warn "oups v1 is 0, u0: $u0 $y->[-2] $y->[-1] l ",scalar @$y,"\n"
    -    # if $v1 == 0;
    -    $q = (($u0 == $v1) ? $MAX_VAL : int(($u0*$MBASE+$u1)/$v1));
    -    --$q while ($v2*$q > ($u0*$MBASE+$u1-$q*$v1)*$MBASE+$u2);
    -    if ($q)
    -      {
    -      ($car, $bar) = (0,0);
    -      for ($yi = 0, $xi = $#$x-$#$y-1; $yi <= $#$y; ++$yi,++$xi) 
    -        {
    -        $prd = $q * $y->[$yi] + $car;
    -        $prd -= ($car = int($prd / $MBASE)) * $MBASE;
    -	$x->[$xi] += $MBASE if ($bar = (($x->[$xi] -= $prd + $bar) < 0));
    -	}
    -      if ($x->[-1] < $car + $bar) 
    -        {
    -        $car = 0; --$q;
    -	for ($yi = 0, $xi = $#$x-$#$y-1; $yi <= $#$y; ++$yi,++$xi) 
    -          {
    -	  $x->[$xi] -= $MBASE
    -	   if ($car = (($x->[$xi] += $y->[$yi] + $car) >= $MBASE));
    -	  }
    -	}   
    -      }
    -    pop(@$x); unshift(@q, $q);
    -    }
    -  if (wantarray) 
    -    {
    -    @d = ();
    -    if ($dd != 1)  
    -      {
    -      $car = 0; 
    -      for $xi (reverse @$x) 
    -        {
    -        $prd = $car * $MBASE + $xi;
    -        $car = $prd - ($tmp = int($prd / $dd)) * $dd;
    -        unshift(@d, $tmp);
    -        }
    -      }
    -    else 
    -      {
    -      @d = @$x;
    -      }
    -    @$x = @q;
    -    my $d = \@d; 
    -    __strip_zeros($x);
    -    __strip_zeros($d);
    -    return ($x,$d);
    -    }
    -  @$x = @q;
    -  __strip_zeros($x);
    -  $x;
    -  }
    -
    -##############################################################################
    -# testing
    -
    -sub _acmp
    -  {
    -  # internal absolute post-normalized compare (ignore signs)
    -  # ref to array, ref to array, return <0, 0, >0
    -  # arrays must have at least one entry; this is not checked for
    -  my ($c,$cx,$cy) = @_;
    - 
    -  # shortcut for short numbers 
    -  return (($cx->[0] <=> $cy->[0]) <=> 0) 
    -   if scalar @$cx == scalar @$cy && scalar @$cx == 1;
    -
    -  # fast comp based on number of array elements (aka pseudo-length)
    -  my $lxy = (scalar @$cx - scalar @$cy)
    -  # or length of first element if same number of elements (aka difference 0)
    -    ||
    -  # need int() here because sometimes the last element is '00018' vs '18'
    -   (length(int($cx->[-1])) - length(int($cy->[-1])));
    -  return -1 if $lxy < 0;				# already differs, ret
    -  return 1 if $lxy > 0;					# ditto
    -
    -  # manual way (abort if unequal, good for early ne)
    -  my $a; my $j = scalar @$cx;
    -  while (--$j >= 0)
    -    {
    -    last if ($a = $cx->[$j] - $cy->[$j]);
    -    }
    -  $a <=> 0;
    -  }
    -
    -sub _len
    -  {
    -  # compute number of digits
    -
    -  # int() because add/sub sometimes leaves strings (like '00005') instead of
    -  # '5' in this place, thus causing length() to report wrong length
    -  my $cx = $_[1];
    -
    -  (@$cx-1)*$BASE_LEN+length(int($cx->[-1]));
    -  }
    -
    -sub _digit
    -  {
    -  # return the nth digit, negative values count backward
    -  # zero is rightmost, so _digit(123,0) will give 3
    -  my ($c,$x,$n) = @_;
    -
    -  my $len = _len('',$x);
    -
    -  $n = $len+$n if $n < 0;		# -1 last, -2 second-to-last
    -  $n = abs($n);				# if negative was too big
    -  $len--; $n = $len if $n > $len;	# n to big?
    -  
    -  my $elem = int($n / $BASE_LEN);	# which array element
    -  my $digit = $n % $BASE_LEN;		# which digit in this element
    -  $elem = '0' x $BASE_LEN . @$x[$elem];	# get element padded with 0's
    -  substr($elem,-$digit-1,1);
    -  }
    -
    -sub _zeros
    -  {
    -  # return amount of trailing zeros in decimal
    -  # check each array elem in _m for having 0 at end as long as elem == 0
    -  # Upon finding a elem != 0, stop
    -  my $x = $_[1];
    -
    -  return 0 if scalar @$x == 1 && $x->[0] == 0;
    -
    -  my $zeros = 0; my $elem;
    -  foreach my $e (@$x)
    -    {
    -    if ($e != 0)
    -      {
    -      $elem = "$e";				# preserve x
    -      $elem =~ s/.*?(0*$)/$1/;			# strip anything not zero
    -      $zeros *= $BASE_LEN;			# elems * 5
    -      $zeros += length($elem);			# count trailing zeros
    -      last;					# early out
    -      }
    -    $zeros ++;					# real else branch: 50% slower!
    -    }
    -  $zeros;
    -  }
    -
    -##############################################################################
    -# _is_* routines
    -
    -sub _is_zero
    -  {
    -  # return true if arg is zero 
    -  (((scalar @{$_[1]} == 1) && ($_[1]->[0] == 0))) <=> 0;
    -  }
    -
    -sub _is_even
    -  {
    -  # return true if arg is even
    -  (!($_[1]->[0] & 1)) <=> 0; 
    -  }
    -
    -sub _is_odd
    -  {
    -  # return true if arg is even
    -  (($_[1]->[0] & 1)) <=> 0; 
    -  }
    -
    -sub _is_one
    -  {
    -  # return true if arg is one
    -  (scalar @{$_[1]} == 1) && ($_[1]->[0] == 1) <=> 0; 
    -  }
    -
    -sub _is_two
    -  {
    -  # return true if arg is two 
    -  (scalar @{$_[1]} == 1) && ($_[1]->[0] == 2) <=> 0; 
    -  }
    -
    -sub _is_ten
    -  {
    -  # return true if arg is ten 
    -  (scalar @{$_[1]} == 1) && ($_[1]->[0] == 10) <=> 0; 
    -  }
    -
    -sub __strip_zeros
    -  {
    -  # internal normalization function that strips leading zeros from the array
    -  # args: ref to array
    -  my $s = shift;
    - 
    -  my $cnt = scalar @$s; # get count of parts
    -  my $i = $cnt-1;
    -  push @$s,0 if $i < 0;		# div might return empty results, so fix it
    -
    -  return $s if @$s == 1;		# early out
    -
    -  #print "strip: cnt $cnt i $i\n";
    -  # '0', '3', '4', '0', '0',
    -  #  0    1    2    3    4
    -  # cnt = 5, i = 4
    -  # i = 4
    -  # i = 3
    -  # => fcnt = cnt - i (5-2 => 3, cnt => 5-1 = 4, throw away from 4th pos)
    -  # >= 1: skip first part (this can be zero)
    -  while ($i > 0) { last if $s->[$i] != 0; $i--; }
    -  $i++; splice @$s,$i if ($i < $cnt); # $i cant be 0
    -  $s;                                                                    
    -  }                                                                             
    -
    -###############################################################################
    -# check routine to test internal state for corruptions
    -
    -sub _check
    -  {
    -  # used by the test suite
    -  my $x = $_[1];
    -
    -  return "$x is not a reference" if !ref($x);
    -
    -  # are all parts are valid?
    -  my $i = 0; my $j = scalar @$x; my ($e,$try);
    -  while ($i < $j)
    -    {
    -    $e = $x->[$i]; $e = 'undef' unless defined $e;
    -    $try = '=~ /^[\+]?[0-9]+\$/; '."($x, $e)";
    -    last if $e !~ /^[+]?[0-9]+$/;
    -    $try = '=~ /^[\+]?[0-9]+\$/; '."($x, $e) (stringify)";
    -    last if "$e" !~ /^[+]?[0-9]+$/;
    -    $try = '=~ /^[\+]?[0-9]+\$/; '."($x, $e) (cat-stringify)";
    -    last if '' . "$e" !~ /^[+]?[0-9]+$/;
    -    $try = ' < 0 || >= $BASE; '."($x, $e)";
    -    last if $e <0 || $e >= $BASE;
    -    # this test is disabled, since new/bnorm and certain ops (like early out
    -    # in add/sub) are allowed/expected to leave '00000' in some elements
    -    #$try = '=~ /^00+/; '."($x, $e)";
    -    #last if $e =~ /^00+/;
    -    $i++;
    -    }
    -  return "Illegal part '$e' at pos $i (tested: $try)" if $i < $j;
    -  0;
    -  }
    -
    -
    -###############################################################################
    -
    -sub _mod
    -  {
    -  # if possible, use mod shortcut
    -  my ($c,$x,$yo) = @_;
    -
    -  # slow way since $y to big
    -  if (scalar @$yo > 1)
    -    {
    -    my ($xo,$rem) = _div($c,$x,$yo);
    -    return $rem;
    -    }
    -
    -  my $y = $yo->[0];
    -  # both are single element arrays
    -  if (scalar @$x == 1)
    -    {
    -    $x->[0] %= $y;
    -    return $x;
    -    }
    -
    -  # @y is a single element, but @x has more than one element
    -  my $b = $BASE % $y;
    -  if ($b == 0)
    -    {
    -    # when BASE % Y == 0 then (B * BASE) % Y == 0
    -    # (B * BASE) % $y + A % Y => A % Y
    -    # so need to consider only last element: O(1)
    -    $x->[0] %= $y;
    -    }
    -  elsif ($b == 1)
    -    {
    -    # else need to go through all elements: O(N), but loop is a bit simplified
    -    my $r = 0;
    -    foreach (@$x)
    -      {
    -      $r = ($r + $_) % $y;		# not much faster, but heh...
    -      #$r += $_ % $y; $r %= $y;
    -      }
    -    $r = 0 if $r == $y;
    -    $x->[0] = $r;
    -    }
    -  else
    -    {
    -    # else need to go through all elements: O(N)
    -    my $r = 0; my $bm = 1;
    -    foreach (@$x)
    -      {
    -      $r = ($_ * $bm + $r) % $y;
    -      $bm = ($bm * $b) % $y;
    -
    -      #$r += ($_ % $y) * $bm;
    -      #$bm *= $b;
    -      #$bm %= $y;
    -      #$r %= $y;
    -      }
    -    $r = 0 if $r == $y;
    -    $x->[0] = $r;
    -    }
    -  splice (@$x,1);		# keep one element of $x
    -  $x;
    -  }
    -
    -##############################################################################
    -# shifts
    -
    -sub _rsft
    -  {
    -  my ($c,$x,$y,$n) = @_;
    -
    -  if ($n != 10)
    -    {
    -    $n = _new($c,$n); return _div($c,$x, _pow($c,$n,$y));
    -    }
    -
    -  # shortcut (faster) for shifting by 10)
    -  # multiples of $BASE_LEN
    -  my $dst = 0;				# destination
    -  my $src = _num($c,$y);		# as normal int
    -  my $xlen = (@$x-1)*$BASE_LEN+length(int($x->[-1]));  # len of x in digits
    -  if ($src >= $xlen or ($src == $xlen and ! defined $x->[1]))
    -    {
    -    # 12345 67890 shifted right by more than 10 digits => 0
    -    splice (@$x,1);                    # leave only one element
    -    $x->[0] = 0;                       # set to zero
    -    return $x;
    -    }
    -  my $rem = $src % $BASE_LEN;		# remainder to shift
    -  $src = int($src / $BASE_LEN);		# source
    -  if ($rem == 0)
    -    {
    -    splice (@$x,0,$src);		# even faster, 38.4 => 39.3
    -    }
    -  else
    -    {
    -    my $len = scalar @$x - $src;	# elems to go
    -    my $vd; my $z = '0'x $BASE_LEN;
    -    $x->[scalar @$x] = 0;		# avoid || 0 test inside loop
    -    while ($dst < $len)
    -      {
    -      $vd = $z.$x->[$src];
    -      $vd = substr($vd,-$BASE_LEN,$BASE_LEN-$rem);
    -      $src++;
    -      $vd = substr($z.$x->[$src],-$rem,$rem) . $vd;
    -      $vd = substr($vd,-$BASE_LEN,$BASE_LEN) if length($vd) > $BASE_LEN;
    -      $x->[$dst] = int($vd);
    -      $dst++;
    -      }
    -    splice (@$x,$dst) if $dst > 0;		# kill left-over array elems
    -    pop @$x if $x->[-1] == 0 && @$x > 1;	# kill last element if 0
    -    } # else rem == 0
    -  $x;
    -  }
    -
    -sub _lsft
    -  {
    -  my ($c,$x,$y,$n) = @_;
    -
    -  if ($n != 10)
    -    {
    -    $n = _new($c,$n); return _mul($c,$x, _pow($c,$n,$y));
    -    }
    -
    -  # shortcut (faster) for shifting by 10) since we are in base 10eX
    -  # multiples of $BASE_LEN:
    -  my $src = scalar @$x;			# source
    -  my $len = _num($c,$y);		# shift-len as normal int
    -  my $rem = $len % $BASE_LEN;		# remainder to shift
    -  my $dst = $src + int($len/$BASE_LEN);	# destination
    -  my $vd;				# further speedup
    -  $x->[$src] = 0;			# avoid first ||0 for speed
    -  my $z = '0' x $BASE_LEN;
    -  while ($src >= 0)
    -    {
    -    $vd = $x->[$src]; $vd = $z.$vd;
    -    $vd = substr($vd,-$BASE_LEN+$rem,$BASE_LEN-$rem);
    -    $vd .= $src > 0 ? substr($z.$x->[$src-1],-$BASE_LEN,$rem) : '0' x $rem;
    -    $vd = substr($vd,-$BASE_LEN,$BASE_LEN) if length($vd) > $BASE_LEN;
    -    $x->[$dst] = int($vd);
    -    $dst--; $src--;
    -    }
    -  # set lowest parts to 0
    -  while ($dst >= 0) { $x->[$dst--] = 0; }
    -  # fix spurios last zero element
    -  splice @$x,-1 if $x->[-1] == 0;
    -  $x;
    -  }
    -
    -sub _pow
    -  {
    -  # power of $x to $y
    -  # ref to array, ref to array, return ref to array
    -  my ($c,$cx,$cy) = @_;
    -
    -  if (scalar @$cy == 1 && $cy->[0] == 0)
    -    {
    -    splice (@$cx,1); $cx->[0] = 1;		# y == 0 => x => 1
    -    return $cx;
    -    }
    -  if ((scalar @$cx == 1 && $cx->[0] == 1) ||	#    x == 1
    -      (scalar @$cy == 1 && $cy->[0] == 1))	# or y == 1
    -    {
    -    return $cx;
    -    }
    -  if (scalar @$cx == 1 && $cx->[0] == 0)
    -    {
    -    splice (@$cx,1); $cx->[0] = 0;		# 0 ** y => 0 (if not y <= 0)
    -    return $cx;
    -    }
    -
    -  my $pow2 = _one();
    -
    -  my $y_bin = _as_bin($c,$cy); $y_bin =~ s/^0b//;
    -  my $len = length($y_bin);
    -  while (--$len > 0)
    -    {
    -    _mul($c,$pow2,$cx) if substr($y_bin,$len,1) eq '1';		# is odd?
    -    _mul($c,$cx,$cx);
    -    }
    -
    -  _mul($c,$cx,$pow2);
    -  $cx;
    -  }
    -
    -sub _fac
    -  {
    -  # factorial of $x
    -  # ref to array, return ref to array
    -  my ($c,$cx) = @_;
    -
    -  if ((@$cx == 1) && ($cx->[0] <= 2))
    -    {
    -    $cx->[0] ||= 1;		# 0 => 1, 1 => 1, 2 => 2
    -    return $cx;
    -    }
    -
    -  # go forward until $base is exceeded
    -  # limit is either $x steps (steps == 100 means a result always too high) or
    -  # $base.
    -  my $steps = 100; $steps = $cx->[0] if @$cx == 1;
    -  my $r = 2; my $cf = 3; my $step = 2; my $last = $r;
    -  while ($r*$cf < $BASE && $step < $steps)
    -    {
    -    $last = $r; $r *= $cf++; $step++;
    -    }
    -  if ((@$cx == 1) && $step == $cx->[0])
    -    {
    -    # completely done, so keep reference to $x and return
    -    $cx->[0] = $r;
    -    return $cx;
    -    }
    -  
    -  # now we must do the left over steps
    -  my $n;					# steps still to do
    -  if (scalar @$cx == 1)
    -    {
    -    $n = $cx->[0];
    -    }
    -  else
    -    {
    -    $n = _copy($c,$cx);
    -    }
    -
    -  $cx->[0] = $last; splice (@$cx,1);		# keep ref to $x
    -  my $zero_elements = 0;
    -
    -  # do left-over steps fit into a scalar?
    -  if (ref $n eq 'ARRAY')
    -    {
    -    # No, so use slower inc() & cmp()
    -    $step = [$step];
    -    while (_acmp($step,$n) <= 0)
    -      {
    -      # as soon as the last element of $cx is 0, we split it up and remember
    -      # how many zeors we got so far. The reason is that n! will accumulate
    -      # zeros at the end rather fast.
    -      if ($cx->[0] == 0)
    -        {
    -        $zero_elements ++; shift @$cx;
    -        }
    -      _mul($c,$cx,$step); _inc($c,$step);
    -      }
    -    }
    -  else
    -    {
    -    # Yes, so we can speed it up slightly
    -    while ($step <= $n)
    -      {
    -      # When the last element of $cx is 0, we split it up and remember
    -      # how many we got so far. The reason is that n! will accumulate
    -      # zeros at the end rather fast.
    -      if ($cx->[0] == 0)
    -        {
    -        $zero_elements ++; shift @$cx;
    -        }
    -      _mul($c,$cx,[$step]); $step++;
    -      }
    -    }
    -  # multiply in the zeros again
    -  while ($zero_elements-- > 0)
    -    {
    -    unshift @$cx, 0; 
    -    }
    -  $cx;			# return result
    -  }
    -
    -#############################################################################
    -
    -sub _log_int
    -  {
    -  # calculate integer log of $x to base $base
    -  # ref to array, ref to array - return ref to array
    -  my ($c,$x,$base) = @_;
    -
    -  # X == 0 => NaN
    -  return if (scalar @$x == 1 && $x->[0] == 0);
    -  # BASE 0 or 1 => NaN
    -  return if (scalar @$base == 1 && $base->[0] < 2);
    -  my $cmp = _acmp($c,$x,$base); # X == BASE => 1
    -  if ($cmp == 0)
    -    {
    -    splice (@$x,1); $x->[0] = 1;
    -    return ($x,1)
    -    }
    -  # X < BASE
    -  if ($cmp < 0)
    -    {
    -    splice (@$x,1); $x->[0] = 0;
    -    return ($x,undef);
    -    }
    -
    -  # this trial multiplication is very fast, even for large counts (like for
    -  # 2 ** 1024, since this still requires only 1024 very fast steps
    -  # (multiplication of a large number by a very small number is very fast))
    -  my $x_org = _copy($c,$x);		# preserve x
    -  splice(@$x,1); $x->[0] = 1;		# keep ref to $x
    -
    -  my $trial = _copy($c,$base);
    -
    -  # XXX TODO this only works if $base has only one element
    -  if (scalar @$base == 1)
    -    {
    -    # compute int ( length_in_base_10(X) / ( log(base) / log(10) ) )
    -    my $len = _len($c,$x_org);
    -    my $res = int($len / (log($base->[0]) / log(10))) || 1; # avoid $res == 0
    -
    -    $x->[0] = $res;
    -    $trial = _pow ($c, _copy($c, $base), $x);
    -    my $a = _acmp($x,$trial,$x_org);
    -    return ($x,1) if $a == 0;
    -    # we now know that $res is too small
    -    if ($res < 0)
    -      {
    -      _mul($c,$trial,$base); _add($c, $x, [1]);
    -      }
    -    else
    -      {
    -      # or too big
    -      _div($c,$trial,$base); _sub($c, $x, [1]);
    -      }
    -    # did we now get the right result?
    -    $a = _acmp($x,$trial,$x_org);
    -    return ($x,1) if $a == 0;		# yes, exactly
    -    # still too big
    -    if ($a > 0)
    -      {
    -      _div($c,$trial,$base); _sub($c, $x, [1]);
    -      }
    -    } 
    -  
    -  # simple loop that increments $x by two in each step, possible overstepping
    -  # the real result by one
    -
    -  my $a;
    -  my $base_mul = _mul($c, _copy($c,$base), $base);
    -
    -  while (($a = _acmp($c,$trial,$x_org)) < 0)
    -    {
    -    _mul($c,$trial,$base_mul); _add($c, $x, [2]);
    -    }
    -
    -  my $exact = 1;
    -  if ($a > 0)
    -    {
    -    # overstepped the result
    -    _dec($c, $x);
    -    _div($c,$trial,$base);
    -    $a = _acmp($c,$trial,$x_org);
    -    if ($a > 0)
    -      {
    -      _dec($c, $x);
    -      }
    -    $exact = 0 if $a != 0;
    -    }
    -  
    -  ($x,$exact);				# return result
    -  }
    -
    -# for debugging:
    -  use constant DEBUG => 0;
    -  my $steps = 0;
    -  sub steps { $steps };
    -
    -sub _sqrt
    -  {
    -  # square-root of $x in place
    -  # Compute a guess of the result (by rule of thumb), then improve it via
    -  # Newton's method.
    -  my ($c,$x) = @_;
    -
    -  if (scalar @$x == 1)
    -    {
    -    # fit's into one Perl scalar, so result can be computed directly
    -    $x->[0] = int(sqrt($x->[0]));
    -    return $x;
    -    } 
    -  my $y = _copy($c,$x);
    -  # hopefully _len/2 is < $BASE, the -1 is to always undershot the guess
    -  # since our guess will "grow"
    -  my $l = int((_len($c,$x)-1) / 2);	
    -
    -  my $lastelem = $x->[-1];					# for guess
    -  my $elems = scalar @$x - 1;
    -  # not enough digits, but could have more?
    -  if ((length($lastelem) <= 3) && ($elems > 1))
    -    {
    -    # right-align with zero pad
    -    my $len = length($lastelem) & 1;
    -    print "$lastelem => " if DEBUG;
    -    $lastelem .= substr($x->[-2] . '0' x $BASE_LEN,0,$BASE_LEN);
    -    # former odd => make odd again, or former even to even again
    -    $lastelem = $lastelem / 10 if (length($lastelem) & 1) != $len;
    -    print "$lastelem\n" if DEBUG;
    -    }
    -
    -  # construct $x (instead of _lsft($c,$x,$l,10)
    -  my $r = $l % $BASE_LEN;	# 10000 00000 00000 00000 ($BASE_LEN=5)
    -  $l = int($l / $BASE_LEN);
    -  print "l =  $l " if DEBUG;
    -
    -  splice @$x,$l;		# keep ref($x), but modify it
    -
    -  # we make the first part of the guess not '1000...0' but int(sqrt($lastelem))
    -  # that gives us:
    -  # 14400 00000 => sqrt(14400) => guess first digits to be 120
    -  # 144000 000000 => sqrt(144000) => guess 379
    -
    -  print "$lastelem (elems $elems) => " if DEBUG;
    -  $lastelem = $lastelem / 10 if ($elems & 1 == 1);		# odd or even?
    -  my $g = sqrt($lastelem); $g =~ s/\.//;			# 2.345 => 2345
    -  $r -= 1 if $elems & 1 == 0;					# 70 => 7
    -
    -  # padd with zeros if result is too short
    -  $x->[$l--] = int(substr($g . '0' x $r,0,$r+1));
    -  print "now ",$x->[-1] if DEBUG;
    -  print " would have been ", int('1' . '0' x $r),"\n" if DEBUG;
    -
    -  # If @$x > 1, we could compute the second elem of the guess, too, to create
    -  # an even better guess. Not implemented yet. Does it improve performance?
    -  $x->[$l--] = 0 while ($l >= 0);	# all other digits of guess are zero
    -
    -  print "start x= ",_str($c,$x),"\n" if DEBUG;
    -  my $two = _two();
    -  my $last = _zero();
    -  my $lastlast = _zero();
    -  $steps = 0 if DEBUG;
    -  while (_acmp($c,$last,$x) != 0 && _acmp($c,$lastlast,$x) != 0)
    -    {
    -    $steps++ if DEBUG;
    -    $lastlast = _copy($c,$last);
    -    $last = _copy($c,$x);
    -    _add($c,$x, _div($c,_copy($c,$y),$x));
    -    _div($c,$x, $two );
    -    print " x= ",_str($c,$x),"\n" if DEBUG;
    -    }
    -  print "\nsteps in sqrt: $steps, " if DEBUG;
    -  _dec($c,$x) if _acmp($c,$y,_mul($c,_copy($c,$x),$x)) < 0;	# overshot? 
    -  print " final ",$x->[-1],"\n" if DEBUG;
    -  $x;
    -  }
    -
    -sub _root
    -  {
    -  # take n'th root of $x in place (n >= 3)
    -  my ($c,$x,$n) = @_;
    - 
    -  if (scalar @$x == 1)
    -    {
    -    if (scalar @$n > 1)
    -      {
    -      # result will always be smaller than 2 so trunc to 1 at once
    -      $x->[0] = 1;
    -      }
    -    else
    -      {
    -      # fit's into one Perl scalar, so result can be computed directly
    -      # cannot use int() here, because it rounds wrongly (try 
    -      # (81 ** 3) ** (1/3) to see what I mean)
    -      #$x->[0] = int( $x->[0] ** (1 / $n->[0]) );
    -      # round to 8 digits, then truncate result to integer
    -      $x->[0] = int ( sprintf ("%.8f", $x->[0] ** (1 / $n->[0]) ) );
    -      }
    -    return $x;
    -    } 
    -
    -  # we know now that X is more than one element long
    -
    -  # if $n is a power of two, we can repeatedly take sqrt($X) and find the
    -  # proper result, because sqrt(sqrt($x)) == root($x,4)
    -  my $b = _as_bin($c,$n);
    -  if ($b =~ /0b1(0+)$/)
    -    {
    -    my $count = CORE::length($1);	# 0b100 => len('00') => 2
    -    my $cnt = $count;			# counter for loop
    -    unshift (@$x, 0);			# add one element, together with one
    -					# more below in the loop this makes 2
    -    while ($cnt-- > 0)
    -      {
    -      # 'inflate' $X by adding one element, basically computing
    -      # $x * $BASE * $BASE. This gives us more $BASE_LEN digits for result
    -      # since len(sqrt($X)) approx == len($x) / 2.
    -      unshift (@$x, 0);
    -      # calculate sqrt($x), $x is now one element to big, again. In the next
    -      # round we make that two, again.
    -      _sqrt($c,$x);
    -      }
    -    # $x is now one element to big, so truncate result by removing it
    -    splice (@$x,0,1);
    -    } 
    -  else
    -    {
    -    # trial computation by starting with 2,4,8,16 etc until we overstep
    -    my $step;
    -    my $trial = _two();
    -
    -    # while still to do more than X steps
    -    do
    -      {
    -      $step = _two();
    -      while (_acmp($c, _pow($c, _copy($c, $trial), $n), $x) < 0)
    -        {
    -        _mul ($c, $step, [2]);
    -        _add ($c, $trial, $step);
    -        }
    -
    -      # hit exactly?
    -      if (_acmp($c, _pow($c, _copy($c, $trial), $n), $x) == 0)
    -        {
    -        @$x = @$trial;			# make copy while preserving ref to $x
    -        return $x;
    -        }
    -      # overstepped, so go back on step
    -      _sub($c, $trial, $step);
    -      } while (scalar @$step > 1 || $step->[0] > 128);
    -
    -    # reset step to 2
    -    $step = _two();
    -    # add two, because $trial cannot be exactly the result (otherwise we would
    -    # alrady have found it)
    -    _add($c, $trial, $step);
    - 
    -    # and now add more and more (2,4,6,8,10 etc)
    -    while (_acmp($c, _pow($c, _copy($c, $trial), $n), $x) < 0)
    -      {
    -      _add ($c, $trial, $step);
    -      }
    -
    -    # hit not exactly? (overstepped)
    -    if (_acmp($c, _pow($c, _copy($c, $trial), $n), $x) > 0)
    -      {
    -      _dec($c,$trial);
    -      }
    -
    -    # hit not exactly? (overstepped)
    -    # 80 too small, 81 slightly too big, 82 too big
    -    if (_acmp($c, _pow($c, _copy($c, $trial), $n), $x) > 0)
    -      {
    -      _dec ($c, $trial); 
    -      }
    -
    -    @$x = @$trial;			# make copy while preserving ref to $x
    -    return $x;
    -    }
    -  $x; 
    -  }
    -
    -##############################################################################
    -# binary stuff
    -
    -sub _and
    -  {
    -  my ($c,$x,$y) = @_;
    -
    -  # the shortcut makes equal, large numbers _really_ fast, and makes only a
    -  # very small performance drop for small numbers (e.g. something with less
    -  # than 32 bit) Since we optimize for large numbers, this is enabled.
    -  return $x if _acmp($c,$x,$y) == 0;		# shortcut
    -  
    -  my $m = _one(); my ($xr,$yr);
    -  my $mask = $AND_MASK;
    -
    -  my $x1 = $x;
    -  my $y1 = _copy($c,$y);			# make copy
    -  $x = _zero();
    -  my ($b,$xrr,$yrr);
    -  use integer;
    -  while (!_is_zero($c,$x1) && !_is_zero($c,$y1))
    -    {
    -    ($x1, $xr) = _div($c,$x1,$mask);
    -    ($y1, $yr) = _div($c,$y1,$mask);
    -
    -    # make ints() from $xr, $yr
    -    # this is when the AND_BITS are greater than $BASE and is slower for
    -    # small (<256 bits) numbers, but faster for large numbers. Disabled
    -    # due to KISS principle
    -
    -#    $b = 1; $xrr = 0; foreach (@$xr) { $xrr += $_ * $b; $b *= $BASE; }
    -#    $b = 1; $yrr = 0; foreach (@$yr) { $yrr += $_ * $b; $b *= $BASE; }
    -#    _add($c,$x, _mul($c, _new( $c, ($xrr & $yrr) ), $m) );
    -    
    -    # 0+ due to '&' doesn't work in strings
    -    _add($c,$x, _mul($c, [ 0+$xr->[0] & 0+$yr->[0] ], $m) );
    -    _mul($c,$m,$mask);
    -    }
    -  $x;
    -  }
    -
    -sub _xor
    -  {
    -  my ($c,$x,$y) = @_;
    -
    -  return _zero() if _acmp($c,$x,$y) == 0;	# shortcut (see -and)
    -
    -  my $m = _one(); my ($xr,$yr);
    -  my $mask = $XOR_MASK;
    -
    -  my $x1 = $x;
    -  my $y1 = _copy($c,$y);			# make copy
    -  $x = _zero();
    -  my ($b,$xrr,$yrr);
    -  use integer;
    -  while (!_is_zero($c,$x1) && !_is_zero($c,$y1))
    -    {
    -    ($x1, $xr) = _div($c,$x1,$mask);
    -    ($y1, $yr) = _div($c,$y1,$mask);
    -    # make ints() from $xr, $yr (see _and())
    -    #$b = 1; $xrr = 0; foreach (@$xr) { $xrr += $_ * $b; $b *= $BASE; }
    -    #$b = 1; $yrr = 0; foreach (@$yr) { $yrr += $_ * $b; $b *= $BASE; }
    -    #_add($c,$x, _mul($c, _new( $c, ($xrr ^ $yrr) ), $m) );
    -
    -    # 0+ due to '^' doesn't work in strings
    -    _add($c,$x, _mul($c, [ 0+$xr->[0] ^ 0+$yr->[0] ], $m) );
    -    _mul($c,$m,$mask);
    -    }
    -  # the loop stops when the shorter of the two numbers is exhausted
    -  # the remainder of the longer one will survive bit-by-bit, so we simple
    -  # multiply-add it in
    -  _add($c,$x, _mul($c, $x1, $m) ) if !_is_zero($c,$x1);
    -  _add($c,$x, _mul($c, $y1, $m) ) if !_is_zero($c,$y1);
    -  
    -  $x;
    -  }
    -
    -sub _or
    -  {
    -  my ($c,$x,$y) = @_;
    -
    -  return $x if _acmp($c,$x,$y) == 0;		# shortcut (see _and)
    -
    -  my $m = _one(); my ($xr,$yr);
    -  my $mask = $OR_MASK;
    -
    -  my $x1 = $x;
    -  my $y1 = _copy($c,$y);			# make copy
    -  $x = _zero();
    -  my ($b,$xrr,$yrr);
    -  use integer;
    -  while (!_is_zero($c,$x1) && !_is_zero($c,$y1))
    -    {
    -    ($x1, $xr) = _div($c,$x1,$mask);
    -    ($y1, $yr) = _div($c,$y1,$mask);
    -    # make ints() from $xr, $yr (see _and())
    -#    $b = 1; $xrr = 0; foreach (@$xr) { $xrr += $_ * $b; $b *= $BASE; }
    -#    $b = 1; $yrr = 0; foreach (@$yr) { $yrr += $_ * $b; $b *= $BASE; }
    -#    _add($c,$x, _mul($c, _new( $c, ($xrr | $yrr) ), $m) );
    -    
    -    # 0+ due to '|' doesn't work in strings
    -    _add($c,$x, _mul($c, [ 0+$xr->[0] | 0+$yr->[0] ], $m) );
    -    _mul($c,$m,$mask);
    -    }
    -  # the loop stops when the shorter of the two numbers is exhausted
    -  # the remainder of the longer one will survive bit-by-bit, so we simple
    -  # multiply-add it in
    -  _add($c,$x, _mul($c, $x1, $m) ) if !_is_zero($c,$x1);
    -  _add($c,$x, _mul($c, $y1, $m) ) if !_is_zero($c,$y1);
    -  
    -  $x;
    -  }
    -
    -sub _as_hex
    -  {
    -  # convert a decimal number to hex (ref to array, return ref to string)
    -  my ($c,$x) = @_;
    -
    -  # fit's into one element (handle also 0x0 case)
    -  return sprintf("0x%x",$x->[0]) if @$x == 1;
    -
    -  my $x1 = _copy($c,$x);
    -
    -  my $es = '';
    -  my ($xr, $h, $x10000);
    -  if ($] >= 5.006)
    -    {
    -    $x10000 = [ 0x10000 ]; $h = 'h4';
    -    }
    -  else
    -    {
    -    $x10000 = [ 0x1000 ]; $h = 'h3';
    -    }
    -  while (@$x1 != 1 || $x1->[0] != 0)		# _is_zero()
    -    {
    -    ($x1, $xr) = _div($c,$x1,$x10000);
    -    $es .= unpack($h,pack('v',$xr->[0]));	# XXX TODO: why pack('v',...)?
    -    }
    -  $es = reverse $es;
    -  $es =~ s/^[0]+//;   # strip leading zeros
    -  '0x' . $es;					# return result prepended with 0x
    -  }
    -
    -sub _as_bin
    -  {
    -  # convert a decimal number to bin (ref to array, return ref to string)
    -  my ($c,$x) = @_;
    -
    -  # fit's into one element (and Perl recent enough), handle also 0b0 case
    -  # handle zero case for older Perls
    -  if ($] <= 5.005 && @$x == 1 && $x->[0] == 0)
    -    {
    -    my $t = '0b0'; return $t;
    -    }
    -  if (@$x == 1 && $] >= 5.006)
    -    {
    -    my $t = sprintf("0b%b",$x->[0]);
    -    return $t;
    -    }
    -  my $x1 = _copy($c,$x);
    -
    -  my $es = '';
    -  my ($xr, $b, $x10000);
    -  if ($] >= 5.006)
    -    {
    -    $x10000 = [ 0x10000 ]; $b = 'b16';
    -    }
    -  else
    -    {
    -    $x10000 = [ 0x1000 ]; $b = 'b12';
    -    }
    -  while (!(@$x1 == 1 && $x1->[0] == 0))		# _is_zero()
    -    {
    -    ($x1, $xr) = _div($c,$x1,$x10000);
    -    $es .= unpack($b,pack('v',$xr->[0]));	# XXX TODO: why pack('v',...)?
    -    # $es .= unpack($b,$xr->[0]);
    -    }
    -  $es = reverse $es;
    -  $es =~ s/^[0]+//;   # strip leading zeros
    -  '0b' . $es;					# return result prepended with 0b
    -  }
    -
    -sub _from_hex
    -  {
    -  # convert a hex number to decimal (ref to string, return ref to array)
    -  my ($c,$hs) = @_;
    -
    -  my $m = _new($c, 0x10000000);			# 28 bit at a time (<32 bit!)
    -  my $d = 7;					# 7 digits at a time
    -  if ($] <= 5.006)
    -    {
    -    # for older Perls, play safe
    -    $m = [ 0x10000 ];				# 16 bit at a time (<32 bit!)
    -    $d = 4;					# 4 digits at a time
    -    }
    -
    -  my $mul = _one();
    -  my $x = _zero();
    -
    -  my $len = int( (length($hs)-2)/$d );		# $d digit parts, w/o the '0x'
    -  my $val; my $i = -$d;
    -  while ($len >= 0)
    -    {
    -    $val = substr($hs,$i,$d);			# get hex digits
    -    $val =~ s/^[+-]?0x// if $len == 0;		# for last part only because
    -    $val = hex($val);				# hex does not like wrong chars
    -    $i -= $d; $len --;
    -    my $adder = [ $val ];
    -    # if the resulting number was to big to fit into one element, create a
    -    # two-element version (bug found by Mark Lakata - Thanx!)
    -    if (CORE::length($val) > $BASE_LEN)
    -      {
    -      $adder = _new($c,$val);
    -      }
    -    _add ($c, $x, _mul ($c, $adder, $mul ) ) if $val != 0;
    -    _mul ($c, $mul, $m ) if $len >= 0; 		# skip last mul
    -    }
    -  $x;
    -  }
    -
    -sub _from_bin
    -  {
    -  # convert a hex number to decimal (ref to string, return ref to array)
    -  my ($c,$bs) = @_;
    -
    -  # instead of converting X (8) bit at a time, it is faster to "convert" the
    -  # number to hex, and then call _from_hex.
    -
    -  my $hs = $bs;
    -  $hs =~ s/^[+-]?0b//;					# remove sign and 0b
    -  my $l = length($hs);					# bits
    -  $hs = '0' x (8-($l % 8)) . $hs if ($l % 8) != 0;	# padd left side w/ 0
    -  my $h = '0x' . unpack('H*', pack ('B*', $hs));	# repack as hex
    -  
    -  $c->_from_hex($h);
    -  }
    -
    -##############################################################################
    -# special modulus functions
    -
    -sub _modinv
    -  {
    -  # modular inverse
    -  my ($c,$x,$y) = @_;
    -
    -  my $u = _zero($c); my $u1 = _one($c);
    -  my $a = _copy($c,$y); my $b = _copy($c,$x);
    -
    -  # Euclid's Algorithm for bgcd(), only that we calc bgcd() ($a) and the
    -  # result ($u) at the same time. See comments in BigInt for why this works.
    -  my $q;
    -  ($a, $q, $b) = ($b, _div($c,$a,$b));		# step 1
    -  my $sign = 1;
    -  while (!_is_zero($c,$b))
    -    {
    -    my $t = _add($c, 				# step 2:
    -       _mul($c,_copy($c,$u1), $q) ,		#  t =  u1 * q
    -       $u );					#     + u
    -    $u = $u1;					#  u = u1, u1 = t
    -    $u1 = $t;
    -    $sign = -$sign;
    -    ($a, $q, $b) = ($b, _div($c,$a,$b));	# step 1
    -    }
    -
    -  # if the gcd is not 1, then return NaN
    -  return (undef,undef) unless _is_one($c,$a);
    - 
    -  ($u1, $sign == 1 ? '+' : '-');
    -  }
    -
    -sub _modpow
    -  {
    -  # modulus of power ($x ** $y) % $z
    -  my ($c,$num,$exp,$mod) = @_;
    -
    -  # in the trivial case,
    -  if (_is_one($c,$mod))
    -    {
    -    splice @$num,0,1; $num->[0] = 0;
    -    return $num;
    -    }
    -  if ((scalar @$num == 1) && (($num->[0] == 0) || ($num->[0] == 1)))
    -    {
    -    $num->[0] = 1;
    -    return $num;
    -    }
    -
    -#  $num = _mod($c,$num,$mod);	# this does not make it faster
    -
    -  my $acc = _copy($c,$num); my $t = _one();
    -
    -  my $expbin = _as_bin($c,$exp); $expbin =~ s/^0b//;
    -  my $len = length($expbin);
    -  while (--$len >= 0)
    -    {
    -    if ( substr($expbin,$len,1) eq '1')			# is_odd
    -      {
    -      _mul($c,$t,$acc);
    -      $t = _mod($c,$t,$mod);
    -      }
    -    _mul($c,$acc,$acc);
    -    $acc = _mod($c,$acc,$mod);
    -    }
    -  @$num = @$t;
    -  $num;
    -  }
    -
    -sub _gcd
    -  {
    -  # greatest common divisor
    -  my ($c,$x,$y) = @_;
    -
    -  while ( (scalar @$y != 1) || ($y->[0] != 0) )		# while ($y != 0)
    -    {
    -    my $t = _copy($c,$y);
    -    $y = _mod($c, $x, $y);
    -    $x = $t;
    -    }
    -  $x;
    -  }
    -
    -##############################################################################
    -##############################################################################
    -
    -1;
    -__END__
    -
    -=head1 NAME
    -
    -Math::BigInt::Calc - Pure Perl module to support Math::BigInt
    -
    -=head1 SYNOPSIS
    -
    -Provides support for big integer calculations. Not intended to be used by other
    -modules. Other modules which sport the same functions can also be used to support
    -Math::BigInt, like Math::BigInt::GMP or Math::BigInt::Pari.
    -
    -=head1 DESCRIPTION
    -
    -In order to allow for multiple big integer libraries, Math::BigInt was
    -rewritten to use library modules for core math routines. Any module which
    -follows the same API as this can be used instead by using the following:
    -
    -	use Math::BigInt lib => 'libname';
    -
    -'libname' is either the long name ('Math::BigInt::Pari'), or only the short
    -version like 'Pari'.
    -
    -=head1 STORAGE
    -
    -=head1 METHODS
    -
    -The following functions MUST be defined in order to support the use by
    -Math::BigInt v1.70 or later:
    -
    -	api_version()	return API version, minimum 1 for v1.70
    -	_new(string)	return ref to new object from ref to decimal string
    -	_zero()		return a new object with value 0
    -	_one()		return a new object with value 1
    -	_two()		return a new object with value 2
    -	_ten()		return a new object with value 10
    -
    -	_str(obj)	return ref to a string representing the object
    -	_num(obj)	returns a Perl integer/floating point number
    -			NOTE: because of Perl numeric notation defaults,
    -			the _num'ified obj may lose accuracy due to 
    -			machine-dependend floating point size limitations
    -                    
    -	_add(obj,obj)	Simple addition of two objects
    -	_mul(obj,obj)	Multiplication of two objects
    -	_div(obj,obj)	Division of the 1st object by the 2nd
    -			In list context, returns (result,remainder).
    -			NOTE: this is integer math, so no
    -			fractional part will be returned.
    -			The second operand will be not be 0, so no need to
    -			check for that.
    -	_sub(obj,obj)	Simple subtraction of 1 object from another
    -			a third, optional parameter indicates that the params
    -			are swapped. In this case, the first param needs to
    -			be preserved, while you can destroy the second.
    -			sub (x,y,1) => return x - y and keep x intact!
    -	_dec(obj)	decrement object by one (input is garant. to be > 0)
    -	_inc(obj)	increment object by one
    -
    -
    -	_acmp(obj,obj)	<=> operator for objects (return -1, 0 or 1)
    -
    -	_len(obj)	returns count of the decimal digits of the object
    -	_digit(obj,n)	returns the n'th decimal digit of object
    -
    -	_is_one(obj)	return true if argument is 1
    -	_is_two(obj)	return true if argument is 2
    -	_is_ten(obj)	return true if argument is 10
    -	_is_zero(obj)	return true if argument is 0
    -	_is_even(obj)	return true if argument is even (0,2,4,6..)
    -	_is_odd(obj)	return true if argument is odd (1,3,5,7..)
    -
    -	_copy		return a ref to a true copy of the object
    -
    -	_check(obj)	check whether internal representation is still intact
    -			return 0 for ok, otherwise error message as string
    -
    -	_from_hex(str)	return ref to new object from ref to hexadecimal string
    -	_from_bin(str)	return ref to new object from ref to binary string
    -	
    -	_as_hex(str)	return string containing the value as
    -			unsigned hex string, with the '0x' prepended.
    -			Leading zeros must be stripped.
    -	_as_bin(str)	Like as_hex, only as binary string containing only
    -			zeros and ones. Leading zeros must be stripped and a
    -			'0b' must be prepended.
    -	
    -	_rsft(obj,N,B)	shift object in base B by N 'digits' right
    -	_lsft(obj,N,B)	shift object in base B by N 'digits' left
    -	
    -	_xor(obj1,obj2)	XOR (bit-wise) object 1 with object 2
    -			Note: XOR, AND and OR pad with zeros if size mismatches
    -	_and(obj1,obj2)	AND (bit-wise) object 1 with object 2
    -	_or(obj1,obj2)	OR (bit-wise) object 1 with object 2
    -
    -	_mod(obj,obj)	Return remainder of div of the 1st by the 2nd object
    -	_sqrt(obj)	return the square root of object (truncated to int)
    -	_root(obj)	return the n'th (n >= 3) root of obj (truncated to int)
    -	_fac(obj)	return factorial of object 1 (1*2*3*4..)
    -	_pow(obj,obj)	return object 1 to the power of object 2
    -			return undef for NaN
    -	_zeros(obj)	return number of trailing decimal zeros
    -	_modinv		return inverse modulus
    -	_modpow		return modulus of power ($x ** $y) % $z
    -	_log_int(X,N)	calculate integer log() of X in base N
    -			X >= 0, N >= 0 (return undef for NaN)
    -			returns (RESULT, EXACT) where EXACT is:
    -			 1     : result is exactly RESULT
    -			 0     : result was truncated to RESULT
    -			 undef : unknown whether result is exactly RESULT
    -        _gcd(obj,obj)	return Greatest Common Divisor of two objects
    -
    -The following functions are optional, and can be defined if the underlying lib
    -has a fast way to do them. If undefined, Math::BigInt will use pure Perl (hence
    -slow) fallback routines to emulate these:
    -	
    -	_signed_or
    -	_signed_and
    -	_signed_xor
    -
    -
    -Input strings come in as unsigned but with prefix (i.e. as '123', '0xabc'
    -or '0b1101').
    -
    -So the library needs only to deal with unsigned big integers. Testing of input
    -parameter validity is done by the caller, so you need not worry about
    -underflow (f.i. in C<_sub()>, C<_dec()>) nor about division by zero or similar
    -cases.
    -
    -The first parameter can be modified, that includes the possibility that you
    -return a reference to a completely different object instead. Although keeping
    -the reference and just changing it's contents is prefered over creating and
    -returning a different reference.
    -
    -Return values are always references to objects, strings, or true/false for
    -comparisation routines.
    -
    -=head1 WRAP YOUR OWN
    -
    -If you want to port your own favourite c-lib for big numbers to the
    -Math::BigInt interface, you can take any of the already existing modules as
    -a rough guideline. You should really wrap up the latest BigInt and BigFloat
    -testsuites with your module, and replace in them any of the following:
    -
    -	use Math::BigInt;
    -
    -by this:
    -
    -	use Math::BigInt lib => 'yourlib';
    -
    -This way you ensure that your library really works 100% within Math::BigInt.
    -
    -=head1 LICENSE
    - 
    -This program is free software; you may redistribute it and/or modify it under
    -the same terms as Perl itself. 
    -
    -=head1 AUTHORS
    -
    -Original math code by Mark Biggar, rewritten by Tels L
    -in late 2000.
    -Seperated from BigInt and shaped API with the help of John Peacock.
    -
    -Fixed, speed-up, streamlined and enhanced by Tels 2001 - 2005.
    -
    -=head1 SEE ALSO
    -
    -L, L, L,
    -L, L and L.
    -
    -=cut
    diff --git a/lib/perl5/5.8.8/Math/BigInt/CalcEmu.pm b/lib/perl5/5.8.8/Math/BigInt/CalcEmu.pm
    deleted file mode 100644
    index f56b51a3..00000000
    --- a/lib/perl5/5.8.8/Math/BigInt/CalcEmu.pm
    +++ /dev/null
    @@ -1,329 +0,0 @@
    -package Math::BigInt::CalcEmu;
    -
    -use 5.005;
    -use strict;
    -# use warnings;	# dont use warnings for older Perls
    -use vars qw/$VERSION/;
    -
    -$VERSION = '0.05';
    -
    -package Math::BigInt;
    -
    -# See SYNOPSIS below.
    -
    -my $CALC_EMU;
    -
    -BEGIN
    -  {
    -  $CALC_EMU = Math::BigInt->config()->{'lib'};
    -  # register us with MBI to get notified of future lib changes
    -  Math::BigInt::_register_callback( __PACKAGE__, sub { $CALC_EMU = $_[0]; } );
    -  }
    -
    -sub __emu_band
    -  {
    -  my ($self,$x,$y,$sx,$sy,@r) = @_;
    -
    -  return $x->bzero(@r) if $y->is_zero() || $x->is_zero();
    -  
    -  my $sign = 0;					# sign of result
    -  $sign = 1 if $sx == -1 && $sy == -1;
    -
    -  my ($bx,$by);
    -
    -  if ($sx == -1)				# if x is negative
    -    {
    -    # two's complement: inc and flip all "bits" in $bx
    -    $bx = $x->binc()->as_hex();			# -1 => 0, -2 => 1, -3 => 2 etc
    -    $bx =~ s/-?0x//;
    -    $bx =~ tr/0123456789abcdef/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/;
    -    }
    -  else
    -    {
    -    $bx = $x->as_hex();				# get binary representation
    -    $bx =~ s/-?0x//;
    -    $bx =~ tr/fedcba9876543210/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/;
    -    }
    -  if ($sy == -1)				# if y is negative
    -    {
    -    # two's complement: inc and flip all "bits" in $by
    -    $by = $y->copy()->binc()->as_hex();		# -1 => 0, -2 => 1, -3 => 2 etc
    -    $by =~ s/-?0x//;
    -    $by =~ tr/0123456789abcdef/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/;
    -    }
    -  else
    -    {
    -    $by = $y->as_hex();				# get binary representation
    -    $by =~ s/-?0x//;
    -    $by =~ tr/fedcba9876543210/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/;
    -    }
    -  # now we have bit-strings from X and Y, reverse them for padding
    -  $bx = reverse $bx;
    -  $by = reverse $by;
    -
    -  # padd the shorter string
    -  my $xx = "\x00"; $xx = "\x0f" if $sx == -1;
    -  my $yy = "\x00"; $yy = "\x0f" if $sy == -1;
    -  my $diff = CORE::length($bx) - CORE::length($by);
    -  if ($diff > 0)
    -    {
    -    # if $yy eq "\x00", we can cut $bx, otherwise we need to padd $by
    -    $by .= $yy x $diff;
    -    }
    -  elsif ($diff < 0)
    -    {
    -    # if $xx eq "\x00", we can cut $by, otherwise we need to padd $bx
    -    $bx .= $xx x abs($diff);
    -    }
    -  
    -  # and the strings together
    -  my $r = $bx & $by;
    -
    -  # and reverse the result again
    -  $bx = reverse $r;
    -
    -  # One of $x or $y was negative, so need to flip bits in the result.
    -  # In both cases (one or two of them negative, or both positive) we need
    -  # to get the characters back.
    -  if ($sign == 1)
    -    {
    -    $bx =~ tr/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/0123456789abcdef/;
    -    }
    -  else
    -    {
    -    $bx =~ tr/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/fedcba9876543210/;
    -    }
    -
    -  # leading zeros will be stripped by _from_hex()
    -  $bx = '0x' . $bx;
    -  $x->{value} = $CALC_EMU->_from_hex( $bx );
    -
    -  # calculate sign of result
    -  $x->{sign} = '+';
    -  $x->{sign} = '-' if $sign == 1 && !$x->is_zero();
    -
    -  $x->bdec() if $sign == 1;
    -
    -  $x->round(@r);
    -  }
    -
    -sub __emu_bior
    -  {
    -  my ($self,$x,$y,$sx,$sy,@r) = @_;
    -
    -  return $x->round(@r) if $y->is_zero();
    -
    -  my $sign = 0;					# sign of result
    -  $sign = 1 if ($sx == -1) || ($sy == -1);
    -
    -  my ($bx,$by);
    -
    -  if ($sx == -1)				# if x is negative
    -    {
    -    # two's complement: inc and flip all "bits" in $bx
    -    $bx = $x->binc()->as_hex();			# -1 => 0, -2 => 1, -3 => 2 etc
    -    $bx =~ s/-?0x//;
    -    $bx =~ tr/0123456789abcdef/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/;
    -    }
    -  else
    -    {
    -    $bx = $x->as_hex();				# get binary representation
    -    $bx =~ s/-?0x//;
    -    $bx =~ tr/fedcba9876543210/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/;
    -    }
    -  if ($sy == -1)				# if y is negative
    -    {
    -    # two's complement: inc and flip all "bits" in $by
    -    $by = $y->copy()->binc()->as_hex();		# -1 => 0, -2 => 1, -3 => 2 etc
    -    $by =~ s/-?0x//;
    -    $by =~ tr/0123456789abcdef/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/;
    -    }
    -  else
    -    {
    -    $by = $y->as_hex();				# get binary representation
    -    $by =~ s/-?0x//;
    -    $by =~ tr/fedcba9876543210/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/;
    -    }
    -  # now we have bit-strings from X and Y, reverse them for padding
    -  $bx = reverse $bx;
    -  $by = reverse $by;
    -
    -  # padd the shorter string
    -  my $xx = "\x00"; $xx = "\x0f" if $sx == -1;
    -  my $yy = "\x00"; $yy = "\x0f" if $sy == -1;
    -  my $diff = CORE::length($bx) - CORE::length($by);
    -  if ($diff > 0)
    -    {
    -    $by .= $yy x $diff;
    -    }
    -  elsif ($diff < 0)
    -    {
    -    $bx .= $xx x abs($diff);
    -    }
    -
    -  # or the strings together
    -  my $r = $bx | $by;
    -
    -  # and reverse the result again
    -  $bx = reverse $r;
    -
    -  # one of $x or $y was negative, so need to flip bits in the result
    -  # in both cases (one or two of them negative, or both positive) we need
    -  # to get the characters back.
    -  if ($sign == 1)
    -    {
    -    $bx =~ tr/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/0123456789abcdef/;
    -    }
    -  else
    -    {
    -    $bx =~ tr/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/fedcba9876543210/;
    -    }
    -
    -  # leading zeros will be stripped by _from_hex()
    -  $bx = '0x' . $bx;
    -  $x->{value} = $CALC_EMU->_from_hex( $bx );
    -
    -  # calculate sign of result
    -  $x->{sign} = '+';
    -  $x->{sign} = '-' if $sign == 1 && !$x->is_zero();
    -
    -  # if one of X or Y was negative, we need to decrement result
    -  $x->bdec() if $sign == 1;
    -
    -  $x->round(@r);
    -  }
    -
    -sub __emu_bxor
    -  {
    -  my ($self,$x,$y,$sx,$sy,@r) = @_;
    -
    -  return $x->round(@r) if $y->is_zero();
    -
    -  my $sign = 0;					# sign of result
    -  $sign = 1 if $x->{sign} ne $y->{sign};
    -
    -  my ($bx,$by);
    -
    -  if ($sx == -1)				# if x is negative
    -    {
    -    # two's complement: inc and flip all "bits" in $bx
    -    $bx = $x->binc()->as_hex();			# -1 => 0, -2 => 1, -3 => 2 etc
    -    $bx =~ s/-?0x//;
    -    $bx =~ tr/0123456789abcdef/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/;
    -    }
    -  else
    -    {
    -    $bx = $x->as_hex();				# get binary representation
    -    $bx =~ s/-?0x//;
    -    $bx =~ tr/fedcba9876543210/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/;
    -    }
    -  if ($sy == -1)				# if y is negative
    -    {
    -    # two's complement: inc and flip all "bits" in $by
    -    $by = $y->copy()->binc()->as_hex();		# -1 => 0, -2 => 1, -3 => 2 etc
    -    $by =~ s/-?0x//;
    -    $by =~ tr/0123456789abcdef/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/;
    -    }
    -  else
    -    {
    -    $by = $y->as_hex();				# get binary representation
    -    $by =~ s/-?0x//;
    -    $by =~ tr/fedcba9876543210/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/;
    -    }
    -  # now we have bit-strings from X and Y, reverse them for padding
    -  $bx = reverse $bx;
    -  $by = reverse $by;
    -
    -  # padd the shorter string
    -  my $xx = "\x00"; $xx = "\x0f" if $sx == -1;
    -  my $yy = "\x00"; $yy = "\x0f" if $sy == -1;
    -  my $diff = CORE::length($bx) - CORE::length($by);
    -  if ($diff > 0)
    -    {
    -    $by .= $yy x $diff;
    -    }
    -  elsif ($diff < 0)
    -    {
    -    $bx .= $xx x abs($diff);
    -    }
    -
    -  # xor the strings together
    -  my $r = $bx ^ $by;
    -
    -  # and reverse the result again
    -  $bx = reverse $r;
    -
    -  # one of $x or $y was negative, so need to flip bits in the result
    -  # in both cases (one or two of them negative, or both positive) we need
    -  # to get the characters back.
    -  if ($sign == 1)
    -    {
    -    $bx =~ tr/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/0123456789abcdef/;
    -    }
    -  else
    -    {
    -    $bx =~ tr/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/fedcba9876543210/;
    -    }
    -
    -  # leading zeros will be stripped by _from_hex()
    -  $bx = '0x' . $bx;
    -  $x->{value} = $CALC_EMU->_from_hex( $bx );
    -
    -  # calculate sign of result
    -  $x->{sign} = '+';
    -  $x->{sign} = '-' if $sx != $sy && !$x->is_zero();
    -
    -  $x->bdec() if $sign == 1;
    -
    -  $x->round(@r);
    -  }
    -
    -##############################################################################
    -##############################################################################
    -
    -1;
    -__END__
    -
    -=head1 NAME
    -
    -Math::BigInt::CalcEmu - Emulate low-level math with BigInt code
    -
    -=head1 SYNOPSIS
    -
    -	use Math::BigInt::CalcEmu;
    -
    -=head1 DESCRIPTION
    -
    -Contains routines that emulate low-level math functions in BigInt, e.g.
    -optional routines the low-level math package does not provide on it's own.
    -
    -Will be loaded on demand and called automatically by BigInt.
    -
    -Stuff here is really low-priority to optimize, since it is far better to
    -implement the operation in the low-level math libary directly, possible even
    -using a call to the native lib.
    -
    -=head1 METHODS
    -
    -=head2 __emu_bxor
    -
    -=head2 __emu_band
    -
    -=head2 __emu_bior
    -
    -=head1 LICENSE
    - 
    -This program is free software; you may redistribute it and/or modify it under
    -the same terms as Perl itself. 
    -
    -=head1 AUTHORS
    -
    -(c) Tels http://bloodgate.com 2003, 2004 - based on BigInt code by
    -Tels from 2001-2003.
    -
    -=head1 SEE ALSO
    -
    -L, L, L,
    -L and L.
    -
    -=cut
    diff --git a/lib/perl5/5.8.8/Math/BigInt/Trace.pm b/lib/perl5/5.8.8/Math/BigInt/Trace.pm
    deleted file mode 100644
    index 4733d226..00000000
    --- a/lib/perl5/5.8.8/Math/BigInt/Trace.pm
    +++ /dev/null
    @@ -1,47 +0,0 @@
    -#!/usr/bin/perl -w
    -
    -package Math::BigInt::Trace;
    -
    -require 5.005_02;
    -use strict;
    -
    -use Exporter;
    -use Math::BigInt;
    -use vars qw($VERSION @ISA $PACKAGE @EXPORT_OK
    -            $accuracy $precision $round_mode $div_scale);
    -
    -@ISA = qw(Exporter Math::BigInt);
    -
    -$VERSION = 0.01;
    -
    -use overload;	# inherit overload from BigInt
    -
    -# Globals
    -$accuracy = $precision = undef;
    -$round_mode = 'even';
    -$div_scale = 40;
    -
    -sub new
    -{
    -        my $proto  = shift;
    -        my $class  = ref($proto) || $proto;
    -
    -        my $value       = shift;
    -	my $a = $accuracy; $a = $_[0] if defined $_[0];
    -	my $p = $precision; $p = $_[1] if defined $_[1];
    -        my $self = Math::BigInt->new($value,$a,$p,$round_mode);
    -	bless $self,$class;
    -	print "MBI new '$value' => '$self' (",ref($self),")";
    -        return $self;
    -}
    -
    -sub import
    -  {
    -  print "MBI import ",join(' ',@_);
    -  my $self = shift;
    -  Math::BigInt::import($self,@_);		# need it for subclasses
    -#  $self->export_to_level(1,$self,@_);		# need this ?
    -  @_ = ();
    -  }
    -
    -1;
    diff --git a/lib/perl5/5.8.8/Math/BigRat.pm b/lib/perl5/5.8.8/Math/BigRat.pm
    deleted file mode 100644
    index 6243dd4c..00000000
    --- a/lib/perl5/5.8.8/Math/BigRat.pm
    +++ /dev/null
    @@ -1,1688 +0,0 @@
    -
    -#
    -# "Tax the rat farms." - Lord Vetinari
    -#
    -
    -# The following hash values are used:
    -#   sign : +,-,NaN,+inf,-inf
    -#   _d   : denominator
    -#   _n   : numeraotr (value = _n/_d)
    -#   _a   : accuracy
    -#   _p   : precision
    -# You should not look at the innards of a BigRat - use the methods for this.
    -
    -package Math::BigRat;
    -
    -require 5.005_03;
    -use strict;
    -
    -use Math::BigFloat;
    -use vars qw($VERSION @ISA $upgrade $downgrade
    -            $accuracy $precision $round_mode $div_scale $_trap_nan $_trap_inf);
    -
    -@ISA = qw(Math::BigFloat);
    -
    -$VERSION = '0.15';
    -
    -use overload;			# inherit overload from Math::BigFloat
    -
    -BEGIN
    -  { 
    -  *objectify = \&Math::BigInt::objectify; 	# inherit this from BigInt
    -  *AUTOLOAD = \&Math::BigFloat::AUTOLOAD;	# can't inherit AUTOLOAD
    -  # we inherit these from BigFloat because currently it is not possible
    -  # that MBF has a different $MBI variable than we, because MBF also uses
    -  # Math::BigInt::config->('lib'); (there is always only one library loaded)
    -  *_e_add = \&Math::BigFloat::_e_add;
    -  *_e_sub = \&Math::BigFloat::_e_sub;
    -  *as_int = \&as_number;
    -  *is_pos = \&is_positive;
    -  *is_neg = \&is_negative;
    -  }
    -
    -##############################################################################
    -# Global constants and flags. Access these only via the accessor methods!
    -
    -$accuracy = $precision = undef;
    -$round_mode = 'even';
    -$div_scale = 40;
    -$upgrade = undef;
    -$downgrade = undef;
    -
    -# These are internally, and not to be used from the outside at all!
    -
    -$_trap_nan = 0;                         # are NaNs ok? set w/ config()
    -$_trap_inf = 0;                         # are infs ok? set w/ config()
    -
    -# the package we are using for our private parts, defaults to:
    -# Math::BigInt->config()->{lib}
    -my $MBI = 'Math::BigInt::Calc';
    -
    -my $nan = 'NaN';
    -my $class = 'Math::BigRat';
    -
    -sub isa
    -  {
    -  return 0 if $_[1] =~ /^Math::Big(Int|Float)/;		# we aren't
    -  UNIVERSAL::isa(@_);
    -  }
    -
    -##############################################################################
    -
    -sub _new_from_float
    -  {
    -  # turn a single float input into a rational number (like '0.1')
    -  my ($self,$f) = @_;
    -
    -  return $self->bnan() if $f->is_nan();
    -  return $self->binf($f->{sign}) if $f->{sign} =~ /^[+-]inf$/;
    -
    -  $self->{_n} = $MBI->_copy( $f->{_m} );	# mantissa
    -  $self->{_d} = $MBI->_one();
    -  $self->{sign} = $f->{sign} || '+';
    -  if ($f->{_es} eq '-')
    -    {
    -    # something like Math::BigRat->new('0.1');
    -    # 1 / 1 => 1/10
    -    $MBI->_lsft ( $self->{_d}, $f->{_e} ,10);	
    -    }
    -  else
    -    {
    -    # something like Math::BigRat->new('10');
    -    # 1 / 1 => 10/1
    -    $MBI->_lsft ( $self->{_n}, $f->{_e} ,10) unless 
    -      $MBI->_is_zero($f->{_e});	
    -    }
    -  $self;
    -  }
    -
    -sub new
    -  {
    -  # create a Math::BigRat
    -  my $class = shift;
    -
    -  my ($n,$d) = @_;
    -
    -  my $self = { }; bless $self,$class;
    - 
    -  # input like (BigInt) or (BigFloat):
    -  if ((!defined $d) && (ref $n) && (!$n->isa('Math::BigRat')))
    -    {
    -    if ($n->isa('Math::BigFloat'))
    -      {
    -      $self->_new_from_float($n);
    -      }
    -    if ($n->isa('Math::BigInt'))
    -      {
    -      # TODO: trap NaN, inf
    -      $self->{_n} = $MBI->_copy($n->{value});		# "mantissa" = N
    -      $self->{_d} = $MBI->_one();			# d => 1
    -      $self->{sign} = $n->{sign};
    -      }
    -    if ($n->isa('Math::BigInt::Lite'))
    -      {
    -      # TODO: trap NaN, inf
    -      $self->{sign} = '+'; $self->{sign} = '-' if $$n < 0;
    -      $self->{_n} = $MBI->_new(abs($$n));		# "mantissa" = N
    -      $self->{_d} = $MBI->_one();			# d => 1
    -      }
    -    return $self->bnorm();				# normalize (120/1 => 12/10)
    -    }
    -
    -  # input like (BigInt,BigInt) or (BigLite,BigLite):
    -  if (ref($d) && ref($n))
    -    {
    -    # do N first (for $self->{sign}):
    -    if ($n->isa('Math::BigInt'))
    -      {
    -      # TODO: trap NaN, inf
    -      $self->{_n} = $MBI->_copy($n->{value});		# "mantissa" = N
    -      $self->{sign} = $n->{sign};
    -      }
    -    elsif ($n->isa('Math::BigInt::Lite'))
    -      {
    -      # TODO: trap NaN, inf
    -      $self->{sign} = '+'; $self->{sign} = '-' if $$n < 0;
    -      $self->{_n} = $MBI->_new(abs($$n));		# "mantissa" = $n
    -      }
    -    else
    -      {
    -      require Carp;
    -      Carp::croak(ref($n) . " is not a recognized object format for Math::BigRat->new");
    -      }
    -    # now D:
    -    if ($d->isa('Math::BigInt'))
    -      {
    -      # TODO: trap NaN, inf
    -      $self->{_d} = $MBI->_copy($d->{value});		# "mantissa" = D
    -      # +/+ or -/- => +, +/- or -/+ => -
    -      $self->{sign} = $d->{sign} ne $self->{sign} ? '-' : '+';
    -      }
    -    elsif ($d->isa('Math::BigInt::Lite'))
    -      {
    -      # TODO: trap NaN, inf
    -      $self->{_d} = $MBI->_new(abs($$d));		# "mantissa" = D
    -      my $ds = '+'; $ds = '-' if $$d < 0;
    -      # +/+ or -/- => +, +/- or -/+ => -
    -      $self->{sign} = $ds ne $self->{sign} ? '-' : '+';
    -      }
    -    else
    -      {
    -      require Carp;
    -      Carp::croak(ref($d) . " is not a recognized object format for Math::BigRat->new");
    -      }
    -    return $self->bnorm();				# normalize (120/1 => 12/10)
    -    }
    -  return $n->copy() if ref $n;				# already a BigRat
    -
    -  if (!defined $n)
    -    {
    -    $self->{_n} = $MBI->_zero();			# undef => 0
    -    $self->{_d} = $MBI->_one();
    -    $self->{sign} = '+';
    -    return $self;
    -    }
    -
    -  # string input with / delimiter
    -  if ($n =~ /\s*\/\s*/)
    -    {
    -    return $class->bnan() if $n =~ /\/.*\//;	# 1/2/3 isn't valid
    -    return $class->bnan() if $n =~ /\/\s*$/;	# 1/ isn't valid
    -    ($n,$d) = split (/\//,$n);
    -    # try as BigFloats first
    -    if (($n =~ /[\.eE]/) || ($d =~ /[\.eE]/))
    -      {
    -      local $Math::BigFloat::accuracy = undef;
    -      local $Math::BigFloat::precision = undef;
    -
    -      # one of them looks like a float 
    -      my $nf = Math::BigFloat->new($n,undef,undef);
    -      $self->{sign} = '+';
    -      return $self->bnan() if $nf->is_nan();
    -
    -      $self->{_n} = $MBI->_copy( $nf->{_m} );	# get mantissa
    -
    -      # now correct $self->{_n} due to $n
    -      my $f = Math::BigFloat->new($d,undef,undef);
    -      return $self->bnan() if $f->is_nan();
    -      $self->{_d} = $MBI->_copy( $f->{_m} );
    -
    -      # calculate the difference between nE and dE
    -      # XXX TODO: check that exponent() makes a copy to avoid copy()
    -      my $diff_e = $nf->exponent()->copy()->bsub( $f->exponent);
    -      if ($diff_e->is_negative())
    -	{
    -        # < 0: mul d with it
    -        $MBI->_lsft( $self->{_d}, $MBI->_new( $diff_e->babs()), 10);
    -	}
    -      elsif (!$diff_e->is_zero())
    -        {
    -        # > 0: mul n with it
    -        $MBI->_lsft( $self->{_n}, $MBI->_new( $diff_e), 10);
    -        }
    -      }
    -    else
    -      {
    -      # both d and n look like (big)ints
    -
    -      $self->{sign} = '+';					# no sign => '+'
    -      $self->{_n} = undef;
    -      $self->{_d} = undef;
    -      if ($n =~ /^([+-]?)0*(\d+)\z/)				# first part ok?
    -	{
    -	$self->{sign} = $1 || '+';				# no sign => '+'
    -	$self->{_n} = $MBI->_new($2 || 0);
    -        }
    -
    -      if ($d =~ /^([+-]?)0*(\d+)\z/)				# second part ok?
    -	{
    -	$self->{sign} =~ tr/+-/-+/ if ($1 || '') eq '-';	# negate if second part neg.
    -	$self->{_d} = $MBI->_new($2 || 0);
    -        }
    -
    -      if (!defined $self->{_n} || !defined $self->{_d})
    -	{
    -        $d = Math::BigInt->new($d,undef,undef) unless ref $d;
    -        $n = Math::BigInt->new($n,undef,undef) unless ref $n;
    -
    -        if ($n->{sign} =~ /^[+-]$/ && $d->{sign} =~ /^[+-]$/)
    -	  { 
    -	  # both parts are ok as integers (wierd things like ' 1e0'
    -          $self->{_n} = $MBI->_copy($n->{value});
    -          $self->{_d} = $MBI->_copy($d->{value});
    -          $self->{sign} = $n->{sign};
    -          $self->{sign} =~ tr/+-/-+/ if $d->{sign} eq '-';	# -1/-2 => 1/2
    -          return $self->bnorm();
    -	  }
    -
    -        $self->{sign} = '+';					# a default sign
    -        return $self->bnan() if $n->is_nan() || $d->is_nan();
    -
    -	# handle inf cases:
    -        if ($n->is_inf() || $d->is_inf())
    -	  {
    -	  if ($n->is_inf())
    -	    {
    -	    return $self->bnan() if $d->is_inf();		# both are inf => NaN
    -	    my $s = '+'; 		# '+inf/+123' or '-inf/-123'
    -	    $s = '-' if substr($n->{sign},0,1) ne $d->{sign};
    -	    # +-inf/123 => +-inf
    -	    return $self->binf($s);
    -	    }
    -          # 123/inf => 0
    -          return $self->bzero();
    -	  }
    -	}
    -      }
    -
    -    return $self->bnorm();
    -    }
    -
    -  # simple string input
    -  if (($n =~ /[\.eE]/))
    -    {
    -    # looks like a float, quacks like a float, so probably is a float
    -    $self->{sign} = 'NaN';
    -    local $Math::BigFloat::accuracy = undef;
    -    local $Math::BigFloat::precision = undef;
    -    $self->_new_from_float(Math::BigFloat->new($n,undef,undef));
    -    }
    -  else
    -    {
    -    # for simple forms, use $MBI directly
    -    if ($n =~ /^([+-]?)0*(\d+)\z/)
    -      {
    -      $self->{sign} = $1 || '+';
    -      $self->{_n} = $MBI->_new($2 || 0);
    -      $self->{_d} = $MBI->_one();
    -      }
    -    else
    -      {
    -      my $n = Math::BigInt->new($n,undef,undef);
    -      $self->{_n} = $MBI->_copy($n->{value});
    -      $self->{_d} = $MBI->_one();
    -      $self->{sign} = $n->{sign};
    -      return $self->bnan() if $self->{sign} eq 'NaN';
    -      return $self->binf($self->{sign}) if $self->{sign} =~ /^[+-]inf$/;
    -      }
    -    }
    -  $self->bnorm();
    -  }
    -
    -sub copy
    -  {
    -  # if two arguments, the first one is the class to "swallow" subclasses
    -  my ($c,$x) = @_;
    -
    -  if (scalar @_ == 1)
    -    {
    -    $x = $_[0];
    -    $c = ref($x);
    -    }
    -  return unless ref($x); # only for objects
    -
    -  my $self = bless {}, $c;
    -
    -  $self->{sign} = $x->{sign};
    -  $self->{_d} = $MBI->_copy($x->{_d});
    -  $self->{_n} = $MBI->_copy($x->{_n});
    -  $self->{_a} = $x->{_a} if defined $x->{_a};
    -  $self->{_p} = $x->{_p} if defined $x->{_p};
    -  $self;
    -  }
    -
    -##############################################################################
    -
    -sub config
    -  {
    -  # return (later set?) configuration data as hash ref
    -  my $class = shift || 'Math::BigRat';
    -
    -  my $cfg = $class->SUPER::config(@_);
    -
    -  # now we need only to override the ones that are different from our parent
    -  $cfg->{class} = $class;
    -  $cfg->{with} = $MBI;
    -  $cfg;
    -  }
    -
    -##############################################################################
    -
    -sub bstr
    -  {
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -
    -  if ($x->{sign} !~ /^[+-]$/)		# inf, NaN etc
    -    {
    -    my $s = $x->{sign}; $s =~ s/^\+//; 	# +inf => inf
    -    return $s;
    -    }
    -
    -  my $s = ''; $s = $x->{sign} if $x->{sign} ne '+';	# '+3/2' => '3/2'
    -
    -  return $s . $MBI->_str($x->{_n}) if $MBI->_is_one($x->{_d});
    -  $s . $MBI->_str($x->{_n}) . '/' . $MBI->_str($x->{_d});
    -  }
    -
    -sub bsstr
    -  {
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -
    -  if ($x->{sign} !~ /^[+-]$/)		# inf, NaN etc
    -    {
    -    my $s = $x->{sign}; $s =~ s/^\+//; 	# +inf => inf
    -    return $s;
    -    }
    -  
    -  my $s = ''; $s = $x->{sign} if $x->{sign} ne '+';	# +3 vs 3
    -  $s . $MBI->_str($x->{_n}) . '/' . $MBI->_str($x->{_d});
    -  }
    -
    -sub bnorm
    -  {
    -  # reduce the number to the shortest form
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -
    -  # Both parts must be objects of whatever we are using today.
    -  # Second check because Calc.pm has ARRAY res as unblessed objects.
    -  if (ref($x->{_n}) ne $MBI && ref($x->{_n}) ne 'ARRAY')
    -    {
    -    require Carp; Carp::croak ("n is not $MBI but (".ref($x->{_n}).') in bnorm()');
    -    }
    -  if (ref($x->{_d}) ne $MBI && ref($x->{_d}) ne 'ARRAY')
    -    {
    -    require Carp; Carp::croak ("d is not $MBI but (".ref($x->{_d}).') in bnorm()');
    -    }
    -
    -  # no normalize for NaN, inf etc.
    -  return $x if $x->{sign} !~ /^[+-]$/;
    -
    -  # normalize zeros to 0/1
    -  if ($MBI->_is_zero($x->{_n}))
    -    {
    -    $x->{sign} = '+';					# never leave a -0
    -    $x->{_d} = $MBI->_one() unless $MBI->_is_one($x->{_d});
    -    return $x;
    -    }
    -
    -  return $x if $MBI->_is_one($x->{_d});			# no need to reduce
    -
    -  # reduce other numbers
    -  my $gcd = $MBI->_copy($x->{_n});
    -  $gcd = $MBI->_gcd($gcd,$x->{_d});
    -  
    -  if (!$MBI->_is_one($gcd))
    -    {
    -    $x->{_n} = $MBI->_div($x->{_n},$gcd);
    -    $x->{_d} = $MBI->_div($x->{_d},$gcd);
    -    }
    -  $x;
    -  }
    -
    -##############################################################################
    -# sign manipulation
    -
    -sub bneg
    -  {
    -  # (BRAT or num_str) return BRAT
    -  # negate number or make a negated number from string
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -
    -  return $x if $x->modify('bneg');
    -
    -  # for +0 dont negate (to have always normalized +0). Does nothing for 'NaN'
    -  $x->{sign} =~ tr/+-/-+/ unless ($x->{sign} eq '+' && $MBI->_is_zero($x->{_n}));
    -  $x;
    -  }
    -
    -##############################################################################
    -# special values
    -
    -sub _bnan
    -  {
    -  # used by parent class bnan() to initialize number to NaN
    -  my $self = shift;
    -
    -  if ($_trap_nan)
    -    {
    -    require Carp;
    -    my $class = ref($self);
    -    # "$self" below will stringify the object, this blows up if $self is a
    -    # partial object (happens under trap_nan), so fix it beforehand
    -    $self->{_d} = $MBI->_zero() unless defined $self->{_d};
    -    $self->{_n} = $MBI->_zero() unless defined $self->{_n};
    -    Carp::croak ("Tried to set $self to NaN in $class\::_bnan()");
    -    }
    -  $self->{_n} = $MBI->_zero();
    -  $self->{_d} = $MBI->_zero();
    -  }
    -
    -sub _binf
    -  {
    -  # used by parent class bone() to initialize number to +inf/-inf
    -  my $self = shift;
    -
    -  if ($_trap_inf)
    -    {
    -    require Carp;
    -    my $class = ref($self);
    -    # "$self" below will stringify the object, this blows up if $self is a
    -    # partial object (happens under trap_nan), so fix it beforehand
    -    $self->{_d} = $MBI->_zero() unless defined $self->{_d};
    -    $self->{_n} = $MBI->_zero() unless defined $self->{_n};
    -    Carp::croak ("Tried to set $self to inf in $class\::_binf()");
    -    }
    -  $self->{_n} = $MBI->_zero();
    -  $self->{_d} = $MBI->_zero();
    -  }
    -
    -sub _bone
    -  {
    -  # used by parent class bone() to initialize number to +1/-1
    -  my $self = shift;
    -  $self->{_n} = $MBI->_one();
    -  $self->{_d} = $MBI->_one();
    -  }
    -
    -sub _bzero
    -  {
    -  # used by parent class bzero() to initialize number to 0
    -  my $self = shift;
    -  $self->{_n} = $MBI->_zero();
    -  $self->{_d} = $MBI->_one();
    -  }
    -
    -##############################################################################
    -# mul/add/div etc
    -
    -sub badd
    -  {
    -  # add two rational numbers
    -
    -  # set up parameters
    -  my ($self,$x,$y,@r) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,@r) = objectify(2,@_);
    -    }
    -
    -  # +inf + +inf => +inf,  -inf + -inf => -inf
    -  return $x->binf(substr($x->{sign},0,1))
    -    if $x->{sign} eq $y->{sign} && $x->{sign} =~ /^[+-]inf$/;
    -
    -  # +inf + -inf or -inf + +inf => NaN
    -  return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/);
    -
    -  #  1   1    gcd(3,4) = 1    1*3 + 1*4    7
    -  #  - + -                  = --------- = --                 
    -  #  4   3                      4*3       12
    -
    -  # we do not compute the gcd() here, but simple do:
    -  #  5   7    5*3 + 7*4   43
    -  #  - + -  = --------- = --                 
    -  #  4   3       4*3      12
    - 
    -  # and bnorm() will then take care of the rest
    -
    -  # 5 * 3
    -  $x->{_n} = $MBI->_mul( $x->{_n}, $y->{_d});
    -
    -  # 7 * 4
    -  my $m = $MBI->_mul( $MBI->_copy( $y->{_n} ), $x->{_d} );
    -
    -  # 5 * 3 + 7 * 4
    -  ($x->{_n}, $x->{sign}) = _e_add( $x->{_n}, $m, $x->{sign}, $y->{sign});
    -
    -  # 4 * 3
    -  $x->{_d} = $MBI->_mul( $x->{_d}, $y->{_d});
    -
    -  # normalize result, and possible round
    -  $x->bnorm()->round(@r);
    -  }
    -
    -sub bsub
    -  {
    -  # subtract two rational numbers
    -
    -  # set up parameters
    -  my ($self,$x,$y,@r) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,@r) = objectify(2,@_);
    -    }
    -
    -  # flip sign of $x, call badd(), then flip sign of result
    -  $x->{sign} =~ tr/+-/-+/
    -    unless $x->{sign} eq '+' && $MBI->_is_zero($x->{_n});	# not -0
    -  $x->badd($y,@r);				# does norm and round
    -  $x->{sign} =~ tr/+-/-+/ 
    -    unless $x->{sign} eq '+' && $MBI->_is_zero($x->{_n});	# not -0
    -  $x;
    -  }
    -
    -sub bmul
    -  {
    -  # multiply two rational numbers
    -  
    -  # set up parameters
    -  my ($self,$x,$y,@r) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,@r) = objectify(2,@_);
    -    }
    -
    -  return $x->bnan() if ($x->{sign} eq 'NaN' || $y->{sign} eq 'NaN');
    -
    -  # inf handling
    -  if (($x->{sign} =~ /^[+-]inf$/) || ($y->{sign} =~ /^[+-]inf$/))
    -    {
    -    return $x->bnan() if $x->is_zero() || $y->is_zero();
    -    # result will always be +-inf:
    -    # +inf * +/+inf => +inf, -inf * -/-inf => +inf
    -    # +inf * -/-inf => -inf, -inf * +/+inf => -inf
    -    return $x->binf() if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/);
    -    return $x->binf() if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/);
    -    return $x->binf('-');
    -    }
    -
    -  # x== 0 # also: or y == 1 or y == -1
    -  return wantarray ? ($x,$self->bzero()) : $x if $x->is_zero();
    -
    -  # XXX TODO:
    -  # According to Knuth, this can be optimized by doing gcd twice (for d and n)
    -  # and reducing in one step. This would save us the bnorm() at the end.
    -
    -  #  1   2    1 * 2    2    1
    -  #  - * - =  -----  = -  = -
    -  #  4   3    4 * 3    12   6
    -  
    -  $x->{_n} = $MBI->_mul( $x->{_n}, $y->{_n});
    -  $x->{_d} = $MBI->_mul( $x->{_d}, $y->{_d});
    -
    -  # compute new sign
    -  $x->{sign} = $x->{sign} eq $y->{sign} ? '+' : '-';
    -
    -  $x->bnorm()->round(@r);
    -  }
    -
    -sub bdiv
    -  {
    -  # (dividend: BRAT or num_str, divisor: BRAT or num_str) return
    -  # (BRAT,BRAT) (quo,rem) or BRAT (only rem)
    -
    -  # set up parameters
    -  my ($self,$x,$y,@r) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,@r) = objectify(2,@_);
    -    }
    -
    -  return $self->_div_inf($x,$y)
    -   if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/) || $y->is_zero());
    -
    -  # x== 0 # also: or y == 1 or y == -1
    -  return wantarray ? ($x,$self->bzero()) : $x if $x->is_zero();
    -
    -  # XXX TODO: list context, upgrade
    -  # According to Knuth, this can be optimized by doing gcd twice (for d and n)
    -  # and reducing in one step. This would save us the bnorm() at the end.
    -
    -  # 1     1    1   3
    -  # -  /  - == - * -
    -  # 4     3    4   1
    -  
    -  $x->{_n} = $MBI->_mul( $x->{_n}, $y->{_d});
    -  $x->{_d} = $MBI->_mul( $x->{_d}, $y->{_n});
    -
    -  # compute new sign 
    -  $x->{sign} = $x->{sign} eq $y->{sign} ? '+' : '-';
    -
    -  $x->bnorm()->round(@r);
    -  $x;
    -  }
    -
    -sub bmod
    -  {
    -  # compute "remainder" (in Perl way) of $x / $y
    -
    -  # set up parameters
    -  my ($self,$x,$y,@r) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,@r) = objectify(2,@_);
    -    }
    -
    -  return $self->_div_inf($x,$y)
    -   if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/) || $y->is_zero());
    -
    -  return $x if $x->is_zero();           # 0 / 7 = 0, mod 0
    -
    -  # compute $x - $y * floor($x/$y), keeping the sign of $x
    -
    -  # copy x to u, make it positive and then do a normal division ($u/$y)
    -  my $u = bless { sign => '+' }, $self;
    -  $u->{_n} = $MBI->_mul( $MBI->_copy($x->{_n}), $y->{_d} );
    -  $u->{_d} = $MBI->_mul( $MBI->_copy($x->{_d}), $y->{_n} );
    -  
    -  # compute floor(u)
    -  if (! $MBI->_is_one($u->{_d}))
    -    {
    -    $u->{_n} = $MBI->_div($u->{_n},$u->{_d});	# 22/7 => 3/1 w/ truncate
    -    # no need to set $u->{_d} to 1, since below we set it to $y->{_d} anyway
    -    }
    -  
    -  # now compute $y * $u
    -  $u->{_d} = $MBI->_copy($y->{_d});		# 1 * $y->{_d}, see floor above
    -  $u->{_n} = $MBI->_mul($u->{_n},$y->{_n});
    -
    -  my $xsign = $x->{sign}; $x->{sign} = '+';	# remember sign and make x positive
    -  # compute $x - $u
    -  $x->bsub($u);
    -  $x->{sign} = $xsign;				# put sign back
    -
    -  $x->bnorm()->round(@r);
    -  }
    -
    -##############################################################################
    -# bdec/binc
    -
    -sub bdec
    -  {
    -  # decrement value (subtract 1)
    -  my ($self,$x,@r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
    -
    -  return $x if $x->{sign} !~ /^[+-]$/;	# NaN, inf, -inf
    -
    -  if ($x->{sign} eq '-')
    -    {
    -    $x->{_n} = $MBI->_add( $x->{_n}, $x->{_d});		# -5/2 => -7/2
    -    }
    -  else
    -    {
    -    if ($MBI->_acmp($x->{_n},$x->{_d}) < 0)		# n < d?
    -      {
    -      # 1/3 -- => -2/3
    -      $x->{_n} = $MBI->_sub( $MBI->_copy($x->{_d}), $x->{_n});
    -      $x->{sign} = '-';
    -      }
    -    else
    -      {
    -      $x->{_n} = $MBI->_sub($x->{_n}, $x->{_d}); 	# 5/2 => 3/2
    -      }
    -    }
    -  $x->bnorm()->round(@r);
    -  }
    -
    -sub binc
    -  {
    -  # increment value (add 1)
    -  my ($self,$x,@r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
    -  
    -  return $x if $x->{sign} !~ /^[+-]$/;	# NaN, inf, -inf
    -
    -  if ($x->{sign} eq '-')
    -    {
    -    if ($MBI->_acmp($x->{_n},$x->{_d}) < 0)
    -      {
    -      # -1/3 ++ => 2/3 (overflow at 0)
    -      $x->{_n} = $MBI->_sub( $MBI->_copy($x->{_d}), $x->{_n});
    -      $x->{sign} = '+';
    -      }
    -    else
    -      {
    -      $x->{_n} = $MBI->_sub($x->{_n}, $x->{_d}); 	# -5/2 => -3/2
    -      }
    -    }
    -  else
    -    {
    -    $x->{_n} = $MBI->_add($x->{_n},$x->{_d});		# 5/2 => 7/2
    -    }
    -  $x->bnorm()->round(@r);
    -  }
    -
    -##############################################################################
    -# is_foo methods (the rest is inherited)
    -
    -sub is_int
    -  {
    -  # return true if arg (BRAT or num_str) is an integer
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -
    -  return 1 if ($x->{sign} =~ /^[+-]$/) &&	# NaN and +-inf aren't
    -    $MBI->_is_one($x->{_d});			# x/y && y != 1 => no integer
    -  0;
    -  }
    -
    -sub is_zero
    -  {
    -  # return true if arg (BRAT or num_str) is zero
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -
    -  return 1 if $x->{sign} eq '+' && $MBI->_is_zero($x->{_n});
    -  0;
    -  }
    -
    -sub is_one
    -  {
    -  # return true if arg (BRAT or num_str) is +1 or -1 if signis given
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -
    -  my $sign = $_[2] || ''; $sign = '+' if $sign ne '-';
    -  return 1
    -   if ($x->{sign} eq $sign && $MBI->_is_one($x->{_n}) && $MBI->_is_one($x->{_d}));
    -  0;
    -  }
    -
    -sub is_odd
    -  {
    -  # return true if arg (BFLOAT or num_str) is odd or false if even
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -
    -  return 1 if ($x->{sign} =~ /^[+-]$/) &&		# NaN & +-inf aren't
    -    ($MBI->_is_one($x->{_d}) && $MBI->_is_odd($x->{_n})); # x/2 is not, but 3/1
    -  0;
    -  }
    -
    -sub is_even
    -  {
    -  # return true if arg (BINT or num_str) is even or false if odd
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -
    -  return 0 if $x->{sign} !~ /^[+-]$/;			# NaN & +-inf aren't
    -  return 1 if ($MBI->_is_one($x->{_d})			# x/3 is never
    -     && $MBI->_is_even($x->{_n}));			# but 4/1 is
    -  0;
    -  }
    -
    -##############################################################################
    -# parts() and friends
    -
    -sub numerator
    -  {
    -  my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
    -
    -  # NaN, inf, -inf
    -  return Math::BigInt->new($x->{sign}) if ($x->{sign} !~ /^[+-]$/);
    -
    -  my $n = Math::BigInt->new($MBI->_str($x->{_n})); $n->{sign} = $x->{sign};
    -  $n;
    -  }
    -
    -sub denominator
    -  {
    -  my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
    -
    -  # NaN
    -  return Math::BigInt->new($x->{sign}) if $x->{sign} eq 'NaN';
    -  # inf, -inf
    -  return Math::BigInt->bone() if $x->{sign} !~ /^[+-]$/;
    -  
    -  Math::BigInt->new($MBI->_str($x->{_d}));
    -  }
    -
    -sub parts
    -  {
    -  my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
    -
    -  my $c = 'Math::BigInt';
    -
    -  return ($c->bnan(),$c->bnan()) if $x->{sign} eq 'NaN';
    -  return ($c->binf(),$c->binf()) if $x->{sign} eq '+inf';
    -  return ($c->binf('-'),$c->binf()) if $x->{sign} eq '-inf';
    -
    -  my $n = $c->new( $MBI->_str($x->{_n}));
    -  $n->{sign} = $x->{sign};
    -  my $d = $c->new( $MBI->_str($x->{_d}));
    -  ($n,$d);
    -  }
    -
    -sub length
    -  {
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -
    -  return $nan unless $x->is_int();
    -  $MBI->_len($x->{_n});				# length(-123/1) => length(123)
    -  }
    -
    -sub digit
    -  {
    -  my ($self,$x,$n) = ref($_[0]) ? (undef,$_[0],$_[1]) : objectify(1,@_);
    -
    -  return $nan unless $x->is_int();
    -  $MBI->_digit($x->{_n},$n || 0);		# digit(-123/1,2) => digit(123,2)
    -  }
    -
    -##############################################################################
    -# special calc routines
    -
    -sub bceil
    -  {
    -  my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
    -
    -  return $x if $x->{sign} !~ /^[+-]$/ ||	# not for NaN, inf
    -            $MBI->_is_one($x->{_d});		# 22/1 => 22, 0/1 => 0
    -
    -  $x->{_n} = $MBI->_div($x->{_n},$x->{_d});	# 22/7 => 3/1 w/ truncate
    -  $x->{_d} = $MBI->_one();			# d => 1
    -  $x->{_n} = $MBI->_inc($x->{_n})
    -    if $x->{sign} eq '+';			# +22/7 => 4/1
    -  $x->{sign} = '+' if $MBI->_is_zero($x->{_n});	# -0 => 0
    -  $x;
    -  }
    -
    -sub bfloor
    -  {
    -  my ($self,$x) = ref($_[0]) ? (ref($_[0]),$_[0]) : objectify(1,@_);
    -
    -  return $x if $x->{sign} !~ /^[+-]$/ ||	# not for NaN, inf
    -            $MBI->_is_one($x->{_d});		# 22/1 => 22, 0/1 => 0
    -
    -  $x->{_n} = $MBI->_div($x->{_n},$x->{_d});	# 22/7 => 3/1 w/ truncate
    -  $x->{_d} = $MBI->_one();			# d => 1
    -  $x->{_n} = $MBI->_inc($x->{_n})
    -    if $x->{sign} eq '-';			# -22/7 => -4/1
    -  $x;
    -  }
    -
    -sub bfac
    -  {
    -  my ($self,$x,@r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
    -
    -  # if $x is not an integer
    -  if (($x->{sign} ne '+') || (!$MBI->_is_one($x->{_d})))
    -    {
    -    return $x->bnan();
    -    }
    -
    -  $x->{_n} = $MBI->_fac($x->{_n});
    -  # since _d is 1, we don't need to reduce/norm the result
    -  $x->round(@r);
    -  }
    -
    -sub bpow
    -  {
    -  # power ($x ** $y)
    -
    -  # set up parameters
    -  my ($self,$x,$y,@r) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,@r) = objectify(2,@_);
    -    }
    -
    -  return $x if $x->{sign} =~ /^[+-]inf$/;       # -inf/+inf ** x
    -  return $x->bnan() if $x->{sign} eq $nan || $y->{sign} eq $nan;
    -  return $x->bone(@r) if $y->is_zero();
    -  return $x->round(@r) if $x->is_one() || $y->is_one();
    -
    -  if ($x->{sign} eq '-' && $MBI->_is_one($x->{_n}) && $MBI->_is_one($x->{_d}))
    -    {
    -    # if $x == -1 and odd/even y => +1/-1
    -    return $y->is_odd() ? $x->round(@r) : $x->babs()->round(@r);
    -    # my Casio FX-5500L has a bug here: -1 ** 2 is -1, but -1 * -1 is 1;
    -    }
    -  # 1 ** -y => 1 / (1 ** |y|)
    -  # so do test for negative $y after above's clause
    -
    -  return $x->round(@r) if $x->is_zero();  # 0**y => 0 (if not y <= 0)
    -
    -  # shortcut y/1 (and/or x/1)
    -  if ($MBI->_is_one($y->{_d}))
    -    {
    -    # shortcut for x/1 and y/1
    -    if ($MBI->_is_one($x->{_d}))
    -      {
    -      $x->{_n} = $MBI->_pow($x->{_n},$y->{_n});		# x/1 ** y/1 => (x ** y)/1
    -      if ($y->{sign} eq '-')
    -        {
    -        # 0.2 ** -3 => 1/(0.2 ** 3)
    -        ($x->{_n},$x->{_d}) = ($x->{_d},$x->{_n});	# swap
    -        }
    -      # correct sign; + ** + => +
    -      if ($x->{sign} eq '-')
    -        {
    -        # - * - => +, - * - * - => -
    -        $x->{sign} = '+' if $MBI->_is_even($y->{_n});	
    -        }
    -      return $x->round(@r);
    -      }
    -    # x/z ** y/1
    -    $x->{_n} = $MBI->_pow($x->{_n},$y->{_n});		# 5/2 ** y/1 => 5 ** y / 2 ** y
    -    $x->{_d} = $MBI->_pow($x->{_d},$y->{_n});
    -    if ($y->{sign} eq '-')
    -      {
    -      # 0.2 ** -3 => 1/(0.2 ** 3)
    -      ($x->{_n},$x->{_d}) = ($x->{_d},$x->{_n});	# swap
    -      }
    -    # correct sign; + ** + => +
    -    if ($x->{sign} eq '-')
    -      {
    -      # - * - => +, - * - * - => -
    -      $x->{sign} = '+' if $MBI->_is_even($y->{_n});	
    -      }
    -    return $x->round(@r);
    -    }
    -
    -  # regular calculation (this is wrong for d/e ** f/g)
    -  my $pow2 = $self->bone();
    -  my $y1 = $MBI->_div ( $MBI->_copy($y->{_n}), $y->{_d});
    -  my $two = $MBI->_two();
    -
    -  while (!$MBI->_is_one($y1))
    -    {
    -    $pow2->bmul($x) if $MBI->_is_odd($y1);
    -    $MBI->_div($y1, $two);
    -    $x->bmul($x);
    -    }
    -  $x->bmul($pow2) unless $pow2->is_one();
    -  # n ** -x => 1/n ** x
    -  ($x->{_d},$x->{_n}) = ($x->{_n},$x->{_d}) if $y->{sign} eq '-'; 
    -  $x->bnorm()->round(@r);
    -  }
    -
    -sub blog
    -  {
    -  # set up parameters
    -  my ($self,$x,$y,@r) = (ref($_[0]),@_);
    -
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,@r) = objectify(2,$class,@_);
    -    }
    -
    -  # blog(1,Y) => 0
    -  return $x->bzero() if $x->is_one() && $y->{sign} eq '+';
    -
    -  # $x <= 0 => NaN
    -  return $x->bnan() if $x->is_zero() || $x->{sign} ne '+' || $y->{sign} ne '+';
    -
    -  if ($x->is_int() && $y->is_int())
    -    {
    -    return $self->new($x->as_number()->blog($y->as_number(),@r));
    -    }
    -
    -  # do it with floats
    -  $x->_new_from_float( $x->_as_float()->blog(Math::BigFloat->new("$y"),@r) );
    -  }
    -
    -sub _float_from_part
    -  {
    -  my $x = shift;
    -
    -  my $f = Math::BigFloat->bzero();
    -  $f->{_m} = $MBI->_copy($x);
    -  $f->{_e} = $MBI->_zero();
    -
    -  $f;
    -  }
    -
    -sub _as_float
    -  {
    -  my $x = shift;
    -
    -  local $Math::BigFloat::upgrade = undef;
    -  local $Math::BigFloat::accuracy = undef;
    -  local $Math::BigFloat::precision = undef;
    -  # 22/7 => 3.142857143..
    -
    -  my $a = $x->accuracy() || 0;
    -  if ($a != 0 || !$MBI->_is_one($x->{_d}))
    -    {
    -    # n/d
    -    return Math::BigFloat->new($x->{sign} . $MBI->_str($x->{_n}))->bdiv( $MBI->_str($x->{_d}), $x->accuracy());
    -    }
    -  # just n
    -  Math::BigFloat->new($x->{sign} . $MBI->_str($x->{_n}));
    -  }
    -
    -sub broot
    -  {
    -  # set up parameters
    -  my ($self,$x,$y,@r) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,@r) = objectify(2,@_);
    -    }
    -
    -  if ($x->is_int() && $y->is_int())
    -    {
    -    return $self->new($x->as_number()->broot($y->as_number(),@r));
    -    }
    -
    -  # do it with floats
    -  $x->_new_from_float( $x->_as_float()->broot($y,@r) );
    -  }
    -
    -sub bmodpow
    -  {
    -  # set up parameters
    -  my ($self,$x,$y,$m,@r) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,$m,@r) = objectify(3,@_);
    -    }
    -
    -  # $x or $y or $m are NaN or +-inf => NaN
    -  return $x->bnan()
    -   if $x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/ ||
    -   $m->{sign} !~ /^[+-]$/;
    -
    -  if ($x->is_int() && $y->is_int() && $m->is_int())
    -    {
    -    return $self->new($x->as_number()->bmodpow($y->as_number(),$m,@r));
    -    }
    -
    -  warn ("bmodpow() not fully implemented");
    -  $x->bnan();
    -  }
    -
    -sub bmodinv
    -  {
    -  # set up parameters
    -  my ($self,$x,$y,@r) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y,@r) = objectify(2,@_);
    -    }
    -
    -  # $x or $y are NaN or +-inf => NaN
    -  return $x->bnan() 
    -   if $x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/;
    -
    -  if ($x->is_int() && $y->is_int())
    -    {
    -    return $self->new($x->as_number()->bmodinv($y->as_number(),@r));
    -    }
    -
    -  warn ("bmodinv() not fully implemented");
    -  $x->bnan();
    -  }
    -
    -sub bsqrt
    -  {
    -  my ($self,$x,@r) = ref($_[0]) ? (ref($_[0]),@_) : objectify(1,@_);
    -
    -  return $x->bnan() if $x->{sign} !~ /^[+]/;    # NaN, -inf or < 0
    -  return $x if $x->{sign} eq '+inf';            # sqrt(inf) == inf
    -  return $x->round(@r) if $x->is_zero() || $x->is_one();
    -
    -  local $Math::BigFloat::upgrade = undef;
    -  local $Math::BigFloat::downgrade = undef;
    -  local $Math::BigFloat::precision = undef;
    -  local $Math::BigFloat::accuracy = undef;
    -  local $Math::BigInt::upgrade = undef;
    -  local $Math::BigInt::precision = undef;
    -  local $Math::BigInt::accuracy = undef;
    -
    -  $x->{_n} = _float_from_part( $x->{_n} )->bsqrt();
    -  $x->{_d} = _float_from_part( $x->{_d} )->bsqrt();
    -
    -  # XXX TODO: we probably can optimze this:
    -
    -  # if sqrt(D) was not integer
    -  if ($x->{_d}->{_es} ne '+')
    -    {
    -    $x->{_n}->blsft($x->{_d}->exponent()->babs(),10);	# 7.1/4.51 => 7.1/45.1
    -    $x->{_d} = $MBI->_copy( $x->{_d}->{_m} );		# 7.1/45.1 => 71/45.1
    -    }
    -  # if sqrt(N) was not integer
    -  if ($x->{_n}->{_es} ne '+')
    -    {
    -    $x->{_d}->blsft($x->{_n}->exponent()->babs(),10);	# 71/45.1 => 710/45.1
    -    $x->{_n} = $MBI->_copy( $x->{_n}->{_m} );		# 710/45.1 => 710/451
    -    }
    -
    -  # convert parts to $MBI again 
    -  $x->{_n} = $MBI->_lsft( $MBI->_copy( $x->{_n}->{_m} ), $x->{_n}->{_e}, 10)
    -    if ref($x->{_n}) ne $MBI && ref($x->{_n}) ne 'ARRAY';
    -  $x->{_d} = $MBI->_lsft( $MBI->_copy( $x->{_d}->{_m} ), $x->{_d}->{_e}, 10)
    -    if ref($x->{_d}) ne $MBI && ref($x->{_d}) ne 'ARRAY';
    -
    -  $x->bnorm()->round(@r);
    -  }
    -
    -sub blsft
    -  {
    -  my ($self,$x,$y,$b,@r) = objectify(3,@_);
    - 
    -  $b = 2 unless defined $b;
    -  $b = $self->new($b) unless ref ($b);
    -  $x->bmul( $b->copy()->bpow($y), @r);
    -  $x;
    -  }
    -
    -sub brsft
    -  {
    -  my ($self,$x,$y,$b,@r) = objectify(3,@_);
    -
    -  $b = 2 unless defined $b;
    -  $b = $self->new($b) unless ref ($b);
    -  $x->bdiv( $b->copy()->bpow($y), @r);
    -  $x;
    -  }
    -
    -##############################################################################
    -# round
    -
    -sub round
    -  {
    -  $_[0];
    -  }
    -
    -sub bround
    -  {
    -  $_[0];
    -  }
    -
    -sub bfround
    -  {
    -  $_[0];
    -  }
    -
    -##############################################################################
    -# comparing
    -
    -sub bcmp
    -  {
    -  # compare two signed numbers 
    -  
    -  # set up parameters
    -  my ($self,$x,$y) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y) = objectify(2,@_);
    -    }
    -
    -  if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
    -    {
    -    # handle +-inf and NaN
    -    return undef if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
    -    return 0 if $x->{sign} eq $y->{sign} && $x->{sign} =~ /^[+-]inf$/;
    -    return +1 if $x->{sign} eq '+inf';
    -    return -1 if $x->{sign} eq '-inf';
    -    return -1 if $y->{sign} eq '+inf';
    -    return +1;
    -    }
    -  # check sign for speed first
    -  return 1 if $x->{sign} eq '+' && $y->{sign} eq '-';   # does also 0 <=> -y
    -  return -1 if $x->{sign} eq '-' && $y->{sign} eq '+';  # does also -x <=> 0
    -
    -  # shortcut
    -  my $xz = $MBI->_is_zero($x->{_n});
    -  my $yz = $MBI->_is_zero($y->{_n});
    -  return 0 if $xz && $yz;                               # 0 <=> 0
    -  return -1 if $xz && $y->{sign} eq '+';                # 0 <=> +y
    -  return 1 if $yz && $x->{sign} eq '+';                 # +x <=> 0
    - 
    -  my $t = $MBI->_mul( $MBI->_copy($x->{_n}), $y->{_d});
    -  my $u = $MBI->_mul( $MBI->_copy($y->{_n}), $x->{_d});
    -
    -  my $cmp = $MBI->_acmp($t,$u);				# signs are equal
    -  $cmp = -$cmp if $x->{sign} eq '-';			# both are '-' => reverse
    -  $cmp;
    -  }
    -
    -sub bacmp
    -  {
    -  # compare two numbers (as unsigned)
    - 
    -  # set up parameters
    -  my ($self,$x,$y) = (ref($_[0]),@_);
    -  # objectify is costly, so avoid it
    -  if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1])))
    -    {
    -    ($self,$x,$y) = objectify(2,$class,@_);
    -    }
    -
    -  if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/))
    -    {
    -    # handle +-inf and NaN
    -    return undef if (($x->{sign} eq $nan) || ($y->{sign} eq $nan));
    -    return 0 if $x->{sign} =~ /^[+-]inf$/ && $y->{sign} =~ /^[+-]inf$/;
    -    return 1 if $x->{sign} =~ /^[+-]inf$/ && $y->{sign} !~ /^[+-]inf$/;
    -    return -1;
    -    }
    -
    -  my $t = $MBI->_mul( $MBI->_copy($x->{_n}), $y->{_d});
    -  my $u = $MBI->_mul( $MBI->_copy($y->{_n}), $x->{_d});
    -  $MBI->_acmp($t,$u);					# ignore signs
    -  }
    -
    -##############################################################################
    -# output conversation
    -
    -sub numify
    -  {
    -  # convert 17/8 => float (aka 2.125)
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    - 
    -  return $x->bstr() if $x->{sign} !~ /^[+-]$/;	# inf, NaN, etc
    -
    -  # N/1 => N
    -  my $neg = ''; $neg = '-' if $x->{sign} eq '-';
    -  return $neg . $MBI->_num($x->{_n}) if $MBI->_is_one($x->{_d});
    -
    -  $x->_as_float()->numify() + 0.0;
    -  }
    -
    -sub as_number
    -  {
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -
    -  return Math::BigInt->new($x) if $x->{sign} !~ /^[+-]$/;	# NaN, inf etc
    - 
    -  my $u = Math::BigInt->bzero();
    -  $u->{sign} = $x->{sign};
    -  $u->{value} = $MBI->_div( $MBI->_copy($x->{_n}), $x->{_d});	# 22/7 => 3
    -  $u;
    -  }
    -
    -sub as_bin
    -  {
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -
    -  return $x unless $x->is_int();
    -
    -  my $s = $x->{sign}; $s = '' if $s eq '+';
    -  $s . $MBI->_as_bin($x->{_n});
    -  }
    -
    -sub as_hex
    -  {
    -  my ($self,$x) = ref($_[0]) ? (undef,$_[0]) : objectify(1,@_);
    -
    -  return $x unless $x->is_int();
    -
    -  my $s = $x->{sign}; $s = '' if $s eq '+';
    -  $s . $MBI->_as_hex($x->{_n});
    -  }
    -
    -##############################################################################
    -# import
    -
    -sub import
    -  {
    -  my $self = shift;
    -  my $l = scalar @_;
    -  my $lib = ''; my @a;
    -
    -  for ( my $i = 0; $i < $l ; $i++)
    -    {
    -    if ( $_[$i] eq ':constant' )
    -      {
    -      # this rest causes overlord er load to step in
    -      overload::constant float => sub { $self->new(shift); };
    -      }
    -#    elsif ($_[$i] eq 'upgrade')
    -#      {
    -#     # this causes upgrading
    -#      $upgrade = $_[$i+1];		# or undef to disable
    -#      $i++;
    -#      }
    -    elsif ($_[$i] eq 'downgrade')
    -      {
    -      # this causes downgrading
    -      $downgrade = $_[$i+1];		# or undef to disable
    -      $i++;
    -      }
    -    elsif ($_[$i] eq 'lib')
    -      {
    -      $lib = $_[$i+1] || '';		# default Calc
    -      $i++;
    -      }
    -    elsif ($_[$i] eq 'with')
    -      {
    -      # this argument is no longer used
    -      #$MBI = $_[$i+1] || 'Math::BigInt::Calc';	# default Math::BigInt::Calc
    -      $i++;
    -      }
    -    else
    -      {
    -      push @a, $_[$i];
    -      }
    -    }
    -  require Math::BigInt;
    -
    -  # let use Math::BigInt lib => 'GMP'; use Math::BigRat; still have GMP
    -  if ($lib ne '')
    -    {
    -    my @c = split /\s*,\s*/, $lib;
    -    foreach (@c)
    -      {
    -      $_ =~ tr/a-zA-Z0-9://cd;                    # limit to sane characters
    -      }
    -    $lib = join(",", @c);
    -    }
    -  my @import = ('objectify');
    -  push @import, lib => $lib if $lib ne '';
    -
    -  # MBI already loaded, so feed it our lib arguments
    -  Math::BigInt->import( @import );
    -
    -  $MBI = Math::BigFloat->config()->{lib};
    -
    -  # register us with MBI to get notified of future lib changes
    -  Math::BigInt::_register_callback( $self, sub { $MBI = $_[0]; } );
    -  
    -  # any non :constant stuff is handled by our parent, Exporter (loaded
    -  # by Math::BigFloat, even if @_ is empty, to give it a chance
    -  $self->SUPER::import(@a);             # for subclasses
    -  $self->export_to_level(1,$self,@a);   # need this, too
    -  }
    -
    -1;
    -
    -__END__
    -
    -=head1 NAME
    -
    -Math::BigRat - Arbitrary big rational numbers
    -
    -=head1 SYNOPSIS
    -
    -	use Math::BigRat;
    -
    -	my $x = Math::BigRat->new('3/7'); $x += '5/9';
    -
    -	print $x->bstr(),"\n";
    -  	print $x ** 2,"\n";
    -
    -	my $y = Math::BigRat->new('inf');
    -	print "$y ", ($y->is_inf ? 'is' : 'is not') , " infinity\n";
    -
    -	my $z = Math::BigRat->new(144); $z->bsqrt();
    -
    -=head1 DESCRIPTION
    -
    -Math::BigRat complements Math::BigInt and Math::BigFloat by providing support
    -for arbitrary big rational numbers.
    -
    -=head2 MATH LIBRARY
    -
    -Math with the numbers is done (by default) by a module called
    -Math::BigInt::Calc. This is equivalent to saying:
    -
    -	use Math::BigRat lib => 'Calc';
    -
    -You can change this by using:
    -
    -	use Math::BigRat lib => 'BitVect';
    -
    -The following would first try to find Math::BigInt::Foo, then
    -Math::BigInt::Bar, and when this also fails, revert to Math::BigInt::Calc:
    -
    -	use Math::BigRat lib => 'Foo,Math::BigInt::Bar';
    -
    -Calc.pm uses as internal format an array of elements of some decimal base
    -(usually 1e7, but this might be different for some systems) with the least
    -significant digit first, while BitVect.pm uses a bit vector of base 2, most
    -significant bit first. Other modules might use even different means of
    -representing the numbers. See the respective module documentation for further
    -details.
    -
    -Currently the following replacement libraries exist, search for them at CPAN:
    -
    -	Math::BigInt::BitVect
    -	Math::BigInt::GMP
    -	Math::BigInt::Pari
    -	Math::BigInt::FastCalc
    -
    -=head1 METHODS
    -
    -Any methods not listed here are dervied from Math::BigFloat (or
    -Math::BigInt), so make sure you check these two modules for further
    -information.
    -
    -=head2 new()
    -
    -	$x = Math::BigRat->new('1/3');
    -
    -Create a new Math::BigRat object. Input can come in various forms:
    -
    -	$x = Math::BigRat->new(123);				# scalars
    -	$x = Math::BigRat->new('inf');				# infinity
    -	$x = Math::BigRat->new('123.3');			# float
    -	$x = Math::BigRat->new('1/3');				# simple string
    -	$x = Math::BigRat->new('1 / 3');			# spaced
    -	$x = Math::BigRat->new('1 / 0.1');			# w/ floats
    -	$x = Math::BigRat->new(Math::BigInt->new(3));		# BigInt
    -	$x = Math::BigRat->new(Math::BigFloat->new('3.1'));	# BigFloat
    -	$x = Math::BigRat->new(Math::BigInt::Lite->new('2'));	# BigLite
    -
    -	# You can also give D and N as different objects:
    -	$x = Math::BigRat->new(
    -		Math::BigInt->new(-123),
    -		Math::BigInt->new(7),
    -		);			# => -123/7
    -
    -=head2 numerator()
    -
    -	$n = $x->numerator();
    -
    -Returns a copy of the numerator (the part above the line) as signed BigInt.
    -
    -=head2 denominator()
    -	
    -	$d = $x->denominator();
    -
    -Returns a copy of the denominator (the part under the line) as positive BigInt.
    -
    -=head2 parts()
    -
    -	($n,$d) = $x->parts();
    -
    -Return a list consisting of (signed) numerator and (unsigned) denominator as
    -BigInts.
    -
    -=head2 as_int()
    -
    -	$x = Math::BigRat->new('13/7');
    -	print $x->as_int(),"\n";		# '1'
    -
    -Returns a copy of the object as BigInt, truncated to an integer.
    -
    -C is an alias for C.
    -
    -=head2 as_hex()
    -
    -	$x = Math::BigRat->new('13');
    -	print $x->as_hex(),"\n";		# '0xd'
    -
    -Returns the BigRat as hexadecimal string. Works only for integers. 
    -
    -=head2 as_bin()
    -
    -	$x = Math::BigRat->new('13');
    -	print $x->as_bin(),"\n";		# '0x1101'
    -
    -Returns the BigRat as binary string. Works only for integers. 
    -
    -=head2 bfac()
    -
    -	$x->bfac();
    -
    -Calculates the factorial of $x. For instance:
    -
    -	print Math::BigRat->new('3/1')->bfac(),"\n";	# 1*2*3
    -	print Math::BigRat->new('5/1')->bfac(),"\n";	# 1*2*3*4*5
    -
    -Works currently only for integers.
    -
    -=head2 blog()
    -
    -Is not yet implemented.
    -
    -=head2 bround()/round()/bfround()
    -
    -Are not yet implemented.
    -
    -=head2 bmod()
    -
    -	use Math::BigRat;
    -	my $x = Math::BigRat->new('7/4');
    -	my $y = Math::BigRat->new('4/3');
    -	print $x->bmod($y);
    -
    -Set $x to the remainder of the division of $x by $y.
    -
    -=head2 is_one()
    -
    -	print "$x is 1\n" if $x->is_one();
    -
    -Return true if $x is exactly one, otherwise false.
    -
    -=head2 is_zero()
    -
    -	print "$x is 0\n" if $x->is_zero();
    -
    -Return true if $x is exactly zero, otherwise false.
    -
    -=head2 is_pos()
    -
    -	print "$x is >= 0\n" if $x->is_positive();
    -
    -Return true if $x is positive (greater than or equal to zero), otherwise
    -false. Please note that '+inf' is also positive, while 'NaN' and '-inf' aren't.
    -
    -C is an alias for C.
    -
    -=head2 is_neg()
    -
    -	print "$x is < 0\n" if $x->is_negative();
    -
    -Return true if $x is negative (smaller than zero), otherwise false. Please
    -note that '-inf' is also negative, while 'NaN' and '+inf' aren't.
    -
    -C is an alias for C.
    -
    -=head2 is_int()
    -
    -	print "$x is an integer\n" if $x->is_int();
    -
    -Return true if $x has a denominator of 1 (e.g. no fraction parts), otherwise
    -false. Please note that '-inf', 'inf' and 'NaN' aren't integer.
    -
    -=head2 is_odd()
    -
    -	print "$x is odd\n" if $x->is_odd();
    -
    -Return true if $x is odd, otherwise false.
    -
    -=head2 is_even()
    -
    -	print "$x is even\n" if $x->is_even();
    -
    -Return true if $x is even, otherwise false.
    -
    -=head2 bceil()
    -
    -	$x->bceil();
    -
    -Set $x to the next bigger integer value (e.g. truncate the number to integer
    -and then increment it by one).
    -
    -=head2 bfloor()
    -	
    -	$x->bfloor();
    -
    -Truncate $x to an integer value.
    -
    -=head2 bsqrt()
    -	
    -	$x->bsqrt();
    -
    -Calculate the square root of $x.
    -
    -=head2 config
    -
    -        use Data::Dumper;
    -
    -        print Dumper ( Math::BigRat->config() );
    -        print Math::BigRat->config()->{lib},"\n";
    -
    -Returns a hash containing the configuration, e.g. the version number, lib
    -loaded etc. The following hash keys are currently filled in with the
    -appropriate information.
    -
    -        key             RO/RW   Description
    -                                Example
    -        ============================================================
    -        lib             RO      Name of the Math library
    -                                Math::BigInt::Calc
    -        lib_version     RO      Version of 'lib'
    -                                0.30
    -        class           RO      The class of config you just called
    -                                Math::BigRat
    -        version         RO      version number of the class you used
    -                                0.10
    -        upgrade         RW      To which class numbers are upgraded
    -                                undef
    -        downgrade       RW      To which class numbers are downgraded
    -                                undef
    -        precision       RW      Global precision
    -                                undef
    -        accuracy        RW      Global accuracy
    -                                undef
    -        round_mode      RW      Global round mode
    -                                even
    -        div_scale       RW      Fallback acccuracy for div
    -                                40
    -        trap_nan        RW      Trap creation of NaN (undef = no)
    -                                undef
    -        trap_inf        RW      Trap creation of +inf/-inf (undef = no)
    -                                undef
    -
    -By passing a reference to a hash you may set the configuration values. This
    -works only for values that a marked with a C above, anything else is
    -read-only.
    -
    -=head1 BUGS
    -
    -Some things are not yet implemented, or only implemented half-way:
    -
    -=over 2
    -
    -=item inf handling (partial)
    -
    -=item NaN handling (partial)
    -
    -=item rounding (not implemented except for bceil/bfloor)
    -
    -=item $x ** $y where $y is not an integer
    -
    -=item bmod(), blog(), bmodinv() and bmodpow() (partial)
    -
    -=back
    -
    -=head1 LICENSE
    -
    -This program is free software; you may redistribute it and/or modify it under
    -the same terms as Perl itself.
    -
    -=head1 SEE ALSO
    -
    -L and L as well as L,
    -L and  L.
    -
    -See L for a way to use
    -Math::BigRat.
    -
    -The package at L
    -may contain more documentation and examples as well as testcases.
    -
    -=head1 AUTHORS
    -
    -(C) by Tels L 2001 - 2005.
    -
    -=cut
    diff --git a/lib/perl5/5.8.8/Math/Complex.pm b/lib/perl5/5.8.8/Math/Complex.pm
    deleted file mode 100644
    index e4b980bd..00000000
    --- a/lib/perl5/5.8.8/Math/Complex.pm
    +++ /dev/null
    @@ -1,1973 +0,0 @@
    -#
    -# Complex numbers and associated mathematical functions
    -# -- Raphael Manfredi	Since Sep 1996
    -# -- Jarkko Hietaniemi	Since Mar 1997
    -# -- Daniel S. Lewart	Since Sep 1997
    -#
    -
    -package Math::Complex;
    -
    -use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $Inf);
    -
    -$VERSION = 1.35;
    -
    -BEGIN {
    -    unless ($^O eq 'unicosmk') {
    -        my $e = $!;
    -	# We do want an arithmetic overflow, Inf INF inf Infinity:.
    -        undef $Inf unless eval <<'EOE' and $Inf =~ /^inf(?:inity)?$/i;
    -	  local $SIG{FPE} = sub {die};
    -	  my $t = CORE::exp 30;
    -	  $Inf = CORE::exp $t;
    -EOE
    -	if (!defined $Inf) {		# Try a different method
    -	  undef $Inf unless eval <<'EOE' and $Inf =~ /^inf(?:inity)?$/i;
    -	    local $SIG{FPE} = sub {die};
    -	    my $t = 1;
    -	    $Inf = $t + "1e99999999999999999999999999999999";
    -EOE
    -	}
    -        $! = $e; # Clear ERANGE.
    -    }
    -    $Inf = "Inf" if !defined $Inf || !($Inf > 0); # Desperation.
    -}
    -
    -use strict;
    -
    -my $i;
    -my %LOGN;
    -
    -# Regular expression for floating point numbers.
    -# These days we could use Scalar::Util::lln(), I guess.
    -my $gre = qr'\s*([\+\-]?(?:(?:(?:\d+(?:_\d+)*(?:\.\d*(?:_\d+)*)?|\.\d+(?:_\d+)*)(?:[eE][\+\-]?\d+(?:_\d+)*)?))|inf)'i;
    -
    -require Exporter;
    -
    -@ISA = qw(Exporter);
    -
    -my @trig = qw(
    -	      pi
    -	      tan
    -	      csc cosec sec cot cotan
    -	      asin acos atan
    -	      acsc acosec asec acot acotan
    -	      sinh cosh tanh
    -	      csch cosech sech coth cotanh
    -	      asinh acosh atanh
    -	      acsch acosech asech acoth acotanh
    -	     );
    -
    -@EXPORT = (qw(
    -	     i Re Im rho theta arg
    -	     sqrt log ln
    -	     log10 logn cbrt root
    -	     cplx cplxe
    -	     atan2
    -	     ),
    -	   @trig);
    -
    -@EXPORT_OK = qw(decplx);
    -
    -%EXPORT_TAGS = (
    -    'trig' => [@trig],
    -);
    -
    -use overload
    -	'+'	=> \&plus,
    -	'-'	=> \&minus,
    -	'*'	=> \&multiply,
    -	'/'	=> \÷,
    -	'**'	=> \&power,
    -	'=='	=> \&numeq,
    -	'<=>'	=> \&spaceship,
    -	'neg'	=> \&negate,
    -	'~'	=> \&conjugate,
    -	'abs'	=> \&abs,
    -	'sqrt'	=> \&sqrt,
    -	'exp'	=> \&exp,
    -	'log'	=> \&log,
    -	'sin'	=> \&sin,
    -	'cos'	=> \&cos,
    -	'tan'	=> \&tan,
    -	'atan2'	=> \&atan2,
    -	qw("" stringify);
    -
    -#
    -# Package "privates"
    -#
    -
    -my %DISPLAY_FORMAT = ('style' => 'cartesian',
    -		      'polar_pretty_print' => 1);
    -my $eps            = 1e-14;		# Epsilon
    -
    -#
    -# Object attributes (internal):
    -#	cartesian	[real, imaginary] -- cartesian form
    -#	polar		[rho, theta] -- polar form
    -#	c_dirty		cartesian form not up-to-date
    -#	p_dirty		polar form not up-to-date
    -#	display		display format (package's global when not set)
    -#
    -
    -# Die on bad *make() arguments.
    -
    -sub _cannot_make {
    -    die "@{[(caller(1))[3]]}: Cannot take $_[0] of '$_[1]'.\n";
    -}
    -
    -sub _make {
    -    my $arg = shift;
    -    my ($p, $q);
    -
    -    if ($arg =~ /^$gre$/) {
    -	($p, $q) = ($1, 0);
    -    } elsif ($arg =~ /^(?:$gre)?$gre\s*i\s*$/) {
    -	($p, $q) = ($1 || 0, $2);
    -    } elsif ($arg =~ /^\s*\(\s*$gre\s*(?:,\s*$gre\s*)?\)\s*$/) {
    -	($p, $q) = ($1, $2 || 0);
    -    }
    -
    -    if (defined $p) {
    -	$p =~ s/^\+//;
    -	$p =~ s/^(-?)inf$/"${1}9**9**9"/e;
    -	$q =~ s/^\+//;
    -	$q =~ s/^(-?)inf$/"${1}9**9**9"/e;
    -    }
    -
    -    return ($p, $q);
    -}
    -
    -sub _emake {
    -    my $arg = shift;
    -    my ($p, $q);
    -
    -    if ($arg =~ /^\s*\[\s*$gre\s*(?:,\s*$gre\s*)?\]\s*$/) {
    -	($p, $q) = ($1, $2 || 0);
    -    } elsif ($arg =~ m!^\s*\[\s*$gre\s*(?:,\s*([-+]?\d*\s*)?pi(?:/\s*(\d+))?\s*)?\]\s*$!) {
    -	($p, $q) = ($1, ($2 eq '-' ? -1 : ($2 || 1)) * pi() / ($3 || 1));
    -    } elsif ($arg =~ /^\s*\[\s*$gre\s*\]\s*$/) {
    -	($p, $q) = ($1, 0);
    -    } elsif ($arg =~ /^\s*$gre\s*$/) {
    -	($p, $q) = ($1, 0);
    -    }
    -
    -    if (defined $p) {
    -	$p =~ s/^\+//;
    -	$q =~ s/^\+//;
    -	$p =~ s/^(-?)inf$/"${1}9**9**9"/e;
    -	$q =~ s/^(-?)inf$/"${1}9**9**9"/e;
    -    }
    -
    -    return ($p, $q);
    -}
    -
    -#
    -# ->make
    -#
    -# Create a new complex number (cartesian form)
    -#
    -sub make {
    -    my $self = bless {}, shift;
    -    my ($re, $im);
    -    if (@_ == 0) {
    -	($re, $im) = (0, 0);
    -    } elsif (@_ == 1) {
    -	return (ref $self)->emake($_[0])
    -	    if ($_[0] =~ /^\s*\[/);
    -	($re, $im) = _make($_[0]);
    -    } elsif (@_ == 2) {
    -	($re, $im) = @_;
    -    }
    -    if (defined $re) {
    -	_cannot_make("real part",      $re) unless $re =~ /^$gre$/;
    -    }
    -    $im ||= 0;
    -    _cannot_make("imaginary part", $im) unless $im =~ /^$gre$/;
    -    $self->set_cartesian([$re, $im ]);
    -    $self->display_format('cartesian');
    -
    -    return $self;
    -}
    -
    -#
    -# ->emake
    -#
    -# Create a new complex number (exponential form)
    -#
    -sub emake {
    -    my $self = bless {}, shift;
    -    my ($rho, $theta);
    -    if (@_ == 0) {
    -	($rho, $theta) = (0, 0);
    -    } elsif (@_ == 1) {
    -	return (ref $self)->make($_[0])
    -	    if ($_[0] =~ /^\s*\(/ || $_[0] =~ /i\s*$/);
    -	($rho, $theta) = _emake($_[0]);
    -    } elsif (@_ == 2) {
    -	($rho, $theta) = @_;
    -    }
    -    if (defined $rho && defined $theta) {
    -	if ($rho < 0) {
    -	    $rho   = -$rho;
    -	    $theta = ($theta <= 0) ? $theta + pi() : $theta - pi();
    -	}
    -    }
    -    if (defined $rho) {
    -	_cannot_make("rho",   $rho)   unless $rho   =~ /^$gre$/;
    -    }
    -    $theta ||= 0;
    -    _cannot_make("theta", $theta) unless $theta =~ /^$gre$/;
    -    $self->set_polar([$rho, $theta]);
    -    $self->display_format('polar');
    -
    -    return $self;
    -}
    -
    -sub new { &make }		# For backward compatibility only.
    -
    -#
    -# cplx
    -#
    -# Creates a complex number from a (re, im) tuple.
    -# This avoids the burden of writing Math::Complex->make(re, im).
    -#
    -sub cplx {
    -	return __PACKAGE__->make(@_);
    -}
    -
    -#
    -# cplxe
    -#
    -# Creates a complex number from a (rho, theta) tuple.
    -# This avoids the burden of writing Math::Complex->emake(rho, theta).
    -#
    -sub cplxe {
    -	return __PACKAGE__->emake(@_);
    -}
    -
    -#
    -# pi
    -#
    -# The number defined as pi = 180 degrees
    -#
    -sub pi () { 4 * CORE::atan2(1, 1) }
    -
    -#
    -# pit2
    -#
    -# The full circle
    -#
    -sub pit2 () { 2 * pi }
    -
    -#
    -# pip2
    -#
    -# The quarter circle
    -#
    -sub pip2 () { pi / 2 }
    -
    -#
    -# deg1
    -#
    -# One degree in radians, used in stringify_polar.
    -#
    -
    -sub deg1 () { pi / 180 }
    -
    -#
    -# uplog10
    -#
    -# Used in log10().
    -#
    -sub uplog10 () { 1 / CORE::log(10) }
    -
    -#
    -# i
    -#
    -# The number defined as i*i = -1;
    -#
    -sub i () {
    -        return $i if ($i);
    -	$i = bless {};
    -	$i->{'cartesian'} = [0, 1];
    -	$i->{'polar'}     = [1, pip2];
    -	$i->{c_dirty} = 0;
    -	$i->{p_dirty} = 0;
    -	return $i;
    -}
    -
    -#
    -# ip2
    -#
    -# Half of i.
    -#
    -sub ip2 () { i / 2 }
    -
    -#
    -# Attribute access/set routines
    -#
    -
    -sub cartesian {$_[0]->{c_dirty} ?
    -		   $_[0]->update_cartesian : $_[0]->{'cartesian'}}
    -sub polar     {$_[0]->{p_dirty} ?
    -		   $_[0]->update_polar : $_[0]->{'polar'}}
    -
    -sub set_cartesian { $_[0]->{p_dirty}++; $_[0]->{c_dirty} = 0;
    -		    $_[0]->{'cartesian'} = $_[1] }
    -sub set_polar     { $_[0]->{c_dirty}++; $_[0]->{p_dirty} = 0;
    -		    $_[0]->{'polar'} = $_[1] }
    -
    -#
    -# ->update_cartesian
    -#
    -# Recompute and return the cartesian form, given accurate polar form.
    -#
    -sub update_cartesian {
    -	my $self = shift;
    -	my ($r, $t) = @{$self->{'polar'}};
    -	$self->{c_dirty} = 0;
    -	return $self->{'cartesian'} = [$r * CORE::cos($t), $r * CORE::sin($t)];
    -}
    -
    -#
    -#
    -# ->update_polar
    -#
    -# Recompute and return the polar form, given accurate cartesian form.
    -#
    -sub update_polar {
    -	my $self = shift;
    -	my ($x, $y) = @{$self->{'cartesian'}};
    -	$self->{p_dirty} = 0;
    -	return $self->{'polar'} = [0, 0] if $x == 0 && $y == 0;
    -	return $self->{'polar'} = [CORE::sqrt($x*$x + $y*$y),
    -				   CORE::atan2($y, $x)];
    -}
    -
    -#
    -# (plus)
    -#
    -# Computes z1+z2.
    -#
    -sub plus {
    -	my ($z1, $z2, $regular) = @_;
    -	my ($re1, $im1) = @{$z1->cartesian};
    -	$z2 = cplx($z2) unless ref $z2;
    -	my ($re2, $im2) = ref $z2 ? @{$z2->cartesian} : ($z2, 0);
    -	unless (defined $regular) {
    -		$z1->set_cartesian([$re1 + $re2, $im1 + $im2]);
    -		return $z1;
    -	}
    -	return (ref $z1)->make($re1 + $re2, $im1 + $im2);
    -}
    -
    -#
    -# (minus)
    -#
    -# Computes z1-z2.
    -#
    -sub minus {
    -	my ($z1, $z2, $inverted) = @_;
    -	my ($re1, $im1) = @{$z1->cartesian};
    -	$z2 = cplx($z2) unless ref $z2;
    -	my ($re2, $im2) = @{$z2->cartesian};
    -	unless (defined $inverted) {
    -		$z1->set_cartesian([$re1 - $re2, $im1 - $im2]);
    -		return $z1;
    -	}
    -	return $inverted ?
    -		(ref $z1)->make($re2 - $re1, $im2 - $im1) :
    -		(ref $z1)->make($re1 - $re2, $im1 - $im2);
    -
    -}
    -
    -#
    -# (multiply)
    -#
    -# Computes z1*z2.
    -#
    -sub multiply {
    -        my ($z1, $z2, $regular) = @_;
    -	if ($z1->{p_dirty} == 0 and ref $z2 and $z2->{p_dirty} == 0) {
    -	    # if both polar better use polar to avoid rounding errors
    -	    my ($r1, $t1) = @{$z1->polar};
    -	    my ($r2, $t2) = @{$z2->polar};
    -	    my $t = $t1 + $t2;
    -	    if    ($t >   pi()) { $t -= pit2 }
    -	    elsif ($t <= -pi()) { $t += pit2 }
    -	    unless (defined $regular) {
    -		$z1->set_polar([$r1 * $r2, $t]);
    -		return $z1;
    -	    }
    -	    return (ref $z1)->emake($r1 * $r2, $t);
    -	} else {
    -	    my ($x1, $y1) = @{$z1->cartesian};
    -	    if (ref $z2) {
    -		my ($x2, $y2) = @{$z2->cartesian};
    -		return (ref $z1)->make($x1*$x2-$y1*$y2, $x1*$y2+$y1*$x2);
    -	    } else {
    -		return (ref $z1)->make($x1*$z2, $y1*$z2);
    -	    }
    -	}
    -}
    -
    -#
    -# _divbyzero
    -#
    -# Die on division by zero.
    -#
    -sub _divbyzero {
    -    my $mess = "$_[0]: Division by zero.\n";
    -
    -    if (defined $_[1]) {
    -	$mess .= "(Because in the definition of $_[0], the divisor ";
    -	$mess .= "$_[1] " unless ("$_[1]" eq '0');
    -	$mess .= "is 0)\n";
    -    }
    -
    -    my @up = caller(1);
    -
    -    $mess .= "Died at $up[1] line $up[2].\n";
    -
    -    die $mess;
    -}
    -
    -#
    -# (divide)
    -#
    -# Computes z1/z2.
    -#
    -sub divide {
    -	my ($z1, $z2, $inverted) = @_;
    -	if ($z1->{p_dirty} == 0 and ref $z2 and $z2->{p_dirty} == 0) {
    -	    # if both polar better use polar to avoid rounding errors
    -	    my ($r1, $t1) = @{$z1->polar};
    -	    my ($r2, $t2) = @{$z2->polar};
    -	    my $t;
    -	    if ($inverted) {
    -		_divbyzero "$z2/0" if ($r1 == 0);
    -		$t = $t2 - $t1;
    -		if    ($t >   pi()) { $t -= pit2 }
    -		elsif ($t <= -pi()) { $t += pit2 }
    -		return (ref $z1)->emake($r2 / $r1, $t);
    -	    } else {
    -		_divbyzero "$z1/0" if ($r2 == 0);
    -		$t = $t1 - $t2;
    -		if    ($t >   pi()) { $t -= pit2 }
    -		elsif ($t <= -pi()) { $t += pit2 }
    -		return (ref $z1)->emake($r1 / $r2, $t);
    -	    }
    -	} else {
    -	    my ($d, $x2, $y2);
    -	    if ($inverted) {
    -		($x2, $y2) = @{$z1->cartesian};
    -		$d = $x2*$x2 + $y2*$y2;
    -		_divbyzero "$z2/0" if $d == 0;
    -		return (ref $z1)->make(($x2*$z2)/$d, -($y2*$z2)/$d);
    -	    } else {
    -		my ($x1, $y1) = @{$z1->cartesian};
    -		if (ref $z2) {
    -		    ($x2, $y2) = @{$z2->cartesian};
    -		    $d = $x2*$x2 + $y2*$y2;
    -		    _divbyzero "$z1/0" if $d == 0;
    -		    my $u = ($x1*$x2 + $y1*$y2)/$d;
    -		    my $v = ($y1*$x2 - $x1*$y2)/$d;
    -		    return (ref $z1)->make($u, $v);
    -		} else {
    -		    _divbyzero "$z1/0" if $z2 == 0;
    -		    return (ref $z1)->make($x1/$z2, $y1/$z2);
    -		}
    -	    }
    -	}
    -}
    -
    -#
    -# (power)
    -#
    -# Computes z1**z2 = exp(z2 * log z1)).
    -#
    -sub power {
    -	my ($z1, $z2, $inverted) = @_;
    -	if ($inverted) {
    -	    return 1 if $z1 == 0 || $z2 == 1;
    -	    return 0 if $z2 == 0 && Re($z1) > 0;
    -	} else {
    -	    return 1 if $z2 == 0 || $z1 == 1;
    -	    return 0 if $z1 == 0 && Re($z2) > 0;
    -	}
    -	my $w = $inverted ? &exp($z1 * &log($z2))
    -	                  : &exp($z2 * &log($z1));
    -	# If both arguments cartesian, return cartesian, else polar.
    -	return $z1->{c_dirty} == 0 &&
    -	       (not ref $z2 or $z2->{c_dirty} == 0) ?
    -	       cplx(@{$w->cartesian}) : $w;
    -}
    -
    -#
    -# (spaceship)
    -#
    -# Computes z1 <=> z2.
    -# Sorts on the real part first, then on the imaginary part. Thus 2-4i < 3+8i.
    -#
    -sub spaceship {
    -	my ($z1, $z2, $inverted) = @_;
    -	my ($re1, $im1) = ref $z1 ? @{$z1->cartesian} : ($z1, 0);
    -	my ($re2, $im2) = ref $z2 ? @{$z2->cartesian} : ($z2, 0);
    -	my $sgn = $inverted ? -1 : 1;
    -	return $sgn * ($re1 <=> $re2) if $re1 != $re2;
    -	return $sgn * ($im1 <=> $im2);
    -}
    -
    -#
    -# (numeq)
    -#
    -# Computes z1 == z2.
    -#
    -# (Required in addition to spaceship() because of NaNs.)
    -sub numeq {
    -	my ($z1, $z2, $inverted) = @_;
    -	my ($re1, $im1) = ref $z1 ? @{$z1->cartesian} : ($z1, 0);
    -	my ($re2, $im2) = ref $z2 ? @{$z2->cartesian} : ($z2, 0);
    -	return $re1 == $re2 && $im1 == $im2 ? 1 : 0;
    -}
    -
    -#
    -# (negate)
    -#
    -# Computes -z.
    -#
    -sub negate {
    -	my ($z) = @_;
    -	if ($z->{c_dirty}) {
    -		my ($r, $t) = @{$z->polar};
    -		$t = ($t <= 0) ? $t + pi : $t - pi;
    -		return (ref $z)->emake($r, $t);
    -	}
    -	my ($re, $im) = @{$z->cartesian};
    -	return (ref $z)->make(-$re, -$im);
    -}
    -
    -#
    -# (conjugate)
    -#
    -# Compute complex's conjugate.
    -#
    -sub conjugate {
    -	my ($z) = @_;
    -	if ($z->{c_dirty}) {
    -		my ($r, $t) = @{$z->polar};
    -		return (ref $z)->emake($r, -$t);
    -	}
    -	my ($re, $im) = @{$z->cartesian};
    -	return (ref $z)->make($re, -$im);
    -}
    -
    -#
    -# (abs)
    -#
    -# Compute or set complex's norm (rho).
    -#
    -sub abs {
    -	my ($z, $rho) = @_;
    -	unless (ref $z) {
    -	    if (@_ == 2) {
    -		$_[0] = $_[1];
    -	    } else {
    -		return CORE::abs($z);
    -	    }
    -	}
    -	if (defined $rho) {
    -	    $z->{'polar'} = [ $rho, ${$z->polar}[1] ];
    -	    $z->{p_dirty} = 0;
    -	    $z->{c_dirty} = 1;
    -	    return $rho;
    -	} else {
    -	    return ${$z->polar}[0];
    -	}
    -}
    -
    -sub _theta {
    -    my $theta = $_[0];
    -
    -    if    ($$theta >   pi()) { $$theta -= pit2 }
    -    elsif ($$theta <= -pi()) { $$theta += pit2 }
    -}
    -
    -#
    -# arg
    -#
    -# Compute or set complex's argument (theta).
    -#
    -sub arg {
    -	my ($z, $theta) = @_;
    -	return $z unless ref $z;
    -	if (defined $theta) {
    -	    _theta(\$theta);
    -	    $z->{'polar'} = [ ${$z->polar}[0], $theta ];
    -	    $z->{p_dirty} = 0;
    -	    $z->{c_dirty} = 1;
    -	} else {
    -	    $theta = ${$z->polar}[1];
    -	    _theta(\$theta);
    -	}
    -	return $theta;
    -}
    -
    -#
    -# (sqrt)
    -#
    -# Compute sqrt(z).
    -#
    -# It is quite tempting to use wantarray here so that in list context
    -# sqrt() would return the two solutions.  This, however, would
    -# break things like
    -#
    -#	print "sqrt(z) = ", sqrt($z), "\n";
    -#
    -# The two values would be printed side by side without no intervening
    -# whitespace, quite confusing.
    -# Therefore if you want the two solutions use the root().
    -#
    -sub sqrt {
    -	my ($z) = @_;
    -	my ($re, $im) = ref $z ? @{$z->cartesian} : ($z, 0);
    -	return $re < 0 ? cplx(0, CORE::sqrt(-$re)) : CORE::sqrt($re)
    -	    if $im == 0;
    -	my ($r, $t) = @{$z->polar};
    -	return (ref $z)->emake(CORE::sqrt($r), $t/2);
    -}
    -
    -#
    -# cbrt
    -#
    -# Compute cbrt(z) (cubic root).
    -#
    -# Why are we not returning three values?  The same answer as for sqrt().
    -#
    -sub cbrt {
    -	my ($z) = @_;
    -	return $z < 0 ?
    -	    -CORE::exp(CORE::log(-$z)/3) :
    -		($z > 0 ? CORE::exp(CORE::log($z)/3): 0)
    -	    unless ref $z;
    -	my ($r, $t) = @{$z->polar};
    -	return 0 if $r == 0;
    -	return (ref $z)->emake(CORE::exp(CORE::log($r)/3), $t/3);
    -}
    -
    -#
    -# _rootbad
    -#
    -# Die on bad root.
    -#
    -sub _rootbad {
    -    my $mess = "Root '$_[0]' illegal, root rank must be positive integer.\n";
    -
    -    my @up = caller(1);
    -
    -    $mess .= "Died at $up[1] line $up[2].\n";
    -
    -    die $mess;
    -}
    -
    -#
    -# root
    -#
    -# Computes all nth root for z, returning an array whose size is n.
    -# `n' must be a positive integer.
    -#
    -# The roots are given by (for k = 0..n-1):
    -#
    -# z^(1/n) = r^(1/n) (cos ((t+2 k pi)/n) + i sin ((t+2 k pi)/n))
    -#
    -sub root {
    -	my ($z, $n, $k) = @_;
    -	_rootbad($n) if ($n < 1 or int($n) != $n);
    -	my ($r, $t) = ref $z ?
    -	    @{$z->polar} : (CORE::abs($z), $z >= 0 ? 0 : pi);
    -	my $theta_inc = pit2 / $n;
    -	my $rho = $r ** (1/$n);
    -	my $cartesian = ref $z && $z->{c_dirty} == 0;
    -	if (@_ == 2) {
    -	    my @root;
    -	    for (my $i = 0, my $theta = $t / $n;
    -		 $i < $n;
    -		 $i++, $theta += $theta_inc) {
    -		my $w = cplxe($rho, $theta);
    -		# Yes, $cartesian is loop invariant.
    -		push @root, $cartesian ? cplx(@{$w->cartesian}) : $w;
    -	    }
    -	    return @root;
    -	} elsif (@_ == 3) {
    -	    my $w = cplxe($rho, $t / $n + $k * $theta_inc);
    -	    return $cartesian ? cplx(@{$w->cartesian}) : $w;
    -	}
    -}
    -
    -#
    -# Re
    -#
    -# Return or set Re(z).
    -#
    -sub Re {
    -	my ($z, $Re) = @_;
    -	return $z unless ref $z;
    -	if (defined $Re) {
    -	    $z->{'cartesian'} = [ $Re, ${$z->cartesian}[1] ];
    -	    $z->{c_dirty} = 0;
    -	    $z->{p_dirty} = 1;
    -	} else {
    -	    return ${$z->cartesian}[0];
    -	}
    -}
    -
    -#
    -# Im
    -#
    -# Return or set Im(z).
    -#
    -sub Im {
    -	my ($z, $Im) = @_;
    -	return 0 unless ref $z;
    -	if (defined $Im) {
    -	    $z->{'cartesian'} = [ ${$z->cartesian}[0], $Im ];
    -	    $z->{c_dirty} = 0;
    -	    $z->{p_dirty} = 1;
    -	} else {
    -	    return ${$z->cartesian}[1];
    -	}
    -}
    -
    -#
    -# rho
    -#
    -# Return or set rho(w).
    -#
    -sub rho {
    -    Math::Complex::abs(@_);
    -}
    -
    -#
    -# theta
    -#
    -# Return or set theta(w).
    -#
    -sub theta {
    -    Math::Complex::arg(@_);
    -}
    -
    -#
    -# (exp)
    -#
    -# Computes exp(z).
    -#
    -sub exp {
    -	my ($z) = @_;
    -	my ($x, $y) = @{$z->cartesian};
    -	return (ref $z)->emake(CORE::exp($x), $y);
    -}
    -
    -#
    -# _logofzero
    -#
    -# Die on logarithm of zero.
    -#
    -sub _logofzero {
    -    my $mess = "$_[0]: Logarithm of zero.\n";
    -
    -    if (defined $_[1]) {
    -	$mess .= "(Because in the definition of $_[0], the argument ";
    -	$mess .= "$_[1] " unless ($_[1] eq '0');
    -	$mess .= "is 0)\n";
    -    }
    -
    -    my @up = caller(1);
    -
    -    $mess .= "Died at $up[1] line $up[2].\n";
    -
    -    die $mess;
    -}
    -
    -#
    -# (log)
    -#
    -# Compute log(z).
    -#
    -sub log {
    -	my ($z) = @_;
    -	unless (ref $z) {
    -	    _logofzero("log") if $z == 0;
    -	    return $z > 0 ? CORE::log($z) : cplx(CORE::log(-$z), pi);
    -	}
    -	my ($r, $t) = @{$z->polar};
    -	_logofzero("log") if $r == 0;
    -	if    ($t >   pi()) { $t -= pit2 }
    -	elsif ($t <= -pi()) { $t += pit2 }
    -	return (ref $z)->make(CORE::log($r), $t);
    -}
    -
    -#
    -# ln
    -#
    -# Alias for log().
    -#
    -sub ln { Math::Complex::log(@_) }
    -
    -#
    -# log10
    -#
    -# Compute log10(z).
    -#
    -
    -sub log10 {
    -	return Math::Complex::log($_[0]) * uplog10;
    -}
    -
    -#
    -# logn
    -#
    -# Compute logn(z,n) = log(z) / log(n)
    -#
    -sub logn {
    -	my ($z, $n) = @_;
    -	$z = cplx($z, 0) unless ref $z;
    -	my $logn = $LOGN{$n};
    -	$logn = $LOGN{$n} = CORE::log($n) unless defined $logn;	# Cache log(n)
    -	return &log($z) / $logn;
    -}
    -
    -#
    -# (cos)
    -#
    -# Compute cos(z) = (exp(iz) + exp(-iz))/2.
    -#
    -sub cos {
    -	my ($z) = @_;
    -	return CORE::cos($z) unless ref $z;
    -	my ($x, $y) = @{$z->cartesian};
    -	my $ey = CORE::exp($y);
    -	my $sx = CORE::sin($x);
    -	my $cx = CORE::cos($x);
    -	my $ey_1 = $ey ? 1 / $ey : $Inf;
    -	return (ref $z)->make($cx * ($ey + $ey_1)/2,
    -			      $sx * ($ey_1 - $ey)/2);
    -}
    -
    -#
    -# (sin)
    -#
    -# Compute sin(z) = (exp(iz) - exp(-iz))/2.
    -#
    -sub sin {
    -	my ($z) = @_;
    -	return CORE::sin($z) unless ref $z;
    -	my ($x, $y) = @{$z->cartesian};
    -	my $ey = CORE::exp($y);
    -	my $sx = CORE::sin($x);
    -	my $cx = CORE::cos($x);
    -	my $ey_1 = $ey ? 1 / $ey : $Inf;
    -	return (ref $z)->make($sx * ($ey + $ey_1)/2,
    -			      $cx * ($ey - $ey_1)/2);
    -}
    -
    -#
    -# tan
    -#
    -# Compute tan(z) = sin(z) / cos(z).
    -#
    -sub tan {
    -	my ($z) = @_;
    -	my $cz = &cos($z);
    -	_divbyzero "tan($z)", "cos($z)" if $cz == 0;
    -	return &sin($z) / $cz;
    -}
    -
    -#
    -# sec
    -#
    -# Computes the secant sec(z) = 1 / cos(z).
    -#
    -sub sec {
    -	my ($z) = @_;
    -	my $cz = &cos($z);
    -	_divbyzero "sec($z)", "cos($z)" if ($cz == 0);
    -	return 1 / $cz;
    -}
    -
    -#
    -# csc
    -#
    -# Computes the cosecant csc(z) = 1 / sin(z).
    -#
    -sub csc {
    -	my ($z) = @_;
    -	my $sz = &sin($z);
    -	_divbyzero "csc($z)", "sin($z)" if ($sz == 0);
    -	return 1 / $sz;
    -}
    -
    -#
    -# cosec
    -#
    -# Alias for csc().
    -#
    -sub cosec { Math::Complex::csc(@_) }
    -
    -#
    -# cot
    -#
    -# Computes cot(z) = cos(z) / sin(z).
    -#
    -sub cot {
    -	my ($z) = @_;
    -	my $sz = &sin($z);
    -	_divbyzero "cot($z)", "sin($z)" if ($sz == 0);
    -	return &cos($z) / $sz;
    -}
    -
    -#
    -# cotan
    -#
    -# Alias for cot().
    -#
    -sub cotan { Math::Complex::cot(@_) }
    -
    -#
    -# acos
    -#
    -# Computes the arc cosine acos(z) = -i log(z + sqrt(z*z-1)).
    -#
    -sub acos {
    -	my $z = $_[0];
    -	return CORE::atan2(CORE::sqrt(1-$z*$z), $z)
    -	    if (! ref $z) && CORE::abs($z) <= 1;
    -	$z = cplx($z, 0) unless ref $z;
    -	my ($x, $y) = @{$z->cartesian};
    -	return 0 if $x == 1 && $y == 0;
    -	my $t1 = CORE::sqrt(($x+1)*($x+1) + $y*$y);
    -	my $t2 = CORE::sqrt(($x-1)*($x-1) + $y*$y);
    -	my $alpha = ($t1 + $t2)/2;
    -	my $beta  = ($t1 - $t2)/2;
    -	$alpha = 1 if $alpha < 1;
    -	if    ($beta >  1) { $beta =  1 }
    -	elsif ($beta < -1) { $beta = -1 }
    -	my $u = CORE::atan2(CORE::sqrt(1-$beta*$beta), $beta);
    -	my $v = CORE::log($alpha + CORE::sqrt($alpha*$alpha-1));
    -	$v = -$v if $y > 0 || ($y == 0 && $x < -1);
    -	return (ref $z)->make($u, $v);
    -}
    -
    -#
    -# asin
    -#
    -# Computes the arc sine asin(z) = -i log(iz + sqrt(1-z*z)).
    -#
    -sub asin {
    -	my $z = $_[0];
    -	return CORE::atan2($z, CORE::sqrt(1-$z*$z))
    -	    if (! ref $z) && CORE::abs($z) <= 1;
    -	$z = cplx($z, 0) unless ref $z;
    -	my ($x, $y) = @{$z->cartesian};
    -	return 0 if $x == 0 && $y == 0;
    -	my $t1 = CORE::sqrt(($x+1)*($x+1) + $y*$y);
    -	my $t2 = CORE::sqrt(($x-1)*($x-1) + $y*$y);
    -	my $alpha = ($t1 + $t2)/2;
    -	my $beta  = ($t1 - $t2)/2;
    -	$alpha = 1 if $alpha < 1;
    -	if    ($beta >  1) { $beta =  1 }
    -	elsif ($beta < -1) { $beta = -1 }
    -	my $u =  CORE::atan2($beta, CORE::sqrt(1-$beta*$beta));
    -	my $v = -CORE::log($alpha + CORE::sqrt($alpha*$alpha-1));
    -	$v = -$v if $y > 0 || ($y == 0 && $x < -1);
    -	return (ref $z)->make($u, $v);
    -}
    -
    -#
    -# atan
    -#
    -# Computes the arc tangent atan(z) = i/2 log((i+z) / (i-z)).
    -#
    -sub atan {
    -	my ($z) = @_;
    -	return CORE::atan2($z, 1) unless ref $z;
    -	my ($x, $y) = ref $z ? @{$z->cartesian} : ($z, 0);
    -	return 0 if $x == 0 && $y == 0;
    -	_divbyzero "atan(i)"  if ( $z == i);
    -	_logofzero "atan(-i)" if (-$z == i); # -i is a bad file test...
    -	my $log = &log((i + $z) / (i - $z));
    -	return ip2 * $log;
    -}
    -
    -#
    -# asec
    -#
    -# Computes the arc secant asec(z) = acos(1 / z).
    -#
    -sub asec {
    -	my ($z) = @_;
    -	_divbyzero "asec($z)", $z if ($z == 0);
    -	return acos(1 / $z);
    -}
    -
    -#
    -# acsc
    -#
    -# Computes the arc cosecant acsc(z) = asin(1 / z).
    -#
    -sub acsc {
    -	my ($z) = @_;
    -	_divbyzero "acsc($z)", $z if ($z == 0);
    -	return asin(1 / $z);
    -}
    -
    -#
    -# acosec
    -#
    -# Alias for acsc().
    -#
    -sub acosec { Math::Complex::acsc(@_) }
    -
    -#
    -# acot
    -#
    -# Computes the arc cotangent acot(z) = atan(1 / z)
    -#
    -sub acot {
    -	my ($z) = @_;
    -	_divbyzero "acot(0)"  if $z == 0;
    -	return ($z >= 0) ? CORE::atan2(1, $z) : CORE::atan2(-1, -$z)
    -	    unless ref $z;
    -	_divbyzero "acot(i)"  if ($z - i == 0);
    -	_logofzero "acot(-i)" if ($z + i == 0);
    -	return atan(1 / $z);
    -}
    -
    -#
    -# acotan
    -#
    -# Alias for acot().
    -#
    -sub acotan { Math::Complex::acot(@_) }
    -
    -#
    -# cosh
    -#
    -# Computes the hyperbolic cosine cosh(z) = (exp(z) + exp(-z))/2.
    -#
    -sub cosh {
    -	my ($z) = @_;
    -	my $ex;
    -	unless (ref $z) {
    -	    $ex = CORE::exp($z);
    -	    return $ex ? ($ex + 1/$ex)/2 : $Inf;
    -	}
    -	my ($x, $y) = @{$z->cartesian};
    -	$ex = CORE::exp($x);
    -	my $ex_1 = $ex ? 1 / $ex : $Inf;
    -	return (ref $z)->make(CORE::cos($y) * ($ex + $ex_1)/2,
    -			      CORE::sin($y) * ($ex - $ex_1)/2);
    -}
    -
    -#
    -# sinh
    -#
    -# Computes the hyperbolic sine sinh(z) = (exp(z) - exp(-z))/2.
    -#
    -sub sinh {
    -	my ($z) = @_;
    -	my $ex;
    -	unless (ref $z) {
    -	    return 0 if $z == 0;
    -	    $ex = CORE::exp($z);
    -	    return $ex ? ($ex - 1/$ex)/2 : "-$Inf";
    -	}
    -	my ($x, $y) = @{$z->cartesian};
    -	my $cy = CORE::cos($y);
    -	my $sy = CORE::sin($y);
    -	$ex = CORE::exp($x);
    -	my $ex_1 = $ex ? 1 / $ex : $Inf;
    -	return (ref $z)->make(CORE::cos($y) * ($ex - $ex_1)/2,
    -			      CORE::sin($y) * ($ex + $ex_1)/2);
    -}
    -
    -#
    -# tanh
    -#
    -# Computes the hyperbolic tangent tanh(z) = sinh(z) / cosh(z).
    -#
    -sub tanh {
    -	my ($z) = @_;
    -	my $cz = cosh($z);
    -	_divbyzero "tanh($z)", "cosh($z)" if ($cz == 0);
    -	return sinh($z) / $cz;
    -}
    -
    -#
    -# sech
    -#
    -# Computes the hyperbolic secant sech(z) = 1 / cosh(z).
    -#
    -sub sech {
    -	my ($z) = @_;
    -	my $cz = cosh($z);
    -	_divbyzero "sech($z)", "cosh($z)" if ($cz == 0);
    -	return 1 / $cz;
    -}
    -
    -#
    -# csch
    -#
    -# Computes the hyperbolic cosecant csch(z) = 1 / sinh(z).
    -#
    -sub csch {
    -	my ($z) = @_;
    -	my $sz = sinh($z);
    -	_divbyzero "csch($z)", "sinh($z)" if ($sz == 0);
    -	return 1 / $sz;
    -}
    -
    -#
    -# cosech
    -#
    -# Alias for csch().
    -#
    -sub cosech { Math::Complex::csch(@_) }
    -
    -#
    -# coth
    -#
    -# Computes the hyperbolic cotangent coth(z) = cosh(z) / sinh(z).
    -#
    -sub coth {
    -	my ($z) = @_;
    -	my $sz = sinh($z);
    -	_divbyzero "coth($z)", "sinh($z)" if $sz == 0;
    -	return cosh($z) / $sz;
    -}
    -
    -#
    -# cotanh
    -#
    -# Alias for coth().
    -#
    -sub cotanh { Math::Complex::coth(@_) }
    -
    -#
    -# acosh
    -#
    -# Computes the arc hyperbolic cosine acosh(z) = log(z + sqrt(z*z-1)).
    -#
    -sub acosh {
    -	my ($z) = @_;
    -	unless (ref $z) {
    -	    $z = cplx($z, 0);
    -	}
    -	my ($re, $im) = @{$z->cartesian};
    -	if ($im == 0) {
    -	    return CORE::log($re + CORE::sqrt($re*$re - 1))
    -		if $re >= 1;
    -	    return cplx(0, CORE::atan2(CORE::sqrt(1 - $re*$re), $re))
    -		if CORE::abs($re) < 1;
    -	}
    -	my $t = &sqrt($z * $z - 1) + $z;
    -	# Try Taylor if looking bad (this usually means that
    -	# $z was large negative, therefore the sqrt is really
    -	# close to abs(z), summing that with z...)
    -	$t = 1/(2 * $z) - 1/(8 * $z**3) + 1/(16 * $z**5) - 5/(128 * $z**7)
    -	    if $t == 0;
    -	my $u = &log($t);
    -	$u->Im(-$u->Im) if $re < 0 && $im == 0;
    -	return $re < 0 ? -$u : $u;
    -}
    -
    -#
    -# asinh
    -#
    -# Computes the arc hyperbolic sine asinh(z) = log(z + sqrt(z*z+1))
    -#
    -sub asinh {
    -	my ($z) = @_;
    -	unless (ref $z) {
    -	    my $t = $z + CORE::sqrt($z*$z + 1);
    -	    return CORE::log($t) if $t;
    -	}
    -	my $t = &sqrt($z * $z + 1) + $z;
    -	# Try Taylor if looking bad (this usually means that
    -	# $z was large negative, therefore the sqrt is really
    -	# close to abs(z), summing that with z...)
    -	$t = 1/(2 * $z) - 1/(8 * $z**3) + 1/(16 * $z**5) - 5/(128 * $z**7)
    -	    if $t == 0;
    -	return &log($t);
    -}
    -
    -#
    -# atanh
    -#
    -# Computes the arc hyperbolic tangent atanh(z) = 1/2 log((1+z) / (1-z)).
    -#
    -sub atanh {
    -	my ($z) = @_;
    -	unless (ref $z) {
    -	    return CORE::log((1 + $z)/(1 - $z))/2 if CORE::abs($z) < 1;
    -	    $z = cplx($z, 0);
    -	}
    -	_divbyzero 'atanh(1)',  "1 - $z" if (1 - $z == 0);
    -	_logofzero 'atanh(-1)'           if (1 + $z == 0);
    -	return 0.5 * &log((1 + $z) / (1 - $z));
    -}
    -
    -#
    -# asech
    -#
    -# Computes the hyperbolic arc secant asech(z) = acosh(1 / z).
    -#
    -sub asech {
    -	my ($z) = @_;
    -	_divbyzero 'asech(0)', "$z" if ($z == 0);
    -	return acosh(1 / $z);
    -}
    -
    -#
    -# acsch
    -#
    -# Computes the hyperbolic arc cosecant acsch(z) = asinh(1 / z).
    -#
    -sub acsch {
    -	my ($z) = @_;
    -	_divbyzero 'acsch(0)', $z if ($z == 0);
    -	return asinh(1 / $z);
    -}
    -
    -#
    -# acosech
    -#
    -# Alias for acosh().
    -#
    -sub acosech { Math::Complex::acsch(@_) }
    -
    -#
    -# acoth
    -#
    -# Computes the arc hyperbolic cotangent acoth(z) = 1/2 log((1+z) / (z-1)).
    -#
    -sub acoth {
    -	my ($z) = @_;
    -	_divbyzero 'acoth(0)'            if ($z == 0);
    -	unless (ref $z) {
    -	    return CORE::log(($z + 1)/($z - 1))/2 if CORE::abs($z) > 1;
    -	    $z = cplx($z, 0);
    -	}
    -	_divbyzero 'acoth(1)',  "$z - 1" if ($z - 1 == 0);
    -	_logofzero 'acoth(-1)', "1 + $z" if (1 + $z == 0);
    -	return &log((1 + $z) / ($z - 1)) / 2;
    -}
    -
    -#
    -# acotanh
    -#
    -# Alias for acot().
    -#
    -sub acotanh { Math::Complex::acoth(@_) }
    -
    -#
    -# (atan2)
    -#
    -# Compute atan(z1/z2), minding the right quadrant.
    -#
    -sub atan2 {
    -	my ($z1, $z2, $inverted) = @_;
    -	my ($re1, $im1, $re2, $im2);
    -	if ($inverted) {
    -	    ($re1, $im1) = ref $z2 ? @{$z2->cartesian} : ($z2, 0);
    -	    ($re2, $im2) = ref $z1 ? @{$z1->cartesian} : ($z1, 0);
    -	} else {
    -	    ($re1, $im1) = ref $z1 ? @{$z1->cartesian} : ($z1, 0);
    -	    ($re2, $im2) = ref $z2 ? @{$z2->cartesian} : ($z2, 0);
    -	}
    -	if ($im1 || $im2) {
    -	    # In MATLAB the imaginary parts are ignored.
    -	    # warn "atan2: Imaginary parts ignored";
    -	    # http://documents.wolfram.com/mathematica/functions/ArcTan
    -	    # NOTE: Mathematica ArcTan[x,y] while atan2(y,x)
    -	    my $s = $z1 * $z1 + $z2 * $z2;
    -	    _divbyzero("atan2") if $s == 0;
    -	    my $i = &i;
    -	    my $r = $z2 + $z1 * $i;
    -	    return -$i * &log($r / &sqrt( $s ));
    -	}
    -	return CORE::atan2($re1, $re2);
    -}
    -
    -#
    -# display_format
    -# ->display_format
    -#
    -# Set (get if no argument) the display format for all complex numbers that
    -# don't happen to have overridden it via ->display_format
    -#
    -# When called as an object method, this actually sets the display format for
    -# the current object.
    -#
    -# Valid object formats are 'c' and 'p' for cartesian and polar. The first
    -# letter is used actually, so the type can be fully spelled out for clarity.
    -#
    -sub display_format {
    -	my $self  = shift;
    -	my %display_format = %DISPLAY_FORMAT;
    -
    -	if (ref $self) {			# Called as an object method
    -	    if (exists $self->{display_format}) {
    -		my %obj = %{$self->{display_format}};
    -		@display_format{keys %obj} = values %obj;
    -	    }
    -	}
    -	if (@_ == 1) {
    -	    $display_format{style} = shift;
    -	} else {
    -	    my %new = @_;
    -	    @display_format{keys %new} = values %new;
    -	}
    -
    -	if (ref $self) { # Called as an object method
    -	    $self->{display_format} = { %display_format };
    -	    return
    -		wantarray ?
    -		    %{$self->{display_format}} :
    -		    $self->{display_format}->{style};
    -	}
    -
    -        # Called as a class method
    -	%DISPLAY_FORMAT = %display_format;
    -	return
    -	    wantarray ?
    -		%DISPLAY_FORMAT :
    -		    $DISPLAY_FORMAT{style};
    -}
    -
    -#
    -# (stringify)
    -#
    -# Show nicely formatted complex number under its cartesian or polar form,
    -# depending on the current display format:
    -#
    -# . If a specific display format has been recorded for this object, use it.
    -# . Otherwise, use the generic current default for all complex numbers,
    -#   which is a package global variable.
    -#
    -sub stringify {
    -	my ($z) = shift;
    -
    -	my $style = $z->display_format;
    -
    -	$style = $DISPLAY_FORMAT{style} unless defined $style;
    -
    -	return $z->stringify_polar if $style =~ /^p/i;
    -	return $z->stringify_cartesian;
    -}
    -
    -#
    -# ->stringify_cartesian
    -#
    -# Stringify as a cartesian representation 'a+bi'.
    -#
    -sub stringify_cartesian {
    -	my $z  = shift;
    -	my ($x, $y) = @{$z->cartesian};
    -	my ($re, $im);
    -
    -	my %format = $z->display_format;
    -	my $format = $format{format};
    -
    -	if ($x) {
    -	    if ($x =~ /^NaN[QS]?$/i) {
    -		$re = $x;
    -	    } else {
    -		if ($x =~ /^-?$Inf$/oi) {
    -		    $re = $x;
    -		} else {
    -		    $re = defined $format ? sprintf($format, $x) : $x;
    -		}
    -	    }
    -	} else {
    -	    undef $re;
    -	}
    -
    -	if ($y) {
    -	    if ($y =~ /^(NaN[QS]?)$/i) {
    -		$im = $y;
    -	    } else {
    -		if ($y =~ /^-?$Inf$/oi) {
    -		    $im = $y;
    -		} else {
    -		    $im =
    -			defined $format ?
    -			    sprintf($format, $y) :
    -			    ($y == 1 ? "" : ($y == -1 ? "-" : $y));
    -		}
    -	    }
    -	    $im .= "i";
    -	} else {
    -	    undef $im;
    -	}
    -
    -	my $str = $re;
    -
    -	if (defined $im) {
    -	    if ($y < 0) {
    -		$str .= $im;
    -	    } elsif ($y > 0 || $im =~ /^NaN[QS]?i$/i)  {
    -		$str .= "+" if defined $re;
    -		$str .= $im;
    -	    }
    -	} elsif (!defined $re) {
    -	    $str = "0";
    -	}
    -
    -	return $str;
    -}
    -
    -
    -#
    -# ->stringify_polar
    -#
    -# Stringify as a polar representation '[r,t]'.
    -#
    -sub stringify_polar {
    -	my $z  = shift;
    -	my ($r, $t) = @{$z->polar};
    -	my $theta;
    -
    -	my %format = $z->display_format;
    -	my $format = $format{format};
    -
    -	if ($t =~ /^NaN[QS]?$/i || $t =~ /^-?$Inf$/oi) {
    -	    $theta = $t; 
    -	} elsif ($t == pi) {
    -	    $theta = "pi";
    -	} elsif ($r == 0 || $t == 0) {
    -	    $theta = defined $format ? sprintf($format, $t) : $t;
    -	}
    -
    -	return "[$r,$theta]" if defined $theta;
    -
    -	#
    -	# Try to identify pi/n and friends.
    -	#
    -
    -	$t -= int(CORE::abs($t) / pit2) * pit2;
    -
    -	if ($format{polar_pretty_print} && $t) {
    -	    my ($a, $b);
    -	    for $a (2..9) {
    -		$b = $t * $a / pi;
    -		if ($b =~ /^-?\d+$/) {
    -		    $b = $b < 0 ? "-" : "" if CORE::abs($b) == 1;
    -		    $theta = "${b}pi/$a";
    -		    last;
    -		}
    -	    }
    -	}
    -
    -        if (defined $format) {
    -	    $r     = sprintf($format, $r);
    -	    $theta = sprintf($format, $theta) unless defined $theta;
    -	} else {
    -	    $theta = $t unless defined $theta;
    -	}
    -
    -	return "[$r,$theta]";
    -}
    -
    -1;
    -__END__
    -
    -=pod
    -
    -=head1 NAME
    -
    -Math::Complex - complex numbers and associated mathematical functions
    -
    -=head1 SYNOPSIS
    -
    -	use Math::Complex;
    -
    -	$z = Math::Complex->make(5, 6);
    -	$t = 4 - 3*i + $z;
    -	$j = cplxe(1, 2*pi/3);
    -
    -=head1 DESCRIPTION
    -
    -This package lets you create and manipulate complex numbers. By default,
    -I limits itself to real numbers, but an extra C statement brings
    -full complex support, along with a full set of mathematical functions
    -typically associated with and/or extended to complex numbers.
    -
    -If you wonder what complex numbers are, they were invented to be able to solve
    -the following equation:
    -
    -	x*x = -1
    -
    -and by definition, the solution is noted I (engineers use I instead since
    -I usually denotes an intensity, but the name does not matter). The number
    -I is a pure I number.
    -
    -The arithmetics with pure imaginary numbers works just like you would expect
    -it with real numbers... you just have to remember that
    -
    -	i*i = -1
    -
    -so you have:
    -
    -	5i + 7i = i * (5 + 7) = 12i
    -	4i - 3i = i * (4 - 3) = i
    -	4i * 2i = -8
    -	6i / 2i = 3
    -	1 / i = -i
    -
    -Complex numbers are numbers that have both a real part and an imaginary
    -part, and are usually noted:
    -
    -	a + bi
    -
    -where C is the I part and C is the I part. The
    -arithmetic with complex numbers is straightforward. You have to
    -keep track of the real and the imaginary parts, but otherwise the
    -rules used for real numbers just apply:
    -
    -	(4 + 3i) + (5 - 2i) = (4 + 5) + i(3 - 2) = 9 + i
    -	(2 + i) * (4 - i) = 2*4 + 4i -2i -i*i = 8 + 2i + 1 = 9 + 2i
    -
    -A graphical representation of complex numbers is possible in a plane
    -(also called the I, but it's really a 2D plane).
    -The number
    -
    -	z = a + bi
    -
    -is the point whose coordinates are (a, b). Actually, it would
    -be the vector originating from (0, 0) to (a, b). It follows that the addition
    -of two complex numbers is a vectorial addition.
    -
    -Since there is a bijection between a point in the 2D plane and a complex
    -number (i.e. the mapping is unique and reciprocal), a complex number
    -can also be uniquely identified with polar coordinates:
    -
    -	[rho, theta]
    -
    -where C is the distance to the origin, and C the angle between
    -the vector and the I axis. There is a notation for this using the
    -exponential form, which is:
    -
    -	rho * exp(i * theta)
    -
    -where I is the famous imaginary number introduced above. Conversion
    -between this form and the cartesian form C is immediate:
    -
    -	a = rho * cos(theta)
    -	b = rho * sin(theta)
    -
    -which is also expressed by this formula:
    -
    -	z = rho * exp(i * theta) = rho * (cos theta + i * sin theta)
    -
    -In other words, it's the projection of the vector onto the I and I
    -axes. Mathematicians call I the I or I and I
    -the I of the complex number. The I of C will be
    -noted C.
    -
    -The polar notation (also known as the trigonometric
    -representation) is much more handy for performing multiplications and
    -divisions of complex numbers, whilst the cartesian notation is better
    -suited for additions and subtractions. Real numbers are on the I
    -axis, and therefore I is zero or I.
    -
    -All the common operations that can be performed on a real number have
    -been defined to work on complex numbers as well, and are merely
    -I of the operations defined on real numbers. This means
    -they keep their natural meaning when there is no imaginary part, provided
    -the number is within their definition set.
    -
    -For instance, the C routine which computes the square root of
    -its argument is only defined for non-negative real numbers and yields a
    -non-negative real number (it is an application from B to B).
    -If we allow it to return a complex number, then it can be extended to
    -negative real numbers to become an application from B to B (the
    -set of complex numbers):
    -
    -	sqrt(x) = x >= 0 ? sqrt(x) : sqrt(-x)*i
    -
    -It can also be extended to be an application from B to B,
    -whilst its restriction to B behaves as defined above by using
    -the following definition:
    -
    -	sqrt(z = [r,t]) = sqrt(r) * exp(i * t/2)
    -
    -Indeed, a negative real number can be noted C<[x,pi]> (the modulus
    -I is always non-negative, so C<[x,pi]> is really C<-x>, a negative
    -number) and the above definition states that
    -
    -	sqrt([x,pi]) = sqrt(x) * exp(i*pi/2) = [sqrt(x),pi/2] = sqrt(x)*i
    -
    -which is exactly what we had defined for negative real numbers above.
    -The C returns only one of the solutions: if you want the both,
    -use the C function.
    -
    -All the common mathematical functions defined on real numbers that
    -are extended to complex numbers share that same property of working
    -I when the imaginary part is zero (otherwise, it would not
    -be called an extension, would it?).
    -
    -A I operation possible on a complex number that is
    -the identity for real numbers is called the I, and is noted
    -with a horizontal bar above the number, or C<~z> here.
    -
    -	 z = a + bi
    -	~z = a - bi
    -
    -Simple... Now look:
    -
    -	z * ~z = (a + bi) * (a - bi) = a*a + b*b
    -
    -We saw that the norm of C was noted C and was defined as the
    -distance to the origin, also known as:
    -
    -	rho = abs(z) = sqrt(a*a + b*b)
    -
    -so
    -
    -	z * ~z = abs(z) ** 2
    -
    -If z is a pure real number (i.e. C), then the above yields:
    -
    -	a * a = abs(a) ** 2
    -
    -which is true (C has the regular meaning for real number, i.e. stands
    -for the absolute value). This example explains why the norm of C is
    -noted C: it extends the C function to complex numbers, yet
    -is the regular C we know when the complex number actually has no
    -imaginary part... This justifies I our use of the C
    -notation for the norm.
    -
    -=head1 OPERATIONS
    -
    -Given the following notations:
    -
    -	z1 = a + bi = r1 * exp(i * t1)
    -	z2 = c + di = r2 * exp(i * t2)
    -	z = 
    -
    -the following (overloaded) operations are supported on complex numbers:
    -
    -	z1 + z2 = (a + c) + i(b + d)
    -	z1 - z2 = (a - c) + i(b - d)
    -	z1 * z2 = (r1 * r2) * exp(i * (t1 + t2))
    -	z1 / z2 = (r1 / r2) * exp(i * (t1 - t2))
    -	z1 ** z2 = exp(z2 * log z1)
    -	~z = a - bi
    -	abs(z) = r1 = sqrt(a*a + b*b)
    -	sqrt(z) = sqrt(r1) * exp(i * t/2)
    -	exp(z) = exp(a) * exp(i * b)
    -	log(z) = log(r1) + i*t
    -	sin(z) = 1/2i (exp(i * z1) - exp(-i * z))
    -	cos(z) = 1/2 (exp(i * z1) + exp(-i * z))
    -	atan2(y, x) = atan(y / x) # Minding the right quadrant, note the order.
    -
    -The definition used for complex arguments of atan2() is
    -
    -       -i log((x + iy)/sqrt(x*x+y*y))
    -
    -The following extra operations are supported on both real and complex
    -numbers:
    -
    -	Re(z) = a
    -	Im(z) = b
    -	arg(z) = t
    -	abs(z) = r
    -
    -	cbrt(z) = z ** (1/3)
    -	log10(z) = log(z) / log(10)
    -	logn(z, n) = log(z) / log(n)
    -
    -	tan(z) = sin(z) / cos(z)
    -
    -	csc(z) = 1 / sin(z)
    -	sec(z) = 1 / cos(z)
    -	cot(z) = 1 / tan(z)
    -
    -	asin(z) = -i * log(i*z + sqrt(1-z*z))
    -	acos(z) = -i * log(z + i*sqrt(1-z*z))
    -	atan(z) = i/2 * log((i+z) / (i-z))
    -
    -	acsc(z) = asin(1 / z)
    -	asec(z) = acos(1 / z)
    -	acot(z) = atan(1 / z) = -i/2 * log((i+z) / (z-i))
    -
    -	sinh(z) = 1/2 (exp(z) - exp(-z))
    -	cosh(z) = 1/2 (exp(z) + exp(-z))
    -	tanh(z) = sinh(z) / cosh(z) = (exp(z) - exp(-z)) / (exp(z) + exp(-z))
    -
    -	csch(z) = 1 / sinh(z)
    -	sech(z) = 1 / cosh(z)
    -	coth(z) = 1 / tanh(z)
    -
    -	asinh(z) = log(z + sqrt(z*z+1))
    -	acosh(z) = log(z + sqrt(z*z-1))
    -	atanh(z) = 1/2 * log((1+z) / (1-z))
    -
    -	acsch(z) = asinh(1 / z)
    -	asech(z) = acosh(1 / z)
    -	acoth(z) = atanh(1 / z) = 1/2 * log((1+z) / (z-1))
    -
    -I, I, I, I, I, I, I, I,
    -I, I, I, have aliases I, I, I,
    -I, I, I, I, I, I,
    -I, I, respectively.  C, C, C, C,
    -C, and C can be used also as mutators.  The C
    -returns only one of the solutions: if you want all three, use the
    -C function.
    -
    -The I function is available to compute all the I
    -roots of some complex, where I is a strictly positive integer.
    -There are exactly I such roots, returned as a list. Getting the
    -number mathematicians call C such that:
    -
    -	1 + j + j*j = 0;
    -
    -is a simple matter of writing:
    -
    -	$j = ((root(1, 3))[1];
    -
    -The Ith root for C is given by:
    -
    -	(root(z, n))[k] = r**(1/n) * exp(i * (t + 2*k*pi)/n)
    -
    -You can return the Ith root directly by C,
    -indexing starting from I and ending at I.
    -
    -The I comparison operator, E=E, is also defined. In
    -order to ensure its restriction to real numbers is conform to what you
    -would expect, the comparison is run on the real part of the complex
    -number first, and imaginary parts are compared only when the real
    -parts match.
    -
    -=head1 CREATION
    -
    -To create a complex number, use either:
    -
    -	$z = Math::Complex->make(3, 4);
    -	$z = cplx(3, 4);
    -
    -if you know the cartesian form of the number, or
    -
    -	$z = 3 + 4*i;
    -
    -if you like. To create a number using the polar form, use either:
    -
    -	$z = Math::Complex->emake(5, pi/3);
    -	$x = cplxe(5, pi/3);
    -
    -instead. The first argument is the modulus, the second is the angle
    -(in radians, the full circle is 2*pi).  (Mnemonic: C is used as a
    -notation for complex numbers in the polar form).
    -
    -It is possible to write:
    -
    -	$x = cplxe(-3, pi/4);
    -
    -but that will be silently converted into C<[3,-3pi/4]>, since the
    -modulus must be non-negative (it represents the distance to the origin
    -in the complex plane).
    -
    -It is also possible to have a complex number as either argument of the
    -C, C, C, and C: the appropriate component of
    -the argument will be used.
    -
    -	$z1 = cplx(-2,  1);
    -	$z2 = cplx($z1, 4);
    -
    -The C, C, C, C, and C will also
    -understand a single (string) argument of the forms
    -
    -    	2-3i
    -    	-3i
    -	[2,3]
    -	[2,-3pi/4]
    -	[2]
    -
    -in which case the appropriate cartesian and exponential components
    -will be parsed from the string and used to create new complex numbers.
    -The imaginary component and the theta, respectively, will default to zero.
    -
    -The C, C, C, C, and C will also
    -understand the case of no arguments: this means plain zero or (0, 0).
    -
    -=head1 DISPLAYING
    -
    -When printed, a complex number is usually shown under its cartesian
    -style I, but there are legitimate cases where the polar style
    -I<[r,t]> is more appropriate.  The process of converting the complex
    -number into a string that can be displayed is known as I.
    -
    -By calling the class method C and
    -supplying either C<"polar"> or C<"cartesian"> as an argument, you
    -override the default display style, which is C<"cartesian">. Not
    -supplying any argument returns the current settings.
    -
    -This default can be overridden on a per-number basis by calling the
    -C method instead. As before, not supplying any argument
    -returns the current display style for this number. Otherwise whatever you
    -specify will be the new display style for I particular number.
    -
    -For instance:
    -
    -	use Math::Complex;
    -
    -	Math::Complex::display_format('polar');
    -	$j = (root(1, 3))[1];
    -	print "j = $j\n";		# Prints "j = [1,2pi/3]"
    -	$j->display_format('cartesian');
    -	print "j = $j\n";		# Prints "j = -0.5+0.866025403784439i"
    -
    -The polar style attempts to emphasize arguments like I
    -(where I is a positive integer and I an integer within [-9, +9]),
    -this is called I.
    -
    -For the reverse of stringifying, see the C and C.
    -
    -=head2 CHANGED IN PERL 5.6
    -
    -The C class method and the corresponding
    -C object method can now be called using
    -a parameter hash instead of just a one parameter.
    -
    -The old display format style, which can have values C<"cartesian"> or
    -C<"polar">, can be changed using the C<"style"> parameter.
    -
    -	$j->display_format(style => "polar");
    -
    -The one parameter calling convention also still works.
    -
    -	$j->display_format("polar");
    -
    -There are two new display parameters.
    -
    -The first one is C<"format">, which is a sprintf()-style format string
    -to be used for both numeric parts of the complex number(s).  The is
    -somewhat system-dependent but most often it corresponds to C<"%.15g">.
    -You can revert to the default by setting the C to C.
    -
    -	# the $j from the above example
    -
    -	$j->display_format('format' => '%.5f');
    -	print "j = $j\n";		# Prints "j = -0.50000+0.86603i"
    -	$j->display_format('format' => undef);
    -	print "j = $j\n";		# Prints "j = -0.5+0.86603i"
    -
    -Notice that this affects also the return values of the
    -C methods: in list context the whole parameter hash
    -will be returned, as opposed to only the style parameter value.
    -This is a potential incompatibility with earlier versions if you
    -have been calling the C method in list context.
    -
    -The second new display parameter is C<"polar_pretty_print">, which can
    -be set to true or false, the default being true.  See the previous
    -section for what this means.
    -
    -=head1 USAGE
    -
    -Thanks to overloading, the handling of arithmetics with complex numbers
    -is simple and almost transparent.
    -
    -Here are some examples:
    -
    -	use Math::Complex;
    -
    -	$j = cplxe(1, 2*pi/3);	# $j ** 3 == 1
    -	print "j = $j, j**3 = ", $j ** 3, "\n";
    -	print "1 + j + j**2 = ", 1 + $j + $j**2, "\n";
    -
    -	$z = -16 + 0*i;			# Force it to be a complex
    -	print "sqrt($z) = ", sqrt($z), "\n";
    -
    -	$k = exp(i * 2*pi/3);
    -	print "$j - $k = ", $j - $k, "\n";
    -
    -	$z->Re(3);			# Re, Im, arg, abs,
    -	$j->arg(2);			# (the last two aka rho, theta)
    -					# can be used also as mutators.
    -
    -=head1 ERRORS DUE TO DIVISION BY ZERO OR LOGARITHM OF ZERO
    -
    -The division (/) and the following functions
    -
    -	log	ln	log10	logn
    -	tan	sec	csc	cot
    -	atan	asec	acsc	acot
    -	tanh	sech	csch	coth
    -	atanh	asech	acsch	acoth
    -
    -cannot be computed for all arguments because that would mean dividing
    -by zero or taking logarithm of zero. These situations cause fatal
    -runtime errors looking like this
    -
    -	cot(0): Division by zero.
    -	(Because in the definition of cot(0), the divisor sin(0) is 0)
    -	Died at ...
    -
    -or
    -
    -	atanh(-1): Logarithm of zero.
    -	Died at...
    -
    -For the C, C, C, C, C, C, C,
    -C, C, the argument cannot be C<0> (zero).  For the
    -logarithmic functions and the C, C, the argument cannot
    -be C<1> (one).  For the C, C, the argument cannot be
    -C<-1> (minus one).  For the C, C, the argument cannot be
    -C (the imaginary unit).  For the C, C, the argument
    -cannot be C<-i> (the negative imaginary unit).  For the C,
    -C, C, the argument cannot be I, where I
    -is any integer.  atan2(0, 0) is undefined, and if the complex arguments
    -are used for atan2(), a division by zero will happen if z1**2+z2**2 == 0.
    -
    -Note that because we are operating on approximations of real numbers,
    -these errors can happen when merely `too close' to the singularities
    -listed above.
    -
    -=head1 ERRORS DUE TO INDIGESTIBLE ARGUMENTS
    -
    -The C and C accept both real and complex arguments.
    -When they cannot recognize the arguments they will die with error
    -messages like the following
    -
    -    Math::Complex::make: Cannot take real part of ...
    -    Math::Complex::make: Cannot take real part of ...
    -    Math::Complex::emake: Cannot take rho of ...
    -    Math::Complex::emake: Cannot take theta of ...
    -
    -=head1 BUGS
    -
    -Saying C exports many mathematical routines in the
    -caller environment and even overrides some (C, C, C).
    -This is construed as a feature by the Authors, actually... ;-)
    -
    -All routines expect to be given real or complex numbers. Don't attempt to
    -use BigFloat, since Perl has currently no rule to disambiguate a '+'
    -operation (for instance) between two overloaded entities.
    -
    -In Cray UNICOS there is some strange numerical instability that results
    -in root(), cos(), sin(), cosh(), sinh(), losing accuracy fast.  Beware.
    -The bug may be in UNICOS math libs, in UNICOS C compiler, in Math::Complex.
    -Whatever it is, it does not manifest itself anywhere else where Perl runs.
    -
    -=head1 AUTHORS
    -
    -Daniel S. Lewart >
    -
    -Original authors Raphael Manfredi > and
    -Jarkko Hietaniemi >
    -
    -=cut
    -
    -1;
    -
    -# eof
    diff --git a/lib/perl5/5.8.8/Math/Trig.pm b/lib/perl5/5.8.8/Math/Trig.pm
    deleted file mode 100644
    index cd173561..00000000
    --- a/lib/perl5/5.8.8/Math/Trig.pm
    +++ /dev/null
    @@ -1,622 +0,0 @@
    -#
    -# Trigonometric functions, mostly inherited from Math::Complex.
    -# -- Jarkko Hietaniemi, since April 1997
    -# -- Raphael Manfredi, September 1996 (indirectly: because of Math::Complex)
    -#
    -
    -require Exporter;
    -package Math::Trig;
    -
    -use 5.006;
    -use strict;
    -
    -use Math::Complex 1.35;
    -use Math::Complex qw(:trig);
    -
    -our($VERSION, $PACKAGE, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
    -
    -@ISA = qw(Exporter);
    -
    -$VERSION = 1.03;
    -
    -my @angcnv = qw(rad2deg rad2grad
    -		deg2rad deg2grad
    -		grad2rad grad2deg);
    -
    -@EXPORT = (@{$Math::Complex::EXPORT_TAGS{'trig'}},
    -	   @angcnv);
    -
    -my @rdlcnv = qw(cartesian_to_cylindrical
    -		cartesian_to_spherical
    -		cylindrical_to_cartesian
    -		cylindrical_to_spherical
    -		spherical_to_cartesian
    -		spherical_to_cylindrical);
    -
    -my @greatcircle = qw(
    -		     great_circle_distance
    -		     great_circle_direction
    -		     great_circle_bearing
    -		     great_circle_waypoint
    -		     great_circle_midpoint
    -		     great_circle_destination
    -		    );
    -
    -my @pi = qw(pi2 pip2 pip4);
    -
    -@EXPORT_OK = (@rdlcnv, @greatcircle, @pi);
    -
    -# See e.g. the following pages:
    -# http://www.movable-type.co.uk/scripts/LatLong.html
    -# http://williams.best.vwh.net/avform.htm
    -
    -%EXPORT_TAGS = ('radial' => [ @rdlcnv ],
    -	        'great_circle' => [ @greatcircle ],
    -	        'pi'     => [ @pi ]);
    -
    -sub pi2  () { 2 * pi }
    -sub pip2 () { pi / 2 }
    -sub pip4 () { pi / 4 }
    -
    -sub DR  () { pi2/360 }
    -sub RD  () { 360/pi2 }
    -sub DG  () { 400/360 }
    -sub GD  () { 360/400 }
    -sub RG  () { 400/pi2 }
    -sub GR  () { pi2/400 }
    -
    -#
    -# Truncating remainder.
    -#
    -
    -sub remt ($$) {
    -    # Oh yes, POSIX::fmod() would be faster. Possibly. If it is available.
    -    $_[0] - $_[1] * int($_[0] / $_[1]);
    -}
    -
    -#
    -# Angle conversions.
    -#
    -
    -sub rad2rad($)     { remt($_[0], pi2) }
    -
    -sub deg2deg($)     { remt($_[0], 360) }
    -
    -sub grad2grad($)   { remt($_[0], 400) }
    -
    -sub rad2deg ($;$)  { my $d = RD * $_[0]; $_[1] ? $d : deg2deg($d) }
    -
    -sub deg2rad ($;$)  { my $d = DR * $_[0]; $_[1] ? $d : rad2rad($d) }
    -
    -sub grad2deg ($;$) { my $d = GD * $_[0]; $_[1] ? $d : deg2deg($d) }
    -
    -sub deg2grad ($;$) { my $d = DG * $_[0]; $_[1] ? $d : grad2grad($d) }
    -
    -sub rad2grad ($;$) { my $d = RG * $_[0]; $_[1] ? $d : grad2grad($d) }
    -
    -sub grad2rad ($;$) { my $d = GR * $_[0]; $_[1] ? $d : rad2rad($d) }
    -
    -sub cartesian_to_spherical {
    -    my ( $x, $y, $z ) = @_;
    -
    -    my $rho = sqrt( $x * $x + $y * $y + $z * $z );
    -
    -    return ( $rho,
    -             atan2( $y, $x ),
    -             $rho ? acos( $z / $rho ) : 0 );
    -}
    -
    -sub spherical_to_cartesian {
    -    my ( $rho, $theta, $phi ) = @_;
    -
    -    return ( $rho * cos( $theta ) * sin( $phi ),
    -             $rho * sin( $theta ) * sin( $phi ),
    -             $rho * cos( $phi   ) );
    -}
    -
    -sub spherical_to_cylindrical {
    -    my ( $x, $y, $z ) = spherical_to_cartesian( @_ );
    -
    -    return ( sqrt( $x * $x + $y * $y ), $_[1], $z );
    -}
    -
    -sub cartesian_to_cylindrical {
    -    my ( $x, $y, $z ) = @_;
    -
    -    return ( sqrt( $x * $x + $y * $y ), atan2( $y, $x ), $z );
    -}
    -
    -sub cylindrical_to_cartesian {
    -    my ( $rho, $theta, $z ) = @_;
    -
    -    return ( $rho * cos( $theta ), $rho * sin( $theta ), $z );
    -}
    -
    -sub cylindrical_to_spherical {
    -    return ( cartesian_to_spherical( cylindrical_to_cartesian( @_ ) ) );
    -}
    -
    -sub great_circle_distance {
    -    my ( $theta0, $phi0, $theta1, $phi1, $rho ) = @_;
    -
    -    $rho = 1 unless defined $rho; # Default to the unit sphere.
    -
    -    my $lat0 = pip2 - $phi0;
    -    my $lat1 = pip2 - $phi1;
    -
    -    return $rho *
    -        acos(cos( $lat0 ) * cos( $lat1 ) * cos( $theta0 - $theta1 ) +
    -             sin( $lat0 ) * sin( $lat1 ) );
    -}
    -
    -sub great_circle_direction {
    -    my ( $theta0, $phi0, $theta1, $phi1 ) = @_;
    -
    -    my $distance = &great_circle_distance;
    -
    -    my $lat0 = pip2 - $phi0;
    -    my $lat1 = pip2 - $phi1;
    -
    -    my $direction =
    -	acos((sin($lat1) - sin($lat0) * cos($distance)) /
    -	     (cos($lat0) * sin($distance)));
    -
    -    $direction = pi2 - $direction
    -	if sin($theta1 - $theta0) < 0;
    -
    -    return rad2rad($direction);
    -}
    -
    -*great_circle_bearing = \&great_circle_direction;
    -
    -sub great_circle_waypoint {
    -    my ( $theta0, $phi0, $theta1, $phi1, $point ) = @_;
    -
    -    $point = 0.5 unless defined $point;
    -
    -    my $d = great_circle_distance( $theta0, $phi0, $theta1, $phi1 );
    -
    -    return undef if $d == pi;
    -
    -    my $sd = sin($d);
    -
    -    return ($theta0, $phi0) if $sd == 0;
    -
    -    my $A = sin((1 - $point) * $d) / $sd;
    -    my $B = sin(     $point  * $d) / $sd;
    -
    -    my $lat0 = pip2 - $phi0;
    -    my $lat1 = pip2 - $phi1;
    -
    -    my $x = $A * cos($lat0) * cos($theta0) + $B * cos($lat1) * cos($theta1);
    -    my $y = $A * cos($lat0) * sin($theta0) + $B * cos($lat1) * sin($theta1);
    -    my $z = $A * sin($lat0)                + $B * sin($lat1);
    -
    -    my $theta = atan2($y, $x);
    -    my $phi   = atan2($z, sqrt($x*$x + $y*$y));
    -    
    -    return ($theta, $phi);
    -}
    -
    -sub great_circle_midpoint {
    -    great_circle_waypoint(@_[0..3], 0.5);
    -}
    -
    -sub great_circle_destination {
    -    my ( $theta0, $phi0, $dir0, $dst ) = @_;
    -
    -    my $lat0 = pip2 - $phi0;
    -
    -    my $phi1   = asin(sin($lat0)*cos($dst)+cos($lat0)*sin($dst)*cos($dir0));
    -    my $theta1 = $theta0 + atan2(sin($dir0)*sin($dst)*cos($lat0),
    -				 cos($dst)-sin($lat0)*sin($phi1));
    -
    -    my $dir1 = great_circle_bearing($theta1, $phi1, $theta0, $phi0) + pi;
    -
    -    $dir1 -= pi2 if $dir1 > pi2;
    -
    -    return ($theta1, $phi1, $dir1);
    -}
    -
    -1;
    -
    -__END__
    -=pod
    -
    -=head1 NAME
    -
    -Math::Trig - trigonometric functions
    -
    -=head1 SYNOPSIS
    -
    -	use Math::Trig;
    -
    -	$x = tan(0.9);
    -	$y = acos(3.7);
    -	$z = asin(2.4);
    -
    -	$halfpi = pi/2;
    -
    -	$rad = deg2rad(120);
    -
    -        # Import constants pi2, pip2, pip4 (2*pi, pi/2, pi/4).
    -	use Math::Trig ':pi';
    -
    -        # Import the conversions between cartesian/spherical/cylindrical.
    -	use Math::Trig ':radial';
    -
    -        # Import the great circle formulas.
    -	use Math::Trig ':great_circle';
    -
    -=head1 DESCRIPTION
    -
    -C defines many trigonometric functions not defined by the
    -core Perl which defines only the C and C.  The constant
    -B is also defined as are a few convenience functions for angle
    -conversions, and I for spherical movement.
    -
    -=head1 TRIGONOMETRIC FUNCTIONS
    -
    -The tangent
    -
    -=over 4
    -
    -=item B
    -
    -=back
    -
    -The cofunctions of the sine, cosine, and tangent (cosec/csc and cotan/cot
    -are aliases)
    -
    -B, B, B, B, B, B
    -
    -The arcus (also known as the inverse) functions of the sine, cosine,
    -and tangent
    -
    -B, B, B
    -
    -The principal value of the arc tangent of y/x
    -
    -B(y, x)
    -
    -The arcus cofunctions of the sine, cosine, and tangent (acosec/acsc
    -and acotan/acot are aliases)
    -
    -B, B, B, B, B
    -
    -The hyperbolic sine, cosine, and tangent
    -
    -B, B, B
    -
    -The cofunctions of the hyperbolic sine, cosine, and tangent (cosech/csch
    -and cotanh/coth are aliases)
    -
    -B, B, B, B, B
    -
    -The arcus (also known as the inverse) functions of the hyperbolic
    -sine, cosine, and tangent
    -
    -B, B, B
    -
    -The arcus cofunctions of the hyperbolic sine, cosine, and tangent
    -(acsch/acosech and acoth/acotanh are aliases)
    -
    -B, B, B, B, B
    -
    -The trigonometric constant B is also defined.
    -
    -$pi2 = 2 * B;
    -
    -=head2 ERRORS DUE TO DIVISION BY ZERO
    -
    -The following functions
    -
    -	acoth
    -	acsc
    -	acsch
    -	asec
    -	asech
    -	atanh
    -	cot
    -	coth
    -	csc
    -	csch
    -	sec
    -	sech
    -	tan
    -	tanh
    -
    -cannot be computed for all arguments because that would mean dividing
    -by zero or taking logarithm of zero. These situations cause fatal
    -runtime errors looking like this
    -
    -	cot(0): Division by zero.
    -	(Because in the definition of cot(0), the divisor sin(0) is 0)
    -	Died at ...
    -
    -or
    -
    -	atanh(-1): Logarithm of zero.
    -	Died at...
    -
    -For the C, C, C, C, C, C, C,
    -C, C, the argument cannot be C<0> (zero).  For the
    -C, C, the argument cannot be C<1> (one).  For the
    -C, C, the argument cannot be C<-1> (minus one).  For the
    -C, C, C, C, the argument cannot be I, where I is any integer.  atan2(0, 0) is undefined.
    -
    -=head2 SIMPLE (REAL) ARGUMENTS, COMPLEX RESULTS
    -
    -Please note that some of the trigonometric functions can break out
    -from the B into the B. For example
    -C has no definition for plain real numbers but it has
    -definition for complex numbers.
    -
    -In Perl terms this means that supplying the usual Perl numbers (also
    -known as scalars, please see L) as input for the
    -trigonometric functions might produce as output results that no more
    -are simple real numbers: instead they are complex numbers.
    -
    -The C handles this by using the C package
    -which knows how to handle complex numbers, please see L
    -for more information. In practice you need not to worry about getting
    -complex numbers as results because the C takes care of
    -details like for example how to display complex numbers. For example:
    -
    -	print asin(2), "\n";
    -
    -should produce something like this (take or leave few last decimals):
    -
    -	1.5707963267949-1.31695789692482i
    -
    -That is, a complex number with the real part of approximately C<1.571>
    -and the imaginary part of approximately C<-1.317>.
    -
    -=head1 PLANE ANGLE CONVERSIONS
    -
    -(Plane, 2-dimensional) angles may be converted with the following functions.
    -
    -	$radians  = deg2rad($degrees);
    -	$radians  = grad2rad($gradians);
    -
    -	$degrees  = rad2deg($radians);
    -	$degrees  = grad2deg($gradians);
    -
    -	$gradians = deg2grad($degrees);
    -	$gradians = rad2grad($radians);
    -
    -The full circle is 2 I radians or I<360> degrees or I<400> gradians.
    -The result is by default wrapped to be inside the [0, {2pi,360,400}[ circle.
    -If you don't want this, supply a true second argument:
    -
    -	$zillions_of_radians  = deg2rad($zillions_of_degrees, 1);
    -	$negative_degrees     = rad2deg($negative_radians, 1);
    -
    -You can also do the wrapping explicitly by rad2rad(), deg2deg(), and
    -grad2grad().
    -
    -=head1 RADIAL COORDINATE CONVERSIONS
    -
    -B are the B and the B
    -systems, explained shortly in more detail.
    -
    -You can import radial coordinate conversion functions by using the
    -C<:radial> tag:
    -
    -    use Math::Trig ':radial';
    -
    -    ($rho, $theta, $z)     = cartesian_to_cylindrical($x, $y, $z);
    -    ($rho, $theta, $phi)   = cartesian_to_spherical($x, $y, $z);
    -    ($x, $y, $z)           = cylindrical_to_cartesian($rho, $theta, $z);
    -    ($rho_s, $theta, $phi) = cylindrical_to_spherical($rho_c, $theta, $z);
    -    ($x, $y, $z)           = spherical_to_cartesian($rho, $theta, $phi);
    -    ($rho_c, $theta, $z)   = spherical_to_cylindrical($rho_s, $theta, $phi);
    -
    -B.
    -
    -=head2 COORDINATE SYSTEMS
    -
    -B coordinates are the usual rectangular I<(x, y, z)>-coordinates.
    -
    -Spherical coordinates, I<(rho, theta, pi)>, are three-dimensional
    -coordinates which define a point in three-dimensional space.  They are
    -based on a sphere surface.  The radius of the sphere is B, also
    -known as the I coordinate.  The angle in the I-plane
    -(around the I-axis) is B, also known as the I
    -coordinate.  The angle from the I-axis is B, also known as the
    -I coordinate.  The North Pole is therefore I<0, 0, rho>, and
    -the Gulf of Guinea (think of the missing big chunk of Africa) I<0,
    -pi/2, rho>.  In geographical terms I is latitude (northward
    -positive, southward negative) and I is longitude (eastward
    -positive, westward negative).
    -
    -B: some texts define I and I the other way round,
    -some texts define the I to start from the horizontal plane, some
    -texts use I in place of I.
    -
    -Cylindrical coordinates, I<(rho, theta, z)>, are three-dimensional
    -coordinates which define a point in three-dimensional space.  They are
    -based on a cylinder surface.  The radius of the cylinder is B,
    -also known as the I coordinate.  The angle in the I-plane
    -(around the I-axis) is B, also known as the I
    -coordinate.  The third coordinate is the I, pointing up from the
    -B-plane.
    -
    -=head2 3-D ANGLE CONVERSIONS
    -
    -Conversions to and from spherical and cylindrical coordinates are
    -available.  Please notice that the conversions are not necessarily
    -reversible because of the equalities like I angles being equal to
    -I<-pi> angles.
    -
    -=over 4
    -
    -=item cartesian_to_cylindrical
    -
    -        ($rho, $theta, $z) = cartesian_to_cylindrical($x, $y, $z);
    -
    -=item cartesian_to_spherical
    -
    -        ($rho, $theta, $phi) = cartesian_to_spherical($x, $y, $z);
    -
    -=item cylindrical_to_cartesian
    -
    -        ($x, $y, $z) = cylindrical_to_cartesian($rho, $theta, $z);
    -
    -=item cylindrical_to_spherical
    -
    -        ($rho_s, $theta, $phi) = cylindrical_to_spherical($rho_c, $theta, $z);
    -
    -Notice that when C<$z> is not 0 C<$rho_s> is not equal to C<$rho_c>.
    -
    -=item spherical_to_cartesian
    -
    -        ($x, $y, $z) = spherical_to_cartesian($rho, $theta, $phi);
    -
    -=item spherical_to_cylindrical
    -
    -        ($rho_c, $theta, $z) = spherical_to_cylindrical($rho_s, $theta, $phi);
    -
    -Notice that when C<$z> is not 0 C<$rho_c> is not equal to C<$rho_s>.
    -
    -=back
    -
    -=head1 GREAT CIRCLE DISTANCES AND DIRECTIONS
    -
    -You can compute spherical distances, called B,
    -by importing the great_circle_distance() function:
    -
    -  use Math::Trig 'great_circle_distance';
    -
    -  $distance = great_circle_distance($theta0, $phi0, $theta1, $phi1, [, $rho]);
    -
    -The I is the shortest distance between two
    -points on a sphere.  The distance is in C<$rho> units.  The C<$rho> is
    -optional, it defaults to 1 (the unit sphere), therefore the distance
    -defaults to radians.
    -
    -If you think geographically the I are longitudes: zero at the
    -Greenwhich meridian, eastward positive, westward negative--and the
    -I are latitudes: zero at the North Pole, northward positive,
    -southward negative.  B: this formula thinks in mathematics, not
    -geographically: the I zero is at the North Pole, not at the
    -Equator on the west coast of Africa (Bay of Guinea).  You need to
    -subtract your geographical coordinates from I (also known as 90
    -degrees).
    -
    -  $distance = great_circle_distance($lon0, pi/2 - $lat0,
    -                                    $lon1, pi/2 - $lat1, $rho);
    -
    -The direction you must follow the great circle (also known as I)
    -can be computed by the great_circle_direction() function:
    -
    -  use Math::Trig 'great_circle_direction';
    -
    -  $direction = great_circle_direction($theta0, $phi0, $theta1, $phi1);
    -
    -(Alias 'great_circle_bearing' is also available.)
    -The result is in radians, zero indicating straight north, pi or -pi
    -straight south, pi/2 straight west, and -pi/2 straight east.
    -
    -You can inversely compute the destination if you know the
    -starting point, direction, and distance:
    -
    -  use Math::Trig 'great_circle_destination';
    -
    -  # thetad and phid are the destination coordinates,
    -  # dird is the final direction at the destination.
    -
    -  ($thetad, $phid, $dird) =
    -    great_circle_destination($theta, $phi, $direction, $distance);
    -
    -or the midpoint if you know the end points:
    -
    -  use Math::Trig 'great_circle_midpoint';
    -
    -  ($thetam, $phim) =
    -    great_circle_midpoint($theta0, $phi0, $theta1, $phi1);
    -
    -The great_circle_midpoint() is just a special case of
    -
    -  use Math::Trig 'great_circle_waypoint';
    -
    -  ($thetai, $phii) =
    -    great_circle_waypoint($theta0, $phi0, $theta1, $phi1, $way);
    -
    -Where the $way is a value from zero ($theta0, $phi0) to one ($theta1,
    -$phi1).  Note that antipodal points (where their distance is I
    -radians) do not have waypoints between them (they would have an an
    -"equator" between them), and therefore C is returned for
    -antipodal points.  If the points are the same and the distance
    -therefore zero and all waypoints therefore identical, the first point
    -(either point) is returned.
    -
    -The thetas, phis, direction, and distance in the above are all in radians.
    -
    -You can import all the great circle formulas by
    -
    -  use Math::Trig ':great_circle';
    -
    -Notice that the resulting directions might be somewhat surprising if
    -you are looking at a flat worldmap: in such map projections the great
    -circles quite often do not look like the shortest routes-- but for
    -example the shortest possible routes from Europe or North America to
    -Asia do often cross the polar regions.
    -
    -=head1 EXAMPLES
    -
    -To calculate the distance between London (51.3N 0.5W) and Tokyo
    -(35.7N 139.8E) in kilometers:
    -
    -        use Math::Trig qw(great_circle_distance deg2rad);
    -
    -        # Notice the 90 - latitude: phi zero is at the North Pole.
    -	sub NESW { deg2rad($_[0]), deg2rad(90 - $_[1]) }
    -	my @L = NESW( -0.5, 51.3);
    -        my @T = NESW(139.8, 35.7);
    -        my $km = great_circle_distance(@L, @T, 6378); # About 9600 km.
    -
    -The direction you would have to go from London to Tokyo (in radians,
    -straight north being zero, straight east being pi/2).
    -
    -        use Math::Trig qw(great_circle_direction);
    -
    -        my $rad = great_circle_direction(@L, @T); # About 0.547 or 0.174 pi.
    -
    -The midpoint between London and Tokyo being
    -
    -        use Math::Trig qw(great_circle_midpoint);
    -
    -        my @M = great_circle_midpoint(@L, @T);
    -
    -or about 68.11N 24.74E, in the Finnish Lapland.
    -
    -=head2 CAVEAT FOR GREAT CIRCLE FORMULAS
    -
    -The answers may be off by few percentages because of the irregular
    -(slightly aspherical) form of the Earth.  The errors are at worst
    -about 0.55%, but generally below 0.3%.
    -
    -=head1 BUGS
    -
    -Saying C exports many mathematical routines in the
    -caller environment and even overrides some (C, C).  This is
    -construed as a feature by the Authors, actually... ;-)
    -
    -The code is not optimized for speed, especially because we use
    -C and thus go quite near complex numbers while doing
    -the computations even when the arguments are not. This, however,
    -cannot be completely avoided if we want things like C to give
    -an answer instead of giving a fatal runtime error.
    -
    -Do not attempt navigation using these formulas.
    -
    -=head1 AUTHORS
    -
    -Jarkko Hietaniemi > and 
    -Raphael Manfredi >.
    -
    -=cut
    -
    -# eof
    diff --git a/lib/perl5/5.8.8/Net/libnetFAQ.pod b/lib/perl5/5.8.8/Net/libnetFAQ.pod
    deleted file mode 100644
    index 9858f2b5..00000000
    --- a/lib/perl5/5.8.8/Net/libnetFAQ.pod
    +++ /dev/null
    @@ -1,307 +0,0 @@
    -=head1 NAME
    -
    -libnetFAQ - libnet Frequently Asked Questions
    -
    -=head1 DESCRIPTION
    -
    -=head2 Where to get this document
    -
    -This document is distributed with the libnet distribution, and is also
    -available on the libnet web page at
    -
    -    http://search.cpan.org/~gbarr/libnet/
    -
    -=head2 How to contribute to this document
    -
    -You may mail corrections, additions, and suggestions to me
    -gbarr@pobox.com.
    -
    -=head1 Author and Copyright Information
    -
    -Copyright (c) 1997-1998 Graham Barr. All rights reserved.
    -This document is free; you can redistribute it and/or modify it
    -under the terms of the Artistic License.
    -
    -=head2 Disclaimer
    -
    -This information is offered in good faith and in the hope that it may
    -be of use, but is not guaranteed to be correct, up to date, or suitable
    -for any particular purpose whatsoever.  The authors accept no liability
    -in respect of this information or its use.
    -
    -
    -=head1 Obtaining and installing libnet
    -
    -=head2 What is libnet ?
    -
    -libnet is a collection of perl5 modules which all related to network
    -programming. The majority of the modules available provided the
    -client side of popular server-client protocols that are used in
    -the internet community.
    -
    -=head2 Which version of perl do I need ?
    -
    -libnet has been know to work with versions of perl from 5.002 onwards. However
    -if your release of perl is prior to perl5.004 then you will need to
    -obtain and install the IO distribution from CPAN. If you have perl5.004
    -or later then you will have the IO modules in your installation already,
    -but CPAN may contain updates.
    -
    -=head2 What other modules do I need ?
    -
    -The only modules you will need installed are the modules from the IO
    -distribution. If you have perl5.004 or later you will already have
    -these modules.
    -
    -=head2 What machines support libnet ?
    -
    -libnet itself is an entirely perl-code distribution so it should work
    -on any machine that perl runs on. However IO may not work
    -with some machines and earlier releases of perl. But this
    -should not be the case with perl version 5.004 or later.
    -
    -=head2 Where can I get the latest libnet release
    -
    -The latest libnet release is always on CPAN, you will find it
    -in 
    -
    - http://www.cpan.org/modules/by-module/Net/
    -
    -The latest release and information is also available on the libnet web page
    -at
    -
    - http://search.cpan.org/~gbarr/libnet/
    -
    -=head1 Using Net::FTP
    -
    -=head2 How do I download files from an FTP server ?
    -
    -An example taken from an article posted to comp.lang.perl.misc
    -
    -    #!/your/path/to/perl
    -
    -    # a module making life easier
    -
    -    use Net::FTP;
    -
    -    # for debuging: $ftp = Net::FTP->new('site','Debug',10);
    -    # open a connection and log in!
    -
    -    $ftp = Net::FTP->new('target_site.somewhere.xxx');
    -    $ftp->login('username','password');
    -
    -    # set transfer mode to binary
    -
    -    $ftp->binary();
    -
    -    # change the directory on the ftp site
    -
    -    $ftp->cwd('/some/path/to/somewhere/');
    -
    -    foreach $name ('file1', 'file2', 'file3') {
    -
    -    # get's arguments are in the following order:
    -    # ftp server's filename
    -    # filename to save the transfer to on the local machine
    -    # can be simply used as get($name) if you want the same name
    -
    -      $ftp->get($name,$name);
    -    }
    -
    -    # ftp done!
    -
    -    $ftp->quit;
    -
    -=head2 How do I transfer files in binary mode ?
    -
    -To transfer files without  translation Net::FTP provides
    -the C method
    -
    -    $ftp->binary;
    -
    -=head2 How can I get the size of a file on a remote FTP server ?
    -
    -=head2 How can I get the modification time of a file on a remote FTP server ?
    -
    -=head2 How can I change the permissions of a file on a remote server ?
    -
    -The FTP protocol does not have a command for changing the permissions
    -of a file on the remote server. But some ftp servers may allow a chmod
    -command to be issued via a SITE command, eg
    -
    -    $ftp->quot('site chmod 0777',$filename);
    -
    -But this is not guaranteed to work.
    -
    -=head2 Can I do a reget operation like the ftp command ?
    -
    -=head2 How do I get a directory listing from an FTP server ?
    -
    -=head2 Changing directory to "" does not fail ?
    -
    -Passing an argument of "" to ->cwd() has the same affect of calling ->cwd()
    -without any arguments. Turn on Debug (I) and you will see what is
    -happening
    -
    -    $ftp = Net::FTP->new($host, Debug => 1);
    -    $ftp->login;
    -    $ftp->cwd("");
    -
    -gives
    -
    -    Net::FTP=GLOB(0x82196d8)>>> CWD /
    -    Net::FTP=GLOB(0x82196d8)<<< 250 CWD command successful.
    -
    -=head2 I am behind a SOCKS firewall, but the Firewall option does not work ?
    -
    -The Firewall option is only for support of one type of firewall. The type
    -supported is an ftp proxy.
    -
    -To use Net::FTP, or any other module in the libnet distribution,
    -through a SOCKS firewall you must create a socks-ified perl executable
    -by compiling perl with the socks library.
    -
    -=head2 I am behind an FTP proxy firewall, but cannot access machines outside ?
    -
    -Net::FTP implements the most popular ftp proxy firewall approach. The scheme
    -implemented is that where you log in to the firewall with C
    -
    -I have heard of one other type of firewall which requires a login to the
    -firewall with an account, then a second login with C. You can
    -still use Net::FTP to traverse these firewalls, but a more manual approach
    -must be taken, eg
    -
    -    $ftp = Net::FTP->new($firewall) or die $@;
    -    $ftp->login($firewall_user, $firewall_passwd) or die $ftp->message;
    -    $ftp->login($ext_user . '@' . $ext_host, $ext_passwd) or die $ftp->message.
    -
    -=head2 My ftp proxy firewall does not listen on port 21
    -
    -FTP servers usually listen on the same port number, port 21, as any other
    -FTP server. But there is no reason why this has to be the case.
    -
    -If you pass a port number to Net::FTP then it assumes this is the port
    -number of the final destination. By default Net::FTP will always try
    -to connect to the firewall on port 21.
    -
    -Net::FTP uses IO::Socket to open the connection and IO::Socket allows
    -the port number to be specified as part of the hostname. So this problem
    -can be resolved by either passing a Firewall option like C<"hostname:1234">
    -or by setting the C option in Net::Config to be a string
    -in in the same form.
    -
    -=head2 Is it possible to change the file permissions of a file on an FTP server ?
    -
    -The answer to this is "maybe". The FTP protocol does not specify a command to change
    -file permissions on a remote host. However many servers do allow you to run the
    -chmod command via the C command. This can be done with
    -
    -  $ftp->site('chmod','0775',$file);
    -
    -=head2 I have seen scripts call a method message, but cannot find it documented ?
    -
    -Net::FTP, like several other packages in libnet, inherits from Net::Cmd, so
    -all the methods described in Net::Cmd are also available on Net::FTP
    -objects.
    -
    -=head2 Why does Net::FTP not implement mput and mget methods
    -
    -The quick answer is because they are easy to implement yourself. The long
    -answer is that to write these in such a way that multiple platforms are
    -supported correctly would just require too much code. Below are
    -some examples how you can implement these yourself.
    -
    -sub mput {
    -  my($ftp,$pattern) = @_;
    -  foreach my $file (glob($pattern)) {
    -    $ftp->put($file) or warn $ftp->message;
    -  }
    -}
    -
    -sub mget {
    -  my($ftp,$pattern) = @_;
    -  foreach my $file ($ftp->ls($pattern)) {
    -    $ftp->get($file) or warn $ftp->message;
    -  }
    -}
    -
    -
    -=head1 Using Net::SMTP
    -
    -=head2 Why can't the part of an Email address after the @ be used as the hostname ?
    -
    -The part of an Email address which follows the @ is not necessarily a hostname,
    -it is a mail domain. To find the name of a host to connect for a mail domain
    -you need to do a DNS MX lookup
    -
    -=head2 Why does Net::SMTP not do DNS MX lookups ?
    -
    -Net::SMTP implements the SMTP protocol. The DNS MX lookup is not part
    -of this protocol.
    -
    -=head2 The verify method always returns true ?
    -
    -Well it may seem that way, but it does not. The verify method returns true
    -if the command succeeded. If you pass verify an address which the
    -server would normally have to forward to another machine, the command
    -will succeed with something like
    -
    -    252 Couldn't verify  but will attempt delivery anyway
    -
    -This command will fail only if you pass it an address in a domain
    -the server directly delivers for, and that address does not exist.
    -
    -=head1 Debugging scripts
    -
    -=head2 How can I debug my scripts that use Net::* modules ?
    -
    -Most of the libnet client classes allow options to be passed to the
    -constructor, in most cases one option is called C. Passing
    -this option with a non-zero value will turn on a protocol trace, which
    -will be sent to STDERR. This trace can be useful to see what commands
    -are being sent to the remote server and what responses are being
    -received back.
    -
    -    #!/your/path/to/perl
    -
    -    use Net::FTP;
    -
    -    my $ftp = new Net::FTP($host, Debug => 1);
    -    $ftp->login('gbarr','password');
    -    $ftp->quit;
    -
    -this script would output something like
    -
    - Net::FTP: Net::FTP(2.22)
    - Net::FTP:   Exporter
    - Net::FTP:   Net::Cmd(2.0801)
    - Net::FTP:   IO::Socket::INET
    - Net::FTP:     IO::Socket(1.1603)
    - Net::FTP:       IO::Handle(1.1504)
    -
    - Net::FTP=GLOB(0x8152974)<<< 220 imagine FTP server (Version wu-2.4(5) Tue Jul 29 11:17:18 CDT 1997) ready.
    - Net::FTP=GLOB(0x8152974)>>> user gbarr
    - Net::FTP=GLOB(0x8152974)<<< 331 Password required for gbarr.
    - Net::FTP=GLOB(0x8152974)>>> PASS ....
    - Net::FTP=GLOB(0x8152974)<<< 230 User gbarr logged in.  Access restrictions apply.
    - Net::FTP=GLOB(0x8152974)>>> QUIT
    - Net::FTP=GLOB(0x8152974)<<< 221 Goodbye.
    -
    -The first few lines tell you the modules that Net::FTP uses and their versions,
    -this is useful data to me when a user reports a bug. The last seven lines
    -show the communication with the server. Each line has three parts. The first
    -part is the object itself, this is useful for separating the output
    -if you are using multiple objects. The second part is either C<<<<<> to
    -show data coming from the server or C<>>>>> to show data
    -going to the server. The remainder of the line is the command
    -being sent or response being received.
    -
    -=head1 AUTHOR AND COPYRIGHT
    -
    -Copyright (c) 1997 Graham Barr.
    -All rights reserved.
    -
    -=for html 
    - -I<$Id: //depot/libnet/Net/libnetFAQ.pod#6 $> - diff --git a/lib/perl5/5.8.8/Pod/Checker.pm b/lib/perl5/5.8.8/Pod/Checker.pm deleted file mode 100644 index 49162da4..00000000 --- a/lib/perl5/5.8.8/Pod/Checker.pm +++ /dev/null @@ -1,1270 +0,0 @@ -############################################################################# -# Pod/Checker.pm -- check pod documents for syntax errors -# -# Copyright (C) 1994-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. -############################################################################# - -package Pod::Checker; - -use vars qw($VERSION); -$VERSION = 1.43; ## Current version of this package -require 5.005; ## requires this Perl version or later - -use Pod::ParseUtils; ## for hyperlinks and lists - -=head1 NAME - -Pod::Checker, podchecker() - check pod documents for syntax errors - -=head1 SYNOPSIS - - use Pod::Checker; - - $syntax_okay = podchecker($filepath, $outputpath, %options); - - my $checker = new Pod::Checker %options; - $checker->parse_from_file($filepath, \*STDERR); - -=head1 OPTIONS/ARGUMENTS - -C<$filepath> is the input POD to read and C<$outputpath> is -where to write POD syntax error messages. Either argument may be a scalar -indicating a file-path, or else a reference to an open filehandle. -If unspecified, the input-file it defaults to C<\*STDIN>, and -the output-file defaults to C<\*STDERR>. - -=head2 podchecker() - -This function can take a hash of options: - -=over 4 - -=item B<-warnings> =E I - -Turn warnings on/off. I is usually 1 for on, but higher values -trigger additional warnings. See L<"Warnings">. - -=back - -=head1 DESCRIPTION - -B will perform syntax checking of Perl5 POD format documentation. - -Curious/ambitious users are welcome to propose additional features they wish -to see in B and B and verify that the checks are -consistent with L. - -The following checks are currently performed: - -=over 4 - -=item * - -Unknown '=xxxx' commands, unknown 'XE...E' interior-sequences, -and unterminated interior sequences. - -=item * - -Check for proper balancing of C<=begin> and C<=end>. The contents of such -a block are generally ignored, i.e. no syntax checks are performed. - -=item * - -Check for proper nesting and balancing of C<=over>, C<=item> and C<=back>. - -=item * - -Check for same nested interior-sequences (e.g. -C...LE...E...E>). - -=item * - -Check for malformed or nonexisting entities C...E>. - -=item * - -Check for correct syntax of hyperlinks C...E>. See L -for details. - -=item * - -Check for unresolved document-internal links. This check may also reveal -misspelled links that seem to be internal links but should be links -to something else. - -=back - -=head1 DIAGNOSTICS - -=head2 Errors - -=over 4 - -=item * empty =headn - -A heading (C<=head1> or C<=head2>) without any text? That ain't no -heading! - -=item * =over on line I without closing =back - -The C<=over> command does not have a corresponding C<=back> before the -next heading (C<=head1> or C<=head2>) or the end of the file. - -=item * =item without previous =over - -=item * =back without previous =over - -An C<=item> or C<=back> command has been found outside a -C<=over>/C<=back> block. - -=item * No argument for =begin - -A C<=begin> command was found that is not followed by the formatter -specification. - -=item * =end without =begin - -A standalone C<=end> command was found. - -=item * Nested =begin's - -There were at least two consecutive C<=begin> commands without -the corresponding C<=end>. Only one C<=begin> may be active at -a time. - -=item * =for without formatter specification - -There is no specification of the formatter after the C<=for> command. - -=item * unresolved internal link I - -The given link to I does not have a matching node in the current -POD. This also happend when a single word node name is not enclosed in -C<"">. - -=item * Unknown command "I" - -An invalid POD command has been found. Valid are C<=head1>, C<=head2>, -C<=head3>, C<=head4>, C<=over>, C<=item>, C<=back>, C<=begin>, C<=end>, -C<=for>, C<=pod>, C<=cut> - -=item * Unknown interior-sequence "I" - -An invalid markup command has been encountered. Valid are: -CE>, CE>, CE>, CE>, -CE>, CE>, CE>, CE>, -CE> - -=item * nested commands IE...IE...E...E - -Two nested identical markup commands have been found. Generally this -does not make sense. - -=item * garbled entity I - -The I found cannot be interpreted as a character entity. - -=item * Entity number out of range - -An entity specified by number (dec, hex, oct) is out of range (1-255). - -=item * malformed link LEE - -The link found cannot be parsed because it does not conform to the -syntax described in L. - -=item * nonempty ZEE - -The CE> sequence is supposed to be empty. - -=item * empty XEE - -The index entry specified contains nothing but whitespace. - -=item * Spurious text after =pod / =cut - -The commands C<=pod> and C<=cut> do not take any arguments. - -=item * Spurious character(s) after =back - -The C<=back> command does not take any arguments. - -=back - -=head2 Warnings - -These may not necessarily cause trouble, but indicate mediocre style. - -=over 4 - -=item * multiple occurrence of link target I - -The POD file has some C<=item> and/or C<=head> commands that have -the same text. Potential hyperlinks to such a text cannot be unique then. -This warning is printed only with warning level greater than one. - -=item * line containing nothing but whitespace in paragraph - -There is some whitespace on a seemingly empty line. POD is very sensitive -to such things, so this is flagged. B users switch on the B -option to avoid this problem. - -=begin _disabled_ - -=item * file does not start with =head - -The file starts with a different POD directive than head. -This is most probably something you do not want. - -=end _disabled_ - -=item * previous =item has no contents - -There is a list C<=item> right above the flagged line that has no -text contents. You probably want to delete empty items. - -=item * preceding non-item paragraph(s) - -A list introduced by C<=over> starts with a text or verbatim paragraph, -but continues with C<=item>s. Move the non-item paragraph out of the -C<=over>/C<=back> block. - -=item * =item type mismatch (I vs. I) - -A list started with e.g. a bulletted C<=item> and continued with a -numbered one. This is obviously inconsistent. For most translators the -type of the I C<=item> determines the type of the list. - -=item * I unescaped CE> in paragraph - -Angle brackets not written as CltE> and CgtE> -can potentially cause errors as they could be misinterpreted as -markup commands. This is only printed when the -warnings level is -greater than 1. - -=item * Unknown entity - -A character entity was found that does not belong to the standard -ISO set or the POD specials C and C. - -=item * No items in =over - -The list opened with C<=over> does not contain any items. - -=item * No argument for =item - -C<=item> without any parameters is deprecated. It should either be followed -by C<*> to indicate an unordered list, by a number (optionally followed -by a dot) to indicate an ordered (numbered) list or simple text for a -definition list. - -=item * empty section in previous paragraph - -The previous section (introduced by a C<=head> command) does not contain -any text. This usually indicates that something is missing. Note: A -C<=head1> followed immediately by C<=head2> does not trigger this warning. - -=item * Verbatim paragraph in NAME section - -The NAME section (C<=head1 NAME>) should consist of a single paragraph -with the script/module name, followed by a dash `-' and a very short -description of what the thing is good for. - -=item * =headI without preceding higher level - -For example if there is a C<=head2> in the POD file prior to a -C<=head1>. - -=back - -=head2 Hyperlinks - -There are some warnings wrt. malformed hyperlinks. - -=over 4 - -=item * ignoring leading/trailing whitespace in link - -There is whitespace at the beginning or the end of the contents of -LE...E. - -=item * (section) in '$page' deprecated - -There is a section detected in the page name of LE...E, e.g. -Cpasswd(2)E>. POD hyperlinks may point to POD documents only. -Please write Cpasswd(2)E> instead. Some formatters are able -to expand this to appropriate code. For links to (builtin) functions, -please say Cperlfunc/mkdirE>, without (). - -=item * alternative text/node '%s' contains non-escaped | or / - -The characters C<|> and C are special in the LE...E context. -Although the hyperlink parser does its best to determine which "/" is -text and which is a delimiter in case of doubt, one ought to escape -these literal characters like this: - - / E - | E - -=back - -=head1 RETURN VALUE - -B returns the number of POD syntax errors found or -1 if -there were no POD commands at all found in the file. - -=head1 EXAMPLES - -See L - -=head1 INTERFACE - -While checking, this module collects document properties, e.g. the nodes -for hyperlinks (C<=headX>, C<=item>) and index entries (CE>). -POD translators can use this feature to syntax-check and get the nodes in -a first pass before actually starting to convert. This is expensive in terms -of execution time, but allows for very robust conversions. - -Since PodParser-1.24 the B module uses only the B -method to print errors and warnings. The summary output (e.g. -"Pod syntax OK") has been dropped from the module and has been included in -B (the script). This allows users of B to -control completely the output behaviour. Users of B (the script) -get the well-known behaviour. - -=cut - -############################################################################# - -use strict; -#use diagnostics; -use Carp; -use Exporter; -use Pod::Parser; - -use vars qw(@ISA @EXPORT); -@ISA = qw(Pod::Parser); -@EXPORT = qw(&podchecker); - -use vars qw(%VALID_COMMANDS %VALID_SEQUENCES); - -my %VALID_COMMANDS = ( - 'pod' => 1, - 'cut' => 1, - 'head1' => 1, - 'head2' => 1, - 'head3' => 1, - 'head4' => 1, - 'over' => 1, - 'back' => 1, - 'item' => 1, - 'for' => 1, - 'begin' => 1, - 'end' => 1, -); - -my %VALID_SEQUENCES = ( - 'I' => 1, - 'B' => 1, - 'S' => 1, - 'C' => 1, - 'L' => 1, - 'F' => 1, - 'X' => 1, - 'Z' => 1, - 'E' => 1, -); - -# stolen from HTML::Entities -my %ENTITIES = ( - # Some normal chars that have special meaning in SGML context - amp => '&', # ampersand -'gt' => '>', # greater than -'lt' => '<', # less than - quot => '"', # double quote - - # PUBLIC ISO 8879-1986//ENTITIES Added Latin 1//EN//HTML - AElig => 'Æ', # capital AE diphthong (ligature) - Aacute => 'Á', # capital A, acute accent - Acirc => 'Â', # capital A, circumflex accent - Agrave => 'À', # capital A, grave accent - Aring => 'Å', # capital A, ring - Atilde => 'Ã', # capital A, tilde - Auml => 'Ä', # capital A, dieresis or umlaut mark - Ccedil => 'Ç', # capital C, cedilla - ETH => 'Ð', # capital Eth, Icelandic - Eacute => 'É', # capital E, acute accent - Ecirc => 'Ê', # capital E, circumflex accent - Egrave => 'È', # capital E, grave accent - Euml => 'Ë', # capital E, dieresis or umlaut mark - Iacute => 'Í', # capital I, acute accent - Icirc => 'Î', # capital I, circumflex accent - Igrave => 'Ì', # capital I, grave accent - Iuml => 'Ï', # capital I, dieresis or umlaut mark - Ntilde => 'Ñ', # capital N, tilde - Oacute => 'Ó', # capital O, acute accent - Ocirc => 'Ô', # capital O, circumflex accent - Ograve => 'Ò', # capital O, grave accent - Oslash => 'Ø', # capital O, slash - Otilde => 'Õ', # capital O, tilde - Ouml => 'Ö', # capital O, dieresis or umlaut mark - THORN => 'Þ', # capital THORN, Icelandic - Uacute => 'Ú', # capital U, acute accent - Ucirc => 'Û', # capital U, circumflex accent - Ugrave => 'Ù', # capital U, grave accent - Uuml => 'Ü', # capital U, dieresis or umlaut mark - Yacute => 'Ý', # capital Y, acute accent - aacute => 'á', # small a, acute accent - acirc => 'â', # small a, circumflex accent - aelig => 'æ', # small ae diphthong (ligature) - agrave => 'à', # small a, grave accent - aring => 'å', # small a, ring - atilde => 'ã', # small a, tilde - auml => 'ä', # small a, dieresis or umlaut mark - ccedil => 'ç', # small c, cedilla - eacute => 'é', # small e, acute accent - ecirc => 'ê', # small e, circumflex accent - egrave => 'è', # small e, grave accent - eth => 'ð', # small eth, Icelandic - euml => 'ë', # small e, dieresis or umlaut mark - iacute => 'í', # small i, acute accent - icirc => 'î', # small i, circumflex accent - igrave => 'ì', # small i, grave accent - iuml => 'ï', # small i, dieresis or umlaut mark - ntilde => 'ñ', # small n, tilde - oacute => 'ó', # small o, acute accent - ocirc => 'ô', # small o, circumflex accent - ograve => 'ò', # small o, grave accent - oslash => 'ø', # small o, slash - otilde => 'õ', # small o, tilde - ouml => 'ö', # small o, dieresis or umlaut mark - szlig => 'ß', # small sharp s, German (sz ligature) - thorn => 'þ', # small thorn, Icelandic - uacute => 'ú', # small u, acute accent - ucirc => 'û', # small u, circumflex accent - ugrave => 'ù', # small u, grave accent - uuml => 'ü', # small u, dieresis or umlaut mark - yacute => 'ý', # small y, acute accent - yuml => 'ÿ', # small y, dieresis or umlaut mark - - # Some extra Latin 1 chars that are listed in the HTML3.2 draft (21-May-96) - copy => '©', # copyright sign - reg => '®', # registered sign - nbsp => "\240", # non breaking space - - # Additional ISO-8859/1 entities listed in rfc1866 (section 14) - iexcl => '¡', - cent => '¢', - pound => '£', - curren => '¤', - yen => '¥', - brvbar => '¦', - sect => '§', - uml => '¨', - ordf => 'ª', - laquo => '«', -'not' => '¬', # not is a keyword in perl - shy => '­', - macr => '¯', - deg => '°', - plusmn => '±', - sup1 => '¹', - sup2 => '²', - sup3 => '³', - acute => '´', - micro => 'µ', - para => '¶', - middot => '·', - cedil => '¸', - ordm => 'º', - raquo => '»', - frac14 => '¼', - frac12 => '½', - frac34 => '¾', - iquest => '¿', -'times' => '×', # times is a keyword in perl - divide => '÷', - -# some POD special entities - verbar => '|', - sol => '/' -); - -##--------------------------------------------------------------------------- - -##--------------------------------- -## Function definitions begin here -##--------------------------------- - -sub podchecker( $ ; $ % ) { - my ($infile, $outfile, %options) = @_; - local $_; - - ## Set defaults - $infile ||= \*STDIN; - $outfile ||= \*STDERR; - - ## Now create a pod checker - my $checker = new Pod::Checker(%options); - - ## Now check the pod document for errors - $checker->parse_from_file($infile, $outfile); - - ## Return the number of errors found - return $checker->num_errors(); -} - -##--------------------------------------------------------------------------- - -##------------------------------- -## Method definitions begin here -##------------------------------- - -################################## - -=over 4 - -=item Cnew( %options )> - -Return a reference to a new Pod::Checker object that inherits from -Pod::Parser and is used for calling the required methods later. The -following options are recognized: - -C<-warnings =E num> - Print warnings if C is true. The higher the value of C, -the more warnings are printed. Currently there are only levels 1 and 2. - -C<-quiet =E num> - If C is true, do not print any errors/warnings. This is useful -when Pod::Checker is used to munge POD code into plain text from within -POD formatters. - -=cut - -## sub new { -## my $this = shift; -## my $class = ref($this) || $this; -## my %params = @_; -## my $self = {%params}; -## bless $self, $class; -## $self->initialize(); -## return $self; -## } - -sub initialize { - my $self = shift; - ## Initialize number of errors, and setup an error function to - ## increment this number and then print to the designated output. - $self->{_NUM_ERRORS} = 0; - $self->{_NUM_WARNINGS} = 0; - $self->{-quiet} ||= 0; - # set the error handling subroutine - $self->errorsub($self->{-quiet} ? sub { 1; } : 'poderror'); - $self->{_commands} = 0; # total number of POD commands encountered - $self->{_list_stack} = []; # stack for nested lists - $self->{_have_begin} = ''; # stores =begin - $self->{_links} = []; # stack for internal hyperlinks - $self->{_nodes} = []; # stack for =head/=item nodes - $self->{_index} = []; # text in X<> - # print warnings? - $self->{-warnings} = 1 unless(defined $self->{-warnings}); - $self->{_current_head1} = ''; # the current =head1 block - $self->parseopts(-process_cut_cmd => 1, -warnings => $self->{-warnings}); -} - -################################## - -=item C<$checker-Epoderror( @args )> - -=item C<$checker-Epoderror( {%opts}, @args )> - -Internal method for printing errors and warnings. If no options are -given, simply prints "@_". The following options are recognized and used -to form the output: - - -msg - -A message to print prior to C<@args>. - - -line - -The line number the error occurred in. - - -file - -The file (name) the error occurred in. - - -severity - -The error level, should be 'WARNING' or 'ERROR'. - -=cut - -# Invoked as $self->poderror( @args ), or $self->poderror( {%opts}, @args ) -sub poderror { - my $self = shift; - my %opts = (ref $_[0]) ? %{shift()} : (); - - ## Retrieve options - chomp( my $msg = ($opts{-msg} || "")."@_" ); - my $line = (exists $opts{-line}) ? " at line $opts{-line}" : ""; - my $file = (exists $opts{-file}) ? " in file $opts{-file}" : ""; - unless (exists $opts{-severity}) { - ## See if can find severity in message prefix - $opts{-severity} = $1 if ( $msg =~ s/^\**\s*([A-Z]{3,}):\s+// ); - } - my $severity = (exists $opts{-severity}) ? "*** $opts{-severity}: " : ""; - - ## Increment error count and print message " - ++($self->{_NUM_ERRORS}) - if(!%opts || ($opts{-severity} && $opts{-severity} eq 'ERROR')); - ++($self->{_NUM_WARNINGS}) - if(!%opts || ($opts{-severity} && $opts{-severity} eq 'WARNING')); - unless($self->{-quiet}) { - my $out_fh = $self->output_handle() || \*STDERR; - print $out_fh ($severity, $msg, $line, $file, "\n") - if($self->{-warnings} || !%opts || $opts{-severity} ne 'WARNING'); - } -} - -################################## - -=item C<$checker-Enum_errors()> - -Set (if argument specified) and retrieve the number of errors found. - -=cut - -sub num_errors { - return (@_ > 1) ? ($_[0]->{_NUM_ERRORS} = $_[1]) : $_[0]->{_NUM_ERRORS}; -} - -################################## - -=item C<$checker-Enum_warnings()> - -Set (if argument specified) and retrieve the number of warnings found. - -=cut - -sub num_warnings { - return (@_ > 1) ? ($_[0]->{_NUM_WARNINGS} = $_[1]) : $_[0]->{_NUM_WARNINGS}; -} - -################################## - -=item C<$checker-Ename()> - -Set (if argument specified) and retrieve the canonical name of POD as -found in the C<=head1 NAME> section. - -=cut - -sub name { - return (@_ > 1 && $_[1]) ? - ($_[0]->{-name} = $_[1]) : $_[0]->{-name}; -} - -################################## - -=item C<$checker-Enode()> - -Add (if argument specified) and retrieve the nodes (as defined by C<=headX> -and C<=item>) of the current POD. The nodes are returned in the order of -their occurrence. They consist of plain text, each piece of whitespace is -collapsed to a single blank. - -=cut - -sub node { - my ($self,$text) = @_; - if(defined $text) { - $text =~ s/\s+$//s; # strip trailing whitespace - $text =~ s/\s+/ /gs; # collapse whitespace - # add node, order important! - push(@{$self->{_nodes}}, $text); - # keep also a uniqueness counter - $self->{_unique_nodes}->{$text}++ if($text !~ /^\s*$/s); - return $text; - } - @{$self->{_nodes}}; -} - -################################## - -=item C<$checker-Eidx()> - -Add (if argument specified) and retrieve the index entries (as defined by -CE>) of the current POD. They consist of plain text, each piece -of whitespace is collapsed to a single blank. - -=cut - -# set/return index entries of current POD -sub idx { - my ($self,$text) = @_; - if(defined $text) { - $text =~ s/\s+$//s; # strip trailing whitespace - $text =~ s/\s+/ /gs; # collapse whitespace - # add node, order important! - push(@{$self->{_index}}, $text); - # keep also a uniqueness counter - $self->{_unique_nodes}->{$text}++ if($text !~ /^\s*$/s); - return $text; - } - @{$self->{_index}}; -} - -################################## - -=item C<$checker-Ehyperlink()> - -Add (if argument specified) and retrieve the hyperlinks (as defined by -CE>) of the current POD. They consist of a 2-item array: line -number and C object. - -=back - -=cut - -# set/return hyperlinks of the current POD -sub hyperlink { - my $self = shift; - if($_[0]) { - push(@{$self->{_links}}, $_[0]); - return $_[0]; - } - @{$self->{_links}}; -} - -## overrides for Pod::Parser - -sub end_pod { - ## Do some final checks and - ## print the number of errors found - my $self = shift; - my $infile = $self->input_file(); - - if(@{$self->{_list_stack}}) { - my $list; - while(($list = $self->_close_list('EOF',$infile)) && - $list->indent() ne 'auto') { - $self->poderror({ -line => 'EOF', -file => $infile, - -severity => 'ERROR', -msg => "=over on line " . - $list->start() . " without closing =back" }); #" - } - } - - # check validity of document internal hyperlinks - # first build the node names from the paragraph text - my %nodes; - foreach($self->node()) { - $nodes{$_} = 1; - if(/^(\S+)\s+\S/) { - # we have more than one word. Use the first as a node, too. - # This is used heavily in perlfunc.pod - $nodes{$1} ||= 2; # derived node - } - } - foreach($self->idx()) { - $nodes{$_} = 3; # index node - } - foreach($self->hyperlink()) { - my ($line,$link) = @$_; - # _TODO_ what if there is a link to the page itself by the name, - # e.g. in Tk::Pod : L - if($link->node() && !$link->page() && $link->type() ne 'hyperlink') { - my $node = $self->_check_ptree($self->parse_text($link->node(), - $line), $line, $infile, 'L'); - if($node && !$nodes{$node}) { - $self->poderror({ -line => $line || '', -file => $infile, - -severity => 'ERROR', - -msg => "unresolved internal link '$node'"}); - } - } - } - - # check the internal nodes for uniqueness. This pertains to - # =headX, =item and X<...> - if($self->{-warnings} && $self->{-warnings}>1) { - foreach(grep($self->{_unique_nodes}->{$_} > 1, - keys %{$self->{_unique_nodes}})) { - $self->poderror({ -line => '-', -file => $infile, - -severity => 'WARNING', - -msg => "multiple occurrence of link target '$_'"}); - } - } - - # no POD found here - $self->num_errors(-1) if($self->{_commands} == 0); -} - -# check a POD command directive -sub command { - my ($self, $cmd, $paragraph, $line_num, $pod_para) = @_; - my ($file, $line) = $pod_para->file_line; - ## Check the command syntax - my $arg; # this will hold the command argument - if (! $VALID_COMMANDS{$cmd}) { - $self->poderror({ -line => $line, -file => $file, -severity => 'ERROR', - -msg => "Unknown command '$cmd'" }); - } - else { # found a valid command - $self->{_commands}++; # delete this line if below is enabled again - - ##### following check disabled due to strong request - #if(!$self->{_commands}++ && $cmd !~ /^head/) { - # $self->poderror({ -line => $line, -file => $file, - # -severity => 'WARNING', - # -msg => "file does not start with =head" }); - #} - - # check syntax of particular command - if($cmd eq 'over') { - # check for argument - $arg = $self->interpolate_and_check($paragraph, $line,$file); - my $indent = 4; # default - if($arg && $arg =~ /^\s*(\d+)\s*$/) { - $indent = $1; - } - # start a new list - $self->_open_list($indent,$line,$file); - } - elsif($cmd eq 'item') { - # are we in a list? - unless(@{$self->{_list_stack}}) { - $self->poderror({ -line => $line, -file => $file, - -severity => 'ERROR', - -msg => "=item without previous =over" }); - # auto-open in case we encounter many more - $self->_open_list('auto',$line,$file); - } - my $list = $self->{_list_stack}->[0]; - # check whether the previous item had some contents - if(defined $self->{_list_item_contents} && - $self->{_list_item_contents} == 0) { - $self->poderror({ -line => $line, -file => $file, - -severity => 'WARNING', - -msg => "previous =item has no contents" }); - } - if($list->{_has_par}) { - $self->poderror({ -line => $line, -file => $file, - -severity => 'WARNING', - -msg => "preceding non-item paragraph(s)" }); - delete $list->{_has_par}; - } - # check for argument - $arg = $self->interpolate_and_check($paragraph, $line, $file); - if($arg && $arg =~ /(\S+)/) { - $arg =~ s/[\s\n]+$//; - my $type; - if($arg =~ /^[*]\s*(\S*.*)/) { - $type = 'bullet'; - $self->{_list_item_contents} = $1 ? 1 : 0; - $arg = $1; - } - elsif($arg =~ /^\d+\.?\s*(\S*)/) { - $type = 'number'; - $self->{_list_item_contents} = $1 ? 1 : 0; - $arg = $1; - } - else { - $type = 'definition'; - $self->{_list_item_contents} = 1; - } - my $first = $list->type(); - if($first && $first ne $type) { - $self->poderror({ -line => $line, -file => $file, - -severity => 'WARNING', - -msg => "=item type mismatch ('$first' vs. '$type')"}); - } - else { # first item - $list->type($type); - } - } - else { - $self->poderror({ -line => $line, -file => $file, - -severity => 'WARNING', - -msg => "No argument for =item" }); - $arg = ' '; # empty - $self->{_list_item_contents} = 0; - } - # add this item - $list->item($arg); - # remember this node - $self->node($arg); - } - elsif($cmd eq 'back') { - # check if we have an open list - unless(@{$self->{_list_stack}}) { - $self->poderror({ -line => $line, -file => $file, - -severity => 'ERROR', - -msg => "=back without previous =over" }); - } - else { - # check for spurious characters - $arg = $self->interpolate_and_check($paragraph, $line,$file); - if($arg && $arg =~ /\S/) { - $self->poderror({ -line => $line, -file => $file, - -severity => 'ERROR', - -msg => "Spurious character(s) after =back" }); - } - # close list - my $list = $self->_close_list($line,$file); - # check for empty lists - if(!$list->item() && $self->{-warnings}) { - $self->poderror({ -line => $line, -file => $file, - -severity => 'WARNING', - -msg => "No items in =over (at line " . - $list->start() . ") / =back list"}); #" - } - } - } - elsif($cmd =~ /^head(\d+)/) { - my $hnum = $1; - $self->{"_have_head_$hnum"}++; # count head types - if($hnum > 1 && !$self->{"_have_head_".($hnum -1)}) { - $self->poderror({ -line => $line, -file => $file, - -severity => 'WARNING', - -msg => "=head$hnum without preceding higher level"}); - } - # check whether the previous =head section had some contents - if(defined $self->{_commands_in_head} && - $self->{_commands_in_head} == 0 && - defined $self->{_last_head} && - $self->{_last_head} >= $hnum) { - $self->poderror({ -line => $line, -file => $file, - -severity => 'WARNING', - -msg => "empty section in previous paragraph"}); - } - $self->{_commands_in_head} = -1; - $self->{_last_head} = $hnum; - # check if there is an open list - if(@{$self->{_list_stack}}) { - my $list; - while(($list = $self->_close_list($line,$file)) && - $list->indent() ne 'auto') { - $self->poderror({ -line => $line, -file => $file, - -severity => 'ERROR', - -msg => "=over on line ". $list->start() . - " without closing =back (at $cmd)" }); - } - } - # remember this node - $arg = $self->interpolate_and_check($paragraph, $line,$file); - $arg =~ s/[\s\n]+$//s; - $self->node($arg); - unless(length($arg)) { - $self->poderror({ -line => $line, -file => $file, - -severity => 'ERROR', - -msg => "empty =$cmd"}); - } - if($cmd eq 'head1') { - $self->{_current_head1} = $arg; - } else { - $self->{_current_head1} = ''; - } - } - elsif($cmd eq 'begin') { - if($self->{_have_begin}) { - # already have a begin - $self->poderror({ -line => $line, -file => $file, - -severity => 'ERROR', - -msg => "Nested =begin's (first at line " . - $self->{_have_begin} . ")"}); - } - else { - # check for argument - $arg = $self->interpolate_and_check($paragraph, $line,$file); - unless($arg && $arg =~ /(\S+)/) { - $self->poderror({ -line => $line, -file => $file, - -severity => 'ERROR', - -msg => "No argument for =begin"}); - } - # remember the =begin - $self->{_have_begin} = "$line:$1"; - } - } - elsif($cmd eq 'end') { - if($self->{_have_begin}) { - # close the existing =begin - $self->{_have_begin} = ''; - # check for spurious characters - $arg = $self->interpolate_and_check($paragraph, $line,$file); - # the closing argument is optional - #if($arg && $arg =~ /\S/) { - # $self->poderror({ -line => $line, -file => $file, - # -severity => 'WARNING', - # -msg => "Spurious character(s) after =end" }); - #} - } - else { - # don't have a matching =begin - $self->poderror({ -line => $line, -file => $file, - -severity => 'ERROR', - -msg => "=end without =begin" }); - } - } - elsif($cmd eq 'for') { - unless($paragraph =~ /\s*(\S+)\s*/) { - $self->poderror({ -line => $line, -file => $file, - -severity => 'ERROR', - -msg => "=for without formatter specification" }); - } - $arg = ''; # do not expand paragraph below - } - elsif($cmd =~ /^(pod|cut)$/) { - # check for argument - $arg = $self->interpolate_and_check($paragraph, $line,$file); - if($arg && $arg =~ /(\S+)/) { - $self->poderror({ -line => $line, -file => $file, - -severity => 'ERROR', - -msg => "Spurious text after =$cmd"}); - } - } - $self->{_commands_in_head}++; - ## Check the interior sequences in the command-text - $self->interpolate_and_check($paragraph, $line,$file) - unless(defined $arg); - } -} - -sub _open_list -{ - my ($self,$indent,$line,$file) = @_; - my $list = Pod::List->new( - -indent => $indent, - -start => $line, - -file => $file); - unshift(@{$self->{_list_stack}}, $list); - undef $self->{_list_item_contents}; - $list; -} - -sub _close_list -{ - my ($self,$line,$file) = @_; - my $list = shift(@{$self->{_list_stack}}); - if(defined $self->{_list_item_contents} && - $self->{_list_item_contents} == 0) { - $self->poderror({ -line => $line, -file => $file, - -severity => 'WARNING', - -msg => "previous =item has no contents" }); - } - undef $self->{_list_item_contents}; - $list; -} - -# process a block of some text -sub interpolate_and_check { - my ($self, $paragraph, $line, $file) = @_; - ## Check the interior sequences in the command-text - # and return the text - $self->_check_ptree( - $self->parse_text($paragraph,$line), $line, $file, ''); -} - -sub _check_ptree { - my ($self,$ptree,$line,$file,$nestlist) = @_; - local($_); - my $text = ''; - # process each node in the parse tree - foreach(@$ptree) { - # regular text chunk - unless(ref) { - # count the unescaped angle brackets - # complain only when warning level is greater than 1 - if($self->{-warnings} && $self->{-warnings}>1) { - my $count; - if($count = tr/<>/<>/) { - $self->poderror({ -line => $line, -file => $file, - -severity => 'WARNING', - -msg => "$count unescaped <> in paragraph" }); - } - } - $text .= $_; - next; - } - # have an interior sequence - my $cmd = $_->cmd_name(); - my $contents = $_->parse_tree(); - ($file,$line) = $_->file_line(); - # check for valid tag - if (! $VALID_SEQUENCES{$cmd}) { - $self->poderror({ -line => $line, -file => $file, - -severity => 'ERROR', - -msg => qq(Unknown interior-sequence '$cmd')}); - # expand it anyway - $text .= $self->_check_ptree($contents, $line, $file, "$nestlist$cmd"); - next; - } - if($nestlist =~ /$cmd/) { - $self->poderror({ -line => $line, -file => $file, - -severity => 'WARNING', - -msg => "nested commands $cmd<...$cmd<...>...>"}); - # _TODO_ should we add the contents anyway? - # expand it anyway, see below - } - if($cmd eq 'E') { - # preserve entities - if(@$contents > 1 || ref $$contents[0] || $$contents[0] !~ /^\w+$/) { - $self->poderror({ -line => $line, -file => $file, - -severity => 'ERROR', - -msg => "garbled entity " . $_->raw_text()}); - next; - } - my $ent = $$contents[0]; - my $val; - if($ent =~ /^0x[0-9a-f]+$/i) { - # hexadec entity - $val = hex($ent); - } - elsif($ent =~ /^0\d+$/) { - # octal - $val = oct($ent); - } - elsif($ent =~ /^\d+$/) { - # numeric entity - $val = $ent; - } - if(defined $val) { - if($val>0 && $val<256) { - $text .= chr($val); - } - else { - $self->poderror({ -line => $line, -file => $file, - -severity => 'ERROR', - -msg => "Entity number out of range " . $_->raw_text()}); - } - } - elsif($ENTITIES{$ent}) { - # known ISO entity - $text .= $ENTITIES{$ent}; - } - else { - $self->poderror({ -line => $line, -file => $file, - -severity => 'WARNING', - -msg => "Unknown entity " . $_->raw_text()}); - $text .= "E<$ent>"; - } - } - elsif($cmd eq 'L') { - # try to parse the hyperlink - my $link = Pod::Hyperlink->new($contents->raw_text()); - unless(defined $link) { - $self->poderror({ -line => $line, -file => $file, - -severity => 'ERROR', - -msg => "malformed link " . $_->raw_text() ." : $@"}); - next; - } - $link->line($line); # remember line - if($self->{-warnings}) { - foreach my $w ($link->warning()) { - $self->poderror({ -line => $line, -file => $file, - -severity => 'WARNING', - -msg => $w }); - } - } - # check the link text - $text .= $self->_check_ptree($self->parse_text($link->text(), - $line), $line, $file, "$nestlist$cmd"); - # remember link - $self->hyperlink([$line,$link]); - } - elsif($cmd =~ /[BCFIS]/) { - # add the guts - $text .= $self->_check_ptree($contents, $line, $file, "$nestlist$cmd"); - } - elsif($cmd eq 'Z') { - if(length($contents->raw_text())) { - $self->poderror({ -line => $line, -file => $file, - -severity => 'ERROR', - -msg => "Nonempty Z<>"}); - } - } - elsif($cmd eq 'X') { - my $idx = $self->_check_ptree($contents, $line, $file, "$nestlist$cmd"); - if($idx =~ /^\s*$/s) { - $self->poderror({ -line => $line, -file => $file, - -severity => 'ERROR', - -msg => "Empty X<>"}); - } - else { - # remember this node - $self->idx($idx); - } - } - else { - # not reached - die "internal error"; - } - } - $text; -} - -# process a block of verbatim text -sub verbatim { - ## Nothing particular to check - my ($self, $paragraph, $line_num, $pod_para) = @_; - - $self->_preproc_par($paragraph); - - if($self->{_current_head1} eq 'NAME') { - my ($file, $line) = $pod_para->file_line; - $self->poderror({ -line => $line, -file => $file, - -severity => 'WARNING', - -msg => 'Verbatim paragraph in NAME section' }); - } -} - -# process a block of regular text -sub textblock { - my ($self, $paragraph, $line_num, $pod_para) = @_; - my ($file, $line) = $pod_para->file_line; - - $self->_preproc_par($paragraph); - - # skip this paragraph if in a =begin block - unless($self->{_have_begin}) { - my $block = $self->interpolate_and_check($paragraph, $line,$file); - if($self->{_current_head1} eq 'NAME') { - if($block =~ /^\s*(\S+?)\s*[,-]/) { - # this is the canonical name - $self->{-name} = $1 unless(defined $self->{-name}); - } - } - } -} - -sub _preproc_par -{ - my $self = shift; - $_[0] =~ s/[\s\n]+$//; - if($_[0]) { - $self->{_commands_in_head}++; - $self->{_list_item_contents}++ if(defined $self->{_list_item_contents}); - if(@{$self->{_list_stack}} && !$self->{_list_stack}->[0]->item()) { - $self->{_list_stack}->[0]->{_has_par} = 1; - } - } -} - -1; - -__END__ - -=head1 AUTHOR - -Please report bugs using L. - -Brad Appleton Ebradapp@enteract.comE (initial version), -Marek Rouchal Emarekr@cpan.orgE - -Based on code for B written by -Tom Christiansen Etchrist@mox.perl.comE - -=cut - diff --git a/lib/perl5/5.8.8/Pod/Find.pm b/lib/perl5/5.8.8/Pod/Find.pm deleted file mode 100644 index 0b085b8c..00000000 --- a/lib/perl5/5.8.8/Pod/Find.pm +++ /dev/null @@ -1,523 +0,0 @@ -############################################################################# -# Pod/Find.pm -- finds files containing POD documentation -# -# Author: Marek Rouchal -# -# Copyright (C) 1999-2000 by Marek Rouchal (and borrowing code -# from Nick Ing-Simmon's PodToHtml). All rights reserved. -# This file is part of "PodParser". Pod::Find is free software; -# you can redistribute it and/or modify it under the same terms -# as Perl itself. -############################################################################# - -package Pod::Find; - -use vars qw($VERSION); -$VERSION = 1.34; ## Current version of this package -require 5.005; ## requires this Perl version or later -use Carp; - -############################################################################# - -=head1 NAME - -Pod::Find - find POD documents in directory trees - -=head1 SYNOPSIS - - use Pod::Find qw(pod_find simplify_name); - my %pods = pod_find({ -verbose => 1, -inc => 1 }); - foreach(keys %pods) { - print "found library POD `$pods{$_}' in $_\n"; - } - - print "podname=",simplify_name('a/b/c/mymodule.pod'),"\n"; - - $location = pod_where( { -inc => 1 }, "Pod::Find" ); - -=head1 DESCRIPTION - -B provides a set of functions to locate POD files. Note that -no function is exported by default to avoid pollution of your namespace, -so be sure to specify them in the B statement if you need them: - - use Pod::Find qw(pod_find); - -From this version on the typical SCM (software configuration management) -files/directories like RCS, CVS, SCCS, .svn are ignored. - -=cut - -use strict; -#use diagnostics; -use Exporter; -use File::Spec; -use File::Find; -use Cwd; - -use vars qw(@ISA @EXPORT_OK $VERSION); -@ISA = qw(Exporter); -@EXPORT_OK = qw(&pod_find &simplify_name &pod_where &contains_pod); - -# package global variables -my $SIMPLIFY_RX; - -=head2 C - -The function B searches for POD documents in a given set of -files and/or directories. It returns a hash with the file names as keys -and the POD name as value. The POD name is derived from the file name -and its position in the directory tree. - -E.g. when searching in F<$HOME/perl5lib>, the file -F<$HOME/perl5lib/MyModule.pm> would get the POD name I, -whereas F<$HOME/perl5lib/Myclass/Subclass.pm> would be -I. The name information can be used for POD -translators. - -Only text files containing at least one valid POD command are found. - -A warning is printed if more than one POD file with the same POD name -is found, e.g. F in different directories. This usually -indicates duplicate occurrences of modules in the I<@INC> search path. - -B The first argument for B may be a hash reference -with options. The rest are either directories that are searched -recursively or files. The POD names of files are the plain basenames -with any Perl-like extension (.pm, .pl, .pod) stripped. - -=over 4 - -=item C<-verbose =E 1> - -Print progress information while scanning. - -=item C<-perl =E 1> - -Apply Perl-specific heuristics to find the correct PODs. This includes -stripping Perl-like extensions, omitting subdirectories that are numeric -but do I match the current Perl interpreter's version id, suppressing -F as a module hierarchy name etc. - -=item C<-script =E 1> - -Search for PODs in the current Perl interpreter's installation -B. This is taken from the local L module. - -=item C<-inc =E 1> - -Search for PODs in the current Perl interpreter's I<@INC> paths. This -automatically considers paths specified in the C environment -as this is prepended to I<@INC> by the Perl interpreter itself. - -=back - -=cut - -# return a hash of the POD files found -# first argument may be a hashref (options), -# rest is a list of directories to search recursively -sub pod_find -{ - my %opts; - if(ref $_[0]) { - %opts = %{shift()}; - } - - $opts{-verbose} ||= 0; - $opts{-perl} ||= 0; - - my (@search) = @_; - - if($opts{-script}) { - require Config; - push(@search, $Config::Config{scriptdir}) - if -d $Config::Config{scriptdir}; - $opts{-perl} = 1; - } - - if($opts{-inc}) { - if ($^O eq 'MacOS') { - # tolerate '.', './some_dir' and '(../)+some_dir' on Mac OS - my @new_INC = @INC; - for (@new_INC) { - if ( $_ eq '.' ) { - $_ = ':'; - } elsif ( $_ =~ s|^((?:\.\./)+)|':' x (length($1)/3)|e ) { - $_ = ':'. $_; - } else { - $_ =~ s|^\./|:|; - } - } - push(@search, grep($_ ne File::Spec->curdir, @new_INC)); - } else { - push(@search, grep($_ ne File::Spec->curdir, @INC)); - } - - $opts{-perl} = 1; - } - - if($opts{-perl}) { - require Config; - # this code simplifies the POD name for Perl modules: - # * remove "site_perl" - # * remove e.g. "i586-linux" (from 'archname') - # * remove e.g. 5.00503 - # * remove pod/ if followed by *.pod (e.g. in pod/perlfunc.pod) - - # Mac OS: - # * remove ":?site_perl:" - # * remove :?pod: if followed by *.pod (e.g. in :pod:perlfunc.pod) - - if ($^O eq 'MacOS') { - $SIMPLIFY_RX = - qq!^(?i:\:?site_perl\:|\:?pod\:(?=.*?\\.pod\\z))*!; - } else { - $SIMPLIFY_RX = - qq!^(?i:site(_perl)?/|\Q$Config::Config{archname}\E/|\\d+\\.\\d+([_.]?\\d+)?/|pod/(?=.*?\\.pod\\z))*!; - } - } - - my %dirs_visited; - my %pods; - my %names; - my $pwd = cwd(); - - foreach my $try (@search) { - unless(File::Spec->file_name_is_absolute($try)) { - # make path absolute - $try = File::Spec->catfile($pwd,$try); - } - # simplify path - # on VMS canonpath will vmsify:[the.path], but File::Find::find - # wants /unixy/paths - $try = File::Spec->canonpath($try) if ($^O ne 'VMS'); - $try = VMS::Filespec::unixify($try) if ($^O eq 'VMS'); - my $name; - if(-f $try) { - if($name = _check_and_extract_name($try, $opts{-verbose})) { - _check_for_duplicates($try, $name, \%names, \%pods); - } - next; - } - my $root_rx = $^O eq 'MacOS' ? qq!^\Q$try\E! : qq!^\Q$try\E/!; - File::Find::find( sub { - my $item = $File::Find::name; - if(-d) { - if($item =~ m{/(?:RCS|CVS|SCCS|\.svn)$}) { - $File::Find::prune = 1; - return; - } - elsif($dirs_visited{$item}) { - warn "Directory '$item' already seen, skipping.\n" - if($opts{-verbose}); - $File::Find::prune = 1; - return; - } - else { - $dirs_visited{$item} = 1; - } - if($opts{-perl} && /^(\d+\.[\d_]+)\z/s && eval "$1" != $]) { - $File::Find::prune = 1; - warn "Perl $] version mismatch on $_, skipping.\n" - if($opts{-verbose}); - } - return; - } - if($name = _check_and_extract_name($item, $opts{-verbose}, $root_rx)) { - _check_for_duplicates($item, $name, \%names, \%pods); - } - }, $try); # end of File::Find::find - } - chdir $pwd; - %pods; -} - -sub _check_for_duplicates { - my ($file, $name, $names_ref, $pods_ref) = @_; - if($$names_ref{$name}) { - warn "Duplicate POD found (shadowing?): $name ($file)\n"; - warn " Already seen in ", - join(' ', grep($$pods_ref{$_} eq $name, keys %$pods_ref)),"\n"; - } - else { - $$names_ref{$name} = 1; - } - $$pods_ref{$file} = $name; -} - -sub _check_and_extract_name { - my ($file, $verbose, $root_rx) = @_; - - # check extension or executable flag - # this involves testing the .bat extension on Win32! - unless(-f $file && -T $file && ($file =~ /\.(pod|pm|plx?)\z/i || -x $file )) { - return undef; - } - - return undef unless contains_pod($file,$verbose); - - # strip non-significant path components - # TODO what happens on e.g. Win32? - my $name = $file; - if(defined $root_rx) { - $name =~ s!$root_rx!!s; - $name =~ s!$SIMPLIFY_RX!!os if(defined $SIMPLIFY_RX); - } - else { - if ($^O eq 'MacOS') { - $name =~ s/^.*://s; - } else { - $name =~ s:^.*/::s; - } - } - _simplify($name); - $name =~ s!/+!::!g; #/ - if ($^O eq 'MacOS') { - $name =~ s!:+!::!g; # : -> :: - } else { - $name =~ s!/+!::!g; # / -> :: - } - $name; -} - -=head2 C - -The function B is equivalent to B, but also -strips Perl-like extensions (.pm, .pl, .pod) and extensions like -F<.bat>, F<.cmd> on Win32 and OS/2, or F<.com> on VMS, respectively. - -=cut - -# basic simplification of the POD name: -# basename & strip extension -sub simplify_name { - my ($str) = @_; - # remove all path components - if ($^O eq 'MacOS') { - $str =~ s/^.*://s; - } else { - $str =~ s:^.*/::s; - } - _simplify($str); - $str; -} - -# internal sub only -sub _simplify { - # strip Perl's own extensions - $_[0] =~ s/\.(pod|pm|plx?)\z//i; - # strip meaningless extensions on Win32 and OS/2 - $_[0] =~ s/\.(bat|exe|cmd)\z//i if($^O =~ /mswin|os2/i); - # strip meaningless extensions on VMS - $_[0] =~ s/\.(com)\z//i if($^O eq 'VMS'); -} - -# contribution from Tim Jenness - -=head2 C - -Returns the location of a pod document given a search directory -and a module (e.g. C) or script (e.g. C) name. - -Options: - -=over 4 - -=item C<-inc =E 1> - -Search @INC for the pod and also the C defined in the -L module. - -=item C<-dirs =E [ $dir1, $dir2, ... ]> - -Reference to an array of search directories. These are searched in order -before looking in C<@INC> (if B<-inc>). Current directory is used if -none are specified. - -=item C<-verbose =E 1> - -List directories as they are searched - -=back - -Returns the full path of the first occurrence to the file. -Package names (eg 'A::B') are automatically converted to directory -names in the selected directory. (eg on unix 'A::B' is converted to -'A/B'). Additionally, '.pm', '.pl' and '.pod' are appended to the -search automatically if required. - -A subdirectory F is also checked if it exists in any of the given -search directories. This ensures that e.g. L is -found. - -It is assumed that if a module name is supplied, that that name -matches the file name. Pods are not opened to check for the 'NAME' -entry. - -A check is made to make sure that the file that is found does -contain some pod documentation. - -=cut - -sub pod_where { - - # default options - my %options = ( - '-inc' => 0, - '-verbose' => 0, - '-dirs' => [ File::Spec->curdir ], - ); - - # Check for an options hash as first argument - if (defined $_[0] && ref($_[0]) eq 'HASH') { - my $opt = shift; - - # Merge default options with supplied options - %options = (%options, %$opt); - } - - # Check usage - carp 'Usage: pod_where({options}, $pod)' unless (scalar(@_)); - - # Read argument - my $pod = shift; - - # Split on :: and then join the name together using File::Spec - my @parts = split (/::/, $pod); - - # Get full directory list - my @search_dirs = @{ $options{'-dirs'} }; - - if ($options{'-inc'}) { - - require Config; - - # Add @INC - if ($^O eq 'MacOS' && $options{'-inc'}) { - # tolerate '.', './some_dir' and '(../)+some_dir' on Mac OS - my @new_INC = @INC; - for (@new_INC) { - if ( $_ eq '.' ) { - $_ = ':'; - } elsif ( $_ =~ s|^((?:\.\./)+)|':' x (length($1)/3)|e ) { - $_ = ':'. $_; - } else { - $_ =~ s|^\./|:|; - } - } - push (@search_dirs, @new_INC); - } elsif ($options{'-inc'}) { - push (@search_dirs, @INC); - } - - # Add location of pod documentation for perl man pages (eg perlfunc) - # This is a pod directory in the private install tree - #my $perlpoddir = File::Spec->catdir($Config::Config{'installprivlib'}, - # 'pod'); - #push (@search_dirs, $perlpoddir) - # if -d $perlpoddir; - - # Add location of binaries such as pod2text - push (@search_dirs, $Config::Config{'scriptdir'}) - if -d $Config::Config{'scriptdir'}; - } - - warn "Search path is: ".join(' ', @search_dirs)."\n" - if $options{'-verbose'}; - - # Loop over directories - Dir: foreach my $dir ( @search_dirs ) { - - # Don't bother if can't find the directory - if (-d $dir) { - warn "Looking in directory $dir\n" - if $options{'-verbose'}; - - # Now concatenate this directory with the pod we are searching for - my $fullname = File::Spec->catfile($dir, @parts); - warn "Filename is now $fullname\n" - if $options{'-verbose'}; - - # Loop over possible extensions - foreach my $ext ('', '.pod', '.pm', '.pl') { - my $fullext = $fullname . $ext; - if (-f $fullext && - contains_pod($fullext, $options{'-verbose'}) ) { - warn "FOUND: $fullext\n" if $options{'-verbose'}; - return $fullext; - } - } - } else { - warn "Directory $dir does not exist\n" - if $options{'-verbose'}; - next Dir; - } - # for some strange reason the path on MacOS/darwin/cygwin is - # 'pods' not 'pod' - # this could be the case also for other systems that - # have a case-tolerant file system, but File::Spec - # does not recognize 'darwin' yet. And cygwin also has "pods", - # but is not case tolerant. Oh well... - if((File::Spec->case_tolerant || $^O =~ /macos|darwin|cygwin/i) - && -d File::Spec->catdir($dir,'pods')) { - $dir = File::Spec->catdir($dir,'pods'); - redo Dir; - } - if(-d File::Spec->catdir($dir,'pod')) { - $dir = File::Spec->catdir($dir,'pod'); - redo Dir; - } - } - # No match; - return undef; -} - -=head2 C - -Returns true if the supplied filename (not POD module) contains some pod -information. - -=cut - -sub contains_pod { - my $file = shift; - my $verbose = 0; - $verbose = shift if @_; - - # check for one line of POD - unless(open(POD,"<$file")) { - warn "Error: $file is unreadable: $!\n"; - return undef; - } - - local $/ = undef; - my $pod = ; - close(POD) || die "Error closing $file: $!\n"; - unless($pod =~ /^=(head\d|pod|over|item)\b/m) { - warn "No POD in $file, skipping.\n" - if($verbose); - return 0; - } - - return 1; -} - -=head1 AUTHOR - -Please report bugs using L. - -Marek Rouchal Emarekr@cpan.orgE, -heavily borrowing code from Nick Ing-Simmons' PodToHtml. - -Tim Jenness Et.jenness@jach.hawaii.eduE provided -C and C. - -=head1 SEE ALSO - -L, L, L - -=cut - -1; - diff --git a/lib/perl5/5.8.8/Pod/Functions.pm b/lib/perl5/5.8.8/Pod/Functions.pm deleted file mode 100644 index 0e250cf0..00000000 --- a/lib/perl5/5.8.8/Pod/Functions.pm +++ /dev/null @@ -1,376 +0,0 @@ -package Pod::Functions; -use strict; - -=head1 NAME - -Pod::Functions - Group Perl's functions a la perlfunc.pod - -=head1 SYNOPSIS - - use Pod::Functions; - - my @misc_ops = @{ $Kinds{ 'Misc' } }; - my $misc_dsc = $Type_Description{ 'Misc' }; - -or - - perl /path/to/lib/Pod/Functions.pm - -This will print a grouped list of Perl's functions, like the -L section. - -=head1 DESCRIPTION - -It exports the following variables: - -=over 4 - -=item %Kinds - -This holds a hash-of-lists. Each list contains the functions in the category -the key denotes. - -=item %Type - -In this hash each key represents a function and the value is the category. -The category can be a comma separated list. - -=item %Flavor - -In this hash each key represents a function and the value is a short -description of that function. - -=item %Type_Description - -In this hash each key represents a category of functions and the value is -a short description of that category. - -=item @Type_Order - -This list of categories is used to produce the same order as the -L section. - -=back - -=head1 CHANGES - -1.02 20020813 - de-typo in the SYNOPSIS section (thanks Mike Castle for noticing) - -1.01 20011229 - fixed some bugs that slipped in after 5.6.1 - added the pod - finished making it strict safe - -1.00 ?? - first numbered version - -=cut - -our $VERSION = '1.03'; - -require Exporter; - -our @ISA = qw(Exporter); -our @EXPORT = qw(%Kinds %Type %Flavor %Type_Description @Type_Order); - -our(%Kinds, %Type, %Flavor); - -our %Type_Description = ( - 'ARRAY' => 'Functions for real @ARRAYs', - 'Binary' => 'Functions for fixed length data or records', - 'File' => 'Functions for filehandles, files, or directories', - 'Flow' => 'Keywords related to control flow of your perl program', - 'HASH' => 'Functions for real %HASHes', - 'I/O' => 'Input and output functions', - 'LIST' => 'Functions for list data', - 'Math' => 'Numeric functions', - 'Misc' => 'Miscellaneous functions', - 'Modules' => 'Keywords related to perl modules', - 'Network' => 'Fetching network info', - 'Objects' => 'Keywords related to classes and object-orientedness', - 'Process' => 'Functions for processes and process groups', - 'Regexp' => 'Regular expressions and pattern matching', - 'Socket' => 'Low-level socket functions', - 'String' => 'Functions for SCALARs or strings', - 'SysV' => 'System V interprocess communication functions', - 'Time' => 'Time-related functions', - 'User' => 'Fetching user and group info', - 'Namespace' => 'Keywords altering or affecting scoping of identifiers', -); - -our @Type_Order = qw{ - String - Regexp - Math - ARRAY - LIST - HASH - I/O - Binary - File - Flow - Namespace - Misc - Process - Modules - Objects - Socket - SysV - User - Network - Time -}; - -while () { - chomp; - s/#.*//; - next unless $_; - my($name, $type, $text) = split " ", $_, 3; - $Type{$name} = $type; - $Flavor{$name} = $text; - for my $t ( split /[,\s]+/, $type ) { - push @{$Kinds{$t}}, $name; - } -} - -close DATA; - -my( $typedesc, $list ); -unless (caller) { - foreach my $type ( @Type_Order ) { - $list = join(", ", sort @{$Kinds{$type}}); - $typedesc = $Type_Description{$type} . ":"; - write; - } -} - -format = - -^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - $typedesc -~~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - $typedesc - ~~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - $list -. - -1; - -__DATA__ --X File a file test (-r, -x, etc) -abs Math absolute value function -accept Socket accept an incoming socket connect -alarm Process schedule a SIGALRM -atan2 Math arctangent of Y/X in the range -PI to PI -bind Socket binds an address to a socket -binmode I/O prepare binary files for I/O -bless Objects create an object -caller Flow,Namespace get context of the current subroutine call -chdir File change your current working directory -chmod File changes the permissions on a list of files -chomp String remove a trailing record separator from a string -chop String remove the last character from a string -chown File change the owership on a list of files -chr String get character this number represents -chroot File make directory new root for path lookups -close I/O close file (or pipe or socket) handle -closedir I/O close directory handle -connect Socket connect to a remote socket -continue Flow optional trailing block in a while or foreach -cos Math cosine function -crypt String one-way passwd-style encryption -dbmclose Objects,I/O breaks binding on a tied dbm file -dbmopen Objects,I/O create binding on a tied dbm file -defined Misc test whether a value, variable, or function is defined -delete HASH deletes a value from a hash -die I/O,Flow raise an exception or bail out -do Flow,Modules turn a BLOCK into a TERM -dump Misc,Flow create an immediate core dump -each HASH retrieve the next key/value pair from a hash -endgrent User be done using group file -endhostent User be done using hosts file -endnetent User be done using networks file -endprotoent Network be done using protocols file -endpwent User be done using passwd file -endservent Network be done using services file -eof I/O test a filehandle for its end -eval Flow,Misc catch exceptions or compile and run code -exec Process abandon this program to run another -exists HASH test whether a hash key is present -exit Flow terminate this program -exp Math raise I to a power -fcntl File file control system call -fileno I/O return file descriptor from filehandle -flock I/O lock an entire file with an advisory lock -fork Process create a new process just like this one -format I/O declare a picture format with use by the write() function -formline Misc internal function used for formats -getc I/O get the next character from the filehandle -getgrent User get next group record -getgrgid User get group record given group user ID -getgrnam User get group record given group name -gethostbyaddr Network get host record given its address -gethostbyname Network get host record given name -gethostent Network get next hosts record -getlogin User return who logged in at this tty -getnetbyaddr Network get network record given its address -getnetbyname Network get networks record given name -getnetent Network get next networks record -getpeername Socket find the other end of a socket connection -getpgrp Process get process group -getppid Process get parent process ID -getpriority Process get current nice value -getprotobyname Network get protocol record given name -getprotobynumber Network get protocol record numeric protocol -getprotoent Network get next protocols record -getpwent User get next passwd record -getpwnam User get passwd record given user login name -getpwuid User get passwd record given user ID -getservbyname Network get services record given its name -getservbyport Network get services record given numeric port -getservent Network get next services record -getsockname Socket retrieve the sockaddr for a given socket -getsockopt Socket get socket options on a given socket -glob File expand filenames using wildcards -gmtime Time convert UNIX time into record or string using Greenwich time -goto Flow create spaghetti code -grep LIST locate elements in a list test true against a given criterion -hex Math,String convert a string to a hexadecimal number -import Modules,Namespace patch a module's namespace into your own -index String find a substring within a string -int Math get the integer portion of a number -ioctl File system-dependent device control system call -join LIST join a list into a string using a separator -keys HASH retrieve list of indices from a hash -kill Process send a signal to a process or process group -last Flow exit a block prematurely -lc String return lower-case version of a string -lcfirst String return a string with just the next letter in lower case -length String return the number of bytes in a string -link File create a hard link in the filesytem -listen Socket register your socket as a server -local Misc,Namespace create a temporary value for a global variable (dynamic scoping) -localtime Time convert UNIX time into record or string using local time -lock Threads get a thread lock on a variable, subroutine, or method -log Math retrieve the natural logarithm for a number -lstat File stat a symbolic link -m// Regexp match a string with a regular expression pattern -map LIST apply a change to a list to get back a new list with the changes -mkdir File create a directory -msgctl SysV SysV IPC message control operations -msgget SysV get SysV IPC message queue -msgrcv SysV receive a SysV IPC message from a message queue -msgsnd SysV send a SysV IPC message to a message queue -my Misc,Namespace declare and assign a local variable (lexical scoping) -next Flow iterate a block prematurely -no Modules unimport some module symbols or semantics at compile time -package Modules,Objects,Namespace declare a separate global namespace -prototype Flow,Misc get the prototype (if any) of a subroutine -oct String,Math convert a string to an octal number -open File open a file, pipe, or descriptor -opendir File open a directory -ord String find a character's numeric representation -our Misc,Namespace declare and assign a package variable (lexical scoping) -pack Binary,String convert a list into a binary representation -pipe Process open a pair of connected filehandles -pop ARRAY remove the last element from an array and return it -pos Regexp find or set the offset for the last/next m//g search -print I/O output a list to a filehandle -printf I/O output a formatted list to a filehandle -push ARRAY append one or more elements to an array -q/STRING/ String singly quote a string -qq/STRING/ String doubly quote a string -quotemeta Regexp quote regular expression magic characters -qw/STRING/ LIST quote a list of words -qx/STRING/ Process backquote quote a string -qr/STRING/ Regexp Compile pattern -rand Math retrieve the next pseudorandom number -read I/O,Binary fixed-length buffered input from a filehandle -readdir I/O get a directory from a directory handle -readline I/O fetch a record from a file -readlink File determine where a symbolic link is pointing -readpipe Process execute a system command and collect standard output -recv Socket receive a message over a Socket -redo Flow start this loop iteration over again -ref Objects find out the type of thing being referenced -rename File change a filename -require Modules load in external functions from a library at runtime -reset Misc clear all variables of a given name -return Flow get out of a function early -reverse String,LIST flip a string or a list -rewinddir I/O reset directory handle -rindex String right-to-left substring search -rmdir File remove a directory -s/// Regexp replace a pattern with a string -scalar Misc force a scalar context -seek I/O reposition file pointer for random-access I/O -seekdir I/O reposition directory pointer -select I/O reset default output or do I/O multiplexing -semctl SysV SysV semaphore control operations -semget SysV get set of SysV semaphores -semop SysV SysV semaphore operations -send Socket send a message over a socket -setgrent User prepare group file for use -sethostent Network prepare hosts file for use -setnetent Network prepare networks file for use -setpgrp Process set the process group of a process -setpriority Process set a process's nice value -setprotoent Network prepare protocols file for use -setpwent User prepare passwd file for use -setservent Network prepare services file for use -setsockopt Socket set some socket options -shift ARRAY remove the first element of an array, and return it -shmctl SysV SysV shared memory operations -shmget SysV get SysV shared memory segment identifier -shmread SysV read SysV shared memory -shmwrite SysV write SysV shared memory -shutdown Socket close down just half of a socket connection -sin Math return the sine of a number -sleep Process block for some number of seconds -socket Socket create a socket -socketpair Socket create a pair of sockets -sort LIST sort a list of values -splice ARRAY add or remove elements anywhere in an array -split Regexp split up a string using a regexp delimiter -sprintf String formatted print into a string -sqrt Math square root function -srand Math seed the random number generator -stat File get a file's status information -study Regexp optimize input data for repeated searches -sub Flow declare a subroutine, possibly anonymously -substr String get or alter a portion of a stirng -symlink File create a symbolic link to a file -syscall I/O,Binary execute an arbitrary system call -sysopen File open a file, pipe, or descriptor -sysread I/O,Binary fixed-length unbuffered input from a filehandle -sysseek I/O,Binary position I/O pointer on handle used with sysread and syswrite -system Process run a separate program -syswrite I/O,Binary fixed-length unbuffered output to a filehandle -tell I/O get current seekpointer on a filehandle -telldir I/O get current seekpointer on a directory handle -tie Objects bind a variable to an object class -tied Objects get a reference to the object underlying a tied variable -time Time return number of seconds since 1970 -times Process,Time return elapsed time for self and child processes -tr/// String transliterate a string -truncate I/O shorten a file -uc String return upper-case version of a string -ucfirst String return a string with just the next letter in upper case -umask File set file creation mode mask -undef Misc remove a variable or function definition -unlink File remove one link to a file -unpack Binary,LIST convert binary structure into normal perl variables -unshift ARRAY prepend more elements to the beginning of a list -untie Objects break a tie binding to a variable -use Modules,Namespace load a module and import its namespace -use Objects load in a module at compile time -utime File set a file's last access and modify times -values HASH return a list of the values in a hash -vec Binary test or set particular bits in a string -wait Process wait for any child process to die -waitpid Process wait for a particular child process to die -wantarray Misc,Flow get void vs scalar vs list context of current subroutine call -warn I/O print debugging info -write I/O print a picture record -y/// String transliterate a string diff --git a/lib/perl5/5.8.8/Pod/Html.pm b/lib/perl5/5.8.8/Pod/Html.pm deleted file mode 100644 index aba3c9f6..00000000 --- a/lib/perl5/5.8.8/Pod/Html.pm +++ /dev/null @@ -1,2112 +0,0 @@ -package Pod::Html; -use strict; -require Exporter; - -use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); -$VERSION = 1.0504; -@ISA = qw(Exporter); -@EXPORT = qw(pod2html htmlify); -@EXPORT_OK = qw(anchorify); - -use Carp; -use Config; -use Cwd; -use File::Spec; -use File::Spec::Unix; -use Getopt::Long; - -use locale; # make \w work right in non-ASCII lands - -=head1 NAME - -Pod::Html - module to convert pod files to HTML - -=head1 SYNOPSIS - - use Pod::Html; - pod2html([options]); - -=head1 DESCRIPTION - -Converts files from pod format (see L) to HTML format. It -can automatically generate indexes and cross-references, and it keeps -a cache of things it knows how to cross-reference. - -=head1 ARGUMENTS - -Pod::Html takes the following arguments: - -=over 4 - -=item backlink - - --backlink="Back to Top" - -Adds "Back to Top" links in front of every C heading (except for -the first). By default, no backlinks are generated. - -=item cachedir - - --cachedir=name - -Creates the item and directory caches in the given directory. - -=item css - - --css=stylesheet - -Specify the URL of a cascading style sheet. Also disables all HTML/CSS -C